Добрий день. Идея била в следущем : Есть много таблиц справочников, чтоби постоянно не перечитивать данние с 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
Как правильно обработать вставку новой записи ?