Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Мастера DELPHI. Новости мира компонент, FAQ, статьи...


Информационный Канал Subscribe.Ru

Ежедневная рассылка сайта Мастера DELPHI

DELPHIMASTER.ru

Выпуск от 08.05.04 09:05

Кое-что из нашей кладовки   |x|
Лучшее из нашего FAQ   |x|
Создание уникального поля

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;


Комментарий от Max


 Для генерации првичного ключа в локальных баз я делал следующее:

 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 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;
  & 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;

»»» Прислать свои комментарии

Обсуждается в конференциях   |x|
  • Как заставить контрол сделать RePaint?
    Как заставить контрол сделать RePaint? Я имею в виду в KOL.
  • 3D - куб
    Уважаемые мастера, как мне изобразить на плоскости (в TBitmap) куб, если известная его сторона и координаты его центра ...
  • Account information
    Здрасте мастера.Может кто-нибудь знает как узнать инфу[имя,..] о юзере на локальном компе, GetUserName не подходит т.к. ...
  • ShellExecute ?
    Народ, нужна помощь! Бьюсь уже n-ый день... Трабла вот в чем: я запускаю программу ( либо файл какой-либо) через ...
  • Помогите с написанием интересной игры ???
    Помогите пожалуйста!!! Нужно очень написать такую вот игруху... Landmine Полезная игра на развитие зрительной памяти. ...
  • Вопрос по фильтрации
    Есть два условия для фильтра: 1) Table1.Filter:='Fam ='''+Edit1.text+'*''and konec<'+ quotedstr(datetostr(date)); ...
  • IP scanner
    Как в Delphi5 просканить IP-диапозон и найти конкретный порт?
У нас большой выбор статей   |x|
Эксплуатационные режимы использования динамически компонуемых библиотек.
В данной статье речь пойдёт, не о том как писать dll, а о том как их можно использовать.
Новинки книжного рынка   |x|
Компьютерная графика. Энциклопедия
Книга адресована тем, кто хотел бы расширить свои профессиональные возможности в области компьютерной графики, в первую очередь: дизайнерам, иллюстраторам, художникам, разработчикам web-сайтов, а также всем желающим поближе познакомиться с увлекательным миром компьютерной графики и анимации. Прочитав ее, вы будете легко ориентироваться в разнообразии современных графических программ, овладеете популярными редакторами для создания растровой и векторной графики, познакомитесь с основами дизайна. Книга снабжена большим количеством примеров, иллюстрирующих работу различных графических программ, ее можно использовать и как учебник, и как подробное справочное руководство.
Автор: Рейнбоу В.
Другие сайты о DELPHI   |x|
Персональный сайт Вадима Исаенко
На данном сайте Вы найдете информацию об авторе и его программах, написанные на Pascal и Delphi. Также есть другая информация, не связанная с программированием.

» Оценка сайта: 2
Опрос населения :)
Образование программиста?
»»» Высшее
»»» Незаконченное высшее
»»» Среднее специальное
»»» Среднее
Для души

Хокку дня
Ветер листву пролистал на дороге,
Быстро умчался…
А снег прочитал.

Афоризмы
Предъявляя кому либо ультиматум, будь готов, что ультиматум будет принят....

Фраза дня
Красивая девушка особенно хорошо смотрится на фоне умной подруги.

Дурацкие законы (информация предоставлена сайтом kurilka.com)
В Монтане (США) нельзя показывать фильмы со сценами преступлений. (Что же они смотрят?)
В Небраске (США) владельцам баров можно продавать пиво, только если в баре варится для посетителей суп.

И на закуску коротенький анекдот
Белая ночь! Дамы приглашают кавалеров!

Фотоприколы.
Начните день с хорошего настроения!
http://www.delphimaster.ru/cgi-bin/prikol.pl?id=4921


На этом позвольте откланяться и пожелать вам удачного дня.
Искренне ваш, Алексей (merlin@delphimaster.ru)

Добро пожаловать на сайт -= Мастера DELPHI =- 


http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу


В избранное