AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Umstellung auf SQL-Filterung
Thema durchsuchen
Ansicht
Themen-Optionen

Umstellung auf SQL-Filterung

Ein Thema von Crowbar · begonnen am 21. Jul 2014 · letzter Beitrag vom 21. Jul 2014
Antwort Antwort
Seite 1 von 2  1 2      
Crowbar

Registriert seit: 17. Jun 2002
43 Beiträge
 
#1

Umstellung auf SQL-Filterung

  Alt 21. Jul 2014, 14:06
Datenbank: dbf • Version: x • Zugriff über: TTable, TQuery, TDatasource
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:
...
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;
...
Nun möchte ich diese Abfrage/Filterung per SQL lösen.

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.

SQLText:='SELECT * FROM Buchung WHERE KATEGORIE ="Einnahmen" AND REEINGANG = '+QuotedStr('')+' AND RESTELLUNG >=... ???

Geändert von Crowbar (21. Jul 2014 um 14:27 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Umstellung auf SQL-Filterung

  Alt 21. Jul 2014, 14:16
Ist RESTELLUNG ein Stringfeld?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Crowbar

Registriert seit: 17. Jun 2002
43 Beiträge
 
#3

AW: Umstellung auf SQL-Filterung

  Alt 21. Jul 2014, 14:20
Ist RESTELLUNG ein Stringfeld?
Nein, ein DATE Feld.

KATEGORIE Feld string
RESTELLUNG Feld date
REEINGANG Feld date

Geändert von Crowbar (21. Jul 2014 um 14:22 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von baumina
baumina

Registriert seit: 5. Mai 2008
Ort: Oberschwaben
1.275 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Umstellung auf SQL-Filterung

  Alt 21. Jul 2014, 14:30
SQL-Code:
WHERE KATEGORIE = 'Einnahmen'
AND RESTELLUNG is not null
AND REEINGANG is null
AND DATEDIFF(day, NOW(), RESTELLUNG) >= 14
Hinter dir gehts abwärts und vor dir steil bergauf ! (Wolfgang Ambros)

Geändert von baumina (21. Jul 2014 um 14:43 Uhr)
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#5

AW: Umstellung auf SQL-Filterung

  Alt 21. Jul 2014, 14:31
Eine Prüfung auf "leer" machst Du am besten mit
Code:
 where ..
   [myDateField] is null
   ..
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.132 Beiträge
 
Delphi 12 Athens
 
#6

AW: Umstellung auf SQL-Filterung

  Alt 21. Jul 2014, 14:35
Ist RESTELLUNG ein Stringfeld?
Nein, ein DATE Feld.
Aber warum behandelst du es dann wie Eines?

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 DBBuchungTable.FieldByName('RESTELLUNG').AsString = '' sollte wohl auch ein DBBuchungTable.FieldByName('RESTELLUNG').IsNull darstellen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Crowbar

Registriert seit: 17. Jun 2002
43 Beiträge
 
#7

AW: Umstellung auf SQL-Filterung

  Alt 21. Jul 2014, 14:58
Ist RESTELLUNG ein Stringfeld?
Nein, ein DATE Feld.
Aber warum behandelst du es dann wie Eines?

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 DBBuchungTable.FieldByName('RESTELLUNG').AsString = '' sollte wohl auch ein DBBuchungTable.FieldByName('RESTELLUNG').IsNull darstellen.
... das ist alles einwenig unsauber programmiert ... deswegen auch meine Überarbeitung und gleichzeitiges Umsetzen auf SQL.

SQL-Code:
WHERE KATEGORIE = 'Einnahmen'
AND RESTELLUNG is not null
AND REEINGANG is null
AND DATEDIFF(day, NOW(), RESTELLUNG) >= 14
... Danke, das war schon fast die Lösung.
WHERE KATEGORIE = "Einnahmen" AND RESTELLUNG is not null AND REEINGANG is null Dieser SQL-Befehl klappt wunderbar, natürlich ohne diese 14 Tage-Berücksichtigung.

Sobald ich aber den gesamten Befehl benutze:

WHERE KATEGORIE = "Einnahmen" AND RESTELLUNG is not null AND REEINGANG is null AND DATEDIFF(day, NOW(), RESTELLUNG) >= 14 ... erhalte ich eine Fehlermeldung, die heißt:

...Boolean expression expectedt, but 'DATEDIFF' found..."
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Umstellung auf SQL-Filterung

  Alt 21. Jul 2014, 15:00
Deswegen sollst Du ja in die Doku zu Deiner DB schauen, welche Datumsfunktionen es da gibt. Was ist das denn: dBase, FoxPro?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Crowbar

Registriert seit: 17. Jun 2002
43 Beiträge
 
#9

AW: Umstellung auf SQL-Filterung

  Alt 21. Jul 2014, 15:06
Deswegen sollst Du ja in die Doku zu Deiner DB schauen, welche Datumsfunktionen es da gibt. Was ist das denn: dBase, FoxPro?
Zum Austesten, ob alles so funktioniert wie ich es mir vorstelle, benutze ich derzeitig die Trialversion von "Absolute Database".
Hier scheint es den Befehl "DATEDIFF" nicht zu geben.

Geändert von Crowbar (21. Jul 2014 um 15:22 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Umstellung auf SQL-Filterung

  Alt 21. Jul 2014, 15:24
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:01 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz