![]() |
Datenbank: SQLite • Version: 3.6.23 • Zugriff über: TDISQLite3 Personal
Werte im DBGrid ändern
Seid gegrüßt,
ich speichere meine Daten in meiner Datenbank in folgendem Format: yyyy-mm-tt, in meinem DBGrid möchte ich sie aber im Format tt-mm-yyyy anzeigen, dafür muss ich die Daten ja an einer bestimmten Stelle ändern. Das wollte ich an der AfterOpen-Prozedur des ClientDataSets machen, hab also folgende Prozedur geschrieben:
Delphi-Quellcode:
Das geht allerdings schief, da ich folgenden Fehler bekomme:
procedure TfmBlubba.cdsBlubbaAfterOpen(DataSet: TDataSet);
begin cdsBlubba.Close; //ohne das, bekomme ich den Fehler, dass ich nicht im Insert-Modus bin while not cdsBlubba.eof do begin cdsBlubba.FieldByName('datum').Text := FormatDateDeu(cdsBlubba.FieldByName('datum').Text); //FormatDateDeu ist eine von mir geschriebene function cdsBlubba.Next; end; cdsBlubba.Open; end; ![]() ![]() ( ![]() Darum die Frage, was an meinem Ansatz falsch ist .. oder muss ich erst beim DBGrid in der DrawColumnCell die Werte ändern? Gruß und frohe Ostern. |
Re: Werte im DBGrid ändern
Hallo :hi:
Versuche mal folgendes: 1. Deine Versuche weglassen 2. nach dem Erzeugen des Datasets oder im OnCreate des Formulars
Delphi-Quellcode:
3. dann sind alle Werte des Feldes Datum des Datasets cdsBlubba entsprechend des Formatstrings angepaßt
TDateTimeField(cdsBlubba.FieldByName('datum')).DisplayFormat:='dd.mm.yyyy';
PS: - solange das Dataset existiert bleibt die Formatierung bestehen. Auch nach Datenänderung. - es gibt auch z.B. TNumericField wo man z.B. Floatwerte in der Darstellung formatieren kann. ob der FormatString so paßt mußt du probieren. Nachfrage: liegt das Datum in der DB als String oder als Date Wert ? Im Falle des Strings funktioniert das nicht :roll: |
Re: Werte im DBGrid ändern
Zitat:
Danke (schonmal) für Deine/Eure Hilfe. :) |
Re: Werte im DBGrid ändern
Guten Morgen...
Zitat:
|
Re: Werte im DBGrid ändern
Zitat:
Zitat:
![]() ![]() |
Re: Werte im DBGrid ändern
Nun...
ich habe es gerade mal probiert und exakt das Ergebnis erhalten was zu erwarten war. Falsch war allerdings, daß die Formatierung auch nach dem Neuladen des Datasets beibehalten wird. Es muß wieder neu gesetzt werden. Kann es sein, daß deine Spaltenbreite einfach nicht zur Darstellung ausreicht ? Ansonsten fällt mir nichts dazu ein. :gruebel: Edit: Zitat:
- Welche Komponente ist das Dataset ? (Standard / Fremdkomponente) Edit2: ...auch wenn der fehlende Buchstabe bereits nicht kopiert wurde :stupid: |
Re: Werte im DBGrid ändern
Zitat:
Das Dataset ist ein TClientDataSet. Der ganze Zugriff erfolgt über: TDISQLite3Database -> TDISQLite3UniDirQuery -> TDataSetProvider -> TClientDataSet -> TDataSource -> TDBGrid. (außer TDISQLite3Database und TDISQLite3UniDirQuery sind alle anderen Standardkomponenten) Liebe Grüße. |
Re: Werte im DBGrid ändern
hmmm...
mit SQLite kenn ich mich nicht wirklich aus. Aber die TDISQLite3UniDirQuery ist doch ein Dataset oder ? Warum mußt du noch einen Provider und ein ClientDataset zwischen der Query und die Datasource basteln ? Versuch mal die Formatierung auf die Query und den Provider und das ClientDataset weglassen. Das heißt die Datasource direkt an die TDISQLite3UniDirQuery. |
Re: Werte im DBGrid ändern
Zitat:
Allerdings machen "wir" Fortschritte, ich hab gerad
Delphi-Quellcode:
gemacht, das hat auch einen gewissen Erfolg, jetzt steht in meinem DBGrid unter Datum allerdings nur "2010" (in 6 Einträgen). (wenn ich die Spalte zur Laufzeit vergrößere, steht da trotzdem nur 2010)
procedure TfmBlubba.dsqlBlubbaQueryAfterOpen(DataSet: TDataSet);
begin TDateTimeField(dsqlBlubbaQuery.FieldByName('Datum')).DisplayFormat := 'dd.mm.yyyy'; end; |
Re: Werte im DBGrid ändern
und wenn du statt der UniDirQuery eine "normale" Query verwendest ?
Frage: die TDISQL stammen woher ? Schon mal Zeos als alternative Zugriffskomponenten probiert ? |
Re: Werte im DBGrid ändern
Zitat:
Zum Thread .. das Problem besteht (aktuell) nicht mehr, da ich in "diesem" DBGrid das Datum gar nicht anzeige (wieso bin ich da gestern Nacht drauf gekommen?!), das Datum wird in einem späterem DBGrid nochmal angezeigt, hierfür muss es dann auch wieder formatiert werden, sollte ich trotz der Hilfe von "haentschman" dabei Probleme haben, werde ich nochmal nachfragen. Frohe Ostern und Danke an haentschman. |
Re: Werte im DBGrid ändern
Zitat:
Zitat:
![]() Nun möchte ich in einem DBGrid die Werte aber so angezeigt bekommen: Zitat:
SQL-Code:
Was mich allerdings wundert und worauf ich auch keine Antwort weiß ist, dass wenn ich jetzt
SELECT datum FROM .. ORDER BY datum DESC
Delphi-Quellcode:
in die Watchliste tue, mir lediglich '2010' angezeigt wird. (in meinem DBGrid wird mir auch nur '2010' angezeigt)
Query.FieldByName('Datum').AsString
Änder ich die Formatierung des Datums in der Datenbank auf: Zitat:
Wenn ich jetzt
Delphi-Quellcode:
anwende, passiert gar nichts, das Datum wird mir weiterhin in meinem DBGrid als "20100323" usw. angezeigt.
TDateTimeField(dsqlBlubbaQuery.FieldByName('Datum')).DisplayFormat := 'dd.mm.yyyy';
Änder ich die Formatierung des Datums in der Datenbank auf: Zitat:
Zitat:
Könnt ihr mir eine Lösung nennen, wie ich das Datum richtig formatiert in meinem DBGrid angezeigt bekomme? Gruß Max |
Re: Werte im DBGrid ändern
ich nochmal... :zwinker:
wenn dein DB Feld vom Typ DATE ist wird in der DB das Datum als Integer abgelegt (so sollte es zumindest sein). Die "Umsetzung" in ein lesbares Datum macht das DBGrid von allein. Im Normalfall das im System eingestellte Format. Fang einfach mal von ganz vorn an: - alle Formatierungen raus - einen DATE Wert aus der DB lesen (wie deine SQL Abfrage) --> wie wird es im Grid angezeigt ? Zitat:
|
Re: Werte im DBGrid ändern
Zitat:
Zitat:
![]() Zitat:
![]() ![]() (ich hoffe, so meintest du das) Meine SQL-Abfrage lautet nun:
SQL-Code:
(hab es zu "Testzwecken" darauf vereinfacht)
SELECT Datum FROM aktienwerte;
dann sieht mein DBGrid so aus: ![]() ![]() Jetzt hab ich allerdings gerade folgendes probiert und die SQL-Abfrage so gestaltet:
SQL-Code:
dann sieht mein DBGrid so aus (wie kommen bitte die Werte zustande :D):
SELECT date(Datum) FROM aktienwerte;
![]() ![]() Zitat:
|
Re: Werte im DBGrid ändern
Hast Du das Feld als Typ int angelegt? Versuch es mal mit Date, das müsste SQLite auch kennen.
|
Re: Werte im DBGrid ändern
Zitat:
![]() ![]() (bevor Fragen aufkommen, in die Datenbank werden die täglichen Schlusskurse von verschiedenen Aktien durch den Benutzer eingetragen) |
Re: Werte im DBGrid ändern
Und wie trägst Du die Daten in die Tabelle ein?
|
Re: Werte im DBGrid ändern
Zitat:
Delphi-Quellcode:
wobei ich ja im Moment noch nicht weiß, wie ich das Datum formatieren muss (allerdings muss ich ja eh eine andere Variable (anstatt string_date) nehmen bzw. diese umwandeln, da der Typ "DATE" ja kein String ist).
dsqlAktien.Execute16
('INSERT INTO aktienwerte(AktienID,Datum,Kurs) VALUES (' + #39 + string_id + #39 + ', ' + #39 + string_date + #39 + ', ' + #39 + string_value + #39 + ');'); Edit: Als ich gerade eine Freundin gefragt hab, wieso mein DBGrid Zahlen wie zB. "50320-08-27" anzeigt (bei "SELECT date(datum) FROM aktienwerte") meinte sie Zitat:
Gruß. |
Re: Werte im DBGrid ändern
Ich hab jetzt nicht genau verfolgt, welche Lib Du für den Zugriff verwendest, aber wenn diese Parameter unterstützen sollte, solltest Du diese auf jeden Fall verwenden.
|
Re: Werte im DBGrid ändern
Der Database Browser formatiert nur die optische Ausgabe. Der Inhalt in der DB wird dabei nicht verändert (wenn es ein DATE Feld ist).
1. Laß mal den Browser einmal aus den Augen. 2. Zeige, wie du das Datum in die DB einträgst. 3. wenn du per SQL das Datum ausliest, wie wird das Datum in einem normalen DBGrid angezeigt ? Edit: - wie Deddy schon sagte, Parameter sind besser. Zitat:
Zitat:
Delphi-Quellcode:
damit liest du den Date Wert ohne Umwandlung. Diese macht das Grid.
SELECT datum FROM aktienwerte
|
Re: Werte im DBGrid ändern
Erstmal danke ich Euch beiden für die Antworten.
Zitat:
2. Wie gesagt, im Moment noch per Hand, später über den Befehl von oben. 3. Das kommt drauf an, aber hab ich das nicht schon in Beitrag #14 ( ![]() Zitat:
Zitat:
Edit: Da Du deinen Post aktualisiert hast, mach ich das auch mal eben, wenn ich meine SQL-Abfrage in
SQL-Code:
umforme, ist das Ergebnis folgendes (in meinem DBGrid):
SELECT datum FROM aktienwerte
![]() ![]() Zur Zeit liegen die Werte in der Datenbank in folgender Form (betrachtet über den SQLite Database Browser) vor: ![]() ![]() |
Re: Werte im DBGrid ändern
ein Beispiel Zeos mit Parametern:
Delphi-Quellcode:
ZQueryDiv --> deine Query. Dann schauen ob ParamByName oder so ähnlich vorhanden ist.
ZQueryDiv.SQL.Text:= 'insert into VERSION (VERSION,DATUM) values(:Version,:Datum)';
ZQueryDiv.ParamByName('Version').Value:= UVersion; ZQueryDiv.ParamByName('Datum').Value:= StrToDate(UVersionDatum); ZQueryDiv.ExecSQL; zu deinem Edit: und was passiert, wenn du das TDateTimeField(dsqlBlubbaQuery.FieldByName('Datum' )).DisplayFormat := 'dd.mm.yyyy' nach dem Query Open einstellst ? |
Re: Werte im DBGrid ändern
Was ich meinte, sind parametrisierte Statements.
Delphi-Quellcode:
[edit] Nanu, roter Kasten, wo bist Du geblieben? [/edit]
Query.SQL.Text := 'INSERT INTO Tabelle(Datum) VALUES(:datum)';
Query.ParamByName('datum').Value := StrToDate('01.01.2010'); Query.ExecSQL; |
Re: Werte im DBGrid ändern
DeddyH hats genauer... PS: warum besetzt ?
|
Re: Werte im DBGrid ändern
Danke für die Erklärung mit den Parametern, dass schau ich mir genauer an, wenn ich das Problem mit dem DBGrid gelöst habe.
Zitat:
![]() ![]() (das Bild zeigt einmal die Prozedur, sowie das DBGrid) Ich hab, wie auf dem Bild zu sehen, "TDateTimeField(dsqlBlubbaQuery.FieldByName('Datum ')).DisplayFormat := 'dd.mm.yyyy'" in die AfterOpen-Prozedur geschrieben, das Ergebnis ist das Gleiche. Edit: Zitat:
Edit2: Falls es hilft, kann ich auch nochmal den ganzen Inhalt der Datenbank auf einem Screenshot festhalten. |
Re: Werte im DBGrid ändern
zugegeben...langsam gehen mir die Ideen aus. 100 mal schon gemacht und es ist wie es sein soll. :gruebel:
- sicher, daß das AfterOpen auch ausgeführt wird ? Schreib das mal einfach unter den Open Befehl. - das Bild ist ein normales DBGrid ? Edit: irgendwie versteh ich nicht, daß das Datum (sprich der DATE Wert in der DB) im DBGrid nicht richtig angezeigt wird. Normalerweise braucht man sich um diese Darstellung keine Mühe machen. Irgendwo fummelt wer daran rum :roll: |
Re: Werte im DBGrid ändern
Zitat:
Zitat:
Vielleicht hilft es ja, hier nochmal die komplette Struktur der Datenbank, sowie der Inhalt von "aktienwerte": ![]() ![]() (ich hoffe, dass das Bild nicht problematisch ist (wegen der Größe)) Zitat:
Gruß. |
Re: Werte im DBGrid ändern
Ich vermute, da steht bereits "Schrott" in der Tabelle. Falls das nur Testdaten sind, würde ich an Deiner Stelle die gesamte Tabelle droppen, neu anlegen und korrekt befüllen.
|
Re: Werte im DBGrid ändern
da steh ich mit DeddyH auf einer Stufe. ich denke auch, daß bereits in der DB was nicht stimmt und du dir damit
Delphi-Quellcode:
irgend was komisches reinschreibst.
dsqlAktien.Execute16
('INSERT INTO aktienwerte(AktienID,Datum,Kurs) VALUES (' + #39 + string_id + #39 + ', ' + #39 + string_date + #39 + ', ' + #39 + string_value + #39 + ');'); ...mach mal ne Pause und schaue ob deine Query Parameter unterstützt. Wir müssen erst mal sicherstellen, daß in der DB auch das richtige steht. |
Re: Werte im DBGrid ändern
Zitat:
Wenn ich mir ![]() Zitat:
Liebe Grüße. |
Re: Werte im DBGrid ändern
Laß diesen Browser mal außen vor...
Nimm eine zusätzliche Query für das "befüllen" dazu das INSERT mit Parametern. |
Re: Werte im DBGrid ändern
Oder wenn es eben mit diesem Browser sein muss, dann im vorgegebenen Format.
SQL-Code:
INSERT INTO Tabelle(Datum) VALUES('2010-01-01')
|
Re: Werte im DBGrid ändern
Also, ich habe mir gerad zu Testzwecken ein kleines Programm geschrieben, das erzeugt die Datenbank nach folgenden Befehlen:
Delphi-Quellcode:
Jetzt hab ich in den Demos zu der Komponente etwas gefunden, das hab ich mal für meinen Fall umgeschrieben:
dsqlDatabase.DatabaseName := 'aktien.db';
dsqlDatabase.CreateDatabase; dsqlDatabase.Execute16('CREATE TABLE aktienwerte (Datum DATE);');
Delphi-Quellcode:
Das entspricht doch den Parametern oder? :|
procedure TfmDate.btInsertClick(Sender: TObject);
const InsertSQL = 'INSERT INTO aktienwerte (Datum) VALUES (?);'; var Datum: string; Stmt: TDISQLite3Statement; begin Datum := '2010-12-01'; Stmt := dsqlDatabase.Prepare16(InsertSQL); try Stmt.Bind_Str16(1, Datum); Stmt.Step; finally Stmt.Free; end; end; Dennoch speichere ich im Moment das Datum ebenfalls als String ab (oder?), allerdings gibt es auch keine Stmt.Bind_Date Funktion in der Demo hatte ich allerdings zu dem Punkt folgendes Zitat gefunden: Zitat:
Jetzt hatte ich ebenfalls probiert, ein Insert über die Query-Komponente zu versuchen, dabei hatte ich folgendes geschrieben:
Delphi-Quellcode:
Dabei bekomm ich aber immer den Fehler, dass 2010-12-01 kein gültiges Datum ist. (ich hatte ebenfalls "20101201", 2010.12.01, "2010,12,01" und 2010/12/01 versucht -> überall der gleiche Fehler).
procedure TfmDate.btInsert2Click(Sender: TObject);
begin dsqlQuery.InsertSQL := 'INSERT INTO aktienwerte (Datum) VALUES (:Datum);'; dsqlQuery.Params.ParamByName('Datum').Value := StrtoDate('2010/12/01'); dsqlQuery.Insert; end; Über die erste Insert-Methode konnte ich Werte in die Datenbank schreiben (auch wenn ich das Datum als String speichere), wenn ich die gespeicherten Werte nun anzeigen möchte, wird mir in dem DBGrid nur "2010" angezeigt. (bei Interesse kann ich auch gern den ganzen Code posten bzw. hochladen) |
Re: Werte im DBGrid ändern
mach mal...ich hab heute Zeit. Und das nagt an meiner Ehre :zwinker:
...ohne Schießgewähr :stupid: |
Re: Werte im DBGrid ändern
Funktioniert das Statement von oben denn im DB-Browser?
Zitat:
|
Re: Werte im DBGrid ändern
Zitat:
Ich hab gerad nochmal folgendes gemacht:
Delphi-Quellcode:
(danach habe ich "dsqlQuery.FieldByName('Datum').AsString in die Watchliste getan und auf das obere einen Haltepunkt gesetzt (auch wenn es keinen Effekt hat))
procedure TfmDate.dsqlQueryAfterOpen(DataSet: TDataSet);
begin dsqlQuery.FieldByName('Datum').AsString; end; Die Watchliste zeigt mir nur "2010" an, ich versteh einfach nicht, wo der Rest von dem Datum bleibt. Edit: Zitat:
|
Re: Werte im DBGrid ändern
schau dir mal in der Zwischenzeit
![]() |
Re: Werte im DBGrid ändern
Zitat:
Delphi-Quellcode:
Hab AFieldDef.DataType in die Watchliste getan und Haltepunkte gesetzt, AFieldDef ist vorher ein ftFloat, das erklärt wieso aus
procedure TfmDate.dsqlQueryInitFieldDef(const AColumn: TDISQLite3Column;
const AFieldDef: TFieldDef); begin if AColumn.ColumnName = 'Datum' then AFieldDef.DataType := ftDate; end; 2010,04,02 -> 2010,04 2010-04-02 -> 2010 usw. wird. Nachdem ich den Feldtypen auf ftDate umgewandelt hab, bekomm ich den Fehler, dass "-1710415.0" kein gültiger "timestamp" ist, liegt das an der Formatierung? (das werd ich gleich mal testen) Edit: Also, ich hab das Datum mal ohne Trennzeichen formatiert 20100201 (für den 2010.02.01 -> 01.02.2010). Das Ergebnis ist, dass mein DBGrid nun 06.12.50320 anzeigt, dass erinnert mich wieder an das, was eine Freundin gesagt hat: Zitat:
Edit2: Hab gerad nochmal nachgeschaut, hat das was mit dem "30.12.1899" zu tun? Ich begeb mich mal an das Umrechnen. |
Re: Werte im DBGrid ändern
Liste der Anhänge anzeigen (Anzahl: 1)
aaalsooo...
Ich habe jetzt 1,5 Stunden gebraucht um das Datum darzustellen. Dabei hab ich mit keinem vernünftigen SQL mit Parametern den Wert in die DB bekommen. Nach Studium der Demo DateTime und abschreiben ist es mir dennoch gelungen. Fazit zu SQLite3 (mein persönliches): - keine Vernünftige Query, wo man nur einfach ein Insert ausführen kann. (Bei der Zuweisung des SQLInsert Strings Fehlermeldung SQL is Empty :gruebel: ) - Die Query kann nicht direkt an eine Datasource gebunden werden -> Fehlermeldung - für mich persönlich unübersichtlich bis unlogisch - das ist für jeden selbst die Entscheidung ob er damit arbeitet. Im Anhang dein Testprojekt zurück: - Entschuldige die Unordnung, stammt vom vielen herumprobieren. Es funktioniert: - DB Erstellen - der Feldtyp für ein Datumsfeld muß REAL sein :gruebel: wie unlogisch mit DATE geht´s in die Hose - Insert 3 - im SQL muß der Datumswert (String) in der Form yyyy-mm-dd vorliegen. Alles andere geht daneben. Gleichzeitig muß der String innerhalb des SQL noch mit der Funktion julianday umgewandelt werden. - im Feld Init muß dann der Feldtyp auf ftDate gestellt werden. --> Dann wird das Datum im Grid als dd.mm.yyyy angezeigt. ...was ein Krampf. :roll: Tip: Da du mit Aktien und Kursen arbeitest, dieses dann vieleicht noch auswerten willst lege ich dir, wenn es kostenlos sein soll, Firebird in Verbindung mit Zeos ans Herz. Unkompliziert, Volles SQL mit gescheiten Parametern, übersichtlich. Ich kann nicht sehen, wenn sich jemand quält. Frage nach, wenn du das in Betracht ziehst. Jetzt stehst du noch am Anfang da ist der Einstieg leicht. Die einfachen Sachen wird man mit SQLite machen können. Wenn es aber komplizierter wird, die SQL´s komplexer bist du ohne vernünftige Parameterverarbeitung erschossen. PS: meine Platte hat das ganze wieder los :cheer: |
Re: Werte im DBGrid ändern
Zitat:
Ich hatte mich für SQLite und DISQLite3 Personal entschieden, da ich so meinem Vater (für den ich das Programm schreibe) lediglich die .exe mitgeben muss (nicht mal eine .dll) und nichts extra installieren muss. Von Firebird gibt es doch eine embedded-Version oder? (das werd ich mir morgen genauer anschauen, vielleicht auch jetzt gleich noch, will aber noch ein Buch auslesen ;)). Zitat:
Ich danke Dir für Deine Hilfsbereitschaft! Zitat:
Ich danke Dir und DeddyH für Eure Hilfsbereitschaft! :cheers: (geht leider nur virtuell (das Anstoßen) ;)) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:04 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz