Combobox EOF wo keiner ist.....

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
Joachim Raap
Beiträge: 118
Registriert: Mo 30. Mär 2020, 12:37

Combobox EOF wo keiner ist.....

Beitrag von Joachim Raap »

Hallo; nachdem ich meine Tabelle gelöscht habe und neue Testsätze angelegt habe besteht jetzt das Problem, daß sich die Combobox nicht mehr mit Sätzen füllen läßt. Wenn er Datensätze lesen will, wird wegen EOF abgebrochen - es sind aber definitiv gültige Sätze vorhanden. jemand einen Fehler entdecken?

Code: Alles auswählen

procedure TFMArtikel.CBArtzugGrpClick(Sender: TObject);
 begin
  Fehlermeldung(99);
   //Füllen der Gruppen in die ComboBox
   CBArtzugGrp.Items.Clear;
   FMMenu.SQLQuery1.SQL.Clear;
   FMMenu.SQLQuery1.SQL.Text:='select nr,bez from gruppen where Aktiv=1 order by Nr;';
   FMMenu.SQLQuery1.open;
   while not FMMenu.SQLQuery1.EOF do
    begin
     CBArtzugGrp.Items.Add(FMMenu.SQLQuery1.FieldByName('Nr').AsString+' '+FMMenu.SQLQuery1.FieldByName('Bez').AsString);
     FMMenu.SQlQuery1.Next;
    end;
 end;   

TBug
Beiträge: 165
Registriert: Mi 2. Sep 2015, 11:09
OS, Lazarus, FPC: Lazaurus 2.2.4 FPC 3.2.2
CPU-Target: Windows 32/64bit

Re: Combobox EOF wo keiner ist.....

Beitrag von TBug »

Hallo Joachim,

Nach dem Öffnen steht der Datensatzzeiger schon ganz hinten!

Joachim Raap
Beiträge: 118
Registriert: Mo 30. Mär 2020, 12:37

Re: Combobox EOF wo keiner ist.....

Beitrag von Joachim Raap »

aha. Aber
1. Wieso?
2.Wie bekomme ich ihn nach vorn?

TBug
Beiträge: 165
Registriert: Mi 2. Sep 2015, 11:09
OS, Lazarus, FPC: Lazaurus 2.2.4 FPC 3.2.2
CPU-Target: Windows 32/64bit

Re: Combobox EOF wo keiner ist.....

Beitrag von TBug »

1. Die Daten werden ja in die Query eingelesen und somit muss der Zeiger ja auf dem letzten Datensatz stehen.

2. Nach dem Öffnen der Query

Code: Alles auswählen

FMMenu.SQlQuery1.First;

Joachim Raap
Beiträge: 118
Registriert: Mo 30. Mär 2020, 12:37

Re: Combobox EOF wo keiner ist.....

Beitrag von Joachim Raap »

mh; " FMMenu.SQLQuery1.first;" hatte ich auch schon verwendet änder aber nichts daran, daß die Daten in der ComboBox nicht erscheinen.....

TBug
Beiträge: 165
Registriert: Mi 2. Sep 2015, 11:09
OS, Lazarus, FPC: Lazaurus 2.2.4 FPC 3.2.2
CPU-Target: Windows 32/64bit

Re: Combobox EOF wo keiner ist.....

Beitrag von TBug »

Hallo Joachim,

mehr fällt mir im Moment und auf die Schnelle nicht ein.

Ich weis nicht, was für ein Datenbanksystem Du verwendest und auf welcher Plattform die DB-Engine läuft,
aber bist Du Dir sicher, dass die Feld-Namen case-insensitive sind?

Code: Alles auswählen

'select nr,bez from gruppen where Aktiv=1 order by Nr;'
und

Code: Alles auswählen

FMMenu.SQLQuery1.FieldByName('Nr').AsString+' '+FMMenu.SQLQuery1.FieldByName('Bez').AsString)
Und selbst wenn es nicht case-sensitiv ist wäre eine durchgängige Schreibweise sehr zu empfehlen.

Joachim Raap
Beiträge: 118
Registriert: Mo 30. Mär 2020, 12:37

Re: Combobox EOF wo keiner ist.....

Beitrag von Joachim Raap »

es liegt nicht an der DB (ist übrigens MariaDB).
Die Combobox ist das Problem. Ich habe jetzt mal ein wenig rumgespielt; sie funktioniert nur dann korrekt, wenn ich das Ereignis '"OnMouseEnter" auswähle. Sie läßt sich z.B. auch nicht mit "Tab" anspringen. Ich weiß im Moment hier auch nicht weiter.....

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 5475
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: Combobox EOF wo keiner ist.....

Beitrag von af0815 »

Schon mal mit dem Debugger dort durchgesteppt? Ich vermute nicht.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
six1
Beiträge: 693
Registriert: Do 1. Jul 2010, 19:01

Re: Combobox EOF wo keiner ist.....

Beitrag von six1 »

Setze mal nach der While Schleife den Itemindex:
CBArtzugGrp.Itemindex:=0;
Gruß, Michael

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 5475
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: Combobox EOF wo keiner ist.....

Beitrag von af0815 »

Joachim Raap hat geschrieben:
Do 24. Nov 2022, 21:57
es liegt nicht an der DB (ist übrigens MariaDB).
Die Combobox ist das Problem. Ich habe jetzt mal ein wenig rumgespielt; sie funktioniert nur dann korrekt, wenn ich das Ereignis '"OnMouseEnter" auswähle. Sie läßt sich z.B. auch nicht mit "Tab" anspringen. Ich weiß im Moment hier auch nicht weiter.....
Das heisst dein Problem ist das die Combobox nicht geladen wird, weil du nicht in den Ereignishandler springst, so wie du gedacht hast.

Die ComboBox sollte sich nicht mit einem Ereignis befüllen, das erst ausgelöst werden kann, wenn sie gültige Einträge hat. Vermutlich ist das auch der Grund warum sie mit Tab nicht den Focus bekommt. Es sollte ja ein Ereignis vorher geben, das die ComboBox befüllt. Das ist auch Workflowdesign. Nachdem wir hier nur kleine Fragmente sehen, kann man das auch nicht beurteilen.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

charlytango
Beiträge: 574
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz 2.0 fixes FPC 3.2 fixes
CPU-Target: Win 32Bit, 64bit
Wohnort: Wien

Re: Combobox EOF wo keiner ist.....

Beitrag von charlytango »

Ich liebe diese Objektschreibweise. Die ist wirklich kompakt aber ein Krampf zum debuggen.

Code: Alles auswählen

procedure TFMArtikel.CBArtzugGrpClick(Sender: TObject);
var
  s,t,string;
 begin
  Fehlermeldung(99);
   //Füllen der Gruppen in die ComboBox
   CBArtzugGrp.Items.Clear;
   FMMenu.SQLQuery1.SQL.Clear;
   s:='select nr,bez from gruppen where Aktiv=1 order by Nr;';
   FMMenu.SQLQuery1.SQL.Text:=s;  //<<- Breakpoint hier
   FMMenu.SQLQuery1.open;
   //FMMenu.SQLQuery1.Last; //bei größeren Datenmengen um die komplette Abfrage zu retrieven
   FMMenu.SQLQuery1.First;   //<--verlasse mich nicht drauf dass der Zeiger auf BOF steht
   while not FMMenu.SQLQuery1.EOF do
    begin
     t:=FMMenu.SQLQuery1.FieldByName('Nr').AsString+' '+FMMenu.SQLQuery1.FieldByName('Bez').AsString;
     CBArtzugGrp.Items.Add(t);  //<<- Breakpoint hier
     FMMenu.SQlQuery1.Next;
    end;
 end;  



und dann mit Ctrl-Alt-L das Debugfenster für lokale Variablen einschalten und prüfen ob das Programm überhaupt bis dorthin kommt und ob die Schleife Werte liefert.
Etwas mehr Code hilft enorm beim Debuggen.

Und wie af0815 sagte darf das nicht in einem Event der Combobox passieren.
Solche Vorbereitungen müssen erledigt sein wenn das Formular angezeigt wird.
Ich mache das in einer eigenen Prozedur (der Übersicht und mehrfachen Verwendbarkeit wegen) die ich meinetwegen "Initialize" oder "Prepare" nenne (immer programmweit gleich benennen) die ich meistens im OnCreate des Formulars nach allen Erstellungsaufgaben aufrufe.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 5475
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: Combobox EOF wo keiner ist.....

Beitrag von af0815 »

charlytango hat geschrieben:
Fr 25. Nov 2022, 10:00
Und wie af0815 sagte darf das nicht in einem Event der Combobox passieren.
Solche Vorbereitungen müssen erledigt sein wenn das Formular angezeigt wird.
Das das erledigt sein muss, wenn das Formular angezeigt wird, halte ich für nicht notwendig.

Allerdings muss es ein Ereignis sein, das anspricht bevor man die ComboBox braucht. Das kann Anzeigen des Formulars sein, genau so gut kann es eine Statusänderung an einer anderen Stelle sein. Bei mir ist es oft, das sich eine Datensatzänderung einer übergeordneten Tabelle ergibt oder ein öffnen eines Datensatz. Das ist wie gesagt stark Work Flow abhängig. Bevor du gar nicht weiterkommst, mach daneben einen Button mit Refresh. Dort hängst du das hinein, bis du weißt wo du das wirklich hineinhängst.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten