AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Query... Feld nicht gefunden
Thema durchsuchen
Ansicht
Themen-Optionen

Query... Feld nicht gefunden

Ein Thema von haentschman · begonnen am 7. Okt 2007 · letzter Beitrag vom 7. Okt 2007
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#1

Query... Feld nicht gefunden

  Alt 7. Okt 2007, 13:24
Datenbank: noch Paradox :-( • Zugriff über: BDE
Hallo alle..

Ich bräuchte mal jemanden, der mir die Brille putzt...

Der Ablauf:

1. Eingabe in Edit Feld... SMatch
2. Start Abfrage
Delphi-Quellcode:
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;
3.SQL (Auszug...)
Delphi-Quellcode:
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;
4. Anzeige im DBGrid


....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:
// Filter
procedure TFLieferschein.ComboBox2Change(Sender: TObject);
begin
  case ComboBox2.ItemIndex of
    0: begin
         Query1.Filtered:= False;
       end;
    1: begin
         if ComboBox2.Text = 'kein Lieferscheinthen
           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;
...funktioniert auch.

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 ?

Danke im Voraus...
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#2

Re: Query... Feld nicht gefunden

  Alt 7. Okt 2007, 13:43
Egal wie, aber hier liegt der Hund begraben :

Zitat von haentschman:
.. ( könnte man auch über SQL erledigen, fand ich aber die schnellere Lösung bei max 20 Datensätzen in der Ergebnismenge)
Was glaubst du denn macht der "Filter" ? Der setzt sich ein neues SQL Statement zusammen. Vielleicht auch nicht. Dürfte zumindest bei wenigen Datensätzen irrelevant sein.
Gruß
Hansa
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#3

Re: Query... Feld nicht gefunden

  Alt 7. Okt 2007, 13:54
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:
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;
Getippt und nicht getestet.

Grüße vom marabu
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#4

Re: Query... Feld nicht gefunden

  Alt 7. Okt 2007, 13:54
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 ?
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#5

Re: Query... Feld nicht gefunden

  Alt 7. Okt 2007, 14:10
Zitat von haentschman:
..Wo liegt der Unterschied ?
IMHO eindeutig bei der Programmlogik. "Filtere" (kanns nicht mehr hören, macht keiner ) doch vorher. Setze den SQL-String doch gleich direkt richtig zusammen. Oder frage eben die DB neu ab. Wir haben hier getestet und es stellte sich heraus, dass die visuelle Darstellung in Windows mind. um den Faktor 10 langsamer ist, als die DB-Abfrage. Welchen Sinn macht es da noch, keine erneute, korrigierte Abfrage an die DB zu machen ?
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#6

Re: Query... Feld nicht gefunden

  Alt 7. Okt 2007, 14:18
Hallo marabu...

...da haben wir es wieder, Variablenübergabe an Prozeduren. ...damit stehe ich noch auf Kriegsfuß

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

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...
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#7

Re: Query... Feld nicht gefunden

  Alt 7. Okt 2007, 14:41
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.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#8

Re: Query... Feld nicht gefunden

  Alt 7. Okt 2007, 14:44
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
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#9

Re: Query... Feld nicht gefunden

  Alt 7. Okt 2007, 15:00
Hallo marabu...

der Fehler tritt auf bei Query.Open

Die SQL Anweisung wird nicht beanstandet.

Der Fehler sieht danach aus, als ob das Feld in der Tabelle nicht vorhanden wäre.

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
2. Das Feld LS ist fester Bestandteil der Tabelle Bewegung.
[edit/]
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#10

Re: Query... Feld nicht gefunden

  Alt 7. Okt 2007, 19:07
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:
procedure Filter;
begin
  with Flieferschein do
    begin
      case ComboBox2.ItemIndex of
        0: begin
             Query1.Filtered:= False;
           end;
        1: begin
             if ComboBox2.Text = 'kein Lieferscheinthen
               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;
...kann trotzdem der Filterstring irgendwie noch aktiv sein ?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:50 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