На главную
Подписка
Новости


Рейтинг@Mail.ru











Главная / DELPHI / Часто задаваемые вопросы и ответы на них / Разработка баз данных / Создание уникального поля Сделать домашней страницей Добавить в избранное Написать писмо

Создание уникального поля



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
Hosted by uCoz