Popup Index und Date formatieren
-
n'abend,
ich weiß nicht, ob es überhaupt in Ordnung geht, das ich zwei Themen in einem Post unterbringe.
Wenn nicht, bitte ich um Nachsicht...Frage 1
Man kann bei einer ComboBox den ItemIndex auf einen belibigen Wert setzen, damit dieser Eintrag direkt aktiv ist. Beispiel: ComboBox1->ItemIndex = 0;Kann man das auch mit einem PopupMenu machen? ich hätte gern, das das erste Item direkt aktiv ist, und man es nur noch mit Enter bestätigen muss.
Frage2
Ich baue für die SQLite den Query mit sprintf.void TFormMain::SQLInsertBuchung(String ValueDat, String ValueHG, String ValueVZweck, int ValueBetrag, String ValueZA, int ValueIdentNr) { char *sql_query = new char[128]; sprintf(sql_query, "INSERT INTO Buchungen " \ "(Datum, Hauptgruppe, Verwendungszweck, Betrag, Zahlart, IdentNr) " \ "VALUES ('%s', '%s', '%s', '%d', '%s', '%d')" \ , ValueDat, ValueHG, ValueVZweck, ValueBetrag, ValueZA, ValueIdentNr); sqlite_com(AktJahr, sql_query); delete[] sql_query; }
Soweit so gut, das Problem ist die Formatierung des Datums.
In der DB ist das Feld vom Typ Date. Das soll eigentlich auch so bleiben, da ich davon ausgehe, das ich noch damit rechnen werde...Das Eingabefeld auf meinem Form ist ein ganz normales TEdit. Also String.
TDateTime* myTime = new TDateTime(StrToDate(FormBuchenEditDate->Text)); String s = myTime->FormatString("yyyy-mm-dd");
Hier wird es noch ein wenig formatiert, und soll nun an die Funktion übergeben werden, in der das Query gebaut wird. Nur wie ? Als String kann ich es ja nun nicht mehr machen. Das gibt eine wunderschöne Exception.
Könnt ihr mir da etwas unter die Arme greifen?
VG
Matthias
-
Zwei Fragen auf einmal führen bei der Beantwortung eher zu Chaos.
sprintf in einem C++ Programm? In 128 Zeichen? Wenn das mal gut geht.
Grundsätzlich: baue Wette in SQL Abfragen niemals per String Konkatenation ein. Benutze Bindevariablen. (https://www.sqlite.org/c3ref/bind_blob.html)
-
@manni66
Danke für den Hinweis auf die Problematik sprintf unter C++!
Das war mir gar nicht bekannt.... Werde jetzt ostream verwenden.Die Bindevariablen muss ich mir mal näher anschauen. Kannte ich auch noch nicht...
-
@MHage sagte in Popup Index und Date formatieren:
Danke für den Hinweis auf die Problematik sprintf unter C++!
Das war mir gar nicht bekannt.... Werde jetzt ostream verwenden.Verstehe den Zusammenhang nicht. Die Problematik von sprintf hat erstmal nichts mit C++ zu tun, die gibts in C genauso. Wie hilft dir hier ostream?! In C++ könntest du einen std::string benutzen. Aber wie @manni66 schon schrieb, solltest du Variablen binden, also in der Abfrage den Platzhalter
?
benutzen. Dann brauchst du deine String-Variablen auch nicht manuell zu quoten (ich hoffe, das hast du wenigstens vorher gemacht?)Dann ist deine Abfrage auch ein konstanter String:
"INSERT INTO Buchungen (Datum, Hauptgruppe, Verwendungszweck, Betrag, Zahlart, IdentNr) VALUES (?, ?, ?, ?, ?, ?)"
-
@wob
Der Einwand von manni66 war ein Grundsätzlicher und hatte nichts mit der eigentlichen Frage zu tun. Bin trotzdem froh, das man mir sowas sagt, auch wenn es nicht direkt mit der Frage zu tun hat.Die Problematik musste ich heute erstmal googeln. Ich wusste nicht einmal etwas davon.
Was ich dann auf die schnelle mitgenommen habe, war die Aussage : sprintf etc.
hat in einem C++ Programm nichts zu suchen.Jetzt nutze ich ostream. Wieder was gelernt....
Und, du hast recht, ostream hilft hier bei der eigentlichen Frage erstmal nichts.
Trotzdem hat sich für mich das Problem erstmal gelöst. Muss mir die Bindevariablen aber noch einmal anschauen, hab es nämlich nicht wirklich kapiert....schönen Abend für euch...