Tdbf - Anzahl gefilterter Zeilen ermitteln[gelöst]

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
and4more
Beiträge: 207
Registriert: Do 15. Nov 2012, 19:13
OS, Lazarus, FPC: Windows 10, Manjaro Linux, Lazarus 1.6.4 (32/64 Bit)
CPU-Target: 32 Bit / 64 Bit

Tdbf - Anzahl gefilterter Zeilen ermitteln[gelöst]

Beitrag von and4more »

Hallo liebes Forum, stehe mal wieder auf dem Schlauch: Und zwar möchte ich unter dBase (Tdbf) nach dem filtern die Anzahl der verbliebenen Zeilen ermitteln, da ich vermeiden möchte, dass eine leere Listbox angezeigt wird. Das Programm prüft zur Laufzeit mittels Locate(), ob der Nachname vorhanden ist, da ich aktuell nicht weiß ob Locate nach mehreren Kriterien suchen kann. Wenn ein oder mehrere (Nach-)Namen gefunden wurden werden diese inkl. Vorname und Geburtsdatum in einer Listbox angezeigt. Problem ist nun, dass evtl. Nachnamen mittels Locate gefunden werden für die beim filtern keine passenden Vornamen und/oder Geburtsdaten gefunden werden und dann eine leere Listbox angezeigt wird. Leider habe ich bisher keine Möglichkeit gefunden das Öffnen der Listbox über vorheriges Prüfen der Zeilenzahl zu verhindern. Mein bisheriger Ansatz:

Code: Alles auswählen

 
        DisableControls;
        //wenn Nachname vorhanden ist
        if (Locate('NNAME',EdName.Text,[])=True) then begin
          Filter:=Format('NNAME="%s" AND VNAME="%s"',[EdName.Text,EdVorname.Text]);
          Filtered:=True;
          //...und Suche erfolgreich (mindestens 1 Wert)
          if (DataSource.DataSet.RecordCount>0) then begin
            FrmPatListe.Show;     //neues Formular mit Listbox wird angezeigt
            while not EOF do begin
              //...dann Patientenname(n) in ListBox (LB_Pat) eintragen
              FrmPatListe.LB_Pat.Items.Add(Fields[3].AsString+', '+
                Fields[4].AsString+' *'+Fields[6].AsString);
              Next;
 

funktioniert leider nicht. Natürlich könnte ich auch die geöfnete Listbox prüfen und bei Null-Inhalt wieder schließen, doch erscheint mir diese Methode wenig elegant.
Kennt jemand eine Möglichkeit entweder mit Locate() mehrere Kriterien gleichzeitig abzufragen oder das Ergebnis nach Filtern auf Null-Inhalt zu prüfen?

Für Vorschläge wäre ich sehr dankbar. Schon mal vielen Dank.
Zuletzt geändert von and4more am Sa 28. Jan 2017, 21:54, insgesamt 3-mal geändert.
Lazarus 1.6.4 32-Bit + 64-Bit, Windows 10 64-Bit, Manjaro Linux 64-Bit

shokwave
Beiträge: 470
Registriert: Do 15. Nov 2007, 16:58
OS, Lazarus, FPC: Win11/Ubuntu Budgie (L 3.0 FPC 3.2.2)
CPU-Target: i386, x64
Wohnort: Gera

Re: Tdbf - Anzahl gefilterter Zeilen ermitteln

Beitrag von shokwave »

Hi,

warum füllst du nicht erst die ListBox und zeigst sie dann an? Dann könntest du vor dem anzeigen prüfen ob sie leer ist.
mfg Ingo

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Tdbf - Anzahl gefilterter Zeilen ermitteln

Beitrag von wp_xyz »

Ich verstehe zwar nicht was du da machst, aber das Suchen nach mehreren Kriterien kann ich dir erklären:

Code: Alles auswählen

Methode von TDataset:
    function Locate(const KeyFields: string; const KeyValues: Variant; Options: TLocateOptions) : boolean;

Der Plural von Keyfields deutet an, dass man da mehrere Feldnamen hineinschreiben kann - ja, das geht; ich trenne mit einem Strichpunkt (geht zumindest bei uns in Deutschland, international wird wahrscheinlich der ListSeparator der FormatSettings genommen - aber da bin ich nicht sicher). Die Werte, die die betreffenden Felder annehmen sollen, schreibt man in die KeyValues; das ist ein Variant, und dem kann man durchaus ein Array aufbürden, indem man dieses per VarArrayCreate() entsprechend aufbereitet.

