Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Werte im DBGrid ändern (https://www.delphipraxis.net/149935-werte-im-dbgrid-aendern.html)

aurikel_Max 2. Apr 2010 20:46

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:
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;
Das geht allerdings schief, da ich folgenden Fehler bekomme:

http://img215.imageshack.us/img215/4610/fehlera.png
(http://img215.imageshack.us/img215/4610/fehlera.png)

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.

haentschman 2. Apr 2010 20:58

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:
TDateTimeField(cdsBlubba.FieldByName('datum')).DisplayFormat:='dd.mm.yyyy';
3. dann sind alle Werte des Feldes Datum des Datasets cdsBlubba entsprechend des Formatstrings angepaßt

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:

aurikel_Max 2. Apr 2010 21:26

Re: Werte im DBGrid ändern
 
Zitat:

Zitat von haentschman
Hallo :hi:

Versuche mal folgendes:
1. Deine Versuche weglassen
2. nach dem Erzeugen des Datasets oder im OnCreate des Formulars
Delphi-Quellcode:
TDateTimeField(cdsBlubba.FieldByName('datum')).DisplayFormat:='dd.mm.yyyy';
3. dann sind alle Werte des Feldes Datum des Datasets cdsBlubba entsprechend des Formatstrings angepaßt

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:

Das Datum wurde ursprünglich als String gespeichert (da das bisher für meine Zwecke ausgereicht hat), habs gerad geändert. Als es als String vorlag hab ich eine Exception bekommen, seitdem es als Datum gespeichert wird, tritt keine Exception mehr auf, allerdings sind die Werte in dem DBGrid jetzt alle: ddmmyyyy :D

Danke (schonmal) für Deine/Eure Hilfe. :)

haentschman 3. Apr 2010 07:59

Re: Werte im DBGrid ändern
 
Guten Morgen...
Zitat:

allerdings sind die Werte in dem DBGrid jetzt alle: ddmmyyyy
:gruebel: mit deiner Funktion oder mit TDateTimeField ?

aurikel_Max 3. Apr 2010 09:08

Re: Werte im DBGrid ändern
 
Zitat:

Zitat von haentschman
Guten Morgen...
Zitat:

allerdings sind die Werte in dem DBGrid jetzt alle: ddmmyyyy
:gruebel: mit deiner Funktion oder mit TDateTimeField ?

Zitat:

TDateTimeField(cdsBlubba.FieldByName('datum')).Dis playFormat:='dd.mm.yyyy';
Wenn ich den Code 1:1 übernehme und den Namen von cdsBlubba anpasse, sind in meinem DBGrid alle Werte unter Datum "ddmmyyyy". (meine Funktion benutz ich hierbei nicht mehr)

http://img708.imageshack.us/img708/1356/datum.png

haentschman 3. Apr 2010 10:49

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:

und den Namen von cdsBlubba anpasse
- :gruebel: Ich denke, daß Dataset heißt so ?
- Welche Komponente ist das Dataset ? (Standard / Fremdkomponente)

Edit2:
...auch wenn der fehlende Buchstabe bereits nicht kopiert wurde :stupid:

aurikel_Max 3. Apr 2010 11:07

Re: Werte im DBGrid ändern
 
Zitat:

Zitat von haentschman
Zitat:

und den Namen von cdsBlubba anpasse
- :gruebel: Ich denke, daß Dataset heißt so ?
- Welche Komonente ist das Dataset ? (Standard / Fremdkomponente)

Das Dataset heißt anders, ich benutze andere Namen hier im Forum.
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.

haentschman 3. Apr 2010 11:15

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.

aurikel_Max 3. Apr 2010 11:35

Re: Werte im DBGrid ändern
 
Zitat:

Zitat von haentschman
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.

Wenn ich die TDSIQLite3UniDirQuery mit dem Datasource verbinde, bekomme ich die Fehlermeldung: "Operation not allowed on a unidirectional dataset."

Allerdings machen "wir" Fortschritte, ich hab gerad

Delphi-Quellcode:
procedure TfmBlubba.dsqlBlubbaQueryAfterOpen(DataSet: TDataSet);
begin
  TDateTimeField(dsqlBlubbaQuery.FieldByName('Datum')).DisplayFormat := 'dd.mm.yyyy';
end;
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)

haentschman 3. Apr 2010 11:43

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 ?

aurikel_Max 3. Apr 2010 12:05

Re: Werte im DBGrid ändern
 
