DISTINCT ????



  • Hi TimoL,

    kannst du vieleicht etwas genauer beschreiben wo ich dieses Befehle einsetzten muss. Ich dir nicht folgen. Mien Code

    if(! pProDet.Open(CRecordset::dynaset,_T("Select taetigkeit from ProjektDetails")))
    return FALSE;
    [/cpp]



  • etwas habe ich vergessen mein Code lautet:

    if(! pProDet.Open(CRecordset::dynaset,_T("Select DESTINCT taetigkeit from     projektDetails")))
          return FALSE;
    


  • Klar doch...

    if(! pProDet.Open(CRecordset::dynaset,_T("Select distinct taetigkeit from ProjektDetails")))

    oder

    if(! pProDet.Open(CRecordset::dynaset,_T("Select distinct(taetigkeit) from ProjektDetails")))

    sollte eigentlich beides gehen...



  • also ich versuche es jetzt so:

    if(! pProDet.Open(CRecordset::dynaset,_T("Select distinct(taetigkeit) from
                                                            ProjektDetails")))
    return FALSE;
    

    es kommt aber folgende Fehlermeldung:"Invalid character value for cast
    specification";



  • Kannst Du mal etwas mehr Code posten?
    Dein pProDet ist vom Typ CRecordset?
    Dann überprüfe mal den Wert der zurückkommen sollte mit dem Variablentyp der sie empfängt.
    Ansonsten kenne ich mich mit dem Recordset auch nicht so gut aus...



  • Das ist die alles ich versuch diese Combobox zu füllen

    BOOL CZeiterfassungDlg::FillComboTaetigkeiten(void)
    {
       int iIndex=0;
    
       CDatabase dbProDet;
       CDBProjektDetails pProDet(&dbProDet);
    
       CString str = "SELECT DISTINCT(taetigkeit) FROM ProjektDetails";
       if(! pProDet.Open(CRecordset::dynaset,_T(str)))
          return FALSE;
    
       while(!(pProDet.IsEOF()) && !(pProDet.IsBOF()) )
       {
          m_cmbTaetigkeiten.InsertString(iIndex,pProDet.m_Taetigkeit.Trim
                                                                                ());
          pProDet.MoveNext();
          iIndex++;
       }
       pProDet.Close();
    
       return TRUE;
    }
    


  • Ist CDBProjektDetails vom Typ CRecordset?
    Und pProDet.m_Taetigkeit ist anscheinend vom Typ CString.
    Als was für ein Feld ist taetigkeit in der Datenbank?

    Davon abgesehen ist die Datenbankverbindung noch garnicht hergestellt, oder?
    Du musst doch auch bei der Datenbank ein Open(Ex) vorher machen...

    Aber sind auch nur wage Vermutungen...



  • ja CDBProjektDetails ist abgeleitet von CRecordset, und pProDet.m_Taetigkeit ist auf der DB von Typ Char und im Code als CString, und die DBVerbindung wird
    doch über die ODBC Klasse hergestellt wenn man nicht db.OpenEx() aufruft.



  • 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.


Anmelden zum Antworten