Сообщение о дубликате записи (IB + Delphi)

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
Некто

Сообщение о дубликате записи (IB + Delphi)

Сообщение Некто » 02 янв 2005, 19:32

Создал ексцепшн, для вывода сообщения о дублировании записи (sqlcode -803):
create exception msg_dbl 'Такое значение в справочнике уже существует, введите др. значение';

вот теперь мучаюсь с тем, как и куда этот ексцепшн прицепить, к какому триггеру или ХП, может есть у кого пример? или объясните как делать

заранее благодарен

Лысый
Сообщения: 177
Зарегистрирован: 08 ноя 2004, 08:20

Сообщение Лысый » 03 янв 2005, 12:24

Пример с ХП:

Код: Выделить всё

CREATE PROCEDURE PERSON_IU (
    ID_PERSON INTEGER,
    FIO VARCHAR(90))
RETURNS (
    ID_OUT INTEGER)
AS
BEGIN
  /* Добавление/изменение Person */

  IF (EXISTS(SELECT ID FROM PERSON WHERE (ID = :ID_PERSON))) THEN
  BEGIN

    IF (EXISTS(SELECT FIO FROM PERSON
                WHERE UPPER(FIO) = UPPER(:FIO) AND ID <> :ID_PERSON)) THEN
    BEGIN
      EXCEPTION MSG_DBL;
      EXIT;
    END

    UPDATE PERSON
       SET FIO = :FIO
     WHERE ID = :ID_PERSON;

     ID_OUT = :ID_PERSON;

  END ELSE BEGIN

    IF (EXISTS(SELECT FIO FROM PERSON WHERE UPPER(FIO) = UPPER(:FIO))) THEN
    BEGIN
      EXCEPTION MSG_DBL;
      EXIT;
    END

    ID_OUT = GEN_ID(ID, 1);

    INSERT INTO PERSON (ID, FIO) VALUES (:ID_OUT, :FIO);
  END

  SUSPEND;
END

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 03 янв 2005, 16:36

все это не нужно, если у таблицы есть ПК и запись вставляется обычным insert - сервер все сам проконтролируется и выматерится сразу при попытке вставки дубликата.

Лысый
Сообщения: 177
Зарегистрирован: 08 ноя 2004, 08:20

Сообщение Лысый » 04 янв 2005, 08:31

Еще можно создать UNIQUE индекс...

Некто

Сообщение Некто » 05 янв 2005, 02:37

kdv писал(а):все это не нужно, если у таблицы есть ПК и запись вставляется обычным insert - сервер все сам проконтролируется и выматерится сразу при попытке вставки дубликата.
надо чтобы по-русски матерился

Лысый
Сообщения: 177
Зарегистрирован: 08 ноя 2004, 08:20

Сообщение Лысый » 05 янв 2005, 08:32

Некто писал(а):
kdv писал(а):все это не нужно, если у таблицы есть ПК и запись вставляется обычным insert - сервер все сам проконтролируется и выматерится сразу при попытке вставки дубликата.
надо чтобы по-русски матерился
Что мешает обрабатывать на клиенте?

Некто

Сообщение Некто » 05 янв 2005, 15:36

Тогда какой смысл в клиет-серверной технологии?
Просто возможно что писать клиенты придётся разным людям и даж на разных ЯП.

Некто

Сообщение Некто » 05 янв 2005, 15:49

А вообще можно это не через ХП, а через триггер before insert организовать?

Лысый
Сообщения: 177
Зарегистрирован: 08 ноя 2004, 08:20

Сообщение Лысый » 06 янв 2005, 09:35

Я в табличке храню коды ошибок, констрайнты (именованные) и текст сообщения. А клиентом ловлю исключения, анализирую сообщение и вывожу нужный текст ошибки...

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 06 янв 2005, 10:57

обработка ошибок и client-server никак не связаны. Клиентское приложение само обязано обрабатывать ошибки, чтобы быть 100% неубиваемым и понятным для клиента. Сделайте 1 модуль сообщений об ошибках, или действительно храните их в таблице в БД, и так далее. вариантов масса, а перевод сообщений firebird/interbase.msg - это в общем муть, как и усложнение кода на клиенте и сервере только для того, чтобы выдать сообщение о нарушении ПК клиенту на русском языке.

McArty
Сообщения: 56
Зарегистрирован: 14 янв 2005, 09:31

Сообщение McArty » 14 янв 2005, 09:58

Прочитаешь такую правильную мысль утром и жить хочеться (точно-точно) :)
А вообще в таком случае, можно прочитать про M-tier технологии. Тогда пусть клиентскую часть пишет кто-хочет и на чем хочет. Или в крайнем случае написать Com-объект, который будет "русифицировать" сообщения от сервака.

Ответить