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 wirdhttp://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 warGruesse
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