Components for Delphi and C++ Builder.

Перейти в английский форум
Перейти на EhLib.com
Текущее время: 27 апр 2024, 18:28

Часовой пояс: UTC




Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
 Заголовок сообщения: MemTableEh + IBXDataDriverEh+IBQuery+IBUpdateSQLW
СообщениеДобавлено: 19 янв 2024, 12:24 
Не в сети

Зарегистрирован: 28 мар 2023, 00:40
Сообщений: 4
Добрий день. Имеется вот такая связка компонентов :
DBGridEh+MemTableEh + IBXDataDriverEh+IBQuery+IBUpdateSQLW ->IBDatabase
DBGridEh1>MemTableEh
DBGridEh2>IBQuery

IBQuery1.CachedUpdates:=true;
IBXDataDriverEh.KeyFields=ID;



Задача : При визове метода MemTableEh.refresh извлечь кеширование данние не используя Sql сервер, а взять их их из IBQuery.Dataset

Для етого переписал метод в IBXDataDriverEh.onReadRecord

procedure TMainFormf.IBXDataDriverEh1ReadRecord((DataDriver: TDataDriverEh; MemTableData: TMemTableDataEh; MemRec: TMemoryRecordEh);
var i: integer;
begin

IBQuery1.Locate('ID', MemRec.DataValues['ID', dvvValueEh], []);
with IBXDataDriverEh1.ProviderDataSet do
begin
for I := 0 to FieldDefs.Count-1 do
MemRec.DataValues[FieldDefs[i].Name, dvvValueEh]:=FieldValues[FieldDefs[i].Name];
next;
end;

end;

Запустил програмку, в режиме .CachedUpdates меняю несколько записей в IBQuery и визиваю MemTableEh.refresh , для обновление даних, под Debug посмотрел вроде все Ок MemTableEh.onRefreshRecord срабативает, корректно возвращает значение, но потом в конце (висит для отладки IBSqlMonitor) визивается Sql запрос , которий возвращает обновленную с сервера текущую запись с IBQuery , на которой в даний момент стоит курсор в DBGridEh. Согласно описанию, ето не должно било бить. В чем подвох? Кто визивается Sql запрос?

Ps. Пробивал использивать собитие IBXDataDriverEh.onRefreshRecord (MemTableEh.refresh) почемуто даже не срабативает.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: MemTableEh + IBXDataDriverEh+IBQuery+IBUpdateSQLW
СообщениеДобавлено: 21 янв 2024, 23:17 
Не в сети

Зарегистрирован: 21 дек 2011, 18:48
Сообщений: 1549
Добрый день.
Цитата:
Запустил програмку, в режиме .CachedUpdates меняю несколько записей в IBQuery и визиваю MemTableEh.refresh , для обновление даних,
Напишите, пожалуйста, зачем вы после изменения данных в режиме CachedUpdates вызываете MemTableEh.Refresh?
Какого результата вы хотите добиться?
Если вы хотите отправить измененные на клиенте данные на сервер, то надо вызывать MemTableEh.ApplyUpdates.

_________________
Best regards
EhLib support Team


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: MemTableEh + IBXDataDriverEh+IBQuery+IBUpdateSQLW
СообщениеДобавлено: 25 янв 2024, 09:13 
Не в сети

Зарегистрирован: 28 мар 2023, 00:40
Сообщений: 4
Добрий день. Идея била в следущем : Есть много таблиц справочников, чтоби постоянно не перечитивать данние с SQL сервера, все внутренние справочники, а также, их изменение и дополнение производится через таблицу IBQuery+IBUpdateSQLW ->IBDatabase. Потом, через MemTableEh>IBXDataDriverEh>(IBQuery+IBUpdateSQLW ->IBDatabase) уже там, в MemTableEh применяю фильтри, описиваю Lookup поля. Запись непосредственно в Sql будет короткой.
wrTransaction.Start;
IBQuery.ApplyUpdates;
wrTransaction.Commit;

Так, как к IBQuery может бить подключено несколько IBXDataDriverEh, на которие ссилаются MemTableEh.ProviderDataSet. то если произошли изменения в IBQuery, данние в подключенних MemTableEh>IBXDataDriverEh>IBQuery не обновляются.
Пока Проблему решил так, может комуто будет полезним.

Переписал IBQuery :

Код:

  TTcIBQuery = class(TIBQuery)
  private
    fRefreshSqlOnCUMode : boolean; //True -Запрос посилается на Sql Сервер False - Дание загружаются из DataSetа (Только в режиме CashedUpdates);
    { Private declarations }
  protected
    { Protected declarations }
    procedure InternalRefresh; override;
  public
    procedure RefreshLinkedMemTables;            /// Refresh всех Таблиц типа TMemoryTableEh у кторих MemTableEh.ProviderDataSet=TTcIbQuery;
    { Public declarations }
  published
    property RefreshSqlOnCUMode : Boolean Read fRefreshSqlOnCUMode Write fRefreshSqlOnCUMode default False;
    { Published declarations }
  end;

procedure Register;

implementation
  uses Vcl.Forms, MemTableEh, IBXDataDriverEh;

procedure TTcIBQuery.InternalRefresh;
begin
  if CachedUpdates then
  begin
     if fRefreshSqlOnCUMode then
          inherited InternalRefresh;
  end
        else
  inherited InternalRefresh;
end;

procedure TTcIBQuery.RefreshLinkedMemTables;
Var i,j     : Integer;
    CurId   : Longint;
    MyQuery : TTcIBQuery;
    MyDataDriver : TIBXDataDriverEh;
    MyBookMark : TBookMark;
begin

  DisableControls;
  MyBookMark:=Self.GetBookmark;
  MyQuery:=Self;
  for i:=0 to Application.ComponentCount-1 do
    if (application.Components[i] is tForm) then
      for j:=0 to  (application.Components[i] as tForm).ComponentCount-1 do
        if (application.Components[i].Components[j] is TMemTableEh) then
          if  Assigned(TMemTableEh(application.Components[i].Components[j]).DataDriver) then
            if (TMemTableEh(application.Components[i].Components[j]).DataDriver is TIBXDataDriverEh) then
            begin
              MyDataDriver:=(TMemTableEh(application.Components[i].Components[j]).DataDriver as TIBXDataDriverEh);
              if Assigned( MyDataDriver.ProviderDataSet) then
                if MyDataDriver.ProviderDataSet=myQuery   then
                  with TMemTableEh(application.Components[i].Components[j]) do
                     if ((not Eof) and (not Bof)) then
                     begin
                       CurId:=FieldByName('ID').AsLargeInt;
                       DisableControls;
                       Refresh;
                       Locate('ID',CurId,[loCaseInsensitive]);
                       EnableControls;
                     end;
            end;
  Self.GotoBookmark(MyBookMark);
  EnableControls;
end;

procedure Register;
begin
  RegisterComponents('TC Components', [TTcIBQuery]);
end;
]

