Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Сгенерировать пересчет всех полей


Автор: Delphist 16.9.2008, 13:42
К сожалению, на данный момент я использую компоненты FIBs, это урезанный аналог FIBPlus. Для принудительного пересчета полей я использую процедуру типа:
Код

procedure
  TfmAbstDict.EmulCalcFields(DataSet: TDataSet);
var
  bm: TBookmark;
  PROC_AP: TDataSetNotifyEvent;
begin

  {Эммулируем срабатывания события OnCalcFields}
  if IsDSActiveAndNotEmpty(DataSet) and Assigned(DataSet.OnCalcFields) then
  begin
    PROC_AP := DataSet.AferPost;
    DataSet.AferPost := nil;
    DataSet.DisableControls;
    if DataSet is TFIBDataSet then
      TFIBDataSet(DataSet).DisableScrollEvents;   
    bm := DataSet.GetBookmark;
    try
      DataSet.First;
      while not DataSet.Eof do
        DataSet.Next;
    finally
     if DataSet.BookmarkValid(bm) then
     begin
       DataSet.GotoBookmark(bm);
       DataSet.FreeBookmark(bm);
     end;
     if DataSet is TFIBDataSet then
       TFIBDataSet(DataSet).EnableScrollEvents;
     DataSet.EnableControls;
    end;
  end;
end;

Вопрос - можно ли оптимизировать (ускорить работу) данной процедуры или может есть какой другой способ эмулирвание пересчета всех полей? 

Автор: Frees 16.9.2008, 13:47
Цитата(Delphist @  16.9.2008,  15:42 Найти цитируемый пост)
К сожалению, на данный момент я использую компоненты FIBs, это урезанный аналог FIBPlus

про FIBs не слыхал дай ссылку на их доку поглядать

в FIBPlus
RefreshClientFields выглядит так

Код

procedure TFIBCustomDataSet.RefreshClientFields(ForceCalc:boolean=True);
var 
  b:  TBookMarkStr;
  CurEof:boolean;
begin
   if IsEmpty then
   begin
     First;
     Exit;
   end;

   b:=Bookmark;
   CurEof:=Eof;
   DisableControls;
   DisableScrollEvents;
   if ForceCalc then
    Include(RunState,drsInRefreshClientFields);
   try
    Bookmark:=b;
    if CurEof then
     Next; // Restore Eof Flag only
   finally
    if ForceCalc then
     Exclude(RunState,drsInRefreshClientFields);
    EnableScrollEvents;
    EnableControls
   end;
end;

Автор: Delphist 16.9.2008, 14:08
Цитата(Frees @  16.9.2008,  14:47 Найти цитируемый пост)
в FIBPlus
RefreshClientFields выглядит так


FIBPlus у меня есть, я знаю, что эти компоненты хорошие, но пока использовать их в проекте я не могу по ряду причин.
На счет RefreshClientFields я в курсе но впиндюрить его код в FIBс так просто не получиться.
Прикрепляю мои FIBс

Автор: Frees 16.9.2008, 14:14
Цитата(Delphist @  16.9.2008,  16:08 Найти цитируемый пост)
На счет RefreshClientFields я в курсе но впиндюрить его код в FIBс так просто не получиться.

ну ты же пишеш процедуру  EmulCalcFields(DataSet: TDataSet); вот и сделай ее как у фибов

Код

procedure TfmAbstDict.EmulCalcFields(DataSet: TFIBCustomDataSet; ForceCalc:boolean=True);
var 
  b:  TBookMarkStr;
  CurEof:boolean;
  
begin
with DataSet do begin 
 if IsEmpty then
   begin
     First;
     Exit;
   end;

   b:=Bookmark;
   CurEof:=Eof;
   DisableControls;
   DisableScrollEvents;
   if ForceCalc then
    Include(RunState,drsInRefreshClientFields);
   try
    Bookmark:=b;
    if CurEof then
     Next; // Restore Eof Flag only
   finally
    if ForceCalc then
     Exclude(RunState,drsInRefreshClientFields);
    EnableScrollEvents;
    EnableControls
   end;
 end;
end;

Автор: Delphist 16.9.2008, 14:28
Цитата(Frees @  16.9.2008,  15:14 Найти цитируемый пост)
ну ты же пишеш процедуру  EmulCalcFields(DataSet: TDataSet); вот и сделай ее как у фибов

Я же говорю не так-то легко всунуть этот код т.к. архитектура fibc и fibplus отличается, например, нет RunState и т.д.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)