Конференция "Базы" » Как в DBGrid поместить данные из другого датасета? [D7, FireBird]
 
  • alexis (14.03.12 17:24) [0]
    Имеется 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 отображает записи корректно.
  • Ega23 © (14.03.12 17:41) [1]
    OtvQr.First
  • alexis (14.03.12 17:45) [2]

    > Ega23 ©   (14.03.12 17:41) [1]

    Данные вычисляемого поля в IBQuery1 смещены на 1 запись, т.е. значение вычисляемого поля для записи №2 почему то стоит у записи №1.
  • sniknik © (14.03.12 17:49) [3]
    > alexis   (14.03.12 17:45) [2]
    в коде ошибка, см. Ega23 ©   (14.03.12 17:41) [1]
  • sniknik © (14.03.12 17:53) [4]
    и кстати не одна... CalcFields может и не один раз сработать, т.что условие неверное, будет "добавлять" при повторном, хотя нужно замещать.
  • sniknik © (14.03.12 22:05) [5]
    > Имеется еще один IBQuery2, связанный с первым.
    о, блин, а эта "связь" это не мастер детайл надеюсь? т.к. вычисление вычисляемых полей происходит несколько раньше чем фильтр/запрос к дочерней таблице.
    если так, то делай это сам, не надейся связку.
  • alexis (15.03.12 08:51) [6]

    > 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;


    Как то не оптимально это, столько запросов к базе.
  • sniknik © (15.03.12 09:51) [7]
    > Как то не оптимально это, столько запросов к базе.
    мастер детайл делает точно также... в одном из вариантов, другой по фильтру. как настроишь (в ADO по крайней мере).
    т.е. если у тебя было по фильтру, то и тут делай также. и +, после открытия сделать локальный фильтр (sort) на ID в фильтруемой по нему таблице.
  • Прик (16.03.12 08:42) [8]
    Это где же в приведенном коде "столько запросов к базе"?
    Единственный запрос к базе в операторе OtvQr.Open;, а цикл проходит по выборке с первой записи до последней в буфере датасета.
    И только, если в выборке очень много строк, то иногда записи фетчатся.
  • Cobalt © (16.03.12 11:50) [9]
    Почему бы не сделать всё через один IBQuery?
 
Конференция "Базы" » Как в DBGrid поместить данные из другого датасета? [D7, FireBird]
Есть новые Нет новых   [134431   +10][b:0][p:0.001]