Entwickler-Ecke

Datenbanken - DB-Abfrage eines Artikels innerhalb eines Datumabschnitts


Aadelbert - Fr 09.11.07 16:56
Titel: DB-Abfrage eines Artikels innerhalb eines Datumabschnitts
Hallo Leute,

die Abfrage sieht im Moment folgendermaßen aus, liefert aber einen "Syntaxfehler (fehlender Operator) ...

Delphi-Quelltext
1:
ADODataSet3.CommandText := 'select * from Bestand where Artikel="'+ SuchArtikel +'"'+'and where Datum between '+ 'DATEVALUE'+'("'+Edit1.Text+'")'+'and'+ 'DATEVALUE'+'("'+Edit2.Text+'")'+' ORDER BY lfd';                    


Ich habe bisher so eine Abfrage nicht gemacht und brauche mal etwas Hilfe.

Danke Aadelbert

Moderiert von user profile iconmatze: Delphi-Tags hinzugefügt


jakobwenzel - Fr 09.11.07 17:10

In der Zeile ist zumindest Delphi-Fehler. Kanns vielleicht sein, dass einfach in der Zeile vorher das Semikolon fehlt?
Oder meinst du einen SQL-Fehler?


Aadelbert - Fr 09.11.07 21:56

Also, in der Zeile vorher fehlt kein Semikolon.

Kann es vielleicht sein, dass das mit "... where Artikel..." und dann nochmal mit "...where Datum..." nicht geht?


mkinzler - Fr 09.11.07 22:12

Versuch es mal mit (SQL-)Parametern


Aadelbert - Fr 09.11.07 23:06

Also so komm ich nicht weiter. Ich brauche schon etwas mehr an Hinweisen. Mit der Suche hier im Forum komme ich auch nicht wirklich weiter.

Trotzdem schon mal Danke


mkinzler - Fr 09.11.07 23:09


Delphi-Quelltext
1:
2:
3:
4:
ADODataSet3.CommandText := 'select * from Bestand where Artikel=:artikel and where Datum between :datum1 and :datum2 ORDER BY lfd'; 
...
ADODataSet3.Params.ParamByName('artikel').asString := SuchArtikel;
...


Aadelbert - Fr 09.11.07 23:59

Danke, der erste Teil funktioniert offensichtlich. Nur so richtig klar komme ich noch nicht damit. Denn jetzt bekomme ich folgenden Hinweis: [Fehler] Unit13.pas(351): Undefinierter Bezeichner: 'Params'. Was muss ich jetzt machen. Tut mir leid, ich tu mich sehr schwer damit. Könntest Du nochmals etwas Hilfe geben?


mkinzler - Sa 10.11.07 00:01


Delphi-Quelltext
1:
ADODataSet3.Parameters.ParamByName('artikel').asString := SuchArtikel;                    


Aadelbert - Sa 10.11.07 00:10

Es hakt immer noch: [Fehler] Unit13.pas(351): Undefinierter Bezeichner: 'asString'.
Mir kommt der Kaffee so langsam hoch! Wieso raff ich das nicht? Ik seh nischt mehr, sitz schon den ganzen Tag am Rechner.


mkinzler - Sa 10.11.07 00:12

Versuchs mal mit .Value


Aadelbert - Sa 10.11.07 00:18

Value klappt zwar, aber trotzdem erhalte ich noch eine Exception: Ein Parameterobjekt ist nicht ordnungsgemäß definiert. Inkonsistente oder unvollständige Informationen wurden angegeben. ...

Ich fühls, die Lösung ist nahe!!!


Aadelbert - So 11.11.07 11:59

Leider funktioniert es immer noch nicht und ich bin auf Hilfe von Wissenden angewiesen.


hansa - So 11.11.07 13:52

Wenn schon, dann so :


Delphi-Quelltext
1:
2:
ADODataSet3.ParamByName('artikel').asString := SuchArtikel;
...


Aadelbert - So 11.11.07 15:38

ADODataSet3.ParamByName(' artikel ').asString := SuchArtikel;
Wenn ich das so eingebe kann ich nicht compilieren:
[Fehler] Unit13.pas(353): Undefinierter Bezeichner: 'ParamByName'

ADODataSet3.Parameters.ParamByName(‘artikel’).asString := SuchArtikel;
Dann kommt das:
[Fehler] Unit13.pas(351): Undefinierter Bezeichner: 'asString'

Das habe ich und lässt sich wenigstens compilieren:

Delphi-Quelltext
1:
2:
3:
ADODataSet3.CommandText := 'select * from Bestand where=:artikel and where Datum between : datum1 and : datum2 ORDER BY lfd’;
ADODataSet3.Parameters.ParamByName (‘artikel’).Value := SuchArtikel;
ADODataSet3.Active := True;


Value klappt zwar, aber trotzdem erhalte ich noch eine Exception: Ein Parameterobjekt ist nicht ordnungsgemäß definiert. Inkonsistente oder unvollständige Informationen wurden angegeben. ...

Was ist denn hier noch falsch?
Kann man das mit ADOQuery vielleicht einfacher lösen?

Hilfe!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Moderiert von user profile iconmatze: Delphi-Tags hinzugefügt


uko - So 11.11.07 16:33

Hallo,


