Autor Beitrag
Schaberick
Hält's aus hier
Beiträge: 5

Win 10, Win 11
Delphi 10.4 Comm., Delphi 10.0 Prof., Visual Studio 2019, Unity, Blender
BeitragVerfasst: So 26.02.23 19:00 
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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
// Wir gehen davon aus, der Table "Kunden" sei gefiltert (irgend ein x-beliebiger Filter)
recordNumber := FD_KundenQuery.recno;  // Physikalische Datensatznummer speichern
FD_KundenQuery.Filtered := false;      // Filter ausschalten
FD_KundenQuery.Recno := recordNumber;  // Gehe wieder exakt auf den zuvor ausgewählten Datensatz

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 user profile iconTh69: Delphi-Tags hinzugefügt
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 26.02.23 22:18 
user profile iconSchaberick hat folgendes geschrieben Zum zitierten Posting springen:
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'.
Dann hast du IndexFieldNames nicht gesetzt.
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6386
Erhaltene Danke: 146

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Mo 27.02.23 08:30 
Alternativ die Methode Locate nutzen.
Du könntest auch versuchen, ob man in dieser Konstellation mir Bookmark arbeiten kann.
Sowohl die Lösung mit FindNearest, wie auch Locate "durchsuchen" die Datenmenge. Bookmark ist aber ein "Zeiger" auf den Datensatz und daher normalerweise schneller. Ob das bei einer Umschaltung eines Filters auch funktioniert, kann ich jetzt aber nicht mit Sicherheit sagen.