IBX. Параметры Refresh запроса.
Модератор: kdv
IBX. Параметры Refresh запроса.
Yaffil 892; Delphi 7; IBX 7.08
Имеем:
IBDataSet.SelectSQL.Text:='Select * from MyProc(:Param1, aram2)';
IBDataSet.RefreshSQL.Text:='Select * from MyProc(:Param1, aram2) 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
не дублируя для них дополнительные поля?
Имеем:
IBDataSet.SelectSQL.Text:='Select * from MyProc(:Param1, aram2)';
IBDataSet.RefreshSQL.Text:='Select * from MyProc(:Param1, aram2) 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
не дублируя для них дополнительные поля?
Согласен, я просто такой пример привел, чтобы понятнее было, к чему какие параметры относятся.kdv писал(а):кстати, херовая идея - так процедуру вызывать. все равно она будет прокачивать через себя все данные, даже если наружный where выберет только одну запись.
Разумеется, у меня для Refresh везде своя процедура написана без where, которая только одну строчку тянет. И в 99% таких процедур только один параметр ключа и присутствует - поэтому все Ок. Но вот бывают случаи когда надо и в Refresh-процедуру передать дополнительные параметры, например для вида отображения данных в каком-нибудь столбце. Вот тут проблема и вылезает.
Re: IBX. Параметры Refresh запроса.
Джефф умеет много гитик. Так уж этот художник видит.VictorIn писал(а): Проблема возникает в том, что почему-то для Refresh запроса
IBX присваивает значения только тем параметрам,
которым соответствуют поля датасета и игнорирует
параметры основного запроса.
Обработать код IBX напильником.VictorIn писал(а): Как решить проблему с передачей параметров в IBDataSet.RefreshSQL
не дублируя для них дополнительные поля?
Re: IBX. Параметры Refresh запроса.
Ясно. Надеялся, что я что-то не так делаю.Merlin писал(а): Обработать код IBX напильником.
Тогда выскажусь, что это 100% баг и надо эти грабли где-нибудь в ФАКе или в статье по IBX описать.
Re: IBX. Параметры Refresh запроса.
Что баг? Что все ...SQL кроме Select работают строго от полей SelectSQL и именно и только их воспринимают как параметры? Это не баг, а концепция. Причём, скорей всего, даже не TIBDataSet, а вообще Borland TDataSet как такового, сто лет в сорцы уже не лазал, не помню. Набор данных и всё, на котором строятся операции. Можешь сообщить в Borland, что у них в концепции багVictorIn писал(а): Тогда выскажусь, что это 100% баг и надо эти грабли где-нибудь в ФАКе или в статье по IBX описать.
Re: IBX. Параметры Refresh запроса.
Я бы согласился с такой концепцией, если бы на нее что-нибудь указывало явно, например, вываливалась ошибка от том, что соответствующее параметру поле не найдено или, по-крайней мере для таких не найденных параметров в процедуру передавался null, а не произвольные значения, которые явно ни где не указывались.Merlin писал(а): Это не баг, а концепция.
Если такое концептуальное поведение где-нибудь описывается в литературе, то я возьму свои слова обратно, но я такого ни где не встречал.
Но мне все-таки, кажется, логичнее было бы проверять на присутствие в RefreshSQL и модифицирующих запросах параметров не входящих в состав полей.
Если кому интересно, вышеописанная проблема исправляется, путем добавления в TIBCustomDataSet.SetInternalSQLParams следуещего кода (вставляется после строки j := FQSelect.FieldIndex[fn] + 1):
if (j = 0)
then Qry.Params.Value:=Params.ByName(fn).Value
else
если и в этом случае параметр не найден, то вывалится ошибка.
Re: IBX. Параметры Refresh запроса.
А вот это уже реализация концепции У этого кренделя такого добра много. Кстати, раз уж взялся за напильник - имей в виду, что IBX надо транслировать с отключенным Range Checking.VictorIn писал(а): Я бы согласился с такой концепцией, если бы на нее что-нибудь указывало явно, например, вываливалась ошибка от том, что соответствующее параметру поле не найдено или, по-крайней мере для таких не найденных параметров в процедуру передавался null, а не произвольные значения, которые явно ни где не указывались.