IBX. Параметры Refresh запроса.

IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.

Модератор: kdv

Ответить
VictorIn
Сообщения: 26
Зарегистрирован: 25 мар 2005, 22:16

IBX. Параметры Refresh запроса.

Сообщение VictorIn » 19 апр 2008, 00:35

Yaffil 892; Delphi 7; IBX 7.08

Имеем:
IBDataSet.SelectSQL.Text:='Select * from MyProc(:Param1, :Param2)';
IBDataSet.RefreshSQL.Text:='Select * from MyProc(:Param1, :Param2) where KEY_ID=:KEY_ID';

IBDataSet.ParamByName('Param1').AsInteger:=1;
IBDataSet.ParamByName('Param1').AsInteger:=2;
IBDataSet.Open;

Проблема возникает в том, что почему-то для Refresh запроса
IBX присваивает значения только тем параметрам,
которым соответствуют поля датасета и игнорирует
параметры основного запроса.
Т.е. параметры Param1 и Param2 при IBDataSet.Refresh
предаются серверу =0. Причем, именно равные 0, а не null, например.

Это баг или обоснованная специфика работы IBX?
Или я что-то неправильно делаю?
Как решить проблему с передачей параметров в IBDataSet.RefreshSQL
не дублируя для них дополнительные поля?

QuAzI
Сообщения: 11
Зарегистрирован: 17 апр 2008, 02:36

Сообщение QuAzI » 19 апр 2008, 01:09

А у тебя никакие триггеры с этими полями не работают?

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

Сообщение kdv » 19 апр 2008, 12:41

кстати, херовая идея - так процедуру вызывать. все равно она будет прокачивать через себя все данные, даже если наружный where выберет только одну запись.

VictorIn
Сообщения: 26
Зарегистрирован: 25 мар 2005, 22:16

Сообщение VictorIn » 19 апр 2008, 14:36

kdv писал(а):кстати, херовая идея - так процедуру вызывать. все равно она будет прокачивать через себя все данные, даже если наружный where выберет только одну запись.
Согласен, я просто такой пример привел, чтобы понятнее было, к чему какие параметры относятся.
Разумеется, у меня для Refresh везде своя процедура написана без where, которая только одну строчку тянет. И в 99% таких процедур только один параметр ключа и присутствует - поэтому все Ок. Но вот бывают случаи когда надо и в Refresh-процедуру передать дополнительные параметры, например для вида отображения данных в каком-нибудь столбце. Вот тут проблема и вылезает.

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

Re: IBX. Параметры Refresh запроса.

Сообщение Merlin » 19 апр 2008, 15:16

VictorIn писал(а): Проблема возникает в том, что почему-то для Refresh запроса
IBX присваивает значения только тем параметрам,
которым соответствуют поля датасета и игнорирует
параметры основного запроса.
Джефф умеет много гитик. Так уж этот художник видит.
VictorIn писал(а): Как решить проблему с передачей параметров в IBDataSet.RefreshSQL
не дублируя для них дополнительные поля?
Обработать код IBX напильником.

VictorIn
Сообщения: 26
Зарегистрирован: 25 мар 2005, 22:16

Re: IBX. Параметры Refresh запроса.

Сообщение VictorIn » 19 апр 2008, 15:28

Merlin писал(а): Обработать код IBX напильником.
Ясно. Надеялся, что я что-то не так делаю. :)
Тогда выскажусь, что это 100% баг и надо эти грабли где-нибудь в ФАКе или в статье по IBX описать.

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

Re: IBX. Параметры Refresh запроса.

Сообщение Merlin » 19 апр 2008, 17:46

VictorIn писал(а): Тогда выскажусь, что это 100% баг и надо эти грабли где-нибудь в ФАКе или в статье по IBX описать.
Что баг? Что все ...SQL кроме Select работают строго от полей SelectSQL и именно и только их воспринимают как параметры? Это не баг, а концепция. Причём, скорей всего, даже не TIBDataSet, а вообще Borland TDataSet как такового, сто лет в сорцы уже не лазал, не помню. Набор данных и всё, на котором строятся операции. Можешь сообщить в Borland, что у них в концепции баг :)

VictorIn
Сообщения: 26
Зарегистрирован: 25 мар 2005, 22:16

Re: IBX. Параметры Refresh запроса.

Сообщение VictorIn » 20 апр 2008, 22:49

Merlin писал(а): Это не баг, а концепция.
Я бы согласился с такой концепцией, если бы на нее что-нибудь указывало явно, например, вываливалась ошибка от том, что соответствующее параметру поле не найдено или, по-крайней мере для таких не найденных параметров в процедуру передавался null, а не произвольные значения, которые явно ни где не указывались.

Если такое концептуальное поведение где-нибудь описывается в литературе, то я возьму свои слова обратно, но я такого ни где не встречал.

Но мне все-таки, кажется, логичнее было бы проверять на присутствие в RefreshSQL и модифицирующих запросах параметров не входящих в состав полей.

Если кому интересно, вышеописанная проблема исправляется, путем добавления в TIBCustomDataSet.SetInternalSQLParams следуещего кода (вставляется после строки j := FQSelect.FieldIndex[fn] + 1):

if (j = 0)
then Qry.Params.Value:=Params.ByName(fn).Value
else

если и в этом случае параметр не найден, то вывалится ошибка.

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

Re: IBX. Параметры Refresh запроса.

Сообщение Merlin » 21 апр 2008, 14:05

VictorIn писал(а): Я бы согласился с такой концепцией, если бы на нее что-нибудь указывало явно, например, вываливалась ошибка от том, что соответствующее параметру поле не найдено или, по-крайней мере для таких не найденных параметров в процедуру передавался null, а не произвольные значения, которые явно ни где не указывались.
А вот это уже реализация концепции :) У этого кренделя такого добра много. Кстати, раз уж взялся за напильник - имей в виду, что IBX надо транслировать с отключенным Range Checking.

Ответить