Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi EDatabaseError - auslesen aus DB (https://www.delphipraxis.net/79998-edatabaseerror-auslesen-aus-db.html)

capo 1. Nov 2006 09:54

Datenbank: Dbase • Version: 5.0 • Zugriff über: BDE

EDatabaseError - auslesen aus DB
 
Hallo

ich versuche schon seit einiger Zeit aus einer *.dbf Datei alle Rechnungsnummern herauszusuchen die ihre Rechnung noch nicht bezahlt haben, das mache ich so:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
With Query1 do
 begin
  sql.add('select * from Rechnungen where BEZAHLT = BEZAHLT ');
Open;
  While not EOF do
  begin
  memo1.Lines.Add(FieldByName('N').AsString + ' => gefunden!'); // N = Nein
  Next;
 End;
 Close;
end;
end;
Klappt überhaupt nicht, erhalte folgende Fehlermeldung:
Zitat:

---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt Rechnung.exe ist eine Exception der Klasse EDatabaseError aufgetreten. Meldung: 'Query1: Das Feld 'N' wurde nicht gefunden'. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.
---------------------------
Wollte es erstmal in einem Memo darstellen, soll später in ein DBGRID.
Da weiss ich auch noch nicht wie.


gruesse
capo

DocE 1. Nov 2006 09:56

Re: EDatabaseError - auslesen aus DB
 
Hallo Capo,

dann scheint es das Feld "N" wohl nicht zu geben. Was meinst Du mit N = Nein?

Grüsse
...Doc

hoika 1. Nov 2006 10:22

Re: EDatabaseError - auslesen aus DB
 
Hallo,

du wirfst hier etwas durcheinander.

ändere deine Query (vor dem 2. BEWZAHLT kommt ein Doppelpunkt).

Delphi-Quellcode:
sql.add('select N from Rechnungen where BEZAHLT = :BEZAHLT ');
ParamByName('BEZAHLT').AsString:= 'N'; // falls es ein Char ist
Open;
try
  while not EOF // usw.
finally
  Close;
end;
das select N geht davon aus, dass das Rechnungsnummer Feld N heisst,
falls nicht, ändern.


Heiko

capo 1. Nov 2006 11:00

Re: EDatabaseError - auslesen aus DB
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Heiko

Danke für deine Hilfe.
Ich verwechsel da glaub ich immer noch was:

Delphi-Quellcode:
procedure TFRechnung.Button1Click(Sender: TObject);
begin
With Query1 do
 begin
  sql.add('select RGNR from Rechnungen where BEZAHLT = :BEZAHLT ');
ParamByName('BEZAHLT').AsString:= 'N'; // falls es ein Char ist
Open;
try
  while not EOF do
  begin
  memo1.Lines.Add(FieldByName('N').AsString + ' => gefunden!');
  Next;
 End;
finally
  Close;
end;
end;
end;
Schau dir bitte mal die Struktur an:

mkinzler 1. Nov 2006 11:04

Re: EDatabaseError - auslesen aus DB
 
Das Feld heißt BEZAHLt also muß es
Delphi-Quellcode:
memo1.Lines.Add(FieldByName('BEZAHLT').AsString + ' => gefunden!');
heißen.

capo 1. Nov 2006 11:06

Re: EDatabaseError - auslesen aus DB
 
hi, irgendwie nicht, erhalte dann als Meldung:
Zitat:

---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt rechnung.exe ist eine Exception der Klasse EDatabaseError aufgetreten. Meldung: 'Query1: Das Feld 'BEZAHLT' wurde nicht gefunden'. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.
---------------------------
OK Hilfe
---------------------------
gruss
capo

mkinzler 1. Nov 2006 11:09

Re: EDatabaseError - auslesen aus DB
 
Du läßst dir ja auch nur ein Feld zurückgeben:
Zitat:

SQL-Code:
select RGNR from Rechnungen where BEZAHLT = :BEZAHLT

Erweitere die Feldliste dementsprechend.

DocE 1. Nov 2006 11:11

Re: EDatabaseError - auslesen aus DB
 
Das liegt daran:


Delphi-Quellcode:
sql.add('select RGNR from Rechnungen where BEZAHLT = :BEZAHLT ');
Du musst die Felder, auf die Du zugreifen möchtest auch abfragen, z.B. mit

Delphi-Quellcode:
sql.add('select RGNR,BEZAHLT from Rechnungen where BEZAHLT = :BEZAHLT ');
oder

Delphi-Quellcode:
sql.add('select * from Rechnungen where BEZAHLT = :BEZAHLT ');
Grüsse
...Doc

capo 1. Nov 2006 11:21

Re: EDatabaseError - auslesen aus DB
 
Ich fang gerade erst damit an.
Danke das war es!

Gruss Capo

capo 1. Nov 2006 11:43

Re: EDatabaseError - auslesen aus DB
 
Ich doch nochmal. :)
Was muss ich tun wenn ich alle Daten der Zeile in der (N) sich befindet in ein DBGrid bekommen will?
Oder hat jemand ein kleines Tutorial speziell für Delphi & Dbase?
gruss
capo

