Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Datenbankinhalte sortiert ausgeben (https://www.delphipraxis.net/91969-datenbankinhalte-sortiert-ausgeben.html)

Svenkan 12. Mai 2007 15:03

Datenbank: DBase • Zugriff über: BDE

Datenbankinhalte sortiert ausgeben
 
Ich greife per BDE (sprich mit TTable und TDataSource) auf eine dbf-Datei zu. Dies funktioniert soweit auch perfekt.
Nur möchte ich nun noch die Ausgabe nach den Feldern
  • DATUM DESC
  • KLASSEN ASC
  • STUNDEN ASC
sortieren.
Code:
SELECT * FROM vt06_07 ORDER BY DATUM DESC,KLASSEN ASC,STUNDEN ASC;
Wie das hier nun aber funktionieren soll, weiß ich nicht so ganz, da ich auch nicht weiß, wo der SQL-Befehl dann eingesetzt werden muss.
Theoretisch müsste es einmal beim Öffnen und dann beim Updaten immer ausgeführt werden.
Desweiteren sollten an Hand der Datumswerte (normales Format xx.xx.xxxx) nur bestimme Tage (am Besten der momentane und der nächste) ausgelesen werden.
Kann mir da jemand helfen?

MrSpock 12. Mai 2007 15:12

Re: Datenbankinhalte sortiert ausgeben
 
Hallo Svenkan,

dazu musst du eine TQuery Komponente einsetzen.

mkinzler 12. Mai 2007 15:14

Re: Datenbankinhalte sortiert ausgeben
 
Einfach statt TTable TQuery nehmen und die Abfrage in Query.SQL.Text eintragen.

Svenkan 12. Mai 2007 15:29

Re: Datenbankinhalte sortiert ausgeben
 
Code:
SELECT * FROM VT06_07.dbf ORDER BY DATUM DESC,KLASSEN ASC,STUNDEN ASC;
Leider möchte er bei mir auf ein völlig falsches Verzeichnis (E:\Programme\Gemeinsame Dateien - nicht einmal vorhanden) zugreifen, statt direkt auf die DB im Stammverzeichnis.
Und wenn ich per Direktlink drauf zugreifen möchte, kommt eine Fehlermeldung vonwegen Keywords, Token und sowas..

mkinzler 12. Mai 2007 15:30

Re: Datenbankinhalte sortiert ausgeben
 
Trage den Pfad in .DataBasename ein

Svenkan 12. Mai 2007 16:14

Re: Datenbankinhalte sortiert ausgeben
 
Wie kann ich denn nun die Query-Ergebnisse ins Grid überführen?
Das Abrufen funzt ja schonmal super.

MrSpock 12. Mai 2007 16:17

Re: Datenbankinhalte sortiert ausgeben
 
Hallo Svenkan,

genauso wie bei TTable, einfach die DataSource in diesem Fall auf die neue Query setzen und für das Grid genau diese Source auswählen.

Svenkan 12. Mai 2007 16:18

Re: Datenbankinhalte sortiert ausgeben
 
Das habe ich bereits versucht, allerdings zeigt er mir dann an, dass es ne ungültige Quelle ist.

MrSpock 12. Mai 2007 16:23

Re: Datenbankinhalte sortiert ausgeben
 
Hallo Svenkan,

du musst eine DataSource Komponente nehmen und bei DataSet die eingefügte TQuery Komponente auswählen. Beim TDBGrid setzt du DataSource auf die DataSource Komponente. Um das Ergebnis zu sehen, musst du noch die Query ausführen: MyQuery.Open;

Svenkan 12. Mai 2007 16:26

Re: Datenbankinhalte sortiert ausgeben
 
Wie gesagt, funktioniert die Deklinierung über DataSet leider nicht.
Alles andere ist fertig eingefügt.

Fehlermeldung: 'Circular datalinks are not allowed'

mkinzler 12. Mai 2007 16:28

Re: Datenbankinhalte sortiert ausgeben
 
Du mußt den Query in der dataSource auswahlen und nicht die dataSource im Query,

Svenkan 12. Mai 2007 16:29

Re: Datenbankinhalte sortiert ausgeben
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ja, hab ich doch gemacht.

MrSpock 12. Mai 2007 16:30

Re: Datenbankinhalte sortiert ausgeben
 
Hallo Svenkan,

dann hast du die Werte falsch gesetzt. Grid > DataSource > Query. Wenn im Grid die DataSource ausgewählt ist, die auf die Query zeigt, dann funktioniert es.

Stelle noch einmal sicher, dass in der Eigenschaft DataSource der Query Komponente KEIN Eintrag steht!

Svenkan 12. Mai 2007 18:33

Re: Datenbankinhalte sortiert ausgeben
 
Irgendwie funktioniert das Hinzufügen von Querys noch nicht so wirklich.

Delphi-Quellcode:
  Query1.Open;
  Query1.SQL.Clear;
  Query1.SQL.Add('SELECT * FROM "VT'+sj+'"');
  Query1.SQL.Add('WHERE NOT S = M AND NOT s= E AND DATUM BETWEEN ('+today+' AND '+tomorrow+')');
  Query1.SQL.Add('ORDER BY DATUM DESC, KLASSEN, S');
Der Code müsste so doch eigtl richtig, sein?
Er gibt mir nämlich aus, dass kein Query vorhanden sei.....

MrSpock 12. Mai 2007 18:38

Re: Datenbankinhalte sortiert ausgeben
 
Hallo Svenkan,

du kannst die Query erst ausführen (öffnen), wenn sie definiert ist.:

Delphi-Quellcode:
Query1.Close;
  Query1.SQL.Clear;
  Query1.SQL.Add('SELECT * FROM "VT'+sj+'"');
  Query1.SQL.Add('WHERE NOT S = M AND NOT s= E AND DATUM BETWEEN ('+today+' AND '+tomorrow+')');
  Query1.SQL.Add('ORDER BY DATUM DESC, KLASSEN, S');
  Query1.Open;

Svenkan 12. Mai 2007 18:41

Re: Datenbankinhalte sortiert ausgeben
 
Mhm..jetzt kommt der Fehler vom Anfang wieder:

Zitat:

Invalid use of keyword.
Token: .2007
Line Number 2.
Deswegen hab ich hier auch nochmal nachgefragt, weil ichs genauso auch schon einmal ausprobiert habe und ebenfalls diesen Fehler bekam.

MrSpock 12. Mai 2007 18:45

Re: Datenbankinhalte sortiert ausgeben
 
Hallo Svenkan,

das liegt daran, dass die Query syntaktisch inkorrekt ist:

Delphi-Quellcode:
  Query1.SQL.Add('SELECT * FROM "VT'+sj+'"');
  Query1.SQL.Add('WHERE NOT S = M AND NOT s= E AND DATUM BETWEEN ('+today+' AND '+tomorrow+')');
wie sehen denn today und tomorrow aus?

mkinzler 12. Mai 2007 18:47

Re: Datenbankinhalte sortiert ausgeben
 
datumswerte müssen gequoted werden oder besser man verwendet Parameter
Delphi-Quellcode:
  Query1.Close;
  Query1.SQL.Text := 'SELECT * FROM "VT'+sj+'"';
  Query1.SQL.Add('WHERE NOT S = M AND NOT s= E AND DATUM BETWEEN :von AND :bis');
  Query1.SQL.Add('ORDER BY DATUM DESC, KLASSEN, S');
  Query1.ParamByName('von').Value := today;
  Query1.ParamByName('bis').Value := tommorrow;
  Query1.Open;

Svenkan 12. Mai 2007 18:52

Re: Datenbankinhalte sortiert ausgeben
 
@ MrSpock:

Delphi-Quellcode:
var
   Ini: TIniFile;
   sj,path,today,tomorrow: String;
   dnr: Integer;
...
  dnr:=DayOfWeek(Date);
  today:=DateToStr(Date);
  if dnr=5 then tomorrow:=DateToStr(Date+3)
  else if dnr=6 then tomorrow:=DateToStr(Date+2)
  else tomorrow:=DateToStr(Date+1);
Es soll halt, falls der momentane Tag Nr. 5 (Freitag) oder 6 (Samstag) ist, jeweils 3 bzw. 2 Tage weitergerechnet werden.
Da ich mir bei Delphi nicht sicher war, wie man das Datum korrekt weiterrechnet, hab ichs mal auf primitive Weise versucht, weiterzurechnen.
Kann natürlich sehr gut sein, dass dort auch dann der Fehler liegt..

@ mkinzler: Danke. Nun bekomm ich aber noch einen Fehler bezüglich unpassender Feldtypen.

mkinzler 12. Mai 2007 18:55

Re: Datenbankinhalte sortiert ausgeben
 
das Casten nach String kannst du die Sparen:
Delphi-Quellcode:
Query1.ParamByName('von').Value := Date;
Query1.ParamByName('bis').Value := Date+1;

Svenkan 12. Mai 2007 18:58

Re: Datenbankinhalte sortiert ausgeben
 
Ja, aber ich brauch ja, je nach Tag, sowieso den nächsten Werktag.
Also müsste ichs wohl so regeln.

Es bleibt aber das Problem der Typen, da anscheinend andere Typen erwartet werden irgendwo, als gegeben sind.

mkinzler 12. Mai 2007 19:00

Re: Datenbankinhalte sortiert ausgeben
 
Delphi-Quellcode:
Query1.ParamByName('von').asString := ...

Svenkan 12. Mai 2007 19:02

Re: Datenbankinhalte sortiert ausgeben
 
Bringt leider auch nix. :( *seufz*
Ich such mich auch echt schon zu Tode hier..

mkinzler 12. Mai 2007 19:04

Re: Datenbankinhalte sortiert ausgeben
 
Wo kommt den der Fehler genau? was für Typen haben die Datenbankfelder?

Svenkan 12. Mai 2007 19:11

Re: Datenbankinhalte sortiert ausgeben
 
Liste der Anhänge anzeigen (Anzahl: 1)
Der Fehler tritt direkt beim Start des Programms auf.
Ich habe dir einen Screen mit den Werten angehängt, die benutzten Felder schwarz markiert.

mkinzler 12. Mai 2007 19:14

Re: Datenbankinhalte sortiert ausgeben
 
Der Fehler liegt wohl woanders, nämlich beim Feld s

Svenkan 12. Mai 2007 19:20

Re: Datenbankinhalte sortiert ausgeben
 
Ne, ich habs mal ausm WHERE-Teil rausgenommen und es kommt immer noch der gleiche Fehler.
Bevor ich das so adden ließ hats ja auch funktioniert mit dem Feld.
Anfangs hat ichs ja direkt im SQL-Teil drin über den Objekt-Inspektor halt.

/edit: Wenn ich den Teil mit dem Datum aus dem WHERE-Teil entferne funktioniert der Code.

mkinzler 12. Mai 2007 19:25

Re: Datenbankinhalte sortiert ausgeben
 
Laß dir doch mal today und tomorrow anzeigen

MrSpock 12. Mai 2007 19:27

Re: Datenbankinhalte sortiert ausgeben
 
Hallo Svenkan,

sind M und E auch Felder, die du aber nicht in deinem Anhang zeigst? Oder willst du S mit den Zeichenketten 'M' und 'E' vergleichen?

Svenkan 12. Mai 2007 19:32

Re: Datenbankinhalte sortiert ausgeben
 
Es funktioniert endlich!
Das Ganze hat wegen dem +2 irgendwie nicht funktioniert.
Ich habe tomorrow nun als TDateTime deklariert und nun funktionierts super. :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:02 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