Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Abfrage aus 2 Tabellen in Access funktioniert nicht (https://www.delphipraxis.net/62041-abfrage-aus-2-tabellen-access-funktioniert-nicht.html)

StoRmtec 30. Jan 2006 10:03

Datenbank: Access • Zugriff über: ADO

Abfrage aus 2 Tabellen in Access funktioniert nicht
 
Hallo Leute

Hätte eine Hilfe gebraucht.

Und zwar habe ich eine Datenbank mit 2 Tabellen.

Druckerwartung | Druckerverbrauch

jetzt möchte ich eine Abfrage machen das er mir die ganzen Kosten zusammenzählt, das funktioniert auch aber wenn ich jetzt machen möchte das er mir nur einen gewissen Datumsbereich ermitteln soll dann bekomme ich eine Fehlermeldung. Weiß auch schon warum. Und zwar wenn zB. bei Druckerwartung in den Zeitraum kein Datum eingetragen ist dann bekomme ich die Fehlermeldung.

Das ist mein Code:
Delphi-Quellcode:
procedure TForm2.gesamtbuttonClick(Sender: TObject);
var gesamtall1, kostenverbrauchall1, kostenwartungall1 : extended;
begin
wartungall.Close;
wartungall.sql.clear;
wartungall.SQL.text := 'select sum(tonerkostengesamt) as Gesamtsumme from verbrauch where datumv between :von and :bis';
wartungall.Parameters.ParamByName('von').Value := StrToDate(edit1.Text);
wartungall.Parameters.ParamByName('bis').Value := StrToDate(edit2.Text);
wartungall.open;
gesverbrauchall.text := wartungall.FieldByName('Gesamtsumme').Value;
verbrauchall.Close;
verbrauchall.sql.clear;
verbrauchall.SQL.text := 'select sum(kosten) as Gesamtkosten from wartung where datum between :von and :bis';
verbrauchall.Parameters.ParamByName('von').Value := StrToDate(edit1.Text);
verbrauchall.Parameters.ParamByName('bis').Value := StrToDate(edit2.Text);
verbrauchall.open;
geswartungall.Text := verbrauchall.FieldByName('Gesamtkosten').Value;
kostenwartungall1 := strtofloat(geswartungall.Text);
kostenverbrauchall1 := strtofloat(gesverbrauchall.Text);
gesamtall1 := kostenwartungall1 + kostenverbrauchall1;
gesall.Text := floattostr(gesamtall1);
end;
Wie kann ich das machen wenn da kein Datum eingetragen ist das er mir trotzdem den anderen Wert ausgibt.

MFG
StoRmtec

marabu 30. Jan 2006 10:06

Re: Abfrage aus 2 Tabellen in Access funktioniert nicht
 
Hi,

du könntest die Bedingung erweitern:

SQL-Code:
... where datumv is not null and datumv between :von and :bis ...
Grüße vom marabu

StoRmtec 30. Jan 2006 10:12

Re: Abfrage aus 2 Tabellen in Access funktioniert nicht
 
Liste der Anhänge anzeigen (Anzahl: 1)
Danke für die Antwort
aber bekomme trotzdem immer diese Fehlermeldung siehe Anhang.

mfg
StoRmtec

marabu 30. Jan 2006 10:29

Re: Abfrage aus 2 Tabellen in Access funktioniert nicht
 
Die Fehlermeldung hat nichts mit dem SQL-Statement zu tun. In welcher Code-Zeile tritt denn der Fehler auf? Ich sehe zwei Kandidaten:

Delphi-Quellcode:
procedure TForm2.gesamtbuttonClick(Sender: TObject);
  // ...
  // gesverbrauchall.text := wartungall.FieldByName('Gesamtsumme').Value;
  gesverbrauchall.text := Format('%.0n', [1.0 * wartungall.FieldByName('Gesamtsumme').AsInteger]);
  // ...
  // geswartungall.Text := verbrauchall.FieldByName('Gesamtkosten').Value;
  geswartungall.Text := Format('%.2m', [verbrauchall.FieldByName('Gesamtkosten').AsFloat]);
  //...
end;
marabu

mkinzler 30. Jan 2006 10:29

Re: Abfrage aus 2 Tabellen in Access funktioniert nicht
 
Ist der Datumswert leer (NULL) dann schlägt die Typkonvertierung natürlich fehl -> Vorher auf NULL abprüfen.

StoRmtec 30. Jan 2006 10:40

Re: Abfrage aus 2 Tabellen in Access funktioniert nicht
 
@mkinzler

Ja da steht nicht drinnen. Das Datumsfeld ist leer.
bei der Wartungstabelle bei der andere ist was drinnen.

Wie kann ich den so was abfangen.
Hast du eine Hilfe für mich.

danke
mfg
StoRmtec

mkinzler 30. Jan 2006 10:45

Re: Abfrage aus 2 Tabellen in Access funktioniert nicht
 
Beispiel für eine Konvertierung

Delphi-Quellcode:
try
 geswartungall.Text := verbrauchall.FieldByName('Gesamtkosten').Value;
except
 geswartungall.Text :='';
end;

StoRmtec 30. Jan 2006 10:51

Re: Abfrage aus 2 Tabellen in Access funktioniert nicht
 
bekomme aber trotzdem noch den Fehler wenn ich das einfüge.

Wie gesagt in der einen Tabelle ist kein Datum zu diesem Zeitpunkt eingetragen
und in der anderen schon.

mfg
StoRmtec

mkinzler 30. Jan 2006 10:58

Re: Abfrage aus 2 Tabellen in Access funktioniert nicht
 
Zitat:

Zitat von StoRmtec
bekomme aber trotzdem noch den Fehler wenn ich das einfüge.

Hast du die anderen Konvertierungsoperationen genauso durch Exceptionhandler gesichert?
Delphi-Quellcode:
if Trim(edit1.Text) <> '' then
    wartungall.Parameters.ParamByName('von').Value := StrToDate(edit1.Text)
else
    wartungall.Parameters.ParamByName('von').Value := NULL;
Selbiges für 'bis' Parameter
Zitat:

Wie gesagt in der einen Tabelle ist kein Datum zu diesem Zeitpunkt eingetragen
und in der anderen schon.
hat du die Erweiterung von marabu eingebaut?

StoRmtec 30. Jan 2006 11:37

Re: Abfrage aus 2 Tabellen in Access funktioniert nicht
 
nein die erweiterung von marabu habe ich nicht eingebaut.

Und mit deinem komme ich auch nicht weiter bekomme trotzdem immer wieder die Fehlermeldung.

MFG
StoRmtec

mkinzler 30. Jan 2006 11:57

Re: Abfrage aus 2 Tabellen in Access funktioniert nicht
 
Je nach Einstellungen in Delphi, werden auch abgefangene Exceptions angezeigt. Versuch mal das Programm aßerhalb der IDE zu starten.

StoRmtec 30. Jan 2006 12:01

Re: Abfrage aus 2 Tabellen in Access funktioniert nicht
 
Kommt auch der Fehler.
Bei der Wartung kommt nichts und beim Verbrauch steht von dem Datum was drinnen.

Mfg
StoRmtec

mkinzler 30. Jan 2006 12:27

Re: Abfrage aus 2 Tabellen in Access funktioniert nicht
 
Wenn 5n der Wart4ngstabelle kein Datum erfasst ist und du filterst nur bestimmte Datumswerte kann er nichts finden. Also where entfernen oder auf Datensätze ohne Datum erweitern ( marabu)

StoRmtec 30. Jan 2006 12:49

Re: Abfrage aus 2 Tabellen in Access funktioniert nicht
 
Liste der Anhänge anzeigen (Anzahl: 1)
Wenn ich nur Marabu Code nehme ohne deinen dann bekomme ich auch einen Fehler.
Siehe anhang.

Wie kann man das machen das er mir die einträge vom 01.09.2005 - 30.09.2005 ausliest
bei der wartung ist kein Datensatz mit dem Datum und beim verbrauch sind 2 datensätze vorhanden.

Danke

StoRmtec

mkinzler 30. Jan 2006 13:00

Re: Abfrage aus 2 Tabellen in Access funktioniert nicht
 
Dieses Problem scheint jetzt in einem anderen Programmteil aufzutreten!
Wenn du den 2. Query durch
SQL-Code:
select sum(kosten) as Gesamtkosten from wartung
ersetzt zeigt er dier alle Wartungsdatensätze an.

StoRmtec 30. Jan 2006 13:15

Re: Abfrage aus 2 Tabellen in Access funktioniert nicht
 
Also wenn ich das drinnen habe dann fragt er mir alle eintrage von allen 2 Tabellen ab.

Delphi-Quellcode:
procedure TForm2.gesamtbuttonClick(Sender: TObject);
var gesamtall1, kostenverbrauchall1, kostenwartungall1 : extended;
begin
wartungall.Close;
wartungall.sql.clear;
wartungall.SQL.text := 'select sum(tonerkostengesamt) as Gesamtsumme from verbrauch';
wartungall.open;
gesverbrauchall.text := wartungall.FieldByName('Gesamtsumme').Value;
verbrauchall.Close;
verbrauchall.sql.clear;
verbrauchall.SQL.text := 'select sum(kosten) as Gesamtkosten from wartung';
verbrauchall.open;
geswartungall.Text := verbrauchall.FieldByName('Gesamtkosten').Value;
kostenwartungall1 := strtofloat(geswartungall.Text);
kostenverbrauchall1 := strtofloat(gesverbrauchall.Text);
gesamtall1 := kostenwartungall1 + kostenverbrauchall1;
gesall.Text := floattostr(gesamtall1);
end;
Und dann stimmt das Ergebniss auch. Nur wenn ich es mit Datum machen will dann gehts nicht.

mkinzler 30. Jan 2006 13:28

Re: Abfrage aus 2 Tabellen in Access funktioniert nicht
 
Vielleicht würde es mir helfen, wenn du Struktur der datenbank und vielleich ausschnittsweise die Daten zu posten.

Beim ersten Query kannst du die where-Clause lassen

StoRmtec 30. Jan 2006 13:41

Re: Abfrage aus 2 Tabellen in Access funktioniert nicht
 
Okay also Tabelle

Verbrauch:

ID | Datumv | geholt | anzahl | kosteneinkauf | druckernameid | tonerkostengesamt
---------------------------------------------------------------------------------------------
7 |12.09.2005| kum | 1 | 21 | 1 | 21
8 |24.09.2005| kum | 2 | 21 | 1 | 42


Tabelle Wartung:

ID | Datum | Repbez | Firma | Kosten | druckernameid
--------------------------------------------------------------
2 |01.08.2005| blablabla| bla | 43 | 1

und jetzt wenn ich dann ausführe bekomme ich den fehler wenn ich beim datum von bis eingebe weil
bei der druckerwartung nichts mit 09.2005 drinnen steht.

StoRmtec 31. Jan 2006 06:56

Re: Abfrage aus 2 Tabellen in Access funktioniert nicht
 
Hat keiner eine Hilfe für mich

Mfg
StoRmtec

mkinzler 31. Jan 2006 07:11

Re: Abfrage aus 2 Tabellen in Access funktioniert nicht
 
Vielleicht solltest du auch diese Zeilen noch absichern
Delphi-Quellcode:
kostenwartungall1 := strtofloat(geswartungall.Text);
kostenverbrauchall1 := strtofloat(gesverbrauchall.Text);
so:
Delphi-Quellcode:
try
    kostenwartungall1 := strtofloat(geswartungall.Text);
except
    kostenwartungall1  := 0;
end;
und analog für 2. Term

marabu 31. Jan 2006 07:56

Re: Abfrage aus 2 Tabellen in Access funktioniert nicht
 
Hallo StoRmtec,

der Code in deinem ersten Beitrag hatte zwei vordergründige Mängel, die ich dir in den Beiträgen #2 und #4 bereits behoben habe. Grundsätzlich gehört dein Code nicht in einen event handler. Besser wären zwei Funktionen, exportiert aus einem Datenmodul. Die beiden SQL-Statements können jeweils einer permanenten Query zugewisen werden und müssen nicht jedes mal wieder übersetzt werden. Die Signatur der Funktionen sollte bereits interne Datentypen verwenden, damit die Funktionen frei von Konvertierungen bleiben können. Der Zugriff auf einen field value bei leerem result set bleibt fehlerfrei, wenn du meinen Hinweis aus Beitrag #4 beherzigst - NULL values werden bei Zugriff über die Konvertierungsmethoden eines Datenfeldes automatisch nach 0 bei numerischen Typen, empty string oder FALSE konvertiert.

Außerhalb dieser Datenbankfunktionalität gilt noch folgendes: Entweder du nimmst Benutzereingaben typsicher entgegen, indem du spezielle Controls wie TDateTimePicker verwendest, die notwendige Prüfungen selbst durchführen, oder du nimmst normale Edit-Felder und schreibst den Prüfcode selbst. Zum Zwecke der Anzeige werden numerische Werte eines Datenbankfeldes in Text umgewandelt, das ist völlig normal. Nicht normal ist es, diesen Text wieder in einen numerischen Wert zu konvertieren um ihn in einer Berechnung zu verwenden.

For what it's worth...

marabu

StoRmtec 31. Jan 2006 11:56

Re: Abfrage aus 2 Tabellen in Access funktioniert nicht
 
Danke mkinzler es funktioniert jetzt so wie ich das möchte.

Habe jetzt noch den DateTimePicker eingebaut und mit dem geht es auch.

Mfg
StoRmtec

mkinzler 31. Jan 2006 12:04

Re: Abfrage aus 2 Tabellen in Access funktioniert nicht
 
Zitat:

Zitat von StoRmtec
Danke mkinzler es funktioniert jetzt so wie ich das möchte.

Freut mich.

Allerdings muß ich marabu rechtgeben mit seinem Einwand, das das Abfangen der Fehler durch Exceptionhandler ( try .. except ) nur die Symptome bekämpft anstatt die Ursachen.
Besser ist es natürlich vorher abzuprüfen, ob die zu konvertierenden Variablenwerte in den Zieltyp konvertierbar sind oder ob überhaupt ein Ergebnis vorliegt bzw. Variablen nicht leer( Null) sind.

StoRmtec 1. Feb 2006 08:54

Re: Abfrage aus 2 Tabellen in Access funktioniert nicht
 
Hallo

Wie kann ich den eine Abfrage abfangen wenn ich mit die Datensätze einer bestimmten ID anzeigen lassen will und dann das zusammenzählen lasse. Bekomme da immer eine Fehlermeldung wenn er zB. beim Verbrauch keine ID findet.

Bitte noch mal um Hilfe

Delphi-Quellcode:
procedure TForm2.Button17Click(Sender: TObject);
var gesamt1, kostenverbrauch, kostenwartung : extended;
begin
wartungq.Close;
wartungq.sql.clear;
wartungq.SQL.text := 'select sum(tonerkostengesamt) as Gesamtsumme from verbrauch where druckernameid='''+dbedit1.text+'''';
wartungq.open;
gesverbrauch.text := wartungq.FieldByName('Gesamtsumme').Value;
verbrauchq.Close;
verbrauchq.sql.clear;
verbrauchq.SQL.text := 'select sum(kosten) as Gesamtkosten from wartung where druckernameid='''+dbedit1.text+'''';
verbrauchq.open;
geswartung.Text := verbrauchq.FieldByName('Gesamtkosten').Value;
kostenwartung := strtofloat(geswartung.Text);
kostenverbrauch := strtofloat(gesverbrauch.Text);
gesamt1 := kostenwartung + kostenverbrauch;
gesamt.Text := floattostr(gesamt1) +' €';
end;
Danke

mkinzler 1. Feb 2006 09:04

Re: Abfrage aus 2 Tabellen in Access funktioniert nicht
 
Z.B so:
Delphi-Quellcode:
if wartungq.RecordCount > 0 then
    kostenwartung := strtofloat(geswartung.Text)
else
    kostenwartung := 0;

StoRmtec 1. Feb 2006 11:54

Re: Abfrage aus 2 Tabellen in Access funktioniert nicht
 
Liste der Anhänge anzeigen (Anzahl: 1)
jetzt bekomme ich den Fehler

mkinzler 1. Feb 2006 12:10

Re: Abfrage aus 2 Tabellen in Access funktioniert nicht
 
1.) Hast du die selbe Änderung für den Verbrauch durchgeführt?
2.) Was für ein Wert gibt er für RecordCount aus?

StoRmtec 1. Feb 2006 12:24

Re: Abfrage aus 2 Tabellen in Access funktioniert nicht
 
1.) Ja habe ich gemacht
2.) wie meinst was er mir da ausgibt

mkinzler 1. Feb 2006 12:30

Re: Abfrage aus 2 Tabellen in Access funktioniert nicht
 
Setze mal einen Haltepunkt an der Zeile, ind der RecordCount verwendet wird und schau dir mal den Wert an. Wenn die Datenbank kein Ergebnis liefert sollte RecordCount eigentlich 0 sein.

StoRmtec 1. Feb 2006 13:18

Re: Abfrage aus 2 Tabellen in Access funktioniert nicht
 
Hallo
Wie finde ich das heraus bzw wie setze ich so einen Haltepunkt
danke

mkinzler 1. Feb 2006 13:31

Re: Abfrage aus 2 Tabellen in Access funktioniert nicht
 
Im Codeeditor links vor die Zeile klicken. Es wird dort dann ein Punkt angezeigt. Dann Programm starten. Das Programm wird dann ausgefüht und am Haltepunkt angehalten.

Du programmierst noch nicht lang oder? ;-)

StoRmtec 1. Feb 2006 13:47

Re: Abfrage aus 2 Tabellen in Access funktioniert nicht
 
Nein ist noch nicht lange

Wenn ich das mache bekomme ich trotzdem die Fehlermeldung und wenn ich dann auf Break gehe stellt er sich da hin

Delphi-Quellcode:
gesverbrauch.text := wartungq.FieldByName('Gesamtsumme').Value;

mkinzler 1. Feb 2006 13:52

Re: Abfrage aus 2 Tabellen in Access funktioniert nicht
 
Wenn eranhält, fahr mit der Maus über Recordcount, dann siehst du den aktuellen Wert. Ist der 0?

StoRmtec 1. Feb 2006 13:54

Re: Abfrage aus 2 Tabellen in Access funktioniert nicht
 
Wenn ich auf den 0 fahre dann schreibt er hin 0|0

aber bekomme vorher schon eine fehlermeldung
First chance exception at $7C81EB33. Exception class EVariantTypeCastError with message 'Could not convert variant of type (Null) into type (String)'. Process Druckkosten.exe (5772)

mkinzler 1. Feb 2006 18:42

Re: Abfrage aus 2 Tabellen in Access funktioniert nicht
 
Setz mal den Breakpoint ein bischen vorher und gehe dann in Einzelschritten weiter, bis du die Zeile findest in der der Fehler ausgelöst wird.

StoRmtec 2. Feb 2006 06:51

Re: Abfrage aus 2 Tabellen in Access funktioniert nicht
 
Hallo

Also wenn ich auf Break gehe dann ist diese Zeile rot.

Delphi-Quellcode:
gesverbrauch.text := wartungq.FieldByName('Gesamtsumme').Value;

mkinzler 2. Feb 2006 07:13

Re: Abfrage aus 2 Tabellen in Access funktioniert nicht
 
Das Feld Gesamtsumme ist vom Typ Float, die Eigenschaft Text aber String also so ändern:
Delphi-Quellcode:
gesverbrauch.text := wartungq.FieldByName('Gesamtsumme').asString;

StoRmtec 2. Feb 2006 08:30

Re: Abfrage aus 2 Tabellen in Access funktioniert nicht
 
Liste der Anhänge anzeigen (Anzahl: 1)
jetzt kommt immer der Fehler

mkinzler 2. Feb 2006 08:52

Re: Abfrage aus 2 Tabellen in Access funktioniert nicht
 
Packe mal deinen kompletten Sourcecode und stelle ihn mal ein.

StoRmtec 2. Feb 2006 09:19

Re: Abfrage aus 2 Tabellen in Access funktioniert nicht
 
Hier ist der Code


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