Arial Century Courier Georgia Tahoma Verdana Times New Roman
-
+
var
Fields: TList;
KeyValues: Variant;
KeyNames: String ;
Bmk: TBookmark;
I: Integer;
BookmarkFound: Boolean;
CanLocate: Boolean;
begin
Fields := TList.Create;
if KeyFields = '' then KeyFields := GetFieldNamesStr(Query);
try
Query.GetFieldList(Fields, KeyFields);
for I := Fields.Count - 1 downto 0 do with TField(Fields[I]) do
if Calculated or Lookup then Fields.Delete(I);
CanLocate := Fields.Count > 0;
if CanLocate then begin
if Fields.Count = 1 then KeyValues := TField(Fields[0]).Value
else begin
KeyValues := VarArrayCreate([0, Fields.Count - 1], varVariant);
KeyValues[0] := TField(Fields[0]).Value;
end ;
KeyNames := TField(Fields[0]).FieldName;
for I := 1 to Fields.Count - 1 do begin
KeyNames := KeyNames + ';' + TField(Fields[I]).FieldName;
KeyValues[I] := TField(Fields[I]).Value;
end ;
end ;
finally
Fields.Free;
end ;
with Query do begin
Bmk := nil ;
DisableControls;
try
BookmarkFound := False;
if BookMarkSearch then Bmk := GetBookmark;
Close;
Open;
if Assigned(Bmk) then try
GotoBookMark(Bmk);
BookmarkFound := True;
except
end ;
if not BookmarkFound and CanLocate then Locate(KeyNames, KeyValues, []);
finally
EnableControls;
Screen.Cursor := crDefault;
FreeBookmark(Bmk);
end ;
end ;
end ;
procedure TQuery.RefreshParams;
var DataSet: TDataSet;
begin
DisableControls;
try
if FDataLink.DataSource <> nil then begin
DataSet := FDataLink.DataSource.DataSet;
if DataSet <> nil then
if DataSet.Active and (DataSet.State <> dsSetKey) then
DoRefreshQuery(Self, GetFieldNamesStr(Self), False);
end ;
finally
EnableControls;
end ;
end ;
Как
заставить BDE сохранять в БД поле времени с сотыми долями секунды?
Nomadic отвечает:
Если руками, то в BDE Administrator (BDE Configuration Utility).
Если при инсталляции твоей программы, то –
В пункте Make Registry Changes InstallShield'а создай ключ
HKEY_LOCAL_MACHINE\SOFTWARE\Borland\Database Engine\Settings\SYSTEM\FORMATS\TIME\MILSECONDS=TRUE
Запись буфера BDE на диск
Общее :
Сделанные в таблице изменения непосредственно на диск не записываются до тех пор, пока таблица не будет закрыта. Потеря питания или сбой в системе может привести к потере данных и прочим неприятностям. Чтобы избежать этого, существует два прямых вызова Database Engine, дающих один и тот же результат. Эти функции – DbiUseIdleTime и DbiSaveChanges.
DbiSaveChanges(hDBICur) :
DbiSaveChanges сохраняет на диске все обновления, находящиеся в буфере таблицы, связанной с курсором (hDBICur). Может быть вызвана из любого места программы. Например, можно при каждом обновлении записи сохранять на диске все изменения (добавьте dbiProcs в список используемых модулей):
procedure TForm1.Table1AfterPost(DataSet: TDataSet);
begin
DbiSaveChanges(Table1.handle);
end ;