DateTimePicker auslesen
-
ja. Lo_Entry ist eine Klasse von Typ CRecordset ( ODBC Consumer ).Sorry habe das Add und Update nicht im Forum gepostet, mein Fehler. Also es das Add und Update sind vorhanden. Das Programm läuft alle Befehle von Add bis zum Update ohne Fehler durch. Nur bei m_t_Zeitpunkt erfolgt kein Eintrag
mfg el-loco
-
Für die anderen Felder geht es aber?
Dann zeig bitte mal die DoFieldExchange, die Variablendeklaration im Header und sag, welchen Zeitstempel zu beispielsweise ausprobiert hast.
-
Ja. Alle Felder werden korrekt Ausgefüllt.
Hier die DoDataExchange:
void SMT_C_Supplement::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_COMBO1, m_ListActivities); DDX_Control(pDX, IDC_EDIT1, m_NewActivity); DDX_DateTimeCtrl(pDX, IDC_DATETIMEPICKER5, m_StartDate); DDX_DateTimeCtrl(pDX, IDC_DATETIMEPICKER2, m_StartTime); }
Die Headerdatei:
class SMT_C_Supplement : public CDialog { DECLARE_DYNAMIC(SMT_C_Supplement) public: SMT_C_Supplement(CWnd* pParent = NULL); // standard constructor virtual ~SMT_C_Supplement(); // Dialog Data enum { IDD = IDD_SMT_SUPPLEMENT }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support DECLARE_MESSAGE_MAP() public: afx_msg void OnDtnDatetimechangeDatetimepicker3(NMHDR *pNMHDR, LRESULT *pResult); afx_msg void OnCbnSelchangeCombo1(); long m_ProjectID; CComboBox m_ListActivities; afx_msg void OnDtnDatetimechangeDatetimepicker1(NMHDR *pNMHDR, LRESULT *pResult); CEdit m_NewActivity; afx_msg void OnBnClickedButton1(); int m_ChooseActivity; int m_CreateActivity; afx_msg void OnBnClickedRadio1(); afx_msg void OnBnClickedRadio2(); COleDateTime m_StartDate; COleDateTime m_StartTime; };
Hier der Datenbankeintrag:
CString Ls_Activity; CString Ls_Query; CString Ls_Message; DB_C_Entry Lo_Entry; DB_C_Activity Lo_Activity; DB_C_Project Lo_Project; COleDateTime Lo_ToDB; Lo_ToDB.SetDate(m_StartDate.GetYear(),m_StartDate.GetMonth(),m_StartDate.GetDay()); Lo_ToDB.SetTime(m_StartTime.GetHour(),m_StartTime.GetMinute(),m_StartTime.GetSecond()); Lo_Entry.AddNew(); Lo_Entry.m_s_Projektname = Lo_Project.m_s_ProjektName; Lo_Entry.m_s_Taetigkeitsname = ""; Lo_Entry.m_s_Benutzername = ""; Lo_Entry.m_b_Nachtrag = 1; Lo_Entry.m_t_Zeitpunkt = Lo_ToDB; Lo_Entry.m_b_Typ = "Start"; Lo_Entry.Update();
Was meinst du mit Zeitstempel ?
Vielen Dank für deine Mühe.
mfg el-loco
-
Ähm, eigentlich wollte ich das DoFieldExchange sehen, aber ich habe den Fehler gefunden.
Du darfst die Variablen erst NACH AddNew füllen. AddNew erzeugt doch erst den zu füllenden Datensatz.
-
Aach.. Noch früh am Morgen nach dem Feiertag, sorry
also das verstehe ich jetzt nicht ganz
.
Die Variable Lo_ToDB wird vor AddNew() aufbereitet und dann in die DB geschrieben.
Hier noch DoFieldExchange:
void DB_C_Entry::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("[i_EintragID]"), m_i_EintragID); RFX_Text(pFX, _T("[s_Projektname]"), m_s_Projektname); RFX_Text(pFX, _T("[s_Taetigkeitsname]"), m_s_Taetigkeitsname); RFX_Text(pFX, _T("[s_Benutzername]"), m_s_Benutzername); RFX_Bool(pFX, _T("[b_Nachtrag]"), m_b_Nachtrag); RFX_Date(pFX, _T("[t_Zeitpunkt]"), m_t_Zeitpunkt); RFX_Text(pFX, _T("[b_Typ]"), m_b_Typ); }
Ich hoffe du meinstest das.
mfg el-loco
-
Du musst das Aufbereiten aber NACH AddNew machen, sonst ist das umsonst gewesen!
Lo_Entry.AddNew(); Lo_ToDB.SetDate(m_StartDate.GetYear(),m_StartDate.GetMonth(),m_StartDate.GetDay()); Lo_ToDB.SetTime(m_StartTime.GetHour(),m_StartTime.GetMinute(),m_StartTime.GetSecond()); Lo_Entry.m_s_Projektname = Lo_Project.m_s_ProjektName; Lo_Entry.m_s_Taetigkeitsname = ""; Lo_Entry.m_s_Benutzername = ""; Lo_Entry.m_b_Nachtrag = 1; Lo_Entry.m_t_Zeitpunkt = Lo_ToDB; Lo_Entry.m_b_Typ = "Start"; Lo_Entry.Update();
-
Habs gemacht wie du gesagt hast. Leider ändert sich nichts.
Ich habe auch den Zusammenhang, dass nach AddNew() Variablen aufbereitet werden müssen noch nicht ganz begriffen. Vielleicht sollte ich mich mal besser nochmal hinter die Bücher stellen.
mfg el-loco
-
Oder ich versuchs einmal "für Doofe" zu erklären.
Was is dir lieber? Die Erklärung käme dann nachher, so nach 13:30 irgendwann.
-
Die Erlärung für "Neulinge" bitte.
mfg el-loco
-
Okay, die geht etwas schneller.
Also:
Gehen wir mal davon aus, du hast schon Daten eingelesen und steht auf dem letzten Datensatz.
Wenn du nun irgendwas in die Member schreibst, überschreibst du die Daten im letzten Datensatz. Aber nur im RAM, nicht in der DB.
Willst du nun also einen neuen Datensatz haben, musst du AddNew aufrufen.
Es wird eine "leere Zeile" hintenangestellt und der Cursor darauf gesetzt.
Da rein kannst du nun schreiben - vergisst du ein Feld, ist es NULL.
Wenn du fertig bist schreibst du den neuen Datensatz mit Update in die DB und holst ihn dir (sicherheitshalber) mit Requery neu wieder.Soviel dazu. Ich hab nochmal zwei Fragen:
1.) Was für ein Typ ist m_t_Zeitpunkt?
2.) Was für ein Datum versuchst du zu speichern. Irgendwas vor 1970 oder nach 2038?
-
Eigentlich nichts neues. Das habe ich ja auch so gemacht.
Die erstellte OleDateTime Variable mit der DTP-Variable 1 und DTP-Variable 2 gefüllt mit SetDate und SetTime. Okay.
Mit AddNew eine neue Spalte erzeugt. Okay.
Lo_Entry.m_t_Zeitpunkt = Erstellte OleDateTime Variable. Okay.
Mit Update übernehmen. fertig.
Datensatz von m_t_Zeitpunkt ist vom Typ Date/Time (Access);
Nein. Es sind Daten zwischen 1970 und 2038. Sollte glaube ich nur bei CTime ein Problem sein.mfg el-loco
-
Das ist komisch.
Lass dir doch mal mit TRACE ausgeben, was in den drei Datums-Variablen drin steht.
Vielleicht liegt da der Fehler. (Zum Wandeln in CString kannst du C*Time::Format nehmen.)
-
Huuh hab doch noch eine Lösung gefunden.
Habe folgendes gemacht.
CTime Lt_Date; CTime Lt_Time; m_StartDateCtrl.GetTime(Lt_Date); //Controlvariable des DTP m_StartTimeCtrl.GetTime(Lt_Time); //Controlvariable des DTP CTime Lt_ToDBTimeStart(Lt_Date.GetYear(),Lt_Date.GetMonth(),Lt_Date.GetDay(),Lt_Time.GetHour(),Lt_Time.GetMinute(),Lt_Time.GetSecond()); Lo_Entry.AddNew(); //..... Lo_Entry.m_t_Zeitpunkt = Lt_ToDBTimeStart; Lo_Entry.Update();
Trotzdem vielen Dank für die Hilfe estartu_de.
mfg el-loco