mfc - DB Fehlender Operator
-
Kleine Zwischenfrage: Wer hat die Datenbank entworfen?
Warum wird sowas über die Kundennamen abgefragt und nicht über die Kundennummer oder gar eine ID?(Das würde das eventuelle Problem mit dem ' beheben, in Nummern kommt sowas normalerweise nicht vor...)
-
Die DB hab zwar ich entworfen, aber das Konzept nicht. Es ist so dass hier als Kunde nur in der letzten Station dieses Teils wirklich eingetragen wird, davor ist es einfach nur die nächste Abteilung die es bekommt. Und bisher haben diese Abteilungen keine Nummer die man hier irgendwie einsetzen könnte. aber du hast recht wenn ich das aus der Combo auslese muss ich erst den String nach ' und " durchsuchen und dann davor ein \ machen. Das ist schon sehr schlecht! Aber wie gesagt das Konzept stammt nicht von mir, da muss ich mich höheren Gewalten beugen! Aber ich werde das nochmals ansprechen.
-
Ich hab hier was ähnliches:
Mein Chef will solche Schlüsselwerte wie Kundennummern UNBEDINGT im Nachhinein ändern können.
Die aktuelle Version kann das (leider weiß keiner wie, aber es passiert) und das gibt regelmäßig Probleme.Also muss die neue das auch können. Hab ich gesagt "Okay, kein Problem." und habe eine weitere Spalte angelegt. Die ist jetzt der Schlüssel und auf der anderen kann man ändern, bis man grün wird. Ist ja nur Anzeige.
Sowas hab ich in mehreren Tabellen.Ich sage mir in den Momenten: Er sieht die Oberfläche, da muss das so tun als ob - in die Datenbank gucken MAXIMAL 2 Personen:
Ich: Die Enwicklerin
Admin: Zur Kontrolle bei Fehlern
-
Hm das ist allerdings mal ein gutes Argument, werde vielleicht auch mal umstellen, aber bis dahin sollte das doch auch klappen, oder?
Ich mach:m_pSet->m_strFilter = "Kunde = 'Microswitch Rzell (Ford)'"; m_pSet->Requery();
es kommt aber dennoch
---------------------------
DokumentenVerwaltung
---------------------------
Syntaxfehler (fehlender Operator) in Abfrageausdruck '`PCD_NR` WHERE Kunde = 'Microswitch Rzell (Ford)''.---------------------------
OK
---------------------------Obwohl ich testhalber ' ganz raus genommen hab! Worankann es noch liegen?
-
Der Fehler kommt nicht, wenn du die Zeile mit m_strWhere auskommentierst?
Der kommt nicht, wenn du sowas schreibst?m_pSet->m_strFilter = "[Kunde] IS NOT NULL";
Bei der kopierten Meldung fällt mir auf, dass hinter der ) ein ' fehlt, aber vorne eines ist.
-
also ich hab jetzt was laufendes!
LPCTSTR KSearch = "Arbeitsanweisung where KUNDE = 'Microswitch R-zell (Ford)'";
Ich hab grad einfach beschlossen, dass ' und " von der Eingabe ausgeschlossen werden, statt dessen kommen einfach - rein. Allerdings hat ein Select * from bei mir noch nie geklappt. Drum auch so wie oben.
Ich hätte aber lieber ein m_strFilter, und hab natürlich nicht aufgegeben und auch hier ne Lösung gefunden, naja besser gesagt das Problem gefunden!
Wenn man ein Set mit Order by offen hat will er in dieser Spalte den Filter ausführen, so kommt es mir zumindest vor! wenn ich den Set vor dem m_strFilter schließe und nur [Arbeitsanweisungen] öffne, dann klappt es. Also quasi so:
m_pSet->Close(); m_pSet->Open(AFX_DB_USE_DEFAULT_TYPE,"[Arbeitsanweisung]",NULL); m_pSet->m_strFilter = "Kunde = 'Microswitch R-zell (Ford)'"; m_pSet->Requery();
Aber das kann ja nciht der Sinn von meinem Filter sein! oder? Auch ein Arbeitsanweisung.Kunde = ... hilft nicht weiter wenn der Set mit order by geöffnet ist!
Was kann ich denn nun tun um die beiden unschönen Lösungen zu umgehen??
-
keiner ne Idee? Das Problem mit oben stehender Lösung ist jetzt noch etwas gewachsen. Wenn ich mache:
int nID =0; nID = m_PCD_CMB.GetCurSel(); if (nID != -1) // es muss was gewählt sein { nID = m_PCD_CMB.GetItemData(nID); } if (!m_pSet->IDsuchen(nID)) MessageBox(ERROR_003,MYERROR,MB_ICONERROR); if (m_rdNummern == 3) { CString KSearch; KSearch.Format("%s%s%s","Arbeitsanweisung where KUNDE = '", m_pSet->m_Kunde, "'"); m_pSet->Close(); m_pSet->Open(AFX_DB_USE_DEFAULT_TYPE,KSearch,NULL); //m_pSet->m_strFilter = "Kunde = '"+m_pSet->m_Kunde+"'"; //m_pSet->Requery(); } UpdateData(false);
Klappt es beim ersten mal Kunde auswählen, aber sobald ich das ganze nochmals mache, behält er den vorherigen Filter und findet dann natürlich keine Ergebnisse zu ne anderen Kunden.
Ich hab keine Ahnung warum. IDsuchen ist von mir implementiert und gibt true zurück wenn eine ID gefunden und false wenn nicht und durch den Filter gibt sie dann immer false, obwohl doch eigentlich nach nem Close alles wieder von vorn beginnen sollte, oder?
-
Nene, wenn du das gefiltert aufmachst, dann wirst du auch nur den vorher gewählten Kunden bekommen. Es sei denn, du löschst den filter, machst Requery und so weiter - das wäre aber Blödsinn.
Warum suchst du denn erstmal und machst dann noch den Query? Mach doch nur den Query und frag dann mit IsEOF ab, ob was gefunden wurde.
-
moment das auskommentierte ist die variante zwei! Ich mach nicht mit dem Filter open und danach m_strFilter, ich mach entweder oder aber bei beiden geht es nur einmal. Wieso denn das?
-
int nID =0; nID = m_PCD_CMB.GetCurSel(); if (nID != -1) // es muss was gewählt sein { nID = m_PCD_CMB.GetItemData(nID); } if (m_rdNummern == 3) { CString KSearch; KSearch.Format("%s%s%s","Arbeitsanweisung where KUNDE = '", m_pSet->m_Kunde, "'"); m_pSet->Close(); m_pSet->Open(AFX_DB_USE_DEFAULT_TYPE,KSearch,NULL); //m_pSet->m_strFilter = "Kunde = '"+m_pSet->m_Kunde+"'"; //m_pSet->Requery(); if (m_pSet->IsEOF()) MessageBox(ERROR_003,MYERROR,MB_ICONERROR); } UpdateData(false);
So meinte ich das.
-
aaahhh! Nein das suchen brauch ich ja eh, denn wenn der Radiobutton auf 2 ist, dann mach ich keine Query mehr, dann ist ungefiltert alles da, und ich navigier über suchen zum Datensatz. Aber du hast recht ich könnte die Suche auf if RDOBTN == 2 machen. und if RDOBTN ==3 dann so wie du unten geschrieben hast. Das werd ich wohl so machen, aber daran lag mein Problem nicht.
Ich weiß jetzt woran es lag, weiß aber noch keine Lösung!
Also wenn ich in einem Open-Statement ein order by rein Baue, dann sortiert er nur nach dieser Liste. Er zeigt zwar die anderen Spalten mit an, ich kann in den andern Spalten aber nichts machen was unabhängig von der georderten Spalte ist! m_strFilter macht ja nichts anderes als eine WHERE - Bedingung wenn ich nun also mache select * from irgendwas order by ID und dann mach m_strFilter dann sucht er mit dem Filter in der Spalte ID! Und das kann wenn ich sag where was anderes = ? nicht gehen weil was anderes nicht in irgendwas drin ist. Sei aber scheinbar eine ACCESS - Eigenschaft ("It`s not a bug it´s a feature") darum werde ich mal im Datebankforum fragen wie ich nach order by where einer anderen Spalte machen kann! Wenn es jemand hier weiß, bitte auch hier posten!
-
Und wenn du einfach nach zwei Spalten sortierst?
So eine Zweitsortierung fällt ja gar nicht auf und dein where würde wieder klappen.
Ähm, wenn du nur in einem Fall filterst und in anderen nicht, dann musst du dort aber trotzdem neu laden, oder?
Beispiel:
RDOBTN == 2, du suchst was und findest es.
RDOBTN == 3, du lädst gefiltert.
RDOBTN == 2, du versuchst, was zu finden, was im gefilterten von eben gar nicht drin ist.
-
das mit der zweitsortierung wär mal ne Klasse Idee werd ich gleich mal ausprobieren. Wenn ich nen RDO wechsle schließe ich momentan die DB und mach sie einfach ungefiltert auf, so wie zZ auch bei meiner Kundenauswahl, aber ich will Filtern über m_strFilter und nciht die ganze Zeit close open! Oder macht das zeittechnisch nichts aus? Ich dachte halt es sei so etwas unsauberer!
wie kann ich denn in VC++ ein select machen, wenn eine DB bzw. ein RSet schon geöffnet ist? Denn m_strFilter macht mir ja dummerweise dann das select automatisch und zwar nur in der ORDER Spalte!
-
Ich arbeite ja auch mit CRecordset, aber etwas anders.
Und dieses "etwas" muss dir wohl die Probleme machen, denn bei mir funktioniert folgender Code:CBestellungSet bestSet; bestSet.m_strFilter.Format(_T("([Lieferant] = %d) AND ([Art] = %d)"), f_lLiefID, f_nArt); bestSet.m_strSort = _T("[Best_Dat]"); bestSet.Requery();
Also habe ich leider keine Ahnung. Aber vielleicht stimmt es ja, dass es ein Access-Problem ist. Ich arbeite ja mit MS-SQL.
-
Danke für den Post der bringt mich weiter, ich mach nicht beim open den order by sondern nacher im set den sort, dann sollte es so gehen wie du schreibst!
juhu freu hab doch gewusst mit dir komm ich auf ne Lösung, das probier ich doch gleich mal aus! (Ich hab in nem parallelen Projekt auch MS-SQL werd nachher gleich mal probieren ob da gleiches Problem auftritt!)
-
JUHUU es geht jetzt alles sowas von Tip Top!
Hast mir wieder mal geholfen!
An alle die vielleicht irgendwann über die Suche auf diesen Thread kommen, weil sie ähnliches Problem haben, von wegen fehlender Opperator o.ä. das öffnen eines Recordsets empfiehlt es sich immer nur mit GetDefaultSQL zu machen (also ohne where und ohne order by). Stattdessen das Sortieren mit m_strSort (ersetzt hier das order by im RSet) und das Filtern mit m_strFilter (ersetzt hier das where im RSet)
[EDIT: ist es jetzt verständlicher?]
-
Äh, ist der Post so komplett? Ich verstehe die Erklärung nämlich nicht...
Edit: Ahhh, so ist es besser.
-
OK hab obigen Post nochmal bearbeitet ich hab eigentlich nur das zusammengefasst was du machst, was bei meiner alten Version nicht ging und jetzt geht!
ne kleine Erklärung ist auch hier im DB Forum