Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi ADOTable, Excel über Jet, Filter funktioniert nicht mit NULL (https://www.delphipraxis.net/49190-adotable-excel-ueber-jet-filter-funktioniert-nicht-mit-null.html)

jensw_2000 6. Jul 2005 19:43

Datenbank: Excel • Zugriff über: ADO über Jet

ADOTable, Excel über Jet, Filter funktioniert nicht mit NULL
 
Ich habe ein Problem beim Setzen des Dataset Filters, wenn ich eine Spalte mit NULL filtern muss.

Generell funktioniert der Filter, nur werden alle Datensätze herausgefiltert, bei denen die Filterprüfung auf NULL trifft.

Generell arbeite ich so mit der Excel Datei

Delphi-Quellcode:
     
      // Opendialog öffnen und AdoConnection verbinden

      conn_import.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;' +
        'Provider=Microsoft.Jet.OLEDB.4.0; ' +
        'Data Source=' + Opendialog.Filename + ';' +
        'Extended Properties=Excel 8.0; ' +
        'Persist Security Info=False';
      conn_Import.open;
     
      // Eine Combobox (xlsWorksheets mit den Arbeitsbereichsseiten der Excel Arbeitsmappe füllen

      xlsWorksheets.Enabled := conn_Import.Connected;
      if conn_Import.Connected then
      begin
        conn_Import.GetTableNames(xlsWorksheets.Items, true);
      end;

      // Wenn es mindestens eine Arbeitsbereichsseite gibt, die mit einem Filter versehen und Öffnen

      if xlsWorksheets.items.count =0 then
      begin
        Showmessage('In der gewählten Arbeitsmappe sind keine Arbeitsbereichsseiten verfügbar');
        exit;
      end
      else begin
         xlsWorksheets.itemindex:=0;
         With tbl_Import do
         begin
           close;
           Connection:=conn_Import;
           tablename:=xlsWorksheets.items[0];
           filter:='Name <>'''' AND gesperrt ='''' ';
           try
             open
           except
             on e:exception do
               showmessage(e.message);
           end;
           try
             filtered:=true;
           except
              on e:exception do
              Showmessage('Filter konnte nicht gesetzt werden'+#13#10+e.message);
           end;
         end;
      end;

Soweit so gut.

Wenn ich jedoch eine XLS Datei habe, in der das Feld "gesperrt" nicht vorhanden ist, und ich dieses hinzufüge,
fallen alle Datensätze durch den Filter.

Ich habe die AdoTable zur Fehlersuche nach dem Öffnen in einer "While not eof" Schleife durchlaufen und
mir im DebugMode die Werte von "Gesperrt" anzeigen lassen.
Ergebnis: ... nicht "" sondern NULL :shock:

Das Spaltenformat von "gesperrt" ist in der Excel Tabelle "Text".


Problem:

Ich habe jetzt folgende Filter vergeblich getestet :

filter:='Name <>'''' AND gesperrt ='''' ';
filter:='Name <>'''' AND gesperrt <>'''+'ja'+''' ';
filter:='Name <>'''' AND (gesperrt ='''' OR gesperrt IS NULL)';

Nichts. :?
Variante 1 und 2 bleiben die Datensätze mit NULL im "gesperrt" Feld im Filter hängen und Variante 3 gibt eine Fehlermeldung "Inkompatible Typen" beim Setzen von Filtered :=true aus..

Ich bin verzweifelt ... :roll:

Hilfeeeee

marabu 6. Jul 2005 20:45

Re: ADOTable, Excel über Jet, Filter funktioniert nicht mit
 
Du hast leider ein echtes Problem. Im Abschnitt Filter property der ADO 2.8 API Reference steht unter anderem:

Zitat:

Zitat von Microsoft
The criteria string is made up of clauses in the form FieldName-Operator-Value ... Value cannot be null.

Mitfühlende Grüße vom marabu

jensw_2000 6. Jul 2005 20:51

Re: ADOTable, Excel über Jet, Filter funktioniert nicht mit
 
Problem gelöst.
Habe es rausgefunden ... :nerd:

Die Filter-Bedingungen
Delphi-Quellcode:
'gesterrt = NULL'
bzw.
'gesperrt <> NULL'
funktionieren.

Um demnächst etwas flexibler arbeiten zu können, habe ich jetzt aber eine AdoQuery anstatt der AdoTable verwendet.
SQL ist einfach besser.

Für alle die diesen Thread mal lesen und auch besser gleich zur AdoQuery greifen...
In dem SQL Statement muss der Arbeitsbereichsseitenname (tolles Wort :mrgreen: ) in eckigen Klammern stehen, da dieser ein "$" enthält und SQL das sonst nicht versteht ...
Delphi-Quellcode:
    tbl_Import.SQL.Text:='SELECT * FROM ['+xlsWorksheets.items[xlsWorksheets.itemindex]+ ']'+#13#10+' '+
                         'WHERE NAME <>'''' AND NAME IS NOT NULL AND '+#13#10+' '+
                         '     (Gesperrt = '''' OR Gesperrt IS NULL)';
Trotzdem danke für Eure Mühe ...

Schöne Grüße,
Jens

// edit: ein paar Schreibfehler korrigiert


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