Delphi-PRAXiS
Seite 4 von 5   « Erste     234 5      

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)

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:02 Uhr.
Seite 4 von 5   « Erste     234 5      

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