hapo-mf
Goto Top

DBF-Datenbankabfrage per VBA in Excel

Excel-2003

Hallo,

ich habe mich zum ersten Mal an eine Datenbankabfrage gewagt. Da ich nur abfragen und auf keinen Fall etwas in die Datenbank reinschreiben will, nutze ich Query. Hierzu habe ich den folgenden Code:
Private Sub CommandButton1_Click()
     Range("BF1:BJ65536").Clear  
     With ActiveSheet.QueryTables.Add(Connection:=Array(Array( _
        "ODBC;DSN=dBASE-Dateien;DefaultDir=C:\;DriverId=533;FIL=dBase 5.0;MaxBufferSize=204" _  
           ), Array("8;PageTimeout=5;")), Destination:=Range("BF1"))  
        .CommandText = Array( _
           "SELECT ABPOS.ART_NR, ABPOS.SART_NR, ABPOS.MG_BES, ABPOS.TERMIN, ABPOS.AUSLIEFNR" & Chr(   _  
     13) & "" & Chr(10) & "FROM {oj `F:\STAND94`\ABPOS.DBF ABPOS LEFT OUTER JOIN `F:\STAND94`\ABKOPF. _  
     DBF ABKOPF ON ABPOS.AB_NR = ABKOPF.AB_NR}" & Chr(13) & "" & Chr(10) & "WH" _  
           , "ERE (ABKOPF.DEB_NR Like '1100%') AND (ABPOS.TERMIN Like '" & Format(CDate(Date), "yy")  _  
     & "%') AND (ABPOS.MG_GEL Is Null) AND (ABPOS.AUSLIEFNR Is Not Null)")  
        .Name = "Abfrage von dBASE-Dateien"  
        .FieldNames = False
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = False
        .RefreshOnFileOpen = False
        .BackgroundQuery = False
        .RefreshStyle = xlOverwriteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = False
        .RefreshPeriod = 0
        .PreserveColumnInfo = False
        .Refresh BackgroundQuery:=False
     End With
     Call DieseArbeitsmappe.StarteAuswahlBox 'Hier beginnen die weiteren Auswertungen  
     End Sub
Das funktioniert so auch schon sehr gut, aber: Es werden ALLE Datensätze entsprechend der Abfrage importiert, leider auch die, die in der Datenbank als gelöscht gekennzeichnet sind. Kann ich das Importieren gelöschter Datensätze verhindern?
Bin für jede Hilfe dankbar!

[Edit] Codeformatiert, damit es vielleicht eine/r lesen mag [/Code]

Content-Key: 177588

Url: https://administrator.de/contentid/177588

Printed on: April 25, 2024 at 06:04 o'clock

Member: Biber
Biber Dec 12, 2011 at 16:03:28 (UTC)
Goto Top
Moin HAPO-MF,

meines Wissens nach wird die dBase-Einstellung SET DELETED OFF zum Überlesen der (logisch) gelöschten bzw. der als gelöscht markierten Sätze von keinem der in freier Wildbahn befindlichen Treiber erkannt.

Ist bei deinem Treiber (DriverID 533) so, war aber auch so bei dBase IV (DriverID 277?) und dBaseIII (+).

Falls du diese Wahrheit (sorry, ich bin ja nur der Bote) an dich heranlässt, dann bleiben folgende vertretbare Workarounds
  • Wenn du noch ein dBase im Betrieb hast, dann mach endlich ein PACK und dann hast du keine logisch gelöschten Sätze mehr. face-wink
  • oder lies diese Dbase-Trümmer mit einem FoxPro-Treiber -> der kann putzigerweise dBase lesen UND die DELETED-Sätze erkennen

--> alles andere ist witzlos, du könntest die Daten natürlich nach Access, Excel,.... ziemlich jedem Format "importieren" jeweils mit der Applikation Access, Excel,....usw.
Aber egal wer es importiert, die DELETED-Sätze werden entweder mit übernommen (also nicht erkannt als gelöscht) oder aber, falls zufällig "der erste Importsatz" eine Löschmarkierung hat, dann werden ganze 0 Datensätze übernommen.

