Не выполняется триггер - FB 2.0

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

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

qvd
Сообщения: 27
Зарегистрирован: 10 янв 2007, 11:52

Не выполняется триггер - FB 2.0

Сообщение qvd » 10 янв 2007, 11:56

Добрый день! Такой вопрос:
Существует таблица main, при выполнениии триггера

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

EXECUTE PROCEDURE ZAKRUTIYE_ZAKAZA(1, '09.01.2007 15:29:42')
где: первый параметр - integer, второй - timestamp. Текст процедуры:

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

update main set zakaz_vupolnen = CURRENT_TIMESTAMP where abonent = :abonent_in and NACHALO_VUPOLNENIYA = :NACHALO_VUPOLNENIYA;
Где: abonent_in - Integer, NACHALO_VUPOLNENIYA - timestamp
Поле zakaz_vupolnen должно стать current_timestamp, по умолчанию zakaz_vupolnen = null, но этого не происходит, а если поле zakaz_vupolnen уже содержит данные, то запрос отрабатывается без проблем. Где ошибка?
FB 2.0 (2.0.0.12748-0-Win32)

qvd
Сообщения: 27
Зарегистрирован: 10 янв 2007, 11:52

Сообщение qvd » 10 янв 2007, 12:14

В догонку - в FB 1.5 все работало ...

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 10 янв 2007, 12:35

А может, для начала ты разберешься где процедура а где триггер, а потом вернешься и сформулируешь вопрос нормально?..

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 10 янв 2007, 12:38

В догонку - ты хотя бы Release Notes прочитал? В частности место про точность CURRENT_TIMESTAMP.

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 10 янв 2007, 12:50

Смущает такая конструкция. Похоже на нелады с консерваторией, или просто мне непонятно, что хотелось достичь.

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

and NACHALO_VUPOLNENIYA = :NACHALO_VUPOLNENIYA

qvd
Сообщения: 27
Зарегистрирован: 10 янв 2007, 11:52

Сообщение qvd » 10 янв 2007, 13:03

Да ошибся, не триггер а процедура.

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

and NACHALO_VUPOLNENIYA = :NACHALO_VUPOLNENIYA
NACHALO_VUPOLNENIYA - поле,
:NACHALO_VUPOLNENIYA - входной параметр

точность CURRENT_TIMESTAMP, почитаю, но думаю это не то ...
Почему в некоторых случаях процедура отрабатывает, а в некоторых - нет? Передаваемые ей данные проверял, все нормально.

qvd
Сообщения: 27
Зарегистрирован: 10 янв 2007, 11:52

Сообщение qvd » 10 янв 2007, 13:05

На счет

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

and NACHALO_VUPOLNENIYA = :NACHALO_VUPOLNENIYA
пробовал менять имя :NACHALO_VUPOLNENIYA на другое, (может совпадение имен влияет) - результат тот-же.

dimitr
Разработчик Firebird
Сообщения: 888
Зарегистрирован: 26 окт 2004, 16:20

Сообщение dimitr » 10 янв 2007, 13:20

поле NACHALO_VUPOLNENIYA часом не в триггере заполняется?

qvd
Сообщения: 27
Зарегистрирован: 10 янв 2007, 11:52

Сообщение qvd » 10 янв 2007, 13:38

Нет, не в триггере, процедуре параметры передаются из клиентской программы:

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

Data_Module.Z_IBQuery.SQL.Add('select * from 
ZAKRUTIYE_ZAKAZA('+
Data_Module.IBTable_Main.FieldByName('abonent').AsString+
','''+Data_Module.IBTable_Main.FieldByName('NACHALO_VUPOLNENIYA').AsString+''')');

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 10 янв 2007, 13:44

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

Unit

System

type  TDateTime = type Double;

Ни о чём не говорит?

qvd
Сообщения: 27
Зарегистрирован: 10 янв 2007, 11:52

Сообщение qvd » 10 янв 2007, 13:50

Говорит, но мне надо добавить передаваемый timestamp в sql запрос, а это - строка, поэтому либо AsString либо DateToStr()

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 10 янв 2007, 13:52

А мне это говорит о том, что с типами с плавающей точкой на равенство не работают...

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 10 янв 2007, 13:54

надо добавить TIMESTAMP в запрос
А про параметры в SQL запросах вы когда-нибудь слышали?.. А о том что IBX не слишком-то совместим с FB2 именно при работе с TIMESTAMP?

qvd
Сообщения: 27
Зарегистрирован: 10 янв 2007, 11:52

Сообщение qvd » 10 янв 2007, 13:57

Хорошо, а как-же тогда делать выборки по таким полям, between у меня хорошо работает, выбирает все правильно...

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 10 янв 2007, 14:02

qvd писал(а):Хорошо, а как-же тогда делать выборки по таким полям, between у меня хорошо работает, выбирает все правильно...
Вот именно. А уникальность записи для выборки именно её, единственной, должна обеспечиваться искусственным инт-ключом на генераторе, а не таймштампом, который есть атрибут по своей природе, а не идентификатор.

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 10 янв 2007, 14:06

Dimitry Sibiryakov писал(а):
надо добавить TIMESTAMP в запрос
А про параметры в SQL запросах вы когда-нибудь слышали?..TIMESTAMP?
Параметр тут не поможет. Он чтоб не бороться с локалями, а преобразование дабла в два инта и обратно никогда не будет точным, как и где ни делай. На равенство таймштамп может использоваться только внутри сервера и прочитанный внутри сервера.

qvd
Сообщения: 27
Зарегистрирован: 10 янв 2007, 11:52

Сообщение qvd » 10 янв 2007, 14:06

Нет, не слышал, дело в том, что, работа с бд - не моя специфика, но иногда приходится, поэтому чего-то (возможно многого) могу не знать. Про запросы с параметрами почитаю обязательно, спасибо. А насчет плохой совместимости IBX (я так понимаю, имеются ввиду компоненты с закладки InterBase) и FB 2 где можно почитать (желательно на русском)?

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 10 янв 2007, 14:17

Merlin писал(а):Параметр тут не поможет. Он чтоб не бороться с локалями, а преобразование дабла в два инта и обратно никогда не будет точным, как и где ни делай.
Будет. Оно (в IBX) округлится до секунд на пути туда (в TDateTime) и так же на пути обратно.
qvd писал(а):А насчет плохой совместимости где можно почитать (желательно на русском)?
Облом. Читай в исходниках (там на дельфи), IB API Guide (там на аглицком) и Releaze Notes (эти, кажется, есть и на русском).

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 10 янв 2007, 14:32

Dimitry Sibiryakov писал(а):
Merlin писал(а):Параметр тут не поможет. Он чтоб не бороться с локалями, а преобразование дабла в два инта и обратно никогда не будет точным, как и где ни делай.
Будет. Оно (в IBX) округлится до секунд на пути туда (в TDateTime) и так же на пути обратно.
И гарантированно не совпадёт с установленным триггерно.

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 10 янв 2007, 14:53

Merlin писал(а):И гарантированно не совпадёт с установленным триггерно.
Самое забавное, что присваивание как константной строки может сработать.
Насмотревшись в свое время на всю эту бодягу, я выкинул нафиг (точнее обошел) половину IBX. Следующий шаг был очевиден - переход на чистый API, за что теперь ДК называет меня злобным извергом.

Ответить