Страница 1 из 2
Не выполняется триггер - FB 2.0
Добавлено: 10 янв 2007, 11:56
qvd
Добрый день! Такой вопрос:
Существует таблица 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)
Добавлено: 10 янв 2007, 12:14
qvd
В догонку - в FB 1.5 все работало ...
Добавлено: 10 янв 2007, 12:35
Dimitry Sibiryakov
А может, для начала ты разберешься где процедура а где триггер, а потом вернешься и сформулируешь вопрос нормально?..
Добавлено: 10 янв 2007, 12:38
Dimitry Sibiryakov
В догонку - ты хотя бы Release Notes прочитал? В частности место про точность CURRENT_TIMESTAMP.
Добавлено: 10 янв 2007, 12:50
WildSery
Смущает такая конструкция. Похоже на нелады с консерваторией, или просто мне непонятно, что хотелось достичь.
Код: Выделить всё
and NACHALO_VUPOLNENIYA = :NACHALO_VUPOLNENIYA
Добавлено: 10 янв 2007, 13:03
qvd
Да ошибся, не триггер а процедура.
Код: Выделить всё
and NACHALO_VUPOLNENIYA = :NACHALO_VUPOLNENIYA
NACHALO_VUPOLNENIYA - поле,
:NACHALO_VUPOLNENIYA - входной параметр
точность CURRENT_TIMESTAMP, почитаю, но думаю это не то ...
Почему в некоторых случаях процедура отрабатывает, а в некоторых - нет? Передаваемые ей данные проверял, все нормально.
Добавлено: 10 янв 2007, 13:05
qvd
На счет
Код: Выделить всё
and NACHALO_VUPOLNENIYA = :NACHALO_VUPOLNENIYA
пробовал менять имя :NACHALO_VUPOLNENIYA на другое, (может совпадение имен влияет) - результат тот-же.
Добавлено: 10 янв 2007, 13:20
dimitr
поле NACHALO_VUPOLNENIYA часом не в триггере заполняется?
Добавлено: 10 янв 2007, 13:38
qvd
Нет, не в триггере, процедуре параметры передаются из клиентской программы:
Код: Выделить всё
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+''')');
Добавлено: 10 янв 2007, 13:44
Merlin
Добавлено: 10 янв 2007, 13:50
qvd
Говорит, но мне надо добавить передаваемый timestamp в sql запрос, а это - строка, поэтому либо AsString либо DateToStr()
Добавлено: 10 янв 2007, 13:52
Merlin
А мне это говорит о том, что с типами с плавающей точкой на равенство не работают...
Добавлено: 10 янв 2007, 13:54
Dimitry Sibiryakov
надо добавить TIMESTAMP в запрос
А про параметры в SQL запросах вы когда-нибудь слышали?.. А о том что IBX не слишком-то совместим с FB2 именно при работе с TIMESTAMP?
Добавлено: 10 янв 2007, 13:57
qvd
Хорошо, а как-же тогда делать выборки по таким полям, between у меня хорошо работает, выбирает все правильно...
Добавлено: 10 янв 2007, 14:02
Merlin
qvd писал(а):Хорошо, а как-же тогда делать выборки по таким полям, between у меня хорошо работает, выбирает все правильно...
Вот именно. А уникальность записи для выборки именно её, единственной, должна обеспечиваться искусственным инт-ключом на генераторе, а не таймштампом, который есть атрибут по своей природе, а не идентификатор.
Добавлено: 10 янв 2007, 14:06
Merlin
Dimitry Sibiryakov писал(а):надо добавить TIMESTAMP в запрос
А про параметры в SQL запросах вы когда-нибудь слышали?..TIMESTAMP?
Параметр тут не поможет. Он чтоб не бороться с локалями, а преобразование дабла в два инта и обратно никогда не будет точным, как и где ни делай. На равенство таймштамп может использоваться только внутри сервера и прочитанный внутри сервера.
Добавлено: 10 янв 2007, 14:06
qvd
Нет, не слышал, дело в том, что, работа с бд - не моя специфика, но иногда приходится, поэтому чего-то (возможно многого) могу не знать. Про запросы с параметрами почитаю обязательно, спасибо. А насчет плохой совместимости IBX (я так понимаю, имеются ввиду компоненты с закладки InterBase) и FB 2 где можно почитать (желательно на русском)?
Добавлено: 10 янв 2007, 14:17
Dimitry Sibiryakov
Merlin писал(а):Параметр тут не поможет. Он чтоб не бороться с локалями, а преобразование дабла в два инта и обратно никогда не будет точным, как и где ни делай.
Будет. Оно (в IBX) округлится до секунд на пути туда (в TDateTime) и так же на пути обратно.
qvd писал(а):А насчет плохой совместимости где можно почитать (желательно на русском)?
Облом. Читай в исходниках (там на дельфи), IB API Guide (там на аглицком) и Releaze Notes (эти, кажется, есть и на русском).
Добавлено: 10 янв 2007, 14:32
Merlin
Dimitry Sibiryakov писал(а):Merlin писал(а):Параметр тут не поможет. Он чтоб не бороться с локалями, а преобразование дабла в два инта и обратно никогда не будет точным, как и где ни делай.
Будет. Оно (в IBX) округлится до секунд на пути туда (в TDateTime) и так же на пути обратно.
И гарантированно не совпадёт с установленным триггерно.
Добавлено: 10 янв 2007, 14:53
Dimitry Sibiryakov
Merlin писал(а):И гарантированно не совпадёт с установленным триггерно.
Самое забавное, что присваивание как константной строки может сработать.
Насмотревшись в свое время на всю эту бодягу, я выкинул нафиг (точнее обошел) половину IBX. Следующий шаг был очевиден - переход на чистый API, за что теперь ДК называет меня злобным извергом.