[Propozycje] Generator ID tabeli

0

Za bardzo nie mogłem się odnaleźć w google. Sprawa jest następująca:

  • silnik bazy: MS SQL Server 2005 (wersja express)
  • kompilator: Turbo Delphi
  • komponenty: paleta ADO.

Generalnie chodzi i mechanizm generowania niepowtarzalnego ID dla danej tabeli. Generalnie pytanie zawęża się do kwestii czy jest gotowy generator (bo właśnie tu poległem na szukaniu) czy może jest lepsze rozwiązanie problemu niż moja propozycja.

ADOTable.Last();  
MyID := ADOTable.FieldByName('ID').AsInteger + 1;
0

Twoja propozycja sprawdzi się tylko wtedy, gdy tabela będzie posortowana według pola ID, ponieważ tylko wtedy największa wartość będzie występować jako ostatnia.
Nie wiem czy dobrze pamiętam, ale w SQLServerze jest chyba możliwość tworzenia pól, których wartość zwiększa się automatycznie

0

To wiem. Tu patrzę, że nie napisałem. Chciałbym mieć ustalone ID już na poziomie interfaceu usera. Uprości mi to troszkę walidację danych. Normalnie wszystko jest ok. Podczas operacji insert pomijam pole ID i generator robi to za mnie. Problem jest z wartościami referencyjnymi gdzie tabela przechowuje np. ID pracownika. Mogę wykorzystać Locate() i pobrać ID ale chciałem wszystkie wartości ustalić i zatwierdzieć jednym Post() a nie Insert(), Locate(), Post(), Insert(), Post().

Mówiąc w skrócie - generowanie ID na poziomie komponentu ADO

0

Pobieraj wartość MAX z pola ID, wtedy Cię nie interesuje sortowanie.
Wartość zapisuj do zmiennej lub Edit i dodawaj do niej 1.
Ja taki sposób wykorzystuję w każdej swojej aplikacji bazodanowej i sprawdza się idealnie.
Ot taki autoinkrement sobie wyskrobałem. :-)
Tylko przerób sobie na swoje komponenty, bo ja tam lecę na Firebird/IBX.

begin
   with IBQuery1, SQL do
    begin
     Close;
      Clear;
       Add('SELECT MAX (ID) FROM BAZA');
       Open;
      Edit1.Text:=IntToStr(IBQuery1.Fields[0].AsInteger + 1);
    end;
end;
0

Dzięki bardzo. Coś takiego w zupełności wystarczy. [soczek]

0

Z tym, że mając podłączonych kilku klientów do bazy, jeśli akcja będzie wykonana w tym samym czasie dostaniesz 2 razy to samo id.

0

Z tym, że mając podłączonych kilku klientów do bazy, jeśli akcja będzie wykonana w tym samym czasie dostaniesz 2 razy to samo id.

Szukasz problemu w banałach. :-)
W przypadku podwójnego tego samego ID, zamieniaj na pierwszy wolny przed dodaniem rekordu. :-)

0
RedbaK napisał(a)

Szukasz problemu w banałach. :-)
W przypadku podwójnego tego samego ID, zamieniaj na pierwszy wolny przed dodaniem rekordu. :-)

ROTFL - niezawodny system ...

0

O tym nie pomyslałem. Jednak ten problem ominę. Mała firma. Serwer lokalny. Struktura organizacyjna sprawiająca, że jeszcze się nie zdarzyło aby dwie osoby wprowadzały dane (system firmy to utrudnia). Dodatkowo wprowadzę, zmienną odpowiedzialną za stan edycja-read only. Dzięki temu podczas wprowadzania wszelkie operacje inne niż SELECT będą zablokowane.

1 użytkowników online, w tym zalogowanych: 0, gości: 1