-
Имеется IBQuery1 и DBGrid к нему. Имеется еще один IBQuery2, связанный с первым. Нужно чтобы в одном столбце DBGrid выводились через запятую данные из второго IBQuery2. Пытался сделать через вычисляемое поле, получилось так: procedure TBaseFrm.ProjQrCalcFields(DataSet: TDataSet);
begin
While not OtvQr.Eof do
begin
if ProjQrOtv.AsString<>'' then
ProjQrOtv.AsString:=ProjQrOtv.AsString+', '+OtvQr.FieldByName('S_NAIM').AsString
else
ProjQrOtv.AsString:=OtvQr.FieldByName('S_NAIM').AsString;
OtvQr.Next;
end;
end; 1. При открытии формы с DBGrid столбец с вычисляемым полем пустой, данные появляются только после перебора, вообщем то как и написано в хелпе. Как сделать так, чтобы они запонились автоматически? 2. Данные смещены на 1 запись. Почему так? Привязанный к IBQuery1 второй DBGrid отображает записи корректно.
-
OtvQr.First
-
> Ega23 © (14.03.12 17:41) [1]
Данные вычисляемого поля в IBQuery1 смещены на 1 запись, т.е. значение вычисляемого поля для записи №2 почему то стоит у записи №1.
-
> alexis (14.03.12 17:45) [2] в коде ошибка, см. Ega23 © (14.03.12 17:41) [1]
-
и кстати не одна... CalcFields может и не один раз сработать, т.что условие неверное, будет "добавлять" при повторном, хотя нужно замещать.
-
> Имеется еще один IBQuery2, связанный с первым. о, блин, а эта "связь" это не мастер детайл надеюсь? т.к. вычисление вычисляемых полей происходит несколько раньше чем фильтр/запрос к дочерней таблице. если так, то делай это сам, не надейся связку.
-
> sniknik © (14.03.12 22:05) [5]
мастер-детайл. Сделал по другому, все работает. OtvQr.Close;
OtvQr.ParamByName('ID').AsInteger:=ProjQr.FieldByName('ID').AsInteger;
OtvQr.Open;
OtvQr.First;
While not OtvQr.Eof do
begin
if ProjQrOtv.AsString<>'' then
ProjQrOtv.AsString:=ProjQrOtv.AsString+', '+OtvQr.FieldByName('S_NAIM').AsString
else
ProjQrOtv.AsString:=OtvQr.FieldByName('S_NAIM').AsString;
OtvQr.Next;
end; Как то не оптимально это, столько запросов к базе.
-
> Как то не оптимально это, столько запросов к базе. мастер детайл делает точно также... в одном из вариантов, другой по фильтру. как настроишь (в ADO по крайней мере). т.е. если у тебя было по фильтру, то и тут делай также. и +, после открытия сделать локальный фильтр (sort) на ID в фильтруемой по нему таблице.
-
Это где же в приведенном коде "столько запросов к базе"? Единственный запрос к базе в операторе OtvQr.Open;, а цикл проходит по выборке с первой записи до последней в буфере датасета. И только, если в выборке очень много строк, то иногда записи фетчатся.
-
Почему бы не сделать всё через один IBQuery?
|