Odczytanie niepowtarzalnego numeru rekordu

0

Witam,
mam problem z odczytaniem numeru rekordu.
Funckją IBTable.Recno odczytuje numer rekordu.
u mnie w programie, gdy kliknę tytuł kolumny następuje sortowanie. Następnie dodaje do bazy rekord, odświeżam IBTable i nowy rekord NP: Kazik
nie jest na ostatniej pozycji tylko gdzieś w środku. Recno ma dalej ten sam numer a nie ten gdzie jest rekord Kazik.
Chciałbym aby po dodaniu rekordu kursor na nim stał, lecz nie wiem jak uzyskać jego niepowtarzalne id.

Zna ktoś taką funkcję ? Męczę się z tym któryś dzień i nie mogę tego znaleźć.
Proszę o pomoc.

0

Musisz skorzystać z generatora tabeli, który własnie takowy numer nadaje. Najlepiej zastosować procedurę na bazie, której parametrami wejściowymi będą dane dla inserta, a parametrem zwrotnym będzie jego unikalne ID.

Przykład

CREATE PROCEDURE GET_UNIQUE_ID(
  DANA1 VARCHAR(20),
  DANA2 VARCHAR(20),
  DANA3 VARCHAR(20))
RETURNS(
  ID INTEGER)
AS
BEGIN 
   ID = GEN_ID(NAZWA_KOLUMNY_KLUCZA, 1);   

  -- insert do tabeli
  insert into tabela(id_klucz, pole1, pole2, pole3) values(:id, :dana1, :dana2, :dana3);

  SUSPEND; -- Wyświetl ID
end

W tym przypadku do bazy zrobi się odpowiedni wpis a Ty w rezultacie otrzymasz jego ID, który później możesz wykorzystać robiąc np.

Dataset1.Locate('id', wartosc_z_procedury, []);

aby zaznaczyć nowo dodany rekord.

Na pewno żadnym rozwiązaniem nie będzie zapytanie:

select max(id) from tabela

ponieważ w przypadku większych baz danych i pracy wielu użytkowników na jednej bazie, może się to rozjechać i możesz otrzymać inny ID niż ten z Twojego inserta.

Z procedury korzystasz przez komponent IBStoredProc, lub dataset/ibsql i wywołujesz (tylko dla Dataset lub IBSQL)

select id from get_unique_id(':dana1, :dana2, :dana3');
Dataset.Parambyname('dana1').AsString := ...

itd...

Natomiast do pola z ID zwrotnym komponentu IBStoredProc odwołujesz się przez:

IBStoredProc.FieldByName('id').AsInteger

zamiana znacznika <code class="delphi"> na <code class="sql"> - furious programming

0

@user322 a czy zadziała przy automatycznym generowaniu id ?
A przy okazji to wyświetla mi błąd, że nie jest zdefiniowana kolumna ID_DZIAL.

Moja tabela: DZIALY_INSTYTUCJI (ale nie wiem gdzie ja zdefiniować w tym kodzie) ?
Moje kolumny: ID_DZIAL, NAZWA - przy czym ID_DZIAL ma automatyczne generowanie id.
Jakby to mialo znaczenie to używam IBConsole.

CREATE PROCEDURE GET_UNIQUE_ID(
  DANA1 CHAR(30))
RETURNS(
  ID INTEGER)
AS
BEGIN
   ID = GEN_ID("ID_DZIAL", 1);

  insert into DZIALY_INSTYTUCJI("ID_DZIAL", "NAZWA") values(:id, :dana1);

  SUSPEND; 
end

dodanie znaczników <code class="sql"> oraz `` - furious programming

0

Jeżeli robisz insert i podajesz wartość dla kolumny klucza, która jest generowana automatycznie to generator nie zostanie wywołany automatycznie. Generator jest wywoływany domyślnie dla wartości NULL, zerknij do triggera before insert to zobaczysz dokładnie ten sam kod:

ID = GEN_ID("ID_DZIAL", 1);

Co do błędu to wdarł mi się chochlik bo pisałem z pamięci, w linijce GEN_ID("ID_DZIAL", 1); zamiast ID_DZIAL ma być nazwa generatora, która podejrzysz właśnie w triggerze.

Jakby to mialo znaczenie to używam IBConsole.

nigdy z tego nie korzystałem, ale wydaje mi się, że nie powinno sprawiać to problemu cokolwiek to jest :)

W załączniku podgląd mojego triggera utworzonego automatycznie dla kolumny z AUTOINC.

trigger.png

dodanie obrazka do treści posta - furious programming

0

@user322 Ja właśnie zrobiłem triggera i Generator, żeby po dodaniu rekordu i ODŚWIEŻENIU tabeli generował mi id, ale jeśli odświeżam to ten rekord poszedł do środka(bo rekordy są sortowane alfabetycznie) i nie wiadomo gdzie jest.
I czy ta procedura sprawi że jak dodam rekord to Od razu będe mial id? bez koniecznosic odswiezania ?
Na tym to polega?
Czy to działa tak samo jak Trigger i Generator?

1

i nie wiadomo gdzie jest.
, wymus sortowanie ponownie po dodaniu itema.

I czy ta procedura sprawi że jak dodam rekord to Od razu będe mial id? bez koniecznosic odswiezania ?
Tak, procedura zwróci Ci ID nowo dodanego itema

Czy to działa tak samo jak Trigger i Generator?
Dokładnie tak samo, z tym, że otrzymujesz to co chesz.

Na końcu po ponownym przesortowaniu wystarczy zrobić Locate wiersz i zaznaczy Ci ten właśnie nowo dodany.

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