Теперь следующий нюанс. Написал обработчик изменений :

IBXDataDriverEhUpdateRecord
...
case MemRec.UpdateStatus of
usModified :
usInsert :
usdelete :
....
end;

Срабативает только при изменении usModified или удалении записи usdelete , usInsert - не срабативает , видает ошибку Field ID Must Have f value
Как правильно обработать вставку новой записи ?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: MemTableEh + IBXDataDriverEh+IBQuery+IBUpdateSQLW
СообщениеДобавлено: 26 янв 2024, 15:24 
Не в сети

Зарегистрирован: 21 дек 2011, 18:48
Сообщений: 1549
Добрый день.

Каким образом данные напрямую меняются в IBQuery?
Если используется связка MemTableEh -> IBXDataDriverEh то все внутренние запросы, необходимые для обращения к серверу создаются и удаляются автоматически внутри компонента IBXDataDriverEh.
Разработчик либо открывает и считывает данные с сервера с помощью команды MemTableEh.Open.
Либо меняет данные в MemTableEh и отправляет данные на сервер через команду MemTableEh.ApplyUpdates.

В связке MemTableEh -> XXXDataDriverEh используется только три сценария:
1. Считать все данные c сервера MemTableEh.Open
2. Отправить изменения на сервер MemTableEh.ApplyUpdates.
3. Пересчитать данные с сервера для одной записи MemTableEh.RefreshRecord.

_________________
Best regards
EhLib support Team


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 

Часовой пояс: UTC


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 16


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB