Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Firebird + Delphi как работать с тригерами и хранимыми процедурами  (Прочитано 6560 раз)
0 Пользователей и 4 Гостей смотрят эту тему.
Fatal_Error
Участник

ru
Offline Offline
Пол: Мужской

« : 22-06-2010 09:47 » 

Здравствуйте!
Возникла следующая проблема:
В базе данных есть тригер dcDiscountCard_GEN_ID, он служит для того, чтобы генерировать уникальный код ключевого поля одной из таблиц в этой базе. Работает по принципу: при добавлении новой записи в таблицу значение увеличивается на +1

Код:
AS
BEGIN
  IF (NEW."DiscountCardID" IS NULL) THEN
    NEW."DiscountCardID" = GEN_ID("dcDiscountCardIDGen",1);
END

далее есть хранимая процедура которая отвечает за добавление новой записи в базу

Код:
begin
  if (exists(select * from "dcDiscountCard"
             where "DiscountCardID" = :"DiscountCardID"))
  then
  begin
    update "dcDiscountCard" set "DiscountIssueID" = :"DiscountIssueID",
      "Name" = :"Name", "Code" = :"Code", "Enabled" = :"Enabled",
      "ExpireDate" = :"ExpireDate", "Locked" = :"Locked",
      "AllowInOffline" = :"AllowInOffline", "TransactionID" = :"TransactionID"
    where "DiscountCardID" = :"DiscountCardID";
  end
  else
  begin
    INSERT INTO "dcDiscountCard" ( "DiscountCardID", "DiscountIssueID", "Name",
      "Code", "Enabled", "ExpireDate", "Locked", "AllowInOffline", "TransactionID")
    VALUES (:"DiscountCardID", :"DiscountIssueID", :"Name", :"Code", :"Enabled",
      :"ExpireDate", :"Locked", :"AllowInOffline", :"TransactionID");
  end
  suspend;
end

В коде делфи для вызова этой процедуры пишу следующие:

Код:
ibstoredproc1.Prepare;
ibstoredproc1.Params[0].AsInteger:=777;     //DiscountCardID
ibstoredproc1.Params[1].AsInteger:=1;     //DiscountIssueID
ibstoredproc1.Params[2].AsString:='privet';  //Name
ibstoredproc1.Params[3].AsString:='heloo';  //Code
ibstoredproc1.Params[4].AsInteger:=1; //Enabled
ibstoredproc1.Params[5].Value:=null; //ExpireDate
ibstoredproc1.Params[6].AsInteger:=0; //Locked
ibstoredproc1.Params[7].AsInteger:=1; //AllowInOffline
ibstoredproc1.Params[8].AsInteger:=0; //TransactionID
ibstoredproc1.ExecProc;

как мне выполнить тригер? как получить его новое значение "DiscountCardID" после выполнения? чтобы потом в дальнейшем присвоить его значение соответсвующему полю в новой записи ibstoredproc1.Params[0].AsInteger:=?Не понял??;

Помогите пожайлуста=)  А черт его знает... Не понял Буду очень признателен=)
Базу данных поправить нельзя... так как для этой базы есть свой уже готовый клиент(программный продукт). Я пишу дополнительное приложение собственными силами для этой базы для загрузки информации в базу, так как стандартный клиент не обладает хорошим загрузчиком, вернее обладает, но очень кривым, не подходяшим под мои нужды=)
« Последнее редактирование: 22-06-2010 09:53 от Алексей1153++ » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Online Online
Сообщений: 13


« Ответ #1 : 22-06-2010 09:54 » 

были уже такие темы. Поищи по "GEN_ID"
Записан

x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #2 : 23-06-2010 10:59 » 

Цитата
как мне выполнить тригер?
- триггер выполняется сам, после того события, для которого он был написан, если он активен. выполнить триггер "вручную", на стороне клиента - невозможно.

Цитата
как получить его новое значение "DiscountCardID" после выполнения? чтобы потом в дальнейшем присвоить его значение соответсвующему полю в новой записи ibstoredproc1.Params[0].AsInteger:=???;

классический совет - перейти на FIB+ и навсегда забыть про весь этот геморрой.

альтернатива.

1. пишем запрос, возвращающий нам значение генератора, типа, select GEN_ID (dcDiscountCardIDGen, 1) from rdb$database.
2. перед вставкой вызываем этот запрос и получаем будущее значение генератора
3. во время вставки присваиваем это значение полю.

как видно из тела вашего триггера, новое значение генератора присваивается автоматически только если оно не задано, так что если мы сгенерим значение сами и сами его присвоим - всё будет корректно. в этом и заключается "ход конём" - получить значение до самой вставки.

з.ы. как я уже устал повторять, ФИБы всё это умеют делать сами.
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines