Datenbank filter



  • hallo...

    Hier mein code und die fehlermeldung

    UpdateData();
    
        // Mein Filter: 
        // Zwei Tabellen
        // 1. Tabelle Adressen  = m_ID
        // 2. Tabelle Zeiterfassung m_DatenSatzID2
        //  Wenn ich auf Datensatz 2 aus Adressen bin sollen alle Datensätze 
        //  aus Zeiterfassung in das Listenelement übernommen werden.
    
            // Diese Fehlermeldung bekomme ich!
            // Syntaxfehler (fehlender Operator in Abfrage Ausdruck
    
        m_pSet->m_strFilter = "WHERE adressen.m_id = zeiterfassung.DatenSatzID2";
    
        // Recordset aktualisieren ( Suchregel wird angewendet )
        m_pSet->Requery();
        // Alte Items der CListCtrl löschen
        m_list.DeleteAllItems();
        // Solange Elemente vorhanden
    
        while (!m_pSet->IsEOF() )
        {
            // in CListCtrl einfügen
            int item = m_list.InsertItem(0,m_pSet->m_strFilter);
            m_list.SetItemText(item,1,m_pSet->m_ZeitEin);
            m_list.SetItemText(item,2,m_pSet->m_ZeitAus);
            m_list.SetItemText(item,3,m_pSet->m_MinusZeit);
            m_list.SetItemText(item,4,m_pSet->m_PlusZeit);
            // Aktellen Datensatz um eins weitersetzen
        m_pSet->MoveNext();
        }
    
    mfg uwe
    


  • Hi,
    Zwei Probleme gibt es da:
    1. Der Filter String:
    Der muss natuerlich ohne "WHERE" verschickt werden (Sorry). Also so:

    m_pSet->m_strFilter = "adressen.m_id = zeiterfassung.DatenSatzID2";

    Da m_strFilter da "WHERE" bereits Bestandteil von m_strFIlter() ist.

    2. Der String an sich:
    m_strFilter muss, wie ich schrieb, vor dem "m_pSet->open();" abgeschickt werden. Wenn du aber im Anwendungs Assistenten von CRecordView ableitest, dann ist an der Stelle der Connect zur DB ja schon offen. Das heisst, mit m_strFilter wird man an dieser Stelle nicht mehr froh. In diesem Fall koenntest du eine weitere Klasse von CRecordSet ableiten und dann einen Zeiger auf diese Klasse initialisieren. Das heisst, im geoeffneten Connect einen zweiten oeffnen und hier mit m_strFilter arbeiten. Eine andere Moeglichkeit waere, in CRecordSet::GetDefaultSQL() zu arbeiten. Da steht sowas wie "_T("[adressen][zeit]");", was nichts anderes bedeutet als "_T("SELECT * from adressen,zeit");".
    Das heisst, du kannst hier das Statement erweitern auf "_T("SELECT * from adressen,zeit WHERE [adressen].id = [zeit].adressen_id");" Damit passt du bereits das Standard-Statement an und kannst dir dann den Wiggel mit m_strFilter sparen. Du musst dann allerdings _T("[adressen][zeit]"); auskommentieren.

    Gruss
    items



  • Hallo !

    Du könntest das ganze auch in Access mit einer Abfrage machen, indem Du die
    Tabelle mit den Adressen und den Zeiten verknüpfst. Damit erhält man eine
    dritte Tabelle in denen die daten deiner Abfrage Sind. Nun Könntest Du
    in VC++ diese Tabelle mit einen CDaoRecordSet einbinden, und Du müßtest dich
    nicht mehr darum kümmern die daten auszuwerten, da diese Aufgabe nun die
    Datenbank für dich übernimmt.

    Viele Grüße
    Michael



  • hallo....

    Danke für die super hilfe.

    Ich werde gleich mal probieren....

    mfg uwe



  • lese dir mal das durch dort wird es gezeigt wie
    es gemacht wird

    http://members.aon.at/murli2001/db5/db5.html

    Vossy



  • halloele...

    den link kenne ich schon aus der FAQ aber dank.

    das ist auch nicht das was ich brauche.
    mit dem Verknüpfen funzt jetzt.

    aber leider bekomme ich immer nur einen Datensatz aus Zeit angezeigt.
    Zu jeder Adresse sind aber viele Datensätze in Zeit gespeichert die ich in einer Liste ausgeben will und wenn ich bei adressen einen Datensatz weiter gehe z.b. von datensatz 1 zu zwei dann sollen auch da alle datensätze aus zeit angezeigt werden.

    wat nun?
    😕 mfg uwe



  • halloele....

    keiner eine lösung...?¿?

    mfg uwe



  • hallo....

    hemm... das problem steht noch!

    kennt einer vielleicht ein Buch MFC und Datenbanken oder so...in der art.

    mfg Uwe



  • Ich kümmere mich morgen drum versprochen
    Mail angekommen
    Vossy



  • Moin,
    kriegst du denn in Access die richtige Ausgabe wenn du eine SQL Abfrage machst,
    die deine beiden Tabellen ueber "adressen.m_id = zeiterfassung.DatenSatzID2" verknuepfst?

    Also sowas wie:
    SELECT * FROM adressen INNER JOIN zeit ON adressen.m_id = zeiterfassung.DatenSatzID2;
    bzw.
    SELECT * FROM adressen, zeit WHERE adressen.m_id = zeit.DatenSatzID2;

    Dann haette man das Problemchen schon mal ein bisschen eingegrenzt auf Access oder VC.

    Gruesse
    items



  • hallo...

    ich habs...Danke fuer die Hilfe

    ich war(bin) einfach zu dumm... 😃

    mfg uwe



  • Oooch,
    jetzt sag wenigstens mal, was es denn nun war 🤡

    Gruesse
    items



  • hallo...

    ich habe eine Datensatzgruppe erstellt die zwei Recordsets hat.

    void CZeiterfassung2View::OnListcontrol()
    
    {
        CZeiterfassung2Doc* pDoc = GetDocument();
        CListBox* pLB = (CListBox*) GetDlgItem(IDC_LIST1);
        CZeitSet Zeit(&pDoc->m_database);  // db wird vom Konstruktor übergeben
    
        Zeit.m_strFilter.Format("AdressenID = '%s'", 
            (LPCSTR) m_pSet->m_AdressenID);
    
        Zeit.m_strFilter="AdressenID=?";
        Zeit.m_AdressenIDParam=m_pSet->m_AdressenID;
    
        Zeit.Open();
        m_list.DeleteAllItems();
    while( !Zeit.IsEOF()  )
        {
    
                // in CListCtrl einfügen
            long item = m_list.InsertItem(0,Zeit.m_Datum);
            m_list.SetItemText(item,1,Zeit.m_ZeitEin);
            m_list.SetItemText(item,2,Zeit.m_ZeitAus);
            m_list.SetItemText(item,3,Zeit.m_SollZeit);
            m_list.SetItemText(item,4,Zeit.m_IstZeit);
    
            // Aktellen Datensatz um eins weitersetzen
            Zeit.MoveNext();
    
        }
    
    }
    

    mfg uwe


Anmelden zum Antworten