DocE 1. Nov 2006 11:46

Re: EDatabaseError - auslesen aus DB
 
Im Prinzip musst Du nur eine DataSource auf das Formular ziehen, diese mit der Query verknüpfen und ein DBGrid welches mit der DataSource verknüpft wird...

Grüsse
...Doc

capo 1. Nov 2006 11:51

Re: EDatabaseError - auslesen aus DB
 
Hallo DocE
danke, hab ich gemacht, bekomme folgende Meldung:
Zitat:

---------------------------
Fehler
---------------------------
Query1: Keine SQL-Anweisung verfügbar.
---------------------------
OK
---------------------------

mkinzler 1. Nov 2006 11:56

Re: EDatabaseError - auslesen aus DB
 
Du scheinst immer mehr Änderungen zu machen, als man dir vorschlägt. Poste mal den ganzen aktuellen Code.

DocE 1. Nov 2006 12:01

Re: EDatabaseError - auslesen aus DB
 
...und vielleicht dazu noch, wann die Fehlermeldung auftritt (beim Starten, wenn Du Änderungen im DBGrid vornehmen möchtest). Die Meldung deutet daraufhin, dass Du versuchst im DBGrid Daten anzuzueigen/zu ändern, obwohl die Query noch keine SQL-Anweisung hat...

capo 1. Nov 2006 12:04

Re: EDatabaseError - auslesen aus DB
 
Hallo,

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
With Query1 do
 begin
sql.add('select * from Rechnungen where BEZAHLT = :BEZAHLT ');
 //  sql.add('select RGNR,BEZAHLT from Rechnungen where BEZAHLT = :BEZAHLT ');
ParamByName('BEZAHLT').AsString:= 'N'; // falls es ein Char ist
Open;
try
  while not EOF do
  begin

 memo3.Lines.Add(FieldByName('BEZAHLT').AsString +  ' => gefunden!');
  Next;
 End;
finally
  Close;
end;
end;
end;

DocE 1. Nov 2006 12:06

Re: EDatabaseError - auslesen aus DB
 
Das "Close" ist das Problem. Dann ist die Datenmenge ja wieder geschlossen und kann auch nicht mehr angezeigt werden...

hoika 1. Nov 2006 12:08

Re: EDatabaseError - auslesen aus DB
 
Das

Close

muss weg, die Query muss offen bleiben,
wenn du die Daten im DBGrid anzeigen möchtest.

Ausserdem prüfe, ob alles verknüpft ist.

DBGrid.DataSource -> TDataSource.DataSet -> Query

Heiko

capo 1. Nov 2006 13:26

Re: EDatabaseError - auslesen aus DB
 
hallo und danke nun klappt es... bis auf eine kleine Fehlermeldung wenn ich zweimal hintereinander auf den Button klick:


Zitat:

---------------------------
Ungültiges Schlüsselwort

Symbol-String: select

Zeilennummer: 2.
---------------------------
Beim Code hab ich nur das close rausgenommen.

Nunja, jedenfalls klappt das auslesen. Nochmal Danke dafür :-D

hoika 1. Nov 2006 13:37

Re: EDatabaseError - auslesen aus DB
 
Hallo,

naja, das habe ich nun nicht noch gesagt :wall: )
ein bissel solltest du aich selber was machen .. ;)

beim zweiten Drücken ist die Query schon offen,
dann muss man die vorher zumachen

if Query.Active then Query.Active:= False;

oder sogar als 1. Befehl im OnButton

if Query.Active then Exit;

Das kommt aber auf deine Logik an,
bisher macht es ja keinen Sinn, überhaupt einen Button reinzupacken,
da die Query ja immer offen sein muss.


Heiko
PS:
Übrigens würde ich schleunigst die DB wechseln.
Paradox ist out.
Sobald ein "index out of date" kommt, sprechen wir weiter ;)

raiguen 1. Nov 2006 16:15

Re: EDatabaseError - auslesen aus DB
 