Delphi-Quelltext
1:
ADODataSet3.Parameters.ParamByName('artikel').Value := SuchArtikel;                    

ist schon ok.
Du verwendest auch die Parameter Datum1 und Datum2. Die mußt Du auch setzen (genau wie artikel)! Und dann noch was: auch wenn ich noch nie was mit ADO gemacht habe, glaub ich aber nicht, daß dein SQL korrekt ist:


SQL-Anweisung
1:
select * from Bestand where=:artikel and where Datum between : datum1 and : datum2 ORDER BY lfd                    

würde ich sagen muß so heißen:

SQL-Anweisung
1:
select * from Bestand where Artikel=:artikel and (Datum between :datum1 and :datum2) ORDER BY lfd                    

(Artikel eventuell noch quoten, je nachdem ob es eine Zahl oder ein String ist)

Grüße,
Uli


mkinzler - So 11.11.07 16:42

@uko: Die Abfrage sollte so stimmen, das 2. and gehört ja zum between. Bei Parametern brauchst man nicht Quoten, das ist ja gerade einer der Vorteile von Parametern.
@Aadelbert: Anscheinend kann ADO aber Probleme mit der Bestimmung des Typs des Parameters. Setze mal seinen Typ


Robert.Wachtel - So 11.11.07 16:56

Ich vermisse die Zuweisung der Parameter datum1 und datum2...

// Edit: Gerade erst gesehen, dass uko das auch schon erwähnt hat, also vergesst diesen Beitrag einfach... :mrgreen:


Aadelbert - So 11.11.07 19:15

@uko: Ich habe jetzt den Code so angepasst. Jetzt kann ich zwar compilieren und das Programm startet ...

Der Code sieht jetzt so aus:

Delphi-Quelltext
1:
2:
3:
ADODataSet3.CommandText := 'select * from Bestand where Artikel=:Artikel and (Datum between :SuchDatum1 and :SuchDatum2) ORDER BY lfd';
ADODataSet3.Parameters.ParamByName(' Artikel ').Value := Such Artikel;
ADODataSet3.Active := True;


... aber es werden keine Daten angezeigt.

Moderiert von user profile iconmatze: Delphi-Tags hinzugefügt


uko - So 11.11.07 23:05

Hast Du denn die Werte für die Parameter SuchDatum1 und Suchdatum2 gesetzt? Das taucht in deinem Code nämlich nicht auf.

Grüße,
Uli


Aadelbert - So 11.11.07 23:52

Meine Güte, ich blick es einfach nicht! Wo und wie muss ich die setzen?

Ich danke euch allen für die Geduld!


mkinzler - So 11.11.07 23:54

Genauso wie den Parameter für den Artkel


Aadelbert - Do 15.11.07 23:13

@ ALLE und auch an die 277 ANKUCKER!
Leider konnte ich am 11. aus Zeitgründen nicht weitermachen. So sieht es jetzt aus:


Delphi-Quelltext
1:
2:
3:
4:
5:
ADODataSet3.CommandText := 'select * from Bestand where Artikel=:Artikel and (Datum between :SuchDatum1 and :SuchDatum2) ORDER BY lfd';
ADODataSet3.Parameters.ParamByName('Artikel').Value := SuchBTM;
ADODataSet3.Parameters.ParamByName('Datum').Value := SuchDatum1;
ADODataSet3.Parameters.ParamByName('Datum').Value := SuchDatum2;
ADODataSet3.Active := True;


Ich bekomme weiter eine Fehlermeldung: 'ADODataSet3: Parameter 'Datum' nicht gefunden'.
Das Feld Datum ist in der DB so benannt und auch als Datumsfeld formatiert. Es stehen auch Daten drin.

Wo ist denn jetzt der Fehler? Bitte helft mir!

Gruß Aadelbert

Moderiert von user profile iconmatze: Delphi-Tags hinzugefügt


mkinzler - Do 15.11.07 23:20


Delphi-Quelltext
1:
2:
ADODataSet3.Parameters.ParamByName('Suchdatum1').Value := StrToDate( Edit1.Text);
ADODataSet3.Parameters.ParamByName('Suchdatum2').Value := StrToDate( Edit2.Text);


Aadelbert - Do 15.11.07 23:32

@ MKinzler
Fantastisch! Es läuft! Es läuft!
Von dem Arbeiten mit Parametern habe ich nicht die Spur einer Ahnung. Ich bin wirklich sehr froh über die Hilfe. Natürlich ist es richtig nicht sofort den perfekten Code zu liefern. Ich habe ganz schön geschwitzt, dass mich der Kunde bald ganz schön auf die Füße tritt.

Nochmals 1000Dank!!!!!!!!!!!!!!!
Ich mach für heute Schluss!


Aadelbert - Mi 02.01.08 23:39

Hallo,

tut mir leid wenn ich an dieser Stelle nochmal nachfrage.

Ich möchte den Code noch erweitern und die Anzahl der Datensätze nur für den abgefragten Datumsbereich ermitteln und die Anzahl für eine weitere procedure weiterverarbeiten.
Label1.Caption := IntToStr(ADODataSet3.RecordCount) liefert mir die Anzahl aller Datensätze.

Wie also muss die Abfrage aussehen?

Danke im voraus Gruß Aadelbert