![]() |
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:
Wie kann ich das machen wenn da kein Datum eingetragen ist das er mir trotzdem den anderen Wert ausgibt.
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; MFG StoRmtec |
Re: Abfrage aus 2 Tabellen in Access funktioniert nicht
Hi,
du könntest die Bedingung erweitern:
SQL-Code:
Grüße vom marabu
... where datumv is not null and datumv between :von and :bis ...
|
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 |
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:
marabu
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; |
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.
|
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 |
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; |
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 |
Re: Abfrage aus 2 Tabellen in Access funktioniert nicht
Zitat:
Delphi-Quellcode:
Selbiges für 'bis' Parameter
if Trim(edit1.Text) <> '' then
wartungall.Parameters.ParamByName('von').Value := StrToDate(edit1.Text) else wartungall.Parameters.ParamByName('von').Value := NULL; Zitat:
|
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 |
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.
|
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 |
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)
|
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 |
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:
ersetzt zeigt er dier alle Wartungsdatensätze an.
select sum(kosten) as Gesamtkosten from wartung
|
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:
Und dann stimmt das Ergebniss auch. Nur wenn ich es mit Datum machen will dann gehts nicht.
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; |
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 |
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. |
Re: Abfrage aus 2 Tabellen in Access funktioniert nicht
Hat keiner eine Hilfe für mich
Mfg StoRmtec |
Re: Abfrage aus 2 Tabellen in Access funktioniert nicht
Vielleicht solltest du auch diese Zeilen noch absichern
Delphi-Quellcode:
so:
kostenwartungall1 := strtofloat(geswartungall.Text);
kostenverbrauchall1 := strtofloat(gesverbrauchall.Text);
Delphi-Quellcode:
und analog für 2. Term
try
kostenwartungall1 := strtofloat(geswartungall.Text); except kostenwartungall1 := 0; end; |
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 |
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 |
Re: Abfrage aus 2 Tabellen in Access funktioniert nicht
Zitat:
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. |
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:
Danke
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; |
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; |
Re: Abfrage aus 2 Tabellen in Access funktioniert nicht
Liste der Anhänge anzeigen (Anzahl: 1)
jetzt bekomme ich den Fehler
|
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? |
Re: Abfrage aus 2 Tabellen in Access funktioniert nicht
1.) Ja habe ich gemacht
2.) wie meinst was er mir da ausgibt |
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.
|
Re: Abfrage aus 2 Tabellen in Access funktioniert nicht
Hallo
Wie finde ich das heraus bzw wie setze ich so einen Haltepunkt danke |
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? ;-) |
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;
|
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?
|
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) |
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.
|
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;
|
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;
|
Re: Abfrage aus 2 Tabellen in Access funktioniert nicht
Liste der Anhänge anzeigen (Anzahl: 1)
jetzt kommt immer der Fehler
|
Re: Abfrage aus 2 Tabellen in Access funktioniert nicht
Packe mal deinen kompletten Sourcecode und stelle ihn mal ein.
|
Re: Abfrage aus 2 Tabellen in Access funktioniert nicht
Hier ist der Code
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:57 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