Der dritte (unvertretbare) Workaround ist -> lies diese dBase-Daten ohne Treiber und ohne ODBC, mit einem byteweise-arbeitenden Schnipsel.
Alle dBase-Formate sind voll durchdokumentiert und es sind relatv harmlose Flatfiles (mit Header und danach fester Zeilenlänge).
Wenn die Daten wichtig sind, dann suchmaschine danach, ansonsten vergiss es.

Falls du (du hast ja in mehreren Foren crossgepostet) anderswo eine "echte" Lösung findest, bitte stell sie auch bei uns ab.

Grüße
Biber
Member: HAPO-MF
HAPO-MF Dec 14, 2011 at 15:32:19 (UTC)
Goto Top
Hallo Biber,

vielen Dank für Deine ausführliche Antwort. Ich war kurz davor, Deine "Wahrheit" als mein Schicksal zu akzeptieren, bin dann aber auf die "echte" und vor allem einfache Lösung gestossen! Für alle, die es interessiert:

<Start> <Systemsteuerung> <Verwaltung> <Datenquellen (ODBC)>

Auf der Registerkarte "Benutzer-DSN" sollten alle installierten Datenbanktreiber aufgelistet sein. In meinem Falle:
- Name = "dBASE-Dateien"
- Treiber = "Microsoft dBase Driver (*.dbf)

Diesen Treiber anwählen und dann rechts auf "Konfigurieren" klicken. In dem neuen Fenster rechts unten auf "Optionen>>" klicken und das Häkchen bei "Gelöschte Zeilen anzeigen" entfernen.

GESCHAFFT!!! Excel importiert NICHT mehr die gelöschten Datensätze!!!

PS: Die Lösung poste ich nur hier...
Member: Biber
Biber Dec 14, 2011 at 16:00:50 (UTC)
Goto Top
Moin HAPO-MF,

danke auch für deine Antwort.

Bin in der Tat überrascht, dass es da jetzt doch etwas "unkompliziertes" geben könnte.

Beim postwendenden Versuch, das an meiner neuen (und deshalb relativ ungepimpten) Windows7-Büchse auszuprobieren, kam allerdings sofort eine Meldung des "Microsoft ODBC-Administrators" beim Anfassen des dBASE-Treibers.

"Die Setup-Routinen für den Microsoft Access dBASE Driver (*.dbf, *.ndx, *.mdx) ODBC-Treiber konnten nicht gefunden werden. Installieren Sie den Treiber erneut."

Aber ich denke, das ist ein (für Redmonder PraktikantInnen) relativ normaler Bug, der alle Benutzer-ODBC-Treiber betrifft, die ohne vorheriges Anschauen mit Admin-Rechten benutzt werden sollen. Stümper, damische, amerikanische. face-sad

Wenn ich bei Gelegenheit mal wieder mit Admin-Rechten unterwegs bin, probiere ich es noch mal.
[Nachtrag] Die Fehlermeldung geht nach dem nächsten OK noch weiter, hab ich grad gemerkt.


Fehler bei ConfigDSN, ConfigDriver oder ConfigTranslator

Fehler gefunden.
Der angegebene DSN weist eine nicht übereinstimmende Architektur von Treiber und Anwendung auf.


Nein, liebe Redmonder.
Das weist eher eine fehlende Passgenauigkeit von Anforderungen und Voraussetzungen auf, ihr Dödel.

Ich hau mir jezz' auch einen Glühwein in'n Kopp.
[/Nachtrag]
[Nachtrag2 am 17.12.2011]
Unter Vista/Office2003 funktioniert es in der Tat wie oben beschrieben.
Unter Win7 komme ich es (auch mit Admin-Rechten) nicht hin.
Habe es allerdings auch nicht weiter verfolgt, da ich keinen eigenen Leidensdruck zum Einlesen von DBF-Dateien habe.
[/Nachtrag2 am 17.12.2011]

Grüße
Biber
Member: HAPO-MF
HAPO-MF Dec 14, 2011 at 16:11:21 (UTC)
Goto Top
Zitat von @Biber:
Ich hau mir jezz' auch einen Glühwein in'n Kopp.

In diesem Sinne: Schönen Feierabend!