Конференция "Базы" » Как узнать - выбрался ли весь набор?
 
  • Дмитрий Белькевич © (15.05.15 13:21) [0]
    Сущевует ли у датасета или грида какое-то публичное свойство, которое указывает, что датасет выбрал (отфетчил) весь набор данных?
  • Дмитрий Белькевич © (15.05.15 13:22) [1]
    База - FB 2.1, если что.
  • кгшзх © (15.05.15 15:21) [2]
    нафига это знать?
    начни бежать сверху вниз и всегда дойдешь до самого конца выборки.

    а если тебе это не надо, то не надо и знать вся она уже или не вся прилетела.
  • Ega23 © (15.05.15 15:30) [3]

    > Сущевует ли у датасета или грида какое-то публичное свойство,
    >  которое указывает, что датасет выбрал (отфетчил) весь набор
    > данных?


    DataSet.Eof;  :)

    А вообще:
    with DataSet do
    begin
     Open;
     Last;
     // Вот тут вот - всё выбрано.
    end;


    Если TIBSQL будешь использовать, то аля-улю, он однопроходный.
  • sniknik © (15.05.15 15:44) [4]
    у ADO датасета ExecuteOptions = [] однозначно показывает что выбралось все сразу после команды Open, в других есть не свойство но событие прогресса и окончания выборки.

    с базой - FB 2.1 можно работать через ADO, если что.
  • Дмитрий Белькевич © (15.05.15 15:49) [5]
    >нафига это знать?

    нужно для некоторых интерфейсных решений знать, выбралось уже всё, или еще что-то будет выбираться.

    >DataSet.Eof

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

    >Вот тут вот - всё выбрано.

    не стоит задача выбрать всё. стоит задача определить - выбралось ли всё или нет.

    спасибо всем, еще может мысли будут.
  • Дмитрий Белькевич © (15.05.15 15:51) [6]
    да, я думал событие ловить, вроде бы что-то такое было. если других вариантов нет - придется делать внутренний флаг и ловить.
  • кгшзх © (15.05.15 15:52) [7]
    не стоит задача выбрать всё. стоит задача определить - выбралось ли всё или нет.

    ложная задача поверь.

    если выбирать всего не нужно, то сами данные "конца выборки" - не нужны.
    значит абсолютно пофик должно быть, все выбралось или нет.
  • Дмитрий Белькевич © (15.05.15 15:54) [8]
    поверь, задача истинная. нужно юзерам разное показывать, в зависимости от того, выбралось всё или нет. юзеры так хотят. юзеры за это платят, значит задача истинная - всё просто 1:)
  • кгшзх © (15.05.15 15:55) [9]
    ок, последним постом ты убедил меня окончательно.

    задача твоя ЛОЖНАЯ
  • Дмитрий Белькевич © (15.05.15 15:56) [10]
    моя задача истинная, я гарантирую это! :)
  • кгшзх © (15.05.15 15:59) [11]
    покажи юзеру такое сразу после оупена:

    "все уже загрузилось целиком, гарантирую это! Если не верите, пройдите в самый конец по Ctrl+PGDown"
  • Игорь Шевченко © (15.05.15 17:02) [12]
    Дмитрий Белькевич ©   (15.05.15 15:54) [8]


    > юзеры за это платят


    Нельзя ли подробнее о задаче ?
  • Ega23 © (15.05.15 17:03) [13]

    > стоит задача определить - выбралось ли всё или нет.


    Ковырять конкретный потомок TDataSet, остальное от лукавого.
  • кгшзх © (15.05.15 17:12) [14]
    Нельзя ли подробнее о задаче ?

    там наверняка что-то типа
    когда грид еще не наполнился всеми данными он пусть будет красный.
    а когда уже наполнился, пусть будет белым чтобы было понятно, что можно листать в конец.
  • Jeer © (15.05.15 20:12) [15]
    Задача неверно поставлена, а также - реализация.
  • Плохиш © (15.05.15 23:52) [16]

    > Дмитрий Белькевич ©   (15.05.15 15:54) [8]
    > поверь, задача истинная. нужно юзерам разное показывать,
    >  в зависимости от того, выбралось всё или нет. юзеры так
    > хотят. юзеры за это платят, значит задача истинная - всё
    > просто 1:)

    Для "юзера", если он видит данные, то все данные загружены. Не верит, пусть докажет обратное.

    PS. Не юзерего дело следить за закачкой данных, подозреваю, что он за другое зарплату получает.
  • Inovet © (16.05.15 05:29) [17]
    > [5] Дмитрий Белькевич ©   (15.05.15 15:49)
    > >DataSet.Eof
    >
    > да, смотрел в первую очередь. срабатывает только если курсор грида стоит на последней записи, иначе - не eof.

    Это означает, что разработчики не допустили ошибки в функции Eof().
  • Inovet © (16.05.15 05:50) [18]
    > [5] Дмитрий Белькевич ©   (15.05.15 15:49)
    > курсор грида

    Этот момент я сразу не увидел. Значит, разработчики функции, таки, допустили ошибку.
  • Плохиш © (16.05.15 12:02) [19]
    Eof метод документирован ещë со времëн царя гороха и, как в справке написано, показывает только то, что текущая запись в наборе данных является последней и больше ничего.
  • TDBGrid (16.05.15 12:31) [20]
    А что, если вообще визуально не отображать DBGrid (Visible:= False), до "отработки" запроса?
  • Дмитрий Белькевич © (16.05.15 14:19) [21]
    Господа, я знаю, как работает Eof, я его попробовал, увидел, что не подходит, ищу другой подходящий вариант для моих целей. Набор - TIBQuery.
  • junglecat © (16.05.15 16:03) [22]
    totalCount = select count(*) from table1
    fetchedCount = grid.rows.count
    if (fetchedCount = totalCount) then
     showmessage('Выбрано все, я гарантирую это')
  • sniknik © (16.05.15 21:05) [23]
    > showmessage('Выбрано все, я гарантирую это')
    вот и зря... сразу после запроса на количество, могут запись вставить. если конечно не монопольно работаешь.
    +
    grid.rows.count
    это то что я думаю? грид, не дата/рекордсет. тогда каунт вернет только видимое количество записей, например 20 хотя в рекордсете уже 200 например. dbгрид  это не стринггрид.
  • junglecat © (16.05.15 21:21) [24]
    > [23] sniknik ©   (16.05.15 21:05)

    ну это псевдокод. идея-то, я думаю, понятна
  • Денис Комаров © (17.05.15 21:51) [25]

    > ложная задача поверь.

    +1
    А при больших объемах еще и вредная.
    Нельзя давать пользователю то что он хочет, нужно только необходимое
  • Дмитрий Белькевич © (19.05.15 11:17) [26]
    Сделал так, работает, похоже, как нужно:


    type
    TMakhIBQuery = class(TIBQuery)
    private
     FAllFetched: boolean;
    protected
     function GetRecord(Buffer: TRecordBuffer; GetMode: TGetMode; DoCheck: boolean): TGetResult;
      override;
     procedure InternalOpen; override;
    public
     property AllFetched: boolean Read FAllFetched Write FAllFetched;
    end;

    function TMakhIBQuery.GetRecord(Buffer: TRecordBuffer; GetMode: TGetMode; DoCheck: boolean): TGetResult;
    begin
    Result := inherited;
    if Result = grEOF then
     FAllFetched := True;
    end;

    procedure TMakhIBQuery.InternalOpen;
    begin
    inherited;
    FAllFetched := False;
    end;



    Всем спасибо, комментарии к коду приветствуются.
  • Дмитрий Белькевич © (19.05.15 11:19) [27]
    хотфикс :)


     property AllFetched: boolean Read FAllFetched;
  • Дмитрий Белькевич © (08.06.15 11:44) [28]
    Еще немного, не всегда срабатывало:


    type
    TMakhIBQuery = class(TIBQuery)
    private
     FAllFetched: boolean;
    protected
     function GetRecord(Buffer: TRecordBuffer; GetMode: TGetMode; DoCheck: boolean): TGetResult;
      override;
     procedure InternalOpen; override;
     procedure InternalLast; override;
    public
     property AllFetched: boolean Read FAllFetched;
    end;

    { TMakhIBQuery }

    function TMakhIBQuery.GetRecord(Buffer: TRecordBuffer; GetMode: TGetMode; DoCheck: boolean): TGetResult;
    begin
    Result := inherited;
    if Result = grEOF then
     FAllFetched := True;
    end;

    procedure TMakhIBQuery.InternalLast;
    begin
    inherited;
    FAllFetched := True;
    end;

    procedure TMakhIBQuery.InternalOpen;
    begin
    inherited;
    FAllFetched := False;
    end;

 
Конференция "Базы" » Как узнать - выбрался ли весь набор?
Есть новые Нет новых   [118573   +14][b:0][p:0.001]