Zitat:

Zitat von haentschman
und wenn du statt der UniDirQuery eine "normale" Query verwendest ?

Frage: die TDISQL stammen woher ? Schon mal Zeos als alternative Zugriffskomponenten probiert ?

Für Zeos war ich zu doof, Zeos benötigt doch die sqlite3.dll, allerdings hab ich immer einen Fehler beim Zugriff auf die DB bekommen, obwohl ich die .dll hatte. Das könnte ich aber bei Gelegenheit nochmal versuchen.

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.

aurikel_Max 4. Apr 2010 14:59

Re: Werte im DBGrid ändern
 
Zitat:

Zitat von aurikel_Max
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.

Bei der Stelle bin ich nun und ich weiß nicht weiter, also wie gesagt, meine Daten liegen in der Datenbank in folgender Weise vor:

Zitat:

Datum (vom Typ "DATE")
2010-03-23
2010-04-02
usw... (alternativ stellt es kein Problem dar, die Werte als Strings zu speichern)
//Edit: Bei der Formatierung hab ich mich an "YYYY-MM-DD" gehalten, so wie es auf http://www.sqlite.org/lang_datefunc.html steht

Nun möchte ich in einem DBGrid die Werte aber so angezeigt bekommen:
Zitat:

23.03.2010
02.04.2010
usw...
Mein SelectSQL lautet nun:
SQL-Code:
SELECT datum FROM .. ORDER BY datum DESC
Was mich allerdings wundert und worauf ich auch keine Antwort weiß ist, dass wenn ich jetzt
Delphi-Quellcode:
Query.FieldByName('Datum').AsString
in die Watchliste tue, mir lediglich '2010' angezeigt wird. (in meinem DBGrid wird mir auch nur '2010' angezeigt)

Änder ich die Formatierung des Datums in der Datenbank auf:
Zitat:

20100323
20100402
usw... wird mir das komplette Datum angezeigt (allerdings ohne Punkte usw.).
Wenn ich jetzt
Delphi-Quellcode:
TDateTimeField(dsqlBlubbaQuery.FieldByName('Datum')).DisplayFormat := 'dd.mm.yyyy';
anwende, passiert gar nichts, das Datum wird mir weiterhin in meinem DBGrid als "20100323" usw. angezeigt.

Änder ich die Formatierung des Datums in der Datenbank auf:
Zitat:

2010.03.23
2010.04.02
Wird mir in meinem DBGrid folgendes angezeigt:
Zitat:

2010,04
2010,03
Da ich nicht verstehe, wie dies zustande kommt, wollte ich das Datum (wie ursprünglich vorgesehen) als String abspeichern (hier wird mir immer das komplette Datum angezeigt) und dann in die passende Formatierung bringen, hierbei habe ich verschiedene Ansätze probiert, allerdings war keiner erfolgreich. (die Ansätze kann ich bei Bedarf auch gerne posten)

Könnt ihr mir eine Lösung nennen, wie ich das Datum richtig formatiert in meinem DBGrid angezeigt bekomme?

Gruß
Max

haentschman 4. Apr 2010 15:39

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:

Änder ich die Formatierung des Datums in der Datenbank auf:
:gruebel: wie machst du das denn ? Mit einem Tool ?

aurikel_Max 4. Apr 2010 16:02

Re: Werte im DBGrid ändern
 
Zitat:

Zitat von haentschman
ich nochmal... :zwinker:

Danke, dass Du mir weiterhin hilfst. :)

Zitat:

Zitat von haentschman
Zitat:

Änder ich die Formatierung des Datums in der Datenbank auf:
:gruebel: wie machst du das denn ? Mit einem Tool ?

