Ungültiger Cursorstatus



  • Grüße @All!

    Habe ein Datenbank über ODBC an meine Anwendung gebunden.
    Zur Ausgabe benutze ich ein ActiveX Element namens GridWiz.
    Bis jetzt hat alles gut gefunzt.
    Aber heute wollt ich mal versuchen nen Filter anzusetzen. Habe mir ein paar Beiträge hier dazu reingezogen und denke auch das ich das grundlegend erstmal verstanden habe aber ich bekomme es trotzdem nicht zum laufen. Zumindest bekomme ich Fehlermeldung: "Ungültiger Cursorstatus"

    Hier ein bisschen Code:

    void CAllgAngabenDlgPage::FillFilterGridWiz()
    {
        UpdateData(TRUE);
        CAngabenSet m_pAngabenSet;                                    // mein GridWiz Objekt
        long c;
        c = m_gw_angaben.Sheet(0).GetNumRows();
        m_gw_angaben.Sheet(0).DeleteRow(1,c);                         //hier lösch ich die Inhalte 
                                                                      //dieser Tabelle ( m_gw_angaben = 
                                                                      //Member des GridWiz )
    
        m_pAngabenSet.m_strFilter = "Kunde = 'Filterauswahl'";        //Filterauswahl=CString aus Eingabefeld 
                                                                      //Kunde=Spalte nach der gefiltert wird
        m_pAngabenSet.Open(CRecordset::dynaset, NULL);
        m_pAngabenSet.Requery();
        CString String;
        int b;
        while (!m_pAngabenSet.IsEOF())
        {    
                String.Format("%d",m_pAngabenSet.m_Nummer);
                m_gw_angaben.Sheet(0).Cell(b,1).SetText(String);
    	   m_gw_angaben.Sheet(0).Cell(b,2).SetText(m_pAngabenSet.m_UhrzeitDatum);
    	   m_gw_angaben.Sheet(0).Cell(b,3).SetText(m_pAngabenSet.m_Siebgutbezeichnung);
    	   m_gw_angaben.Sheet(0).Cell(b,4).SetText(m_pAngabenSet.m_Dateiname);
    	   m_gw_angaben.Sheet(0).Cell(b,5).SetText(m_pAngabenSet.m_Dateiverzeichnis);
    	   m_gw_angaben.Sheet(0).Cell(b,6).SetText(m_pAngabenSet.m_Kunde);
    	   m_gw_angaben.Sheet(0).Cell(b,7).SetText(m_pAngabenSet.m_Bemerkung);
    	   m_gw_angaben.Sheet(0).Cell(b,8).SetText(m_pAngabenSet.m_Probenahme);
    	   m_gw_angaben.Sheet(0).Cell(b,9).SetText(m_pAngabenSet.m_Probenvorbereitung);
    	   m_gw_angaben.Sheet(0).Cell(b,10).SetText(m_pAngabenSet.m_Feuchte);
    	   m_gw_angaben.Sheet(0).Cell(b,11).SetText(m_pAngabenSet.m_Dichte);
                String.Format("%d",m_pAngabenSet.m_Messbereich);
    	   m_gw_angaben.Sheet(0).Cell(b,12).SetText(String);
    	   m_gw_angaben.Sheet(0).Cell(b,13).SetText(m_pAngabenSet.m_Messmodus);
    	   m_gw_angaben.Sheet(0).Cell(b,14).SetText(m_pAngabenSet.m_Gr__endefinition);
    	   String.Format("%d",m_pAngabenSet.m_Dosierstufe);
                m_gw_angaben.Sheet(0).Cell(b,15).SetText(String);
                String.Format("%d",m_pAngabenSet.m_Messzeitinsec);
    	   m_gw_angaben.Sheet(0).Cell(b,16).SetText(String);
    	   m_gw_angaben.Sheet(0).Cell(b,17).SetText(m_pAngabenSet.m_zus_tzlicheBemerkung);
                m_pAngabenSet.MoveNext();
                b++;
        }
        m_pAngabenSet.Close();
    }
    

    Bitte gebt mir ein paar Tipps oder berichtigt mich, wenn ihr Fehler findet!
    Danke!
    MfG
    RunSeb



  • Probierr mal das hier aus:

    m_pAngabenSet.m_strFilter = "Kunde = '" + Filterauswahl + "'";
    

    [edit]
    Das Requery direkt nach Open kannst du dir übrigens sparen.
    [/edit]



  • OK, vielen Dank! Das funzt erstmal

    Frage1: Ist das Requery() nicht notwendig um die Datensätze neu zu ordnen?

    Frage2: Kann ich auch nach bestimmten Buchstabenfolgen innerhalb einer Zelle suchen? 🙄

    Z.B. heißt die eine Siebgutbzeichnung Silicium. Und ich möchte wenn man "Sili" eingibt alle Datensätze deren Siebgutbzeichnung mit 'Sili' beginnt.

    😕 MfG
    RunSeb



  • Ja, das Requery aktualisiert sozusagen die Datenansicht, also die vorhandenen Recordsets. Das macht, soviel ich weiss, Open aber auch.
    Requery kannst du benutzen, wenn z.B. die Datenbank bereits offen ist und der Filter neu gesetzt wird. Dann werden die Recordsets durch das Requery neu geordnet und der neue Filter greift. Das ist das selbe wie Close und wieder Open.

    Aus der MSDN:
    CRecordset::m_strFilter
    After you construct the recordset object, but before you call its Open member function, use this data member to store a CString containing an SQL WHERE clause.

    In m_strFilter kannst du also eine SQL-Where-Klausel rein schreiben. Also in deinem Fall:

    CRecordsetObjekt.m_strFilter = "Siebgutbzeichnung LIKE 'Sili%'";
    

    Wenn "Sili" in einer Variablen steht natürlich wieder mit "+ Variable +".
    Bei dem % bin ich mir nicht ganz sicher, ob es bei Oracle und Access gleich ist und funktioniert. Evtl. muss man da unterscheiden und ggf. ein * als Platzhalter verwenden.



  • Sehr schön!

    Das funzt auch:

    m_pAngabenSet.m_strFilter = "Siebgutbezeichnung LIKE '%" + Filterauswahl + "%'";
      m_pAngabenSet.Open(CRecordset::dynaset, NULL);
    

    Dank @isabeau


Anmelden zum Antworten