MovePrev() ?



  • Hallo,

    ich habe in meiner Datenbankanwendung einen Button mit dem ich immer zum vorherigen Datensatz gelangen will, aber leider funktioniert es nicht.
    Er springt anstatt zum vorhergehenden immer gleich zum ersten Datensatz, kann
    mir jemand sagen was ich da falsch mache.
    Ich habe auch einen Button für den nächsten Datensatz welcher funktioniert und
    das ist ja ziemlich ähnlich.

    MfG

    void CDatenbankDlg::OnBvor()
    {
    CKundendatenbankSet pSet;

    pSet.Open(); // Db oeffnen

    if(!pSet.IsBOF()) // Datenbank auslesen
    {
    for(int i=m_iIndex; i>0 ;i--)
    {
    if(!pSet.IsBOF())
    // zum vorherigen DS gehen
    pSet.MovePrev();
    }
    m_strName = pSet.m_Name;
    m_strVorname = pSet.m_Vorname;
    m_strAnschrift = pSet.m_Anschrift;

    }
    pSet.Close(); // Datenbank schliessen
    UpdateData(FALSE);
    }



  • Lass die Schleife weg oder setze m_iIndex auf 1



  • Da springt er auch bis zum ersten Datensatz.
    Und ich habe gleich noch eine Frage bei jedem Button mache ich die DB mit pSet.Open() auf, kann ich das nicht gleich irgendwo global machen, damit ich sie nur einmal auf und einmal zu machen muß?

    MfG



  • Hallo !

    Am Anfang der Methode öffnest du die Datenbank:

    pSet.Open(); // Db oeffnen
    

    Dabei wird immer der erste Datensatz ausgewählt.
    Dann fragst du ab, ob es NICHT der erste Datensatz ist:

    if(!pSet.IsBOF()) // Datenbank auslesen
    

    Ist es aber. Dieser if-Block wird also gar nicht ausgeführt...

    Wenn du dich mit Pointern auskennst, kannst du die Datenbank im Konstruktor öffnen und erst im Destruktor schliessen. Zwischendurch hast du immer einen Zeiger auf den aktuellen Datensatz.

    Tschüss



  • Wie soll ich es da abfragen, kannst Du mir vielleicht etwas Code posten.
    Wäre nett!

    MfG



  • Keine Ahnung, ob es funktioniert (ist ungetestet), aber probier doch mal das hier aus (ohne Pointer 😃 ):

    void CDatenbankDlg::OnBvor()
    {
       CKundendatenbankSet pSet;
    
       pSet.m_strFilter = "Name = '" + m_strName + "' AND Vorname = '" + m_strVorname + "' AND Anschrift = '" + m_strAnschrift + "'";
       pSet.Open(); // Db oeffnen
    
       if(!pSet.IsBOF()) // Datenbank auslesen
       {
          pSet.MovePrev();
       }
    
       m_strName = pSet.m_Name;
       m_strVorname = pSet.m_Vorname;
       m_strAnschrift = pSet.m_Anschrift;
    
       pSet.Close(); // Datenbank schliessen
       UpdateData(FALSE);
    }
    

    [ Dieser Beitrag wurde am 16.10.2002 um 13:24 Uhr von isabeau editiert. ]



  • Leider bleibt alles unverändert, er springt immernoch zum ersten Datensatz.
    Aber trotzdem vielen Dank.

    MfG



  • Bist du sicher, dass keine Schreibfehler im Filter (pSet.m_strFilter = ...) sind (alle ' drin) ? Wenn doch, öffnet sich die Datenbank wieder beim ersten Datensatz.
    Übrigens: vielleicht sind ja auch nicht alle Angaben im Filter erforderlich (nur die Schlüssel der Tabelle).



  • Kann mir das mal jemand erklären? Oder überseht ihr das Wesentliche?
    Er öffnet die DB am Anfang der Funktion. Macht dann nix weiter mit dem Datenbank-Objekt. Wieso sollte er also nciht den ersten Datensatz anzeigen?

    [ Dieser Beitrag wurde am 16.10.2002 um 15:29 Uhr von dEUs editiert. ]



  • Verdammt, das stimmt !
    *mist*



  • Hallo zusammen,

    grundsätzlich sind open/ close in deinen Navigationsroutinen nicht sehr gut aufgehoben - oder habe ich was nicht mitgekriegt?

    Ich würde das irgendwie so lösen. Du machst Dir 2 Funktionen. Z.B.:

    DB_Laden und DB_Entladen
    zzgl. einer Kontrollvariablen (bool) die den Zustand (geöffnet oder nicht) aufnimmt.

    Beim Laden öffnest du den Recordset (du kannst an diese Funktion auch schön einen Parameter für den Filter übergeben). Und setzt/ löschst die Kontrollvariable. Genau andersrum machst Du es beim Entladen.

    Jetzt prüfst du bei jedem Zugriff auf deine DB grundsätzlich die Kontrollvariable und reagierst entsprechend. Somit bist Du grundsätzlich aus dem Schneider, und kannst Deine DB schließen und öffnen wann Du willst und brauchst Dir um den Zustand keine Sorgen mehr zu machen. Das wäre natürlich für dich ein Nebeneffekt. Aber du kannst dann auch das open/ close aus deinen Navigationsroutinen rauskicken. Und dann sollte das auch klappen.

    Eine andere Möglichkeit wäre, sich die aktuelle Position in der DB mit Hilfe eines CDBVariant zu merken. Dann kannst Du diese nach dem Öffnen auch wieder anfahren, bevor Du MovePrev/ MoveNext aufrufst.

    Hope it helps 🙄 ...

    Gruß, Volle.



  • Wie kann ich denn da nun einzeln vor springen in meiner Datenbank.
    Bei meinem Button für den nächsten Datensatz war es ja ähnlich und der
    funktioniert völlig normal.
    Und was genau macht m_strFilter.
    Danke im **voraus!!

    MfG**


Anmelden zum Antworten