Beispiel: Deine Datenbank enthält die Felder "Name", "Vorname", "Ort", 'PLZ" und du möchtest suchen, ob es einen Herrn Johann Meier in einem Ort mit der Postleitzahl 10115 gibt, dann lautet die Anweisung:

Code: Alles auswählen

uses Variants;  //für VarArrayCreate()
...
 if dbf1.Locate('Name;Vorname;PLZ', VarArrayCreate(['Meier', 'Johann', '10115']), []) then
  ShowMessage('gefunden');

and4more
Beiträge: 207
Registriert: Do 15. Nov 2012, 19:13
OS, Lazarus, FPC: Windows 10, Manjaro Linux, Lazarus 1.6.4 (32/64 Bit)
CPU-Target: 32 Bit / 64 Bit

Re: Tdbf - Anzahl gefilterter Zeilen ermitteln

Beitrag von and4more »

@shokwave: ja, hatte ich auch schon überlegt, aber dann würde ja über die ausgeführte Funktion etwas mehr Rechenzeit verbraten, insofern isses nicht ganz so elegant, wär für mich nur ein Notnagel
@wp_xyz: du bist mein Gott. Genau das war's was ich brauchte.

Vielen Dank an Alle
Lazarus 1.6.4 32-Bit + 64-Bit, Windows 10 64-Bit, Manjaro Linux 64-Bit

and4more
Beiträge: 207
Registriert: Do 15. Nov 2012, 19:13
OS, Lazarus, FPC: Windows 10, Manjaro Linux, Lazarus 1.6.4 (32/64 Bit)
CPU-Target: 32 Bit / 64 Bit

Re: Tdbf - Anzahl gefilterter Zeilen ermitteln [gelöst]

Beitrag von and4more »

@wp_xyz: beim compilieren erhalte ich mit:

Code: Alles auswählen

 
        tmpGdate:=EncodeDate(StrToInt(EdGebJJJJ.Text),StrToInt(EdGebMM.Text), StrToInt(EdGebTT.Text));
       ...
        if (Locate('NNAME;VNAME;GEBDAT',VarArrayCreate([EdName.Text,EdVorname.Text,tmpGdate]),[])) then begin....
 

leider die Fehlermeldung "Error: Wrong number of parameters specified for call to "VarArrayCreate"". Warum das ?
Lazarus 1.6.4 32-Bit + 64-Bit, Windows 10 64-Bit, Manjaro Linux 64-Bit

and4more
Beiträge: 207
Registriert: Do 15. Nov 2012, 19:13
OS, Lazarus, FPC: Windows 10, Manjaro Linux, Lazarus 1.6.4 (32/64 Bit)
CPU-Target: 32 Bit / 64 Bit

Re: Tdbf - Anzahl gefilterter Zeilen ermitteln

Beitrag von and4more »

...hab's jetzt doch so gemacht wie der Vorschlag von shokwave. Hat leider nicht geklappt mit "VarArrayCreate" trotz Internetrecherche (relativ wenig Beiträge zu dieser Funktion :| )
Lazarus 1.6.4 32-Bit + 64-Bit, Windows 10 64-Bit, Manjaro Linux 64-Bit

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Tdbf - Anzahl gefilterter Zeilen ermitteln

Beitrag von wp_xyz »

Hab' ich VarArrayCreate geschrieben? Oje, langsam aber sicher...

Nimm VarArrayOf:

Code: Alles auswählen

function VarArrayOf(const Values: array of Variant): Variant; 

varArrayCreate gibt es auch und kommt in zwei Ausführungen:

Code: Alles auswählen

function VarArrayCreate(const Bounds: array of SizeInt; aVarType: TVarType): Variant;
function VarArrayCreate(const Bounds: PVarArrayBoundArray; Dims : SizeInt; aVarType: TVarType): Variant;

http://docs.embarcadero.com/products/ra ... reate.html
https://www.safaribooksonline.com/libra ... re368.html

and4more
Beiträge: 207
Registriert: Do 15. Nov 2012, 19:13
OS, Lazarus, FPC: Windows 10, Manjaro Linux, Lazarus 1.6.4 (32/64 Bit)
CPU-Target: 32 Bit / 64 Bit

Re: Tdbf - Anzahl gefilterter Zeilen ermitteln

Beitrag von and4more »

...mit "VarArrayOf" hat alles prima geklappt, super.
Lazarus 1.6.4 32-Bit + 64-Bit, Windows 10 64-Bit, Manjaro Linux 64-Bit

Antworten