AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi ADOTable, Excel über Jet, Filter funktioniert nicht mit NULL
Thema durchsuchen
Ansicht
Themen-Optionen

ADOTable, Excel über Jet, Filter funktioniert nicht mit NULL

Ein Thema von jensw_2000 · begonnen am 6. Jul 2005 · letzter Beitrag vom 6. Jul 2005
Antwort Antwort
jensw_2000
(Gast)

n/a Beiträge
 
#1

ADOTable, Excel über Jet, Filter funktioniert nicht mit NULL

  Alt 6. Jul 2005, 19:43
Datenbank: Excel • Zugriff über: ADO über Jet
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

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 ...

Hilfeeeee
  Mit Zitat antworten Zitat
marabu

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

Re: ADOTable, Excel über Jet, Filter funktioniert nicht mit

  Alt 6. Jul 2005, 20:45
Du hast leider ein echtes Problem. Im Abschnitt Filter property der ADO 2.8 API Reference steht unter anderem:

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
  Mit Zitat antworten Zitat
jensw_2000
(Gast)

n/a Beiträge
 
#3

Re: ADOTable, Excel über Jet, Filter funktioniert nicht mit

  Alt 6. Jul 2005, 20:51
Problem gelöst.
Habe es rausgefunden ...

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 ) 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
  Mit Zitat antworten Zitat
Antwort Antwort


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 15:17 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