Procedure TableNewRecord(FieldName: String; Var DataSet: TDataSet);
Var
NumRec: Integer;
bm: TBookmark;
Begin
with DataSet do
begin
NumRec := Succ(RecordCount);
if State = dsInsert then Post;
bm := GetBookMark;
DisableControls;
while Locate(FieldName, NumRec, []) and (NumRec > 0) do
Dec(NumRec);
if NumRec = 0 then
begin
NumRec := RecordCount;
while Locate(FieldName, NumRec, []) do
Inc(NumRec);
end;
GotoBookmark(bm);
FreeBookmark(bm);
Edit;
FieldByName(FieldName).AsInteger := NumRec;
Post;
EnableControls;
end;
End;
Комментарий
от Max
Для генерации првичного ключа в локальных баз я делал
следующее:
tbSystem - TTable с установленным exclusive =
true
следующе структуры
Table Char(15),
Field
Char(32),
Value Char(32)
туда записывааем по одной записи
на каждуй первичный
ключ
'TBL1','ID_TBL1','0'
'TBL2','ID_TBL2','1000'
В
результате получается что то типа генераторов в SQL
function TDMSystem.Get_ID(TableName, FieldName :string; LengthField : integer) : string;
Var
OpenFlag : boolean;
i,tmpi : integer;
A : Variant;
tmp : string;
begin
Result := '-1';
OpenFlag:=false;
i:=0;
while ( (ido
begin
try
tbSystem.Open;
OpenFlag := true;
except
OpenFlag := false;
delay(500);
end;
inc(i);
if (i>=MAX_LOCK) then
if Application.MessageBox(
'Не могу открыть системную таблицу'+chr(10)+'Повторить ?',
'Ошибка открытия', MB_YESNO) = idYes then i:=0;
end;
if (OpenFlag) then
begin
A := VarArrayCreate([0, 1], varVariant);
a[0]:=TableName;
a[1]:=FieldName;
if tbSystem.Locate('TABLE;FIELD',A,[]) then
begin
tmp := tbSystem.FieldValues['VALUE'];
tmpi := StrToInt(tmp);
inc(tmpi);
tmp := AddChar('0',delspace(IntToStr(tmpi)),LengthField);
tbSystem.Edit;
tbSystem.FieldValues['VALUE']:=tmp;
tbSystem.Post;
Result := tmp;
end;
end;
tbSystem.Close;
end;
Комментарий
от "Serg" (mail@pi8plus.ru)
Вот мой вариант получения очередного
уникального ( возрастающего) ID
По полю FieldName строится уникальный
индекс
Заодно скажу, что использование AutoInc не есть мудрое
решение.
А если надо пересобрать таблицы ?
{ Get max key value}
function quGetMaxID_(tbName,FieldName: String): LongInt;
begin
with TQuery.Create(nil) do
try
DatabaseName := DBname;
SQL.Add('SELECT MAX('+FieldName+') FROM ' + QuotedStr(tbName));
Open;
result := Fields[0].AsInteger + 1;
finally
Close;
Free;
end;
end;
{ insert new record and return new ID value}
function quInsertBlankSQL_(tbName,fName: string; var id: Longint): boolean;
var
i: integer;
begin
Result := False;
for i:=1 to RepeateAccess do begin
id := quGetMaxID_(tbName,fName);
Result := quInsertKeySQL_(tbName,fName,id);
if Result then Break;
end;
end;
{ Insert record for ID}
function quInsertKeySQL_(tbName, KeyField: string; KeyValue: Longint): boolean;
var
i: integer;
str: string;
begin
Result := False;
str := 'INSERT INTO '+tbName+' ('+ KeyField + ')'+ ' VALUES ('+IntToStr(KeyValue)+')';
for i:=1 to gRptAccess do begin
Result := quExecuteSQL_(str);
if Result then Break;
end;
end;
function quExecuteSQL_(SQLstring: string): boolean;
begin
with quCreateTmp_(SQLstring) do
begin
try
ExecSQL;
Result := True;
except
on E: Exception do begin
Result := False;
end;
end;
Free;
end;
end;
function quCreateTmp_(SQLstring: string): TQuery;
begin
Result:= TQuery.Create(nil);
with Result do
begin
DatabaseName := DBname;
SQL.Text := SQLString;
end;
end;
|
Copyright ©
"Мастера DELPHI" E-mail:
delphi@mastak.com
http://www.delphimaster.ru |
Источник получения информации: http://www.delphimaster.ru
|