DISTINCT ????
-
Meine letzte Idee ist noch, dass er einen Spaltennamen (DISTINCT(taetigkeit)) sucht, es ihn aber nicht gibt.
Also wäre noch die letzte Alternative, dass Du das folgende SQL-Statement ausprobierst:"SELECT DISTINCT(taetigkeit) as taetigkeit FROM ProjektDetails"
somit könnte das Mapping von Rückgabewerten zu Variablen wieder stimmen.
Und wenn es das auch nicht ist, sag mir mal Deine EMail-Adresse,
dann schicke ich Dir meine SQL-Klassen, mit denen das auf jeden Fall klappt.Timo
PS: Davon abgesehen würde ich nicht für jedes SQL eine neue Datenbank-Verbindung aufbauen; ist einfach zu teuer...
-
Also ich danke dir erst mal für diene Mühe. Das Problem ist das ich diese Statement in SQL Server Query Analayzer ausprobiere und ich bekomme keine Fehlermeldung. Aber über die ODBC Klasse geht es nicht, ich glaube es muss wohl ein Problem mit der Typumwandlung sein. Ich wäre dir dankbar wenn du mir diene
ODBC Klasse schicken würdest. xxbahmanxx@gmx.de
-
SELECT DINSTINCTROW taetigkeit from ProjektDetails GROUP BY taetigkeit;
Hilfreich kann es oft sein Access zu benutzen und dort den SQL-Query zusammenzustellen und zu test ob das richtige rauskommt.
[ Dieser Beitrag wurde am 18.12.2002 um 00:59 Uhr von Unix-Tom editiert. ]
[ Dieser Beitrag wurde am 18.12.2002 um 00:59 Uhr von Unix-Tom editiert. ]
-
Hallo Unix-Tom,
wie du sehen kannst, bin ich zu diese späte Stunde immer noch wach und versuche dieses Problem zu lösen, ich glaube ich habe schon fast alles ausprobiert aber es will nicht klappen. Auch bei der SQL Server gibt es ein Query Analayzer aber das blöde ist das es dort klappt, es ist ein Problem mit der Konvertierung.
-
Hier ist nochmal mein Code in Detail vieleicht kann mir ja noch jemand helfen.Ich bekomme die Fehlermeldung:"Ungültiger Zeichenwert für die Konvertierungsangabe"
//// CDBProjektDetails .h ///////////////////////////////////////////////////// CDBProjektDetails::CDBProjektDetails(CDatabase* pdb) : CRecordset(pdb) { m_PID = 0; m_MANR = 0; m_Taetigkeit = L""; m_Datum; m_Anfangszeit; m_Endzeit; m_Dauer; m_Pausen; m_Gesamtzeit = 0; m_EintragZeitpunkt; m_Bemerkung = L""; m_nFields = 11; m_nDefaultType = dynaset; } CString CDBProjektDetails::GetDefaultConnect() { //return _T("DSN=ZE;UID=sa;PWD=;APP=Microsoft\x00ae Visual Studio .NET;WSID=NEPAL;DATABASE=Zeiterfassung;Network=DBMSSOCN"); return _T("DSN=SERVERDBZeiterfassung;APP=Microsoft\x00ae Visual Studio .NET;WSID=CBAHMAN;DATABASE=Zeiterfassung;Trusted_Connection=Yes"); } CString CDBProjektDetails::GetDefaultSQL() { return _T("[dbo].[ProjektDetails]"); } void CDBProjektDetails::DoFieldExchange(CFieldExchange* pFX) { pFX->SetFieldType(CFieldExchange::outputColumn); // Macros such as RFX_Text() and RFX_Int() are dependent on the // type of the member variable, not the type of the field in the database. // ODBC will try to automatically convert the column value to the requested type RFX_Long(pFX, _T("[PID]"), m_PID); RFX_Long(pFX, _T("[MANR]"), m_MANR); RFX_Text(pFX, _T("[Taetigkeit]"), m_Taetigkeit); RFX_Date(pFX, _T("[Datum]"), m_Datum); RFX_Date(pFX, _T("[Anfangszeit]"), m_Anfangszeit); RFX_Date(pFX, _T("[Endzeit]"), m_Endzeit); RFX_Date(pFX, _T("[Dauer]"), m_Dauer); RFX_Date(pFX, _T("[Pausen]"), m_Pausen); RFX_Date(pFX, _T("[EintragZeitpunkt]"), m_EintragZeitpunkt); RFX_Long(pFX, _T("[Gesamtzeit]"), m_Gesamtzeit); RFX_Text(pFX, _T("[Bemerkung]"), m_Bemerkung); } ///////////////////////////////////////////////////////////////////////////// // CDBProjektDetails diagnostics #ifdef _DEBUG void CDBProjektDetails::AssertValid() const { CRecordset::AssertValid(); } void CDBProjektDetails::Dump(CDumpContext& dc) const { CRecordset::Dump(dc); } #endif //_DEBUG ////////CDBProjektDetails .cpp ///////////////////////////////////////////////// class CDBProjektDetails : public CRecordset { public: CDBProjektDetails(CDatabase* pDatabase = NULL); DECLARE_DYNAMIC(CDBProjektDetails) // Field/Param Data // The string types below (if present) reflect the actual data type of the // database field - CStringA for ANSI datatypes and CStringW for Unicode // datatypes. This is to prevent the ODBC driver from performing potentially // unnecessary conversions. If you wish, you may change these members to // CString types and the ODBC driver will perform all necessary conversions. // (Note: You must use an ODBC driver version that is version 3.5 or greater // to support both Unicode and these conversions). long m_PID; long m_MANR; CString m_Taetigkeit; COleDateTime m_Datum; COleDateTime m_Anfangszeit; COleDateTime m_Endzeit; COleDateTime m_Dauer; COleDateTime m_Pausen; COleDateTime m_EintragZeitpunkt; long m_Gesamtzeit; CString m_Bemerkung; // Overrides // Wizard generated virtual function overrides public: virtual CString GetDefaultConnect(); // Default connection string virtual CString GetDefaultSQL(); // default SQL for Recordset virtual void DoFieldExchange(CFieldExchange* pFX); // RFX support // Implementation #ifdef _DEBUG virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const; #endif }; //// CZeiterfassungDlg .cpp ///////////////////////////////////////////////// BOOL CZeiterfassungDlg::FillComboTaetigkeiten(void) { int iIndex=0; CDatabase dbProDet; if(! dbProDet.OpenEx("DSN=SERVERDBZeiterfassung;APP=Microsoft\x00ae Visual Studio .NET;WSID=CBAHMAN;DATABASE=Zeiterfassung;Trusted_Connection=Yes")) return FALSE; CDBProjektDetails pProDet(&dbProDet); if(! pProDet.Open(CRecordset::dynaset,"SELECT distinct taetigkeit from ProjektDetails"))//HIER IST DAS PROBLEM/// return FALSE; while(!(pProDet.IsEOF()) && !(pProDet.IsBOF()) ) { m_cmbTaetigkeiten.InsertString(iIndex,pProDet.m_Taetigkeit.Trim()); pProDet.MoveNext(); iIndex++; } pProDet.Close(); dbProDet.Close(); return TRUE; }
-
Ich vermute, der Fehler liegt darin, dass du das erste Feld des Resultset an eine long-Variable bindest.
Versuch mal:
"SELECT PID, MANR, distinct taetigkeit from ProjektDetails"
-
Hallo MFK,
ja dann funzt es, das habe ich schon probiert, aber das Problem ist das er Taetigkeit nicht akzeptiert.Datentypen wie long kann er machen aber Date und CString nicht das ist echt blöd. ganz davon abgesehen, es funtz auch nicht wenn ich DISTINCT weg lasse.
-
Hallo !
Ich wundere mich gerade über diese Zeile:
while(!(pProDet.IsEOF()) && !(pProDet.IsBOF()))
while(!pProDet.IsEOF()) reicht doch, oder ? Aber das nur nebenbei.
Wie wäre es, wenn du DISTINCT einfach weg lässt und vor InsertString(...) mit FindString(...) kontrollierst, ob der Eintrag bereits vorhanden ist ? Wenn ja, nicht eintragen, ansonsten InsertString(...).
Tschüss
[edit]
Nochwas:
probier mal das hier aus:Die Zeile in DoFieldExchange(...)
RFX_Text(pFX, _T("[Taetigkeit]"), m_Taetigkeit);
ändern in
RFX_Text(pFX, _T("DISTINCT [Taetigkeit]"), m_Taetigkeit);
Dabei ist es allerdings notwendig, dass die Klasse nur aus dem Feld Taetigkeit besteht, d.h. eine weitere "Hilfs-"Klasse von CRecordset ableiten und alle anderen Felder löschen. Ebenso m_nFields = 1; anpassen.
Das hier steht übrigens dazu in der MSDN:
DISTINCT Omits records that contain duplicate data in the selected fields. To be included in the results of the query, the values for each field listed in the SELECT statement must be unique. For example, several employees listed in an Employees table may have the same last name. If two records contain Smith in the LastName field, the following SQL statement returns only one record that contains Smith:
SELECT DISTINCT
LastName
FROM Employees;If you omit DISTINCT, this query returns both Smith records.
If the SELECT clause contains more than one field, the combination of values from all fields must be unique for a given record to be included in the results.
The output of a query that uses DISTINCT isn't updatable and doesn't reflect subsequent changes made by other users.[/edit]
[ Dieser Beitrag wurde am 18.12.2002 um 10:33 Uhr von isabeau editiert. ]
-
Ich danke nochmal für die Unterstützung, klar man kann es auch anders Lösen.
Aber mir ging es eigentlich darum zu wiessen warum sowas vorkommt. Ich arbeite schon länger an das Projekt, und bin auch schon fast am Ende, ich habe bis jetzt nur die Where(m_strFilter) und OrderBy(m_strSort) Klausel gebraucht und wollte nun zum ersten mal in diese Projekt von Distinct in der Select Klausel gebrauch machen, und bin dann auf dieses Problem gestoßen. Es muss sich Wahrscheinlich um eine Fehler irgendwo gut versteckt handeln die ich noch vieleicht finde, aber troztdem danke an allen.
-
Wenn du deine Klasse so machst wie du sie hast dann musst du auch die Felder abfragen welche in der Klasse sind. Und zwar alle-
Willst du ein bestimmtes Field abfragen musst du acuh die Klasse anpassen da er trotzdem Werte in die Leeren Variablen schreiben möchte aber keine Werte vorhanden sind.