Hallo zusammen,
gerade mache ich eine Umstellung eines Programms, in dem ich ADS-Komponenten benutzt hatte. Da man ADS ja nicht mehr so ohne Weiteres ins Delphi bekommt, kam mir die Idee, eine Alternative zu finden. Sie nennt sich FireDAC. Ich habe mit den Komponenten TFDQuery, TFDSource und DBGrid ein Testprogramm mit einer Test-Datenbank erstellt und mit Entsetzen festgestellt, dass ich über die Funktion "Recno" nicht mehr die physikalische Datensatznummer geliefert bekomme, sondern die relative.
Ich hatte mir 2 DBGrids nebeneinander gestellt und beide mit einem Test-Kunden-Table verbunden. Bei dem ersten Grid habe ich die Datenbank ungefiltert, aber mit einem Index auf den Nachnamen dargestellt. Beim zweiten Grid habe ich einen Filter draufgesetzt (um die Anzahl der DS einzuschränken) und ebenfalls einen Index auf den Nachnamen gesetzt.
Und nun kam die Ernüchterung: Sowohl im ungefilterten als auch im gefilterten Table begannen die Datensatznummern bei 1 und zählten hoch bis zum Ende des Tables, pro Satz um 1 inkrementiert.
Bei ADS bekam ich immer die absolute Datensatznummer. Und wenn ich den Index änderte oder auch den Filter, dann blieb die Datensatznummer immer fest mit dem Datensatz verbunden.
Bei SQL-Datenbanken bzw. Tables stelle ich fest, dass die DS-Nummer immer von 1 beim ersten angezeigten Datensatz beginnt und dann brav hochzählt. Das ist natürlich ziemlich böse für mich, da ich in manchen Prozeduren oder Funktionen die Datensätze über die Recno angesprungen habe. Das darf ich nun nicht mehr. Aber wie springe ich gezielt z.B. auf einen Datensatz, der im ungefilterten und nicht indizierten Zustand z.B. die Nummer 15 trägt, im gefilterten und indizierten Zustand aber meinetwegen die 31?
Um es zu konkretisieren:
Delphi-Quelltext
1: 2: 3: 4:
| recordNumber := FD_KundenQuery.recno; FD_KundenQuery.Filtered := false; FD_KundenQuery.Recno := recordNumber; |
Unter ADS hatte das prima funktioniert. Mit FireDAC klappt das nicht mehr. Dadurch, dass ich den Filter ausschalte, ändert sich sofort die Datensatznummer.
Also kam ich auf die Idee, ein Datenbankfeld namens 'ID' (auto increment) in den Table einzubauen. So habe ich eine fortlaufende Nummer.
Aber wie positioniere ich auf einen Datensatz mit z.B. der 'ID' 15, wenn der Index auf dem Nachnamen liegt? Mit
FindNearest() klappt es nicht. Dann sucht er in der Spalte 'Nachname' nach der 15 und nicht in der Spalte 'ID'.
Hat hier jemand eine Idee?
Oder gibt es doch eine Möglichkeit, die physikalische Recno anzusprechen / anzuspringen / herauszufinden?
VG. André
Moderiert von Th69: Delphi-Tags hinzugefügt