Dodanie rekordu do bazy w którym jedno z pól to aktualny autoincrement

0

Cześć,

chcę dodać do bazy Microsoft SQL Server rekord (FireDAC). Baza posiada pole ID z auto inkrementacją.
Chciałbym aby dodając rekord w jednym z pól wpisać od razu tą wartość auto inkrementacji.

Dodawanie rekordu (wersja oczywiście mocno uproszczona ale pokazuje mój problem):

try
  with frmDM.qryTemp, SQL do
    begin
      frmDM.trnTransaction.StartTransaction;
      Close;
      Clear;
      Add('INSERT INTO Grupy (Skrot, Nazwa, NIP)');
      Add('VALUES (:Skrot, :Nazwa, :NIP)');
      if edtSkrot.Text = '' then
        ParamByName('Skrot').AsString := IntToStr('wartość auto inkrementacji); // tutaj mam problem
      else
        ParamByName('Skrot').AsString := Trim(edtSkrot.Text);
      ParamByName('Nazwa').AsString := Trim(edtNazwa.Text);
      ParamByName('NIP').AsString := edtNIP.Text;
      ExecSQL;
      frmDM.trnTransaction.Commit;
    end;

  with frmDM.qryTemp, SQL do // tutaj sobie odczytuję wartość auto inkrementacji dla późniejszych potrzeb, ale to już po ptakach
  begin
      Close;
      Clear;
      Add('SELECT @@IDENTITY');
      Open;
      First;
      rekord := frmDM.qryTemp.Fields[0].AsInteger;
    end;

except
  frmDM.trnTransaction.Rollback;
end;

Znacie jakiś sposób żeby poznać wartość auto inkrementacji przed użyciem jej? No i musi to być odporne na pracę wielostanowiskową.

1

Więc w którym wierszu powyższego kodu potrzebujesz znać Id przyszłego rekordu?

2

Nie wiem czy w FireDAC to przejdzie ale w SDAC działa:

try
  with frmDM.qryTemp, SQL do
  begin
    frmDM.trnTransaction.StartTransaction;
    Close;
    Clear;
    Add(' declare @id numeric ');
    Add(' INSERT INTO Grupy (Skrot, Nazwa, NIP) ');
    Add(' VALUES (:Skrot, :Nazwa, :NIP) ');
    Add(' select @id=scope_identity() ');
    Add(' if :Skrot='''' ' ); //jeżeli skrót jest pusty
    Add(' update Grupy set Skrot=convert(varchar(20), @id) where [email protected] '); //to ustaw id
    Add(' select @id id ');
    ParamByName('Skrot').AsString := Trim(edtSkrot.Text);
    ParamByName('Nazwa').AsString := Trim(edtNazwa.Text);
    ParamByName('NIP').AsString := edtNIP.Text;
    Open;
    rekord := frmDM.qryTemp.FieldByName('id').AsInteger;
    Close;
    frmDM.trnTransaction.Commit;
  end;
except
  frmDM.trnTransaction.Rollback;
end;
0
robertz68 napisał(a):

Cześć,

chcę dodać do bazy Microsoft SQL Server rekord (FireDAC). Baza posiada pole ID z auto inkrementacją.

Identity czy sekwencja?
Bo to różnica.
Dla identity możesz to odczytać jak Ci pokazano, ale PO wygenerowaniu wartości ID.
Dla sekwencji wartość można sobie pobrać w dowolnym momencie.

A poza tym tak już jest jak się nie zna narzędzi z których się korzysta:
https://docwiki.embarcadero.com/RADStudio/Sydney/en/Auto-Incremental_Fields_(FireDAC\

Chciałbym aby dodając rekord w jednym z pól wpisać od razu tą wartość auto inkrementacji.

Dodawanie rekordu (wersja oczywiście mocno uproszczona ale pokazuje mój problem):

Widzę konstrukcję with i to jeszcze wielokryterialną i już dalej nie czytam....

Znacie jakiś sposób żeby poznać wartość auto inkrementacji przed użyciem jej? No i musi to być odporne na pracę wielostanowiskową.

Znacie kilka.
A FireDAC załatwia temat prawie sam (również dla master-detail), trzeba go tylko użyć zgodnie z wymaganiem.

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