-
Сущевует ли у датасета или грида какое-то публичное свойство, которое указывает, что датасет выбрал (отфетчил) весь набор данных?
-
База - FB 2.1, если что.
-
нафига это знать?
начни бежать сверху вниз и всегда дойдешь до самого конца выборки.
а если тебе это не надо, то не надо и знать вся она уже или не вся прилетела.
-
> Сущевует ли у датасета или грида какое-то публичное свойство,
> которое указывает, что датасет выбрал (отфетчил) весь набор
> данных?
DataSet.Eof; :)
А вообще:
with DataSet do
begin
Open;
Last;
// Вот тут вот - всё выбрано.
end;
Если TIBSQL будешь использовать, то аля-улю, он однопроходный.
-
у ADO датасета ExecuteOptions = [] однозначно показывает что выбралось все сразу после команды Open, в других есть не свойство но событие прогресса и окончания выборки.
с базой - FB 2.1 можно работать через ADO, если что.
-
>нафига это знать?
нужно для некоторых интерфейсных решений знать, выбралось уже всё, или еще что-то будет выбираться.
>DataSet.Eof
да, смотрел в первую очередь. срабатывает только если курсор грида стоит на последней записи, иначе - не eof.
>Вот тут вот - всё выбрано.
не стоит задача выбрать всё. стоит задача определить - выбралось ли всё или нет.
спасибо всем, еще может мысли будут.
-
да, я думал событие ловить, вроде бы что-то такое было. если других вариантов нет - придется делать внутренний флаг и ловить.
-
не стоит задача выбрать всё. стоит задача определить - выбралось ли всё или нет.
ложная задача поверь.
если выбирать всего не нужно, то сами данные "конца выборки" - не нужны.
значит абсолютно пофик должно быть, все выбралось или нет.
-
поверь, задача истинная. нужно юзерам разное показывать, в зависимости от того, выбралось всё или нет. юзеры так хотят. юзеры за это платят, значит задача истинная - всё просто 1:)
-
ок, последним постом ты убедил меня окончательно.
задача твоя ЛОЖНАЯ
-
моя задача истинная, я гарантирую это! :)
-
покажи юзеру такое сразу после оупена:
"все уже загрузилось целиком, гарантирую это! Если не верите, пройдите в самый конец по Ctrl+PGDown"
-
Дмитрий Белькевич © (15.05.15 15:54) [8]
> юзеры за это платят
Нельзя ли подробнее о задаче ?
-
> стоит задача определить - выбралось ли всё или нет.
Ковырять конкретный потомок TDataSet, остальное от лукавого.
-
Нельзя ли подробнее о задаче ?
там наверняка что-то типа
когда грид еще не наполнился всеми данными он пусть будет красный.
а когда уже наполнился, пусть будет белым чтобы было понятно, что можно листать в конец.
-
Задача неверно поставлена, а также - реализация.
-
> Дмитрий Белькевич © (15.05.15 15:54) [8]
> поверь, задача истинная. нужно юзерам разное показывать,
> в зависимости от того, выбралось всё или нет. юзеры так
> хотят. юзеры за это платят, значит задача истинная - всё
> просто 1:)
Для "юзера", если он видит данные, то все данные загружены. Не верит, пусть докажет обратное.
PS. Не юзерего дело следить за закачкой данных, подозреваю, что он за другое зарплату получает.
-
> [5] Дмитрий Белькевич © (15.05.15 15:49)
> >DataSet.Eof
>
> да, смотрел в первую очередь. срабатывает только если курсор грида стоит на последней записи, иначе - не eof.
Это означает, что разработчики не допустили ошибки в функции Eof().
-
> [5] Дмитрий Белькевич © (15.05.15 15:49)
> курсор грида
Этот момент я сразу не увидел. Значит, разработчики функции, таки, допустили ошибку.
-
Eof метод документирован ещë со времëн царя гороха и, как в справке написано, показывает только то, что текущая запись в наборе данных является последней и больше ничего.
-
А что, если вообще визуально не отображать DBGrid (Visible:= False), до "отработки" запроса?
-
Господа, я знаю, как работает Eof, я его попробовал, увидел, что не подходит, ищу другой подходящий вариант для моих целей. Набор - TIBQuery.
-
totalCount = select count(*) from table1
fetchedCount = grid.rows.count
if (fetchedCount = totalCount) then
showmessage('Выбрано все, я гарантирую это')
-
> showmessage('Выбрано все, я гарантирую это')
вот и зря... сразу после запроса на количество, могут запись вставить. если конечно не монопольно работаешь.
+
grid.rows.count
это то что я думаю? грид, не дата/рекордсет. тогда каунт вернет только видимое количество записей, например 20 хотя в рекордсете уже 200 например. dbгрид это не стринггрид.
-
> [23] sniknik © (16.05.15 21:05)
ну это псевдокод. идея-то, я думаю, понятна
-
> ложная задача поверь.
+1
А при больших объемах еще и вредная.
Нельзя давать пользователю то что он хочет, нужно только необходимое
-
Сделал так, работает, похоже, как нужно:
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;
Всем спасибо, комментарии к коду приветствуются.
-
хотфикс :)
property AllFetched: boolean Read FAllFetched;
-
Еще немного, не всегда срабатывало:
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;