Programm bleibt stehen ohne Fehlermeldung



  • Hallo Zusammen,
    ich habe ein Programm womit ich auf eine MySQL Datenbank zu greife. Jetzt habe ich bei einer Programmaktion das Problem das es ohne Fehlermeldungstehen bleibt.

    Also ich habe ein Formular mit einem DBGrid. Dort werden die Daten angezeigt. Auf einen Button habe ich folgende Funktion gelegt wenn man ihn Clickt:

    String suchen_rgnummer, sql_insert, bestellter_artikel;
    
        suchen_rgnummer = DataModule1->sql_suchen_offline->FieldByName("rgnummer")->AsString; //damit lese ich die rechnungsnummer von dem Datensatz der gerade im DBGrid aktiviert ist
        sql_insert = "select * from bestellungen where rgnummer = '"+suchen_rgnummer+"'";
        DataModule1->sql_suchen_bestellungen_offline->SQL->Clear();
        DataModule1->sql_suchen_bestellungen_offline->SQL->Add(sql_insert);
        DataModule1->sql_suchen_bestellungen_offline->Open();
        test->Caption = DataModule1->sql_suchen_bestellungen_offline->RecordCount;
        while(DataModule1->sql_suchen_bestellungen_offline->Eof)
        {
            bestellter_artikel = DataModule1->sql_suchen_bestellungen_offline->Fields->Fields[1]->AsString;
    
            if(bestellter_artikel == "1100")
            {
                    checkbox->Checked = true;
            }
        }
        DataModule1->sql_suchen_bestellungen_offline->Close();
    

    Ich lese die Rechnungsnummer von dem Datensatz aus der gerade im DBGrid aktiviert ist.
    Wenn ich das Programm jetzt starte kann ich den Button einmal Clicken. Dann wird alles noch korrekt ausgeführt. Wenn ich den Button aber ein zweites mal Clicke bleibt das Programm einfach stehen und es geht nichts mehr.

    Kann mir da jemand helfen?? Habe ich da im Code einen Fehler??

    Danke im voraus
    EPMS



  • Und du hast wieweit reindebugged?



  • Hallo EPMS,
    was mir so spontan aufgefallen ist:
    Du hast am Ende der Befehle

    DataModule1->sql_suchen_bestellungen_offline->Close();
    

    stehen. Wo öffnest du dann wieder?

    Du kannst auf den ersten Befehl auch einen Break setzen und mit F8 dann schrittweise weiter durch deinen Code hangeln, dann weist du zumindest wo sich dein Programm verabschiedet.

    Viel Erfolg
    Evi48



  • Das

    while(DataModule1->sql_suchen_bestellungen_offline->Eof)

    kommt mir SEHR komisch vor!!! 😮

    PS: Lesen, solange Pointer am Ende steht!!! ???



  • Hallo Zusammen,
    schonmal danke für Eure Hilfe. Habe mal ein bischen rumprobiert und habe festgestellt, wenn ich die While-Schleife raus nehme dann funktioniert die Abfrage. Dann bleibt das Programm nicht mehr stehen. Denke das der Fehler dann wohl da liegt.

    Mit der Schleife will ich eigentlich nur erreichen, dass das Ergeniss der Query solange durchlaufen wird bis die Datenmenge leer ist. Wie kann ich das denn noch lösen??

    Danke im voraus
    BeTZe



  • EPMS schrieb:

    Mit der Schleife will ich eigentlich nur erreichen, dass das Ergeniss der Query solange durchlaufen wird bis die Datenmenge leer ist. Wie kann ich das denn noch lösen??

    indem du deine while-schleife einfach korrigierst,
    du willst ja das die Schleife solange durchlaufen wird wie das Ereignis Eof NICHT eintritt

    und wie negiert man Ausdrücke in C++?



  • Hallo nochmal,

    habe das jetzt folgendermaßen gelöst:

    for(int i = 1; i <= DataModule1->sql_suchen_bestellungen_offline->RecordCount; i++)
    

    Damit klappt es jetzt wunderbar.

    Jetzt hätte ich noch eine andere Frage:
    Die Abfrage soll schlußendlich dann ausgeführt werden, wenn sich der Datensatz im DBGrid ändern.

    Wie kann ich das am besten lösen?? Habe es schon mit OnCellClick versucht. Da klappt es auch. Leider muß man dann ja immer in den Datensatz klicken bevor die Abfrage ausgeführt wird. Kann man das auch so machen, dass die Abfrage sofort ausgeführt wird, sobald man im DBGrid einen anderen Datensatz anwählt??

    Danke im voraus
    EPMS



  • EPMS schrieb:

    Kann man das auch so machen, dass die Abfrage sofort ausgeführt wird, sobald man im DBGrid einen anderen Datensatz anwählt??

    Gegenfrage: wie wählst du denn einen anderen Datensatz aus? Anklicken, Kursortasten, DBNavigator?

    für jedes der 3 gibt es Varianten der Abarbeitung:
    OnCellClick, OnKeyPress, OnClick...



  • Hi Linnea,
    also eigentlich wähle ich die Datensätze entweder per Tasten, Click oder mit der Laufleiste aus.
    Per Tasten und per Click kriege ich dank deinen Tipps schnell raus. Wie mache ich das denn bei der Laufleiste??

    Gruß
    EPMS



  • EPMS schrieb:

    Hallo nochmal,

    habe das jetzt folgendermaßen gelöst:

    for(int i = 1; i <= DataModule1->sql_suchen_bestellungen_offline->RecordCount; i++)
    

    Damit klappt es jetzt wunderbar.

    Vorsicht mit dem RecordCount. Das sollte man nur verwenden wenn es wirklich nicht anders geht. Zum einen funktionert es nicht mit allen DBMs zuverlässig und zum anderen kann es je nach Datenbank ein echter Resourcenfresser sein.

    Linnea hat völlig recht. [cpp]while(**!**DataModule1->sql_suchen_bestellungen_offline->Eof)[/cpp] ist das Mittel der Wahl. Und immer schön drauf achten das man keine Endlosschleifen macht weil man das Next vergißt....



  • DMarko schrieb:

    [cpp]while(**!**DataModule1->sql_suchen_bestellungen_offline->Eof)[/cpp] ist das Mittel der Wahl. Und immer schön drauf achten das man keine Endlosschleifen macht weil man das Next vergißt....

    um das mit dem Next-Vergessen zu verhindern kann man auch folgende Schleife verwenden

    for (DataModule1->sql_suchen_bestellungen_offline->First(); 
        !DataModule1->sql_suchen_bestellungen_offline->Eof; 
         DataModule1->sql_suchen_bestellungen_offline->Next())
    

    [Edit]
    zu der sache mit der sofortigen Abfrage nach wechseln des Datensatzes:
    schau dir mal das Ereignis "AfterScroll" an, das ist ein Ereignis der Datenquelle (TTable), das könnte die Einzelbehandlung bei OnCellClick und ONKeyPress komplett ersetzen...



  • Hallo nochmal,
    also wenn ich die while-Schleife folgendermaßen anwende

    while(!DataModule1->sql_suchen_bestellungen_offline->Eof)
            for(int i=0; i < bestellung_suchen->ComponentCount; i++)
            {
                    if(bestellung_suchen->Components[i]->ClassNameIs("TCheckBox"))
                    {
                            dynamic_cast<TCheckBox*>(bestellung_suchen->Components[i])->Checked = false;
                    }
            }
    
            if(bestellter_artikel == "3201")
            {
                    bestellung_suchen->avfdvdboxen->Checked = true;
                    bestellung_suchen->avfdvdboxenmenge->Visible = true;
                    bestellung_suchen->avfdvdboxenmenge->Text = DataModule1->sql_suchen_bestellungen_offline->Fields->Fields[3]->AsString;
            }
            DataModule1->sql_suchen_bestellungen_offline->Next();
        }
    

    bleibt das Programm auch wieder stehen. Genauso wie vorher. Woran kann das liegen??

    Außerdem hätte ich noch eine Frage.
    Ich habe folgenden Code.:

    if(nn_suchen->Text != "")     sql_insert = "select * from kundendaten where nn = '"+bestellung_suchen->nn_suchen->Text+"'";
        DataModule1->sql_suchen_offline->SQL->Clear();
        DataModule1->sql_suchen_offline->SQL->Add(sql_insert);
        if(DataModule1->sql_suchen_offline->Open())
        {
           DataModule1->ds_suchen_offline->Enabled = true;
        }
    

    Wenn die SQL-Query leer ist wird das Programm mit der Meldung beendet, das die Query leer ist. Kann ich diese Fehlermeldung irgendwie abfangen, damit das Programm nicht abstürzt??

    Danke im voraus
    EPMS



  • Hallo

    bleibt das Programm auch wieder stehen. Genauso wie vorher. Woran kann das liegen??

    [cpp]
    while(!DataModule1->sql_suchen_bestellungen_offline->Eof)
    { // << Wichtig
    for(int i=0; i < bestellung_suchen->ComponentCount; i++)
    ...
    }[/cpp]

    Wenn die SQL-Query leer ist wird das Programm mit der Meldung beendet, das die Query leer ist. Kann ich diese Fehlermeldung irgendwie abfangen, damit das Programm nicht abstürzt??

    Frag doch RecordCount ab, der muß über 0 sein.

    /Edit : oder meinst du die SQL-Anweisung selber? dann doch einfach if (SQLAnweisung == "") Abbrechen();
    bis bald
    akari



  • Hallo akari,
    danke mit der while Schleife. Da fehlte mir würde ich mal sagen ganz klar die Brille. Doof sowas.

    Bei dem zweiten meinte ich nicht die SQL-Anweisung. Werde das mal mit RecNo ausprobieren.

    Gruß
    EPMS



  • Hallo akari nochmal,
    habe es jetzt mal folgendermaßen ausprobiert:

    if(nn_suchen->Text != "")     sql_insert = "select * from kundendaten where nn = '"+bestellung_suchen->nn_suchen->Text+"'";
        DataModule1->sql_suchen_offline->SQL->Clear();
        DataModule1->sql_suchen_offline->SQL->Add(sql_insert);
        if(DataModule1->sql_suchen_offline->RecNo != '0')
        {
            DataModule1->sql_suchen_offline->Open();
            DataModule1->ds_suchen_offline->Enabled = true;
        }
    

    Da kommt leider wieder die Fehlermeldung das die Query leer ist. Diese Meldung möchte ich ja gerade abfangen.
    Weiß jemand was diese Meldung auslöst?? Erst der Openbefehl oder schon die Ermittlung der RecNo??

    Danke im voraus
    EPMS



  • Hallo

    ich schrieb RecordCount :

    DataModule1->sql_suchen_offline->SQL->Add(sql_insert);
    DataModule1->sql_suchen_offline->Open();
    if(DataModule1->sql_suchen_offline->RecordCount > 0)
    {
      ...
    

    bis bald
    akari



  • Hi nochmal,
    sorry hatte ich überlesen.
    Aber wenn ich es mit RecordCount mache kommt auch das gleiche. Wieder die Meldung das die Query empty ist.

    Gibt es noch eine andere Möglichkeit das abzufangen??

    Gruß
    BeTZe



  • versuchs mal so, ist zwar etwas umständlich, funktioniert bei mir aber einwandfrei

    if(nn_suchen->Text != "")     sql_insert = "select * from kundendaten where nn = '"+bestellung_suchen->nn_suchen->Text+"'";
    DataModule1->sql_suchen_offline->SQL->Clear();
    DataModule1->sql_suchen_offline->SQL->Add(sql_insert);
    DataModule1->sql_suchen_offline->Open();
    DataModule1->sql_suchen_offline->Last();
    int num = DataModule1->sql_suchen_offline->RecNo;
    
    if (num > 0)
        {
        //Tu etwas    
        }
    


  • Hallo Linnea,

    danke für deinen Vorschlag. Aber auch hier kommt die gleiche Meldung.

    Wenn z.B. das feld nn_suchen leer ist und man auf suchen klickt kommt die Fehlermeldung "Query was empty".

    Kommt die Meldung bei dir nicht, wenn du das so machst?? Muß ich vielleicht bei der Query selber noch was beachten??

    Gruß
    EPMS



  • ach so meinst du das 😮

    na das ist doch dann noch einfacher:

    if(nn_suchen->Text != "") 
    [b]{[/b]    sql_insert = "select * from kundendaten where nn = '"+bestellung_suchen-  >nn_suchen->Text+"'";
       DataModule1->sql_suchen_offline->SQL->Clear();
       DataModule1->sql_suchen_offline->SQL->Add(sql_insert);
       DataModule1->sql_suchen_offline->Open();
       DataModule1->sql_suchen_offline->Last();
       int num = DataModule1->sql_suchen_offline->RecNo;
    
       if (num > 0)
        {
        //Tu etwas    
        } 
    [b]}[/b]
    

Anmelden zum Antworten