[ODBC] Abfragen mit *



  • Hallo allerseits

    Es treibt mich zum Wahnsinn. Ich bin nun schon einige Zeit am rumtesten aber irgendwie scheint heute einer der Tage zu sein an dem nicht viel klappt. Deshalb bitte ich euch um Hilfe:

    Ist es möglich mit CRecordset Abfragen zu machen mit ? Wenn ich also beispielsweise "12345_12" in meiner Datenbank habe, den letzten Teil jedoch nicht weiss und mit "12345" ersetzen könnte. Er findet jedoch nichts wenn ich es so versuche. Hier mein Codeschnipsel:

    ...
    CString filterCell;
    CString sr = dNIM->m_SiteReference;
    filterCell.Format("Cell = '%s*'", sr);
    
    dCell = new CDatabaseCell(NULL);
    dCell->m_strFilter = filterCell;
    dCell->Open(CRecordset::snapshot, NULL, CRecordset::readOnly);
    dCell->Requery();
    ...
    

    Einen Fehler oder so gibt er mir nicht aus, ist eigentlich auch logisch. Trotzdem findet er keinen Datensatz, obwohl da einer ist.

    Danke für die Aufmerksamkeit



  • Ist das *-Wildcard in SQL nicht das %-Zeichen? 😕

    Nagel mich nicht drauf an, aber ich bin grade echt der Meinung... 🙂



  • Ersetze mal dein = durch LIKE.

    [edit]...und Wildcard: bei Oracle ist es % und bei Access * (für beliebig viele Zeichen) [/edit]

    [nochn edit]
    Das Requery() direkt nach Open() ist übrigens überflüssig. Das bremst so einfach nur:
    [/nochn edit]



  • Nein, das scheint leider nicht zu funktionieren. Er motzt zwar nicht dass die Anweisung oder so falsch sei aber ein Resultat krieg ich nicht. Es ist eben so dass in einer Excel-Tabelle (ja, es sind Excel-Files, es muss was gefiltert werden) zum Beispiel die SiteReference "EINS" ist, in der anderen wo ich dann schauen muss ob diese "site" existiert gibts aber "EINS_1", "EINS_2" und "EINS_3". Die sollte ich jetzt alle 3 rauskriegen und in ein txt schreiben. Wenn das LIKE klappen würde könnte ich mit GetRecordCount() rausfinden wie viele er gefunden hat und dann eine for-Schleife so lange durchführen bis er am Ende angelangt ist. Er findet aber nichts...

    Würde es auch irgendwie anders gehen?



  • Ah sorry, hab nen kleinen Fehler gemacht. Man sollte vielleicht nicht umbedingt Format benutzen da er das "%" als Variable interpretiert. Wenn man jedoch "Cell LIKE 'bla%'" macht, dann funktioniert es. Also isabeau, estartu hatte doch Recht 😉

    Danke ihr beiden



  • GetRecordCount funktionierte doch sowieso nicht richtig... 😞

    Hol dir doch alles und filter das dann in ner Schleife raus.

    Achtung teilweise Pseudocode:

    while (!set.IsEOF())
    {
    if (set.m_strIrgendwas.Find(strSuchtext) == 0)
    {
    // Schreib in Datei
    }
    set.MoveNext();
    }
    

    Dauert zwar vielleicht länger, aber du hast erstmal eine Lösung. 🙂

    Edit: Bedingung korrigiert...



  • Ehm, es geht ja 😃

    Mein einziges Problem war die Wildcardsuche, den Rest hatte ich schon. Und es funktioniert...

    Danke trotzdem 🙂

    EDIT: Hab jetzt aber ein anderes kleines Problem 🙄 . "Zu viele Client-Tasks. Driver's SQLSetConnectAttr failed" gibt er aus. Ich weis auch bei welcher Funktion, ich hab nämlich am schluss 12 Output-Files und die sind alle mit verschiedenen Filterkriterien. Darum hat er irgendwie ein Problem wenn er eine Datenbank so viel mal hintereinander aufruft. Ich schliess die aber bei jeder Funktion mit dNIM->Close wieder? 😕

    Kann man eine Datenbank noch mehr schliessen als schliessen? 😃



  • Bei Format müßte es mit %% gehen... 🙂



  • BAR schrieb:

    Ich schliess die aber bei jeder Funktion mit dNIM->Close wieder?

    Beim Schliessen hätte ich ja eher ein
    dCell->Close();
    erwartet. Und natürlich ein
    delete dCell;



  • Ja aber ich hab vorher noch einen Pointer auf ein CRecordset welches dNIM heisst. Und er hat beim Debuggen auf der Open()-Zeile des dNIM Probleme, eben weil die vorherigen nicht sauber geschlossen wurden. Den Pointer gelöscht hab ich auch, dCell, dSite und dNIM sind auch alle gelöscht und geschlossen...

    void CProcess::SitesThisMonth() //OUTPUT 4
    {
    	CAddFunctions		AF;
    
    	CDatabaseNIM*		dNIM;
    	CDatabaseSite*		dSite;
    
    	int					dYear;
    	int					dMonth;
    	int					dDay;
    	CString				writestring;
    
    	CTime TCurrentDate		= CTime::GetCurrentTime();
    	CString	currentDate		= TCurrentDate.Format("%d.%m.%Y");
    	CString SCurrentDay		= TCurrentDate.Format("%d");
    	int currentDay			= atoi(SCurrentDay);
    	CString SCurrentMonth	= TCurrentDate.Format("%m");
    	int currentMonth		= atoi(SCurrentMonth);
    	CString SCurrentYear	= TCurrentDate.Format("%Y");
    	int currentYear			= atoi(SCurrentYear);
    
    	CFile sitesThisMonthFile(AF.CStringFormat("%s\[FG %s] Sites this Month.txt", outputLocation, currentDate), CFile::modeCreate | CFile::modeWrite);
    
    	dNIM = new CDatabaseNIM(NULL);
    	dNIM->Open(CRecordset::snapshot, NULL, CRecordset::readOnly);
    
    	for(int i = 0; i < dNIM->GetRecordCount(); i++) //AS LONG AS WE ARE IN A ROW
    	{
    		dYear	= dNIM->m_MS23ForecastDate.GetYear();
    		dMonth	= dNIM->m_MS23ForecastDate.GetMonth();
    		dDay	= dNIM->m_MS23ForecastDate.GetDay();
    
    		if(dYear == currentYear && dMonth == currentMonth && dDay > currentDay)
    		{
    			dSite = new CDatabaseSite(NULL);
    			dSite->m_strFilter = "Site LIKE '" + dNIM->m_SiteReference + "%'";
    			dSite->Open(CRecordset::snapshot, NULL, CRecordset::readOnly);
    
    			for(int c = 0; c < dSite->GetRecordCount(); c++)
    			{
    				if(dSite->m_Site != "") //IF THERE WAS FOUND A ENTRY
    				{
    					writestring = AF.CStringFormat("%s\r\n", dSite->m_Site);
    
    					sitesThisMonthFile.SeekToEnd();
    					sitesThisMonthFile.Write(writestring, writestring.GetLength());
    				}
    
    				dSite->MoveNext();
    			}
    
    			dSite->Close();
    		}
    
    		dNIM->MoveNext();
    	}
    
    	sitesThisMonthFile.Close();
    	dNIM->Close();
    
    	delete dSite;
    	delete dNIM;
    }
    

    Und ich hab 10 solche Funktionen. Natürlich erfüllt jede nen anderen Filterprozess, aber der Aufbau etc. ist bei allen gleich. Hab ich da was vergessen zu schliessen oder löschen?


Anmelden zum Antworten