Страница 1 из 1

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

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

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

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

Добавлено: 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

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

Добавлено: 04 янв 2005, 08:31
Лысый
Еще можно создать UNIQUE индекс...

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

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

Добавлено: 05 янв 2005, 15:36
Некто
Тогда какой смысл в клиет-серверной технологии?
Просто возможно что писать клиенты придётся разным людям и даж на разных ЯП.

Добавлено: 05 янв 2005, 15:49
Некто
А вообще можно это не через ХП, а через триггер before insert организовать?

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

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

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