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

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

Добавлено: 19 апр 2008, 00:35
VictorIn
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
не дублируя для них дополнительные поля?

Добавлено: 19 апр 2008, 01:09
QuAzI
А у тебя никакие триггеры с этими полями не работают?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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