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 &n
bsp; Inc(NumRec); end; GotoBookmark(bm); FreeBookmark(bm); Edit; FieldByName(FieldName).AsInteger := NumRec; Post; EnableControls; end; End;
Для генерации првичного ключа в локальных баз я делал следующее:
tbSystem - TTable с установленным exclusive = true следующе структуры Table Char(15), Field Char(32), Value Char(32) туда записывааем по одной записи на каждуй первичный ключ 'TBL1','ID_TBL1','0' 'TBL2','ID_TBL2','1000'
В результате получается что то типа генераторов в SQL
<
br>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 По !
полю Fie
ldName строится уникальный индекс
Заодно скажу, что использование 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 dobegin 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 dobegin 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 dobegin
Result := False; end; &
nbsp;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;
Компьютерная графика. Энциклопедия
Книга адресована тем, кто хотел бы расширить свои профессиональные возможности в области компьютерной графики, в первую очередь: дизайнерам, иллюстраторам, художникам, разработчикам web-сайтов, а также всем желающим поближе познакомиться с увлекательным миром компьютерной графики и анимации. Прочитав ее, вы будете легко ориентироваться в разнообразии современных графических программ, овладеете популярными редакторами для создания растровой и векторной графики, познакомитесь с основами дизайна. Книга снабжена большим количеством примеров, иллюстрирующих работу различных графических программ, ее можно использовать и как учебник, и как подробное справочное руководство.
Автор: Рейнбоу В.
Персональный сайт Вадима Исаенко На данном сайте Вы найдете информацию об авторе и его программах, написанные на Pascal и Delphi. Также есть другая информация, не связанная с программированием.
» Оценка сайта: 2
Хокку дня
Ветер листву пролистал на дороге, Быстро умчался… А снег прочитал.
Афоризмы
Предъявляя кому либо ультиматум, будь готов, что ультиматум будет принят....
Фраза дня
Красивая девушка особенно хорошо смотрится на фоне умной подруги.
Дурацкие законы (информация предоставлена сайтом kurilka.com)
В Монтане (США) нельзя показывать фильмы со сценами преступлений. (Что же они смотрят?)
В Небраске (США) владельцам баров можно продавать пиво, только если в баре варится для посетителей суп.
И на закуску коротенький анекдот
Белая ночь! Дамы приглашают кавалеров!