![]() |
Datenbank: noch Paradox :-( • Zugriff über: BDE
Query... Feld nicht gefunden
Hallo alle..
Ich bräuchte mal jemanden, der mir die Brille putzt... :-D Der Ablauf: 1. Eingabe in Edit Feld... SMatch 2. Start Abfrage
Delphi-Quellcode:
3.SQL (Auszug...)
procedure LSuche;
begin if FLieferschein.SMatch.Text = '' then exit; ListeComboBox; FLieferschein.SMatch.Enabled:= False; FLieferschein.ComboBox1.Enabled:= False; FLieferschein.BitBtn2.Enabled:= False; FLieferschein.BitBtn1.Enabled:= False; FLieferschein.BitBtn3.Enabled:= False; Abfrage; GridOptionen; end; procedure Abfrage; begin FLieferschein.Query1.Filtered:= False; FLieferschein.Query1.Close; case FLieferschein.ComboBox1.ItemIndex of 0: begin // Artikelnummer QArtikelnummer; end; 1: begin // Style Name QStyleName; end; 2: begin // Style Nummer QStyleNummer; end; 3: begin // Lieferschein QLieferschein; end; 4: begin // Rechnung QRechnung; end; end; end;
Delphi-Quellcode:
4. Anzeige im DBGrid
procedure QLieferschein;
begin with FLieferschein do begin Query1.SQL.Text:= 'select Artikel.Artikelnummer,Artikel.StyleName,Artikel.StyleNummer,'+ 'Artikel.Farbe,Artikel.Grosse,Bewegung.Bewegung,Artikel.EKnetto,Bewegung.Datum,Bewegung.RE '+ 'from Artikel,Bewegung '+ 'where Bewegung.LS = (:Match) and Bewegung.Vorgang = (:Vorgang) '+ 'and Artikel.Artikelnummer = Bewegung.Artikelnummer '+ 'order by Farbe,Grosse'; Query1.ParamByName('Match').Value:= FLieferschein.SMatch.Text; Query1.ParamByName('Vorgang').Value:= 'manuell'; FLieferschein.Query1.Open; DbGrid1.Columns[0].Width := 120; DbGrid1.Columns[0].Title.Caption := 'Artikelnummer'; DbGrid1.Columns[1].Width := 120; DbGrid1.Columns[1].Title.Caption := 'Style Name'; DbGrid1.Columns[2].Width := 100; DbGrid1.Columns[2].Title.Caption := 'Style Nummer'; DbGrid1.Columns[4].Width := 40; DbGrid1.Columns[4].Title.Caption := 'Größe'; DbGrid1.Columns[5].Width := 40; DbGrid1.Columns[5].Title.Caption := 'Menge'; DbGrid1.Columns[6].Width := 40; DbGrid1.Columns[6].Title.Caption := 'EK'; DbGrid1.Columns[8].Width := 100; DbGrid1.Columns[8].Title.Caption := 'Rechnung'; if Query1.RecordCount > 0 then begin BitBtn3.Enabled:= False; BitBtn1.Enabled:= True; end; end; end; ....funktioniert ! aber: 5. nanchmal muß ich die Ergebnismenge noch filtern ( könnte man auch über SQL erledigen, fand ich aber die schnellere Lösung bei max 20 Datensätzen in der Ergebnismenge)
Delphi-Quellcode:
...funktioniert auch.
// Filter
procedure TFLieferschein.ComboBox2Change(Sender: TObject); begin case ComboBox2.ItemIndex of 0: begin Query1.Filtered:= False; end; 1: begin if ComboBox2.Text = 'kein Lieferschein' then begin Query1.Filter:= 'LS = '+ QuotedStr(''); Query1.Filtered:= True; SMatch.SetFocus; end else begin Query1.Filter:= 'RE = '+ QuotedStr(''); Query1.Filtered:= True; SMatch.SetFocus; end; end; end; end; Das Problem: - wenn ich die Query einmal gefiltert habe und noch einmal 'procedure QLieferschein' aufrufe erhalte ich die Meldung 'Feld LS' nicht gefunden. - dabei ist unwichtig ob die Query bei Start der Abfrage gefiltert oder ungefiltert ist. das Problem tritt nur bei QLieferschein auf. ... hat jemand eine Idee ? :roll: Danke im Voraus... |
Re: Query... Feld nicht gefunden
Egal wie, aber hier liegt der Hund begraben :
Zitat:
|
Re: Query... Feld nicht gefunden
Hallo,
bei Paradox ist es tatsächlich effizienter mit einem Filter zu arbeiten, da die Zugriffsroutinen sowieso vollständig auf dem Client ablaufen. Ich würde die Konfiguration des Grids und der SpeedButtons nicht in der Prozedur QLieferschein() angehen und dieser auch eine andere Signatur verpassen:
Delphi-Quellcode:
Getippt und nicht getestet.
procedure QLieferschein(q: TQuery; const ls, vorgang: string);
var bFiltered: Boolean; begin with q do begin DisableControls; bFiltered := Filtered; Filtered := False; SQL.Text := 'SELECT A.Artikelnummer, A.StyleName, A.StyleNummer, A.Farbe, A.Grosse, ' + 'B.Bewegung, A.EKnetto, B.Datum, B.RE ' + 'FROM Artikel A, Bewegung B ' + 'WHERE B.LS = :Match AND B.Vorgang = :Vorgang ' + 'AND A.Artikelnummer = B.Artikelnummer ' + 'ORDER BY Farbe, Grosse' ; ParamByName('Match').AsString := ls; ParamByName('Vorgang').AsString := vorgang; Open; Filtered := bFiltered; EnableControls; end; end; Grüße vom marabu |
Re: Query... Feld nicht gefunden
Hallo Hansa...
der Filter setzt meines Wissens keine neue SQL ab... geht viel zu schnell die Filterung. :???: die Query wird geschlossen und wieder geöffnet... wieder alles neu ... :?: Wo liegt der Unterschied ? :gruebel: |
Re: Query... Feld nicht gefunden
Zitat:
|
Re: Query... Feld nicht gefunden
Hallo marabu...
...da haben wir es wieder, Variablenübergabe an Prozeduren. ...damit stehe ich noch auf Kriegsfuß :oops: wenn ich das richtig verstehe übergibst du 'SMatch.Text' mit 'ls' und 'vorgang' entspricht 'manuell' im Prinzip verändert das ja nichts am SQL Text und der Abfrage...oder :gruebel: die Konfiguration des Grids muß hinter der Abfrage positioniert sein, da sich die Spalten( Breiten, Überschriften ) je nach Abfrage ändern... es gibt ja noch QArtikelnummer, QStyleName... DisableControls / EnableControls ist nicht unbedingt notwendig, da die Query Closed ist. Danke für Deine Unterstützung... |
Re: Query... Feld nicht gefunden
Hallo Hansa...
im Prinzip hast du ja Recht, wenn man vorher weiß, nach was man oder ob man Filtern muß. Die Programmlogik ist folgende: grundsätzlich werden alle DS, welche 'manuell' eingetragen wurden und Artikel xy oder StyleName xy tragen geholt. in 90 % der Fälle sind in der Ergebnismenge die Felder LS leer. Nun kann es aber vorkommen, das der Artikel xy auch schon eine Lieferscheinnummer hat. Dieser wird auch mit angezeigt. Dieses dient in erster Linie zur Kontrolle. Soll dann die neue Lieferscheinnummer in die Datensätze ohne Lieferscheinnummer eingetragen werden muß die Ergebnismenge auf leeres LS feld 'gefiltert' werden. - man kann eine neue SQL absetzen oder lokal Filtern. Ich habe mich für die schnelle Filterung entschieden. Ich habe mir schon grundsätzliche Gedanken gemacht ! Die Programmlogik hat seinen Sinn. Im Prinzip funktioniert das ja auch. Bei den anderen Proceduren, wie z.B. QArtikelnummer, welche sich in der SQL Anweisung nur durch unterschiedliche Felder unterscheidet habe ich dieses Phänomen nicht. gefiltert, ungefiltert egal. nur beim 2. Aufruf von QLieferschein kommt dieser Fehler. |
Re: Query... Feld nicht gefunden
Hallo,
hast du gesehen, dass ich den Zustand von Query.Filtered zwischenspeichere? Ich bin mir nicht sicher ob das notwendig ist, würde es aber gefühlsmäßig so machen. Deine Fehlermeldung deutet für mich eindeutig darauf hin, dass das Feld LS nicht gefunden wird, weil es gar kein Bestandteil der aktuellen Query ist. Kann es sein, dass du irgendwo LS per Copy-And-Paste eingeführt hast? Kannst du die Abbruchtelle im Code genau lokalisieren? Ich würde an dieser Stelle eine Existentprüfung für LS einbauen. Bei der Konfiguration des Grids bleibe ich dabei: Sie ist besser außerhalb der Query aufgehoben. Sie lässt sich ja auch über die Query parametrisieren, so dass du anhand der Feldliste ein Name-Mapping und die Breiteneinstellung vornehmen könntest. Was das von Hansa so geschmähte Filtern angeht, so ist die client-seitige Filterung bei Paradox eine Tugend und keine Schande. Die Krücke LocalSQL bringt da einiges an Overhead mit, der sich durch einen Filter vermeiden lässt. Auch ADO unterstützt client-seitige Filter nicht ohne Grund. Freundliche Grüße |
Re: Query... Feld nicht gefunden
Hallo marabu...
der Fehler tritt auf bei Query.Open :gruebel: Die SQL Anweisung wird nicht beanstandet. Der Fehler sieht danach aus, als ob das Feld in der Tabelle nicht vorhanden wäre. :wiejetzt: Beim ersten Aufruf werden die Datensätze geholt wie gewünscht. Ich habe inzwischen die SQL Anweisung nach Deinem Muster optisch verbessert 'A.Artikelnummer statt Artikel.Artikelnummer' macht die Anweisung wesentlich kleiner aber der Fehler bleibt. [edit] Das parametrisieren über die SQL Anweisung hatte ich probiert. Ich hatte aber Probleme mit Spaltenüberschriften welche Leerzeichen enthalten und dann die 'klassische' Variante genommen. [edit/] [edit\ 1.Grammatik :-D 2. Das Feld LS ist fester Bestandteil der Tabelle Bewegung. [edit/] |
Re: Query... Feld nicht gefunden
Hallo alle...
Ich habe einiges ausprobiert...ohne Ergebnis. Langsam drängt sich mir der Verdacht auf, das das fehlende Feld LS nicht mit der Query zusammenhängt sondern mit der Filterung. Die Filterung erfolgt auf Feld LS. Wenn ich aber QLieferschein aufrufe ist in der Ergebnismenge das Feld LS nicht vorhanden. Vor der Abfrage setze ich aber die Query auf Filtered:= False
Delphi-Quellcode:
procedure LSuche;
begin if FLieferschein.SMatch.Text = '' then begin exit; end else begin ListeComboBox; Filter; FLieferschein.SMatch.Enabled:= False; FLieferschein.ComboBox1.Enabled:= False; FLieferschein.BitBtn2.Enabled:= False; FLieferschein.BitBtn1.Enabled:= False; FLieferschein.BitBtn3.Enabled:= False; Abfrage; GridOptionen; end; end;
Delphi-Quellcode:
procedure ListeComboBox;
begin with Flieferschein do begin ComboBox2.Enabled:= False; ComboBox2.Items.Clear; ComboBox2.Items.Add('alle'); case ComboBox1.ItemIndex of 0: begin // Artikelnummer ComboBox2.Items.Add('kein Lieferschein'); end; 1: begin // Style Name ComboBox2.Items.Add('kein Lieferschein'); end; 2: begin // Style Nummer ComboBox2.Items.Add('kein Lieferschein'); end; 3: begin // Lieferschein ComboBox2.Items.Add('keine Rechnung'); end; end; ComboBox2.ItemIndex:= 0; end; end;
Delphi-Quellcode:
...kann trotzdem der Filterstring irgendwie noch aktiv sein ? :gruebel:
procedure Filter;
begin with Flieferschein do begin case ComboBox2.ItemIndex of 0: begin Query1.Filtered:= False; end; 1: begin if ComboBox2.Text = 'kein Lieferschein' then begin Query1.Filter:= 'LS = '+ QuotedStr(''); Query1.Filtered:= True; SMatch.SetFocus; end else begin Query1.Filter:= 'RE = '+ QuotedStr(''); Query1.Filtered:= True; SMatch.SetFocus; end; end; end; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:47 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