![]() |
Datenbank: dbf • Version: x • Zugriff über: TTable, TQuery, TDatasource
Umstellung auf SQL-Filterung
Hallo,
ich bin gerade dabei mein kleines Rechnungsprogramm von TTable nach TQuery (inkl. SQL-Befehle) umzuschreiben. In meinem Rechnungsprogramm sollen die Rechnungen angezeigt werden, dessen Buchnungsdatum (Tabellenfeld "RESTELLUNG") gegenüber dem aktuellen Datum größer-gleich der Mahntage (z.B. 14 Tage) sind. Im Prinzip sollen alle erstellten Rechnungen, die vor 14 Tagen erstellt wurden und kein Rechnungseingangsdatum besitzen, angezeigt werden (= für Mahnungen). Diesen "OnFilterRecord"-Event (TTable) habe ich bisher wie folgt programmiert und läuft auch so wie gewollt:
Delphi-Quellcode:
Nun möchte ich diese Abfrage/Filterung per SQL lösen.
...
MahnTage:=14; ... { Differenz der Tage ermitteln } Function TMainForm.DaysBetween(const d1,d2: TDateTime) : Integer; begin Result:=Trunc(d1)-Trunc(d2); end; ... Procedure TMainForm.DBBuchungTableFilterRecord(DataSet: TDataSet; var Accept: Boolean); Var Tage : Integer; begin if (FilterFeld = 'MAHNUNG') then begin if ((DBBuchungTable.FieldByName('REEINGANG').AsString = '') and (DBBuchungTable.FieldByName('KATEGORIE').AsWideString = 'Einnahmen') and not (DBBuchungTable.FieldByName('RESTELLUNG').AsString = '') then begin Tage:=DaysBetween(Now,StrToDate(DBBuchungSQLQuery.FieldByName('RESTELLUNG').AsString)); Accept:=(Tage >= MahnTage); end; end; end; ... Filterbedingungen: Nur die Rechnungen der KATEGORIE "Einnahmen" anzeigen, dessen Datum im Feld "RESTELLUNG" größer-gleich der Mahntage (z.B. 14 Tage) sind und das Datum für Rechnungseingang (Feld "REEINGANG") leer ist. Zusätzlich ... das Feld "RESTELLUNG" darf auch nicht leer sein. Zusammengefaßt: - im Feld "KATEGORIE" => muss "Einnahmen" stehen und - das Feld "RESTELLUNG" darf nicht leer sein und - das Feld "REEINGANG" muss leer sein und - das Datum im Feld "RESTELLUNG" muss größer-gleich 14 Tage vor dem aktuellen Datum sein Irgendwie stehe ich jetzt hier, durch die vielen "Bedingungsabfragen", auf dem Schlauch. :roll:
Delphi-Quellcode:
SQLText:='SELECT * FROM Buchung WHERE KATEGORIE ="Einnahmen" AND REEINGANG = '+QuotedStr('')+' AND RESTELLUNG >=... ???
|
AW: Umstellung auf SQL-Filterung
Ist RESTELLUNG ein Stringfeld?
|
AW: Umstellung auf SQL-Filterung
Zitat:
KATEGORIE Feld string RESTELLUNG Feld date REEINGANG Feld date |
AW: Umstellung auf SQL-Filterung
SQL-Code:
WHERE KATEGORIE = 'Einnahmen'
AND RESTELLUNG is not null AND REEINGANG is null AND DATEDIFF(day, NOW(), RESTELLUNG) >= 14 |
AW: Umstellung auf SQL-Filterung
Eine Prüfung auf "leer" machst Du am besten mit
Code:
where ..
[myDateField] is null .. |
AW: Umstellung auf SQL-Filterung
Zitat:
Delphi-Quellcode:
Tage := DaysBetween(Now, DBBuchungSQLQuery.FieldByName('RESTELLUNG').AsDataTime);
Jetzt nur noch in der entsprechenden DBMS-Doku nachsehen, wie sich die Funktion nennt, mit welcher man Datumsdifferenzen ausrechnen kann. Und das
Delphi-Quellcode:
sollte wohl auch ein
DBBuchungTable.FieldByName('RESTELLUNG').AsString = ''
Delphi-Quellcode:
darstellen.
DBBuchungTable.FieldByName('RESTELLUNG').IsNull
|
AW: Umstellung auf SQL-Filterung
Zitat:
Zitat:
SQL-Code:
Dieser SQL-Befehl klappt wunderbar, natürlich ohne diese 14 Tage-Berücksichtigung.
WHERE KATEGORIE = "Einnahmen" AND RESTELLUNG is not null AND REEINGANG is null
Sobald ich aber den gesamten Befehl benutze:
SQL-Code:
... erhalte ich eine Fehlermeldung, die heißt:
WHERE KATEGORIE = "Einnahmen" AND RESTELLUNG is not null AND REEINGANG is null AND DATEDIFF(day, NOW(), RESTELLUNG) >= 14
...Boolean expression expectedt, but 'DATEDIFF' found..." |
AW: Umstellung auf SQL-Filterung
Deswegen sollst Du ja in die Doku zu Deiner DB schauen, welche Datumsfunktionen es da gibt. Was ist das denn: dBase, FoxPro?
|
AW: Umstellung auf SQL-Filterung
Zitat:
Hier scheint es den Befehl "DATEDIFF" nicht zu geben. |
AW: Umstellung auf SQL-Filterung
Scheint so. Ich konnte auf die Schnelle keine Übersicht der enthaltenen Funktionen finden, vielleicht ist es das Beste, das Datum am Client zu errechnen und als SQL-Parameter zu übergeben.
|
AW: Umstellung auf SQL-Filterung
Recht übersichtlich
Zitat:
|
AW: Umstellung auf SQL-Filterung
Unter Umständen geht es ja auch so
Zitat:
Gruß K-H |
AW: Umstellung auf SQL-Filterung
Zitat:
Mit dem SQL-Befehl:
SQL-Code:
klappt nun alles wie gewollt. :)
SELECT * FROM Buchung WHERE KATEGORIE = "Einnahmen" AND RESTELLUNG is not null AND REEINGANG is null AND (NOW-RESTELLUNG > 14)
Vielen Dank an alle ... nun konnte ich wieder mein kleines SQL-Wissen erweitern. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:01 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