Zitat:

Zitat von capo
hallo und danke nun klappt es... bis auf eine kleine Fehlermeldung wenn ich zweimal hintereinander auf den Button klick:


Zitat:

---------------------------
Ungültiges Schlüsselwort

Symbol-String: select

Zeilennummer: 2.
---------------------------
Beim Code hab ich nur das close rausgenommen.

Ist klar, warum diese Meldung kommt:
in deinem Code steht Query1.SQL.Add(...), d.h. bei jedem Click auf den Button wird zur bereits bestehenden SQL-Anweisung eine neue (in diesem Fall die gleiche) hinzugefügt :-). Das Ergebnis ist:
select * from Rechnungen where BEZAHLT = :BEZAHLT
select * from Rechnungen where BEZAHLT = :BEZAHLT

Auf der sicheren Seite bist du, wenn du entweder
Delphi-Quellcode:
Query1.SQL.Clear;    // alle Anweisungen löschen
Query1.SQL.Add('select * from Rechnungen where BEZAHLT = :BEZAHLT ')  // Anweisung hinzufügen
Query1.SQL.Add('ORDER BY KDNR')  // 2. Zeile (hier nur mal als Beispiel)
Query1.Open;
oder
Delphi-Quellcode:
//--neue Anweisung zuweisen: vorhandene Anweisung wird durch die neue ersetzt
Query1.SQL.Text := 'SELECT * FROM Rechnungen WHERE BEZAHLT = :BEZAHLT ORDER BY KDNR';
Query1.Open;
Im Übrigen wird eine offene Query automatisch geschlossen, sobal das SQL-Statement geändert wird; auf der sicheren Seite (und für den Fall des Debuggens) ist es immer besser, expliziet
Code:
Query1.Close
zu schreiben ;-)



Zitat:

Zitat von capo
Hallo DocE
danke, hab ich gemacht, bekomme folgende Meldung:
Zitat:

---------------------------
Fehler
---------------------------
Query1: Keine SQL-Anweisung verfügbar.
---------------------------
OK
---------------------------

Auch das ist klar ;-) du hast versucht im ObjektInspektor Query1 auf Active=True zu setzen, hast aber bei der Eigenschaft SQL keine SQL-Anweisung eingetragen...

capo 1. Nov 2006 23:31

Re: EDatabaseError - auslesen aus DB
 
danke für eure hilfe. :kiss:
ich hab bestimmt in den nächsten tagen noch die eine oder andere Frage zu dem Thema.
[edit]Auch jetzt schon... kann ich anstatt einer TQuery auch eine TTable nehmen, damit kann ich mir die Daten so schön während der Entwurfszeit anzeigen lassen um mir das DBGrid so anzeigen zu lassen wie ich es will.

Zitat:

Übrigens würde ich schleunigst die DB wechseln.
Paradox ist out.
Mich interessiert welche DB ich anstatt DBASE (oder ist das Paradox?) ich verwenden kann.
ohne gross iregndwelche DB-Server installieren zu müssen.

Grüsse vom capo

mkinzler 2. Nov 2006 06:50

Re: EDatabaseError - auslesen aus DB
 
Zitat:

Mich interessiert welche DB ich anstatt DBASE (oder ist das Paradox?) ich verwenden kann.
ohne gross iregndwelche DB-Server installieren zu müssen.
Firebird embedded, Absolute DataBase, SQLite, Access, MySQL embedded.
BTW. Da Paradox und DBase die BDE benötigen, mußt du ja auch etwas installieren.

hoika 2. Nov 2006 07:42

Re: EDatabaseError - auslesen aus DB
 
Hallo,

falls du mal einen SQL-Server im Kopf hast,
lass TTable gleich weg, auch wenn es sich jetzt so schön benutzen lässt,
die Probleme bekommst du dann später.

Ich benutze übrigens FB 1.5, dort könntest du auch erst mal die embedded version benutzen.
Ich rate allerdings davon ab.
Wenn du vorhast, mehrere Benutzer auf deine DB zugreifen zu lassen,
solltest du das auch von Anfang an so im Kopf haben.

Performance-Probleme wegen zu viel Netzlast bekommst du nur
mit, wenn du deine DB im Netz laufen lässt.


Heiko

mkinzler 2. Nov 2006 07:49

Re: EDatabaseError - auslesen aus DB
 
Zitat:

Ich benutze übrigens FB 1.5, dort könntest du auch erst mal die embedded version benutzen.
Ich rate allerdings davon ab.
Und warum?

raiguen 2. Nov 2006 08:14

Re: EDatabaseError - auslesen aus DB
 
Zitat:

Zitat von capo
.. kann ich anstatt einer TQuery auch eine TTable nehmen, damit kann ich mir die Daten so schön während der Entwurfszeit anzeigen lassen um mir das DBGrid so anzeigen zu lassen wie ich es will.

Auch mit einer TQuery kann man in der Entwurfszeit sich die Daten im DBGrid anzeigen lassen :!: Im ObjektInspektor ist dann bei der Eigenschaft SQL eine entsprechende Anweisung reinzuschreiben...

hoika 2. Nov 2006 10:44

Re: EDatabaseError - auslesen aus DB
 
Hallo mkinzler,

abraten, falls er später was im Netz machen will,
siehe mein voriges Posting (Netzlast)
Dann kommen wieder die Fragen
"Lokal läuft es schnell, im Netz extrem langsam"


Heiko

mkinzler 2. Nov 2006 11:04

Re: EDatabaseError - auslesen aus DB
 
Okay ich hatte das falsch verstanden. Seine Frage war ja aber nach alternativen Desktopdatenbanken ohne Installation eines Servers.

hoika 2. Nov 2006 12:56

Re: EDatabaseError - auslesen aus DB
 
Jo,

aber man sollte rookies ja schnell an die Probleme ranführen ;)


Heiko

capo 2. Nov 2006 13:13

Re: EDatabaseError - auslesen aus DB
 
Möchte mich bei allen bedanken für die Hilfe und das Interesse,


Zitat:

Zitat von raiguen
Zitat:

Zitat von capo
.. kann ich anstatt einer TQuery auch eine TTable nehmen, damit kann ich mir die Daten so schön während der Entwurfszeit anzeigen lassen um mir das DBGrid so anzeigen zu lassen wie ich es will.

Auch mit einer TQuery kann man in der Entwurfszeit sich die Daten im DBGrid anzeigen lassen :!: Im ObjektInspektor ist dann bei der Eigenschaft SQL eine entsprechende Anweisung reinzuschreiben...

hallo
ich will ja nicht unverschämt sein aber wie muss ich das machen, hast du noch ein Beispiel.

grüsse capo

mkinzler 2. Nov 2006 14:44

Re: EDatabaseError - auslesen aus DB
 
Na einfach
SQL-Code:
Select * from <Tabellennamen>;
Je nach verwendetem DBMS brauchst du u.U. noch Ein TUpdateSQL, welches du per .UpdateObject verknüpfst,

capo 2. Nov 2006 17:59

Re: EDatabaseError - auslesen aus DB
 
yep hab ich nun so einigermaßen verstanden mach es aber momentan so:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  with Query1 do
  begin
    SQL.Clear;

    sql.add('select * from Rechnungen,Kunden where BEZAHLT = :BEZAHLT');

    ParamByName('BEZAHLT').AsString := 'N'; // falls es ein Char ist

    Open;
    try
      while not EOF do
      begin
// memo3.Lines.Add(FieldByName('BEZAHLT').AsString +  ' => gefunden!');
        Next;
      end;
    finally
 // Close;
    end;
  end;
end;
eine/zwei frage(n) habe ich noch und zwar.
bekomme ich so ja "nur" die kundennummer und die noch offenen rechungen im dbgrid angezeigt.
frage:
wie kann ich mir den dazugehörigen namen mit adresse aus einer db mit namen kunden.dbf dazuholen und wahnsinnig toll wäre es dann mit einem klick auf die entsprechende zeile dann auch die entsprechende rechnung angezeigt zu bekommen?

capo

mkinzler 2. Nov 2006 18:04

Re: EDatabaseError - auslesen aus DB
 
Zitat:

wie kann ich mir den dazugehörigen namen mit adresse aus einer db mit namen kunden.dbf dazuholen
Indem du diese dazu joinst.

DocE 2. Nov 2006 18:25

Re: EDatabaseError - auslesen aus DB
 
Das

Delphi-Quellcode:
try
      while not EOF do
      begin
// memo3.Lines.Add(FieldByName('BEZAHLT').AsString +  ' => gefunden!');
        Next;
      end;
    finally
// Close;
    end;
kannst Du Dir im Prinzip sparen, da Du jetzt ja nur noch mit "Next;" die gesamte Tabelle "durchläufst" ohne irgendetwas zu machen. Möchtest Du nach dem Öffnen direkt zum Ende der Tabelle springen reicht ein Aufruf von "Last;"

Grüsse
...Doc


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