Ja, das mache ich mithilfe von dem SQLite Datatabase Browser (http://sqlitebrowser.sourceforge.net/, Version: 2.0b1).


Zitat:

Zitat von haentschman
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 ?

Okay, also ich formatiere mal die Daten in der Datenbank so :
http://img339.imageshack.us/img339/5...rmatierung.png
(ich hoffe, so meintest du das)

Meine SQL-Abfrage lautet nun:
SQL-Code:
SELECT Datum FROM aktienwerte;
(hab es zu "Testzwecken" darauf vereinfacht)

dann sieht mein DBGrid so aus:
http://img39.imageshack.us/img39/3951/dbgridsql.png

Jetzt hab ich allerdings gerade folgendes probiert und die SQL-Abfrage so gestaltet:
SQL-Code:
SELECT date(Datum) FROM aktienwerte;
dann sieht mein DBGrid so aus (wie kommen bitte die Werte zustande :D):
http://img190.imageshack.us/img190/8...datedbgrid.png

Zitat:

Zitat von haentschman
--> wie wird es im Grid angezeigt ?

Ich hoffe, ich konnte Dir Deine Frage beantworten.

DeddyH 4. Apr 2010 16:08

Re: Werte im DBGrid ändern
 
Hast Du das Feld als Typ int angelegt? Versuch es mal mit Date, das müsste SQLite auch kennen.

aurikel_Max 4. Apr 2010 16:16

Re: Werte im DBGrid ändern
 
Zitat:

Zitat von DeddyH
Hast Du das Feld als Typ int angelegt? Versuch es mal mit Date, das müsste SQLite auch kennen.

Ne, der Typ ist "DATE".

http://img97.imageshack.us/img97/1305/sqldate.png
(bevor Fragen aufkommen, in die Datenbank werden die täglichen Schlusskurse von verschiedenen Aktien durch den Benutzer eingetragen)

DeddyH 4. Apr 2010 16:17

Re: Werte im DBGrid ändern
 
Und wie trägst Du die Daten in die Tabelle ein?

aurikel_Max 4. Apr 2010 16:22

Re: Werte im DBGrid ändern
 
Zitat:

Zitat von DeddyH
Und wie trägst Du die Daten in die Tabelle ein?

Bisher noch mit der Hand (also über das SQLite Database Browser-Tool), später über:
Delphi-Quellcode:
    dsqlAktien.Execute16
      ('INSERT INTO aktienwerte(AktienID,Datum,Kurs) VALUES (' + #39 +
      string_id + #39 + ', ' + #39 + string_date + #39 + ', ' + #39 +
      string_value + #39 + ');');
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).

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:

50320 könnten die tage von 1900 an sein
könnte das hinkommen?

Gruß.

DeddyH 4. Apr 2010 16:24

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.

haentschman 4. Apr 2010 16:24

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:

string_date
- wenn das das Datum als String ist... ersetzen durch IntToStr(StrToDate(string_date)) Dabei passiert folgendes: der String wird in einen Date Wert umgewandelt und dann in einen String damit das in deinen SQL String paßt. So was ist mit Vorsicht zu genießen. Parameter sind eindeutiger und weniger kompliziert.

Zitat:

(bei "SELECT date(datum) FROM aktienwerte")
...nur
Delphi-Quellcode:
SELECT datum FROM aktienwerte
damit liest du den Date Wert ohne Umwandlung. Diese macht das Grid.

aurikel_Max 4. Apr 2010 16:45

Re: Werte im DBGrid ändern
 
Erstmal danke ich Euch beiden für die Antworten.

Zitat:

Zitat von haentschman
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 ?

1. Okay.
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 (http://www.delphipraxis.net/internal...144178#1144178) geschrieben, oder versteh ich Dich gerade falsch (das kann auch sein)?

Zitat:

Zitat von haentschman
Edit:
- wie Deddy schon sagte, Parameter sind besser.

Zitat:

Zitat von DeddyH
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.

Ich verwende DISQLite3 Personal, auf den ersten Blick hab ich nichts zu Parametern gefunden, allerdings kann das auch daran liegen, dass ich nicht weiß, was Parameter sind. :oops: (bitte nicht steinigen :()

Edit: Da Du deinen Post aktualisiert hast, mach ich das auch mal eben, wenn ich meine SQL-Abfrage in
SQL-Code:
SELECT datum FROM aktienwerte
umforme, ist das Ergebnis folgendes (in meinem DBGrid):
http://img39.imageshack.us/img39/3951/dbgridsql.png

Zur Zeit liegen die Werte in der Datenbank in folgender Form (betrachtet über den SQLite Database Browser) vor:
http://img339.imageshack.us/img339/5...rmatierung.png

haentschman 4. Apr 2010 16:51

Re: Werte im DBGrid ändern
 
ein Beispiel Zeos mit Parametern:
Delphi-Quellcode:
ZQueryDiv.SQL.Text:= 'insert into VERSION (VERSION,DATUM) values(:Version,:Datum)';
ZQueryDiv.ParamByName('Version').Value:= UVersion;
ZQueryDiv.ParamByName('Datum').Value:= StrToDate(UVersionDatum);
ZQueryDiv.ExecSQL;
ZQueryDiv --> deine Query. Dann schauen ob ParamByName oder so ähnlich vorhanden ist.

zu deinem Edit: und was passiert, wenn du das TDateTimeField(dsqlBlubbaQuery.FieldByName('Datum' )).DisplayFormat := 'dd.mm.yyyy' nach dem Query Open einstellst ?

DeddyH 4. Apr 2010 16:53

Re: Werte im DBGrid ändern
 
Was ich meinte, sind parametrisierte Statements.
Delphi-Quellcode:
Query.SQL.Text := 'INSERT INTO Tabelle(Datum) VALUES(:datum)';
Query.ParamByName('datum').Value := StrToDate('01.01.2010');
Query.ExecSQL;
[edit] Nanu, roter Kasten, wo bist Du geblieben? [/edit]

haentschman 4. Apr 2010 16:54

Re: Werte im DBGrid ändern
 
DeddyH hats genauer... PS: warum besetzt ?

aurikel_Max 4. Apr 2010 17:05

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:

Zitat von haentschman
zu deinem Edit: und was passiert, wenn du das TDateTimeField(dsqlBlubbaQuery.FieldByName('Datum' )).DisplayFormat := 'dd.mm.yyyy' nach dem Query Open einstellst ?

_
http://img535.imageshack.us/img535/3708/tdatetime.png
(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:

Zitat von DeddyH
[edit] Nanu, roter Kasten, wo bist Du geblieben? [/edit]

Was für ein Kasten?

Edit2: Falls es hilft, kann ich auch nochmal den ganzen Inhalt der Datenbank auf einem Screenshot festhalten.

haentschman 4. Apr 2010 17:13

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:

aurikel_Max 4. Apr 2010 17:32

Re: Werte im DBGrid ändern
 
Zitat:

Zitat von haentschman
- sicher, daß das AfterOpen auch ausgeführt wird ? Schreib das mal einfach unter den Open Befehl.

Hab ich mit einem Haltepunkt überprüft und ein Open hat auch nicht geholfen :/
Zitat:

Zitat von haentschman
- das Bild ist ein normales DBGrid ?

Das ist ein ganz normales TDBGrid.

Vielleicht hilft es ja, hier nochmal die komplette Struktur der Datenbank, sowie der Inhalt von "aktienwerte":

http://img688.imageshack.us/img688/3...ktursqlite.png
(ich hoffe, dass das Bild nicht problematisch ist (wegen der Größe))

Zitat:

Zitat von haentschman
zugegeben...langsam gehen mir die Ideen aus. 100 mal schon gemacht und es ist wie es sein soll. :gruebel:

Hab ich die Daten überhaupt richtig abgespeichert? (siehe Screenshot)

Gruß.

DeddyH 4. Apr 2010 17:35

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.

haentschman 4. Apr 2010 17:47

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:
dsqlAktien.Execute16
      ('INSERT INTO aktienwerte(AktienID,Datum,Kurs) VALUES (' + #39 +
      string_id + #39 + ', ' + #39 + string_date + #39 + ', ' + #39 +
      string_value + #39 + ');');
irgend was komisches reinschreibst.

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

aurikel_Max 4. Apr 2010 17:47

Re: Werte im DBGrid ändern
 
Zitat:

Zitat von DeddyH
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.

Es ist kein Problem, die Datenbank neu zu erstellen, diese würde ich allerdings wieder mit dem SQLite Database Browser erstellen und befüllen, dann musst Du mir aber bitte sagen, wie die Formatierung beim Typ DATE ist (mit Bindestrich, Punkt, Komma, direkt aneinander). :|

Wenn ich mir http://www.sqlite.org/lang_datefunc.html anschaue, steht da u.a.:
Zitat:

Zitat von http://www.sqlite.org/lang_datefunc.html
A time string can be in any of the following formats:

1. YYYY-MM-DD

Müsste ich es also zB. 2010-01-30 (für den 30igsten Januar 2010) eintragen?

Liebe Grüße.

haentschman 4. Apr 2010 17:50

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.

DeddyH 4. Apr 2010 17:57

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')

aurikel_Max 4. Apr 2010 18:54

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:
dsqlDatabase.DatabaseName := 'aktien.db';
dsqlDatabase.CreateDatabase;
dsqlDatabase.Execute16('CREATE TABLE aktienwerte (Datum DATE);');
Jetzt hab ich in den Demos zu der Komponente etwas gefunden, das hab ich mal für meinen Fall umgeschrieben:
Delphi-Quellcode:
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;
Das entspricht doch den Parametern oder? :|
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:

{ We bind all columns as strings. DISQLite3 will convert them to
integers or floats as appropriate. }
(wobei mein Datum ja trotzdem kein Integer bzw. Float ist)

Jetzt hatte ich ebenfalls probiert, ein Insert über die Query-Komponente zu versuchen, dabei hatte ich folgendes geschrieben:

Delphi-Quellcode:
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;
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).


Ü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)

haentschman 4. Apr 2010 19:18

Re: Werte im DBGrid ändern
 
mach mal...ich hab heute Zeit. Und das nagt an meiner Ehre :zwinker:

...ohne Schießgewähr :stupid:

DeddyH 4. Apr 2010 19:27

Re: Werte im DBGrid ändern
 
Funktioniert das Statement von oben denn im DB-Browser?
Zitat:

SQL-Code:
INSERT INTO Tabelle(Datum) VALUES('2010-01-01')


aurikel_Max 4. Apr 2010 19:41

Re: Werte im DBGrid ändern
 
Zitat:

Zitat von haentschman
mach mal...ich hab heute Zeit. Und das nagt an meiner Ehre :zwinker:

...ohne Schießgewähr :stupid:

Ok, ich lad die Sachen gleich hoch, aber es gibt eine Sache, die ich nicht verstehe:

Ich hab gerad nochmal folgendes gemacht:
Delphi-Quellcode:
procedure TfmDate.dsqlQueryAfterOpen(DataSet: TDataSet);
begin
  dsqlQuery.FieldByName('Datum').AsString;
end;
(danach habe ich "dsqlQuery.FieldByName('Datum').AsString in die Watchliste getan und auf das obere einen Haltepunkt gesetzt (auch wenn es keinen Effekt hat))
Die Watchliste zeigt mir nur "2010" an, ich versteh einfach nicht, wo der Rest von dem Datum bleibt.

Edit:
Zitat:

Zitat von DeddyH
Funktioniert das Statement von oben denn im DB-Browser?
Zitat:

SQL-Code:
INSERT INTO Tabelle(Datum) VALUES('2010-01-01')


Er fügt die Werte zwar ein, aber im DBGrid wird mir nur "2010" angezeigt. :D

haentschman 4. Apr 2010 20:04

Re: Werte im DBGrid ändern
 
schau dir mal in der Zwischenzeit das an. Da geht es darum, daß SQLite einfach Feldtypen ändert. Vieleicht liegt der Knackpunkt da.

aurikel_Max 4. Apr 2010 20:40

Re: Werte im DBGrid ändern
 
Zitat:

Zitat von haentschman
schau dir mal in der Zwischenzeit das an. Da geht es darum, daß SQLite einfach Feldtypen ändert. Vieleicht liegt der Knackpunkt da.

Okay, jetzt wird mir klar, wieso nur ein Teil zurückgeliefert wird.

Delphi-Quellcode:
procedure TfmDate.dsqlQueryInitFieldDef(const AColumn: TDISQLite3Column;
  const AFieldDef: TFieldDef);
begin
  if AColumn.ColumnName = 'Datum' then
    AFieldDef.DataType := ftDate;
end;
Hab AFieldDef.DataType in die Watchliste getan und Haltepunkte gesetzt, AFieldDef ist vorher ein ftFloat, das erklärt wieso aus
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:

50320 könnten die tage von 1900 an sein
kommt das hin?

Edit2:
Hab gerad nochmal nachgeschaut, hat das was mit dem "30.12.1899" zu tun? Ich begeb mich mal an das Umrechnen.

haentschman 4. Apr 2010 22:15

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:

aurikel_Max 4. Apr 2010 22:35

Re: Werte im DBGrid ändern
 
Zitat:

Zitat von haentschman
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:

Ich danke Dir für die Zeit, die Du aufgebracht hast.

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:

Zitat von haentschman
- 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 Fehlermeldung bezieht sich auf das SelectSQL-Statement, wenn das leer ist, geht auch kein Insert.

Ich danke Dir für Deine Hilfsbereitschaft!

Zitat:

Zitat von haentschman
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.

Ich werde mir gleich bzw. morgen Firefox embedded und die Zeos-Komponente angucken, wenn ich umsteigen sollte und fragen habe, werd ich sie stellen.

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.
Seite 1 von 2  1 2      

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