[Erledigt] MS-Access Fehler beim Filtern

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
Flenser
Beiträge: 24
Registriert: Di 28. Okt 2014, 12:49

[Erledigt] MS-Access Fehler beim Filtern

Beitrag von Flenser »

Wenn ich mit

Code: Alles auswählen

 
    SQLQuery1.SQL.Text:=UTF8ToCP1252('SELECT * FROM T_Verlauf where ([Prüfnrr] like :Pruefnr) and ([Vorgang] like :Vorgang)');
 
    Datasource1.dataset:=SQLQuery1;
    try SQLQuery1.params.ParamByName('Pruefnr').AsString:='%'+UTF8ToWinCP(Pruef_Nr_Label.caption)+'%';  ;except;end;
    try SQLQuery1.params.ParamByName('Vorgang').AsString:='%'+UTF8ToWinCP('Intern')+'%'                 ;except;end;
 
    ODBCConnection1.Open;
    If ODBCConnection1.Connected then SQLQuery1.open;
    DataSource1.DataSet.Last;                       
 


eine Tabelle filtern möchte, der Wert 'Intern' aber nicht existiert, bekomme folgende Fehlermeldung (keine IDE-Fehlermeldung im Quelltext):

Could not vonvert variant of type(Null) into type(String)

Try Except fängt den Fehler nicht ab und da die SQLQuery noch nicht auf ist, habe ich keine Idee, wie man am Besten die Nicht-Existens eines Filterswertes abfangen kann.

Hat jemand vielleicht eine Idee?
Zuletzt geändert von Flenser am Di 18. Jun 2019, 09:56, insgesamt 1-mal geändert.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: MS-Access Fehler beim Filtern

Beitrag von af0815 »

a) Umlaute im SQL sind etwas ganz böses. Tabellennamen mit Umlauten ist die Steigerung von böse.
b) Deine try/except Blöcke schlucken Fehler und geben keinen Hinweis darüber.

Bau zuerst die Parameter auf und dann erst die Query. Wenn ein Parameter fehlt, so lasse den entsprechenden Zweig einfach weg.

BTW: manchmal muss man mit bereits erstellten Datenbanken (mehr schlecht als recht) leben.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: MS-Access Fehler beim Filtern

Beitrag von wp_xyz »

Wo tritt denn der Fehler auf? In dem gezeigten Code beim Definieren der SQL-Parameter, oder erst beim Open?

Dass in der SQL-Anweisung "[Prüfnrr]" mit zwei "r" geschreiben ist, ist ein Schreibfehler beim Posten, oder?

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: MS-Access Fehler beim Filtern

Beitrag von af0815 »

Ich gehe aufgrund der Fehlermeldung davon aus, das die Parameter (sind variants) nicht initialisiert sind. Damit sind sie variant of type(Null) und die können halt nicht in type(string) übergeführt werden. CreateParam ( https://www.freepascal.org/docs-html/cu ... param.html ) fehlt wahrscheinlich.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: MS-Access Fehler beim Filtern

Beitrag von wp_xyz »

Das beigefügte Projekt habe ich in meinem Forums-Ordner gefunden, basierend wahrscheinlich sogar auf einer Frage von dir, und das führt die SELECT-Abfrage mit einem Parameter problemlos aus (Button3Click) (auch mit Umlauten im Tabellen- und Feldnamen).
Dateianhänge
Access_Query_Umlaute.zip
(6.01 KiB) 129-mal heruntergeladen

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: MS-Access Fehler beim Filtern

Beitrag von af0815 »

Da wird aber der Parameter explzit erzeugt

Code: Alles auswählen

    if SQLQuery1.Params.Count = 0 then
      with TParam(SQLQuery1.Params.Add) do begin
        Name := 'PruefName';
        DataType := ftString;
        ParamType := ptInput;
      end;
    SQLQuery1.ParamByName('PruefName').AsString := '%' + UTF8ToCP1252(Edit1.Text) + '%';
    SQLQuery1.SQL.Text := UTF8ToCP1252('SELECT * FROM Prüfung WHERE PrüfName LIKE :PruefName');
 

Ist tricky mit dem with :-)

Nochmals, die Umlaute sind ABSOLUT zu vermeiden. Das kann funktionieren, muss aber nicht unbedingt !! Und dann suchst du dir einen Wolf wenn die SW nach einem Update oder anderen Rechner nicht so will (z.B. PC in Öst., Ungarn, China, ....). Ich bin da ein gebranntes Kind. Habe da ein paar kreative Lösungen von anderen ändern dürfen.

([Sarkastisch on] Ich leite meistens kreativ von Kretin ab - siehe https://de.wiktionary.org/wiki/Kretin Bedeutung 2 bevorzugt [Sarkastisch off])
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Flenser
Beiträge: 24
Registriert: Di 28. Okt 2014, 12:49

Re: MS-Access Fehler beim Filtern

Beitrag von Flenser »

Vielen Dank für die Hilfe. Wie es scheint, wurde der Fehler nicht an der Stelle "produziert". Ich habe den Code der Unit noch einmal komplett neu/umgeschrieben,
weil ich ihn selbst nicht mehr verstanden habe. Teilweise wurde Prozeduren wiederholt (auch mit DB-Zugriff) ausgeführt, weil ich unbeabsichtigt Ereignisse*) erzeugt habe,
die eben diese Prozeduren aufgerufen haben.

Jetzt tritt der Fehler bei dort unverändertem Quelltext nicht mehr auf und es wird wie gewünscht gefiltert.

Das mit den Umlauten kann ich mir leider nicht aussuchen, habe das allerdings im im Griff.

*) Ist wahrscheinlich "lazy-writing", aber ich greife gern .text und .caption- Werte aus dem Formular ab, statt sie in Variablen zu speichern. Wenn ich dann z.B. eine Combobox
durch Quelltext ändere, werden eben Ereignisse ausgelöst... Ich arbeite daran...

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1430
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: MS-Access Fehler beim Filtern

Beitrag von fliegermichl »

Flenser hat geschrieben:Wenn ich dann z.B. eine Combobox
durch Quelltext ändere, werden eben Ereignisse ausgelöst... Ich arbeite daran...


Ich definiere mir in solchen Fällen eine Variable fUpdating. Im EventHandler prüfe ich dann:

Code: Alles auswählen

 
procedure TForm1.OnIrgendwas(Sender : TObject);
begin
 if fUpdating then exit;
 fUpdating := True;
 try
  Mach_irgendwas_was_den_Event_wieder_triggert();
 finally
  fUpdating := False;
 end;
end;
 


Dann passiert nichts mehr auch wenn der Event mehrfach getriggert wird.

Antworten