Supportnet / Forum / Datenbanken
DBase-Datei in eine ACCESS-Datenbank umwandeln
Frage
Ich möchte eine DBase-Datei in eine ACCESS-Datenbank umwandeln. Dafür habe ich folgende Funktion:
Private Function Copy_dBaseToAccess(ByVal FilenameDBase As _
String, ByVal FilenameAccess As String, _
Optional ByVal DeleteIfExists As Boolean = True) As Boolean
Dim dbDBase As Database
Dim TabDBase As Recordset
Dim dbAccess As Database
Dim TabAccess As Recordset
Dim PathDBase As String
Dim NameDBase As String
Dim TabDef As New TableDef
Dim Feld As New Field
Dim I As Integer
Dim Dummy As String
PathDBase = Left$(FilenameDBase, _
InStrRev(FilenameDBase, "") - 1)
NameDBase = Mid$(FilenameDBase, Len(PathDBase) + 2)
NameDBase = Left$(NameDBase, InStrRev(NameDBase, ".") - 1)
dBASE-Datei öffnen
Set dbDBase = Workspaces(0).OpenDatabase(PathDBase, _
False, False, "dBASE IV;")
Set TabDBase = dbDBase.OpenRecordset(NameDBase)
ACCESS-Datei erstellen
If Dir(FilenameAccess) = "" Then
Set dbAccess = Workspaces(0).CreateDatabase(FilenameAccess, _
dbLangGeneral, dbEncrypt)
Else
Set dbAccess = Workspaces(0).OpenDatabase(FilenameAccess)
End If
Prüfen, ob Tabelle vorhanden
On Local Error Resume Next
Dummy = dbAccess.TableDefs(NameDBase).Name
If Err.Number = 0 Then
Tabelle existiert bereits !!!
If DeleteIfExists Then
dbAccess.TableDefs.Delete NameDBase
Else
Copy_dBaseToAccess = False
GoTo Copy_dBase_End
End If
End If
Err.Number = 0
On Local Error GoTo Copy_dBase_Error
Tabellen-Definition übertragen
TabDef.Name = NameDBase
For I = 0 To TabDBase.Fields.Count - 1
With TabDBase.Fields(I)
Feld.Name = .Name
Feld.Type = .Type
Feld.Size = .Size
Feld.AllowZeroLength = .AllowZeroLength
Feld.Attributes = .Attributes
Feld.DefaultValue = .DefaultValue
Feld.Required = .Required
End With
TabDef.Fields.Append Feld
Set Feld = Nothing
Next I
dbAccess.TableDefs.Append TabDef
Access-Tabelle öffnen und Datensätze übertragen
Set TabAccess = dbAccess.OpenRecordset(NameDBase)
While Not TabDBase.EOF
TabAccess.AddNew
For I = 0 To TabDBase.Fields.Count - 1
TabAccess(I) = TabDBase(I)
Next I
TabAccess.Update
TabDBase.MoveNext
Wend
Copy_dBaseToAccess = True
Copy_dBase_End:
On Local Error Resume Next
TabDBase.Close: dbDBase.Close
TabAccess.Close: dbAccess.Close
On Local Error GoTo 0
Exit Function
Copy_dBase_Error:
MsgBox "Fehler !!!" & vbCrLf & Err.Number & _
" " & Err.Description, 16, "FEHLER..."
Copy_dBaseToAccess = False
Resume Copy_dBase_End
End Function
--------------------------------------
Beim kompilieren bekomme ich immer die Meldung
Unzulässige Verwendung des Schlüsselworts New
der Debugger markiert dabei die Zeile
Dim Feld As New Field
kann jemand da weiterhelfen?
Antwort 1 von PotzBlitz
Hallo DixiDix,
lass das Schlüsselwort "New" bei TableDef und Field weg, das ist bei diesen Objekten nicht zulässig. Wenn du ein Tabellen-Objekt anlegen willst, dann benutze die CreateTableDef-Methode des Database-Objekts. An das neue TableDef-Objekt hängst du dann mit der Append-Methode des TableDef-Objekts die neuen Felder an, die du vorher mit der CreateField-Methode des TableDef-Objekts erzeugt hast. Wie du siehst ein recht aufwändiges Unterfangen (was aber zum Glück in der Access-Hilfe ausreichend beschrieben wird).
Wäre es da nicht einfacher, die dBASE-Datenbank einfach nur zum importieren? Siehe Menü Datei | Externe Daten | Importieren | Im Importieren-Dialog den Dateityp "dBASE IV" auswählen
Das war es dann auch eigentlich schon. Wenn du aber bei der VB-Variante bleiben willst, dann könntest du den Import auch mit der TransferDatabase-Methode des DoCmd-Objekts machen, das wäre dann dasselbe in grün.
Gruss
PotzBlitz
lass das Schlüsselwort "New" bei TableDef und Field weg, das ist bei diesen Objekten nicht zulässig. Wenn du ein Tabellen-Objekt anlegen willst, dann benutze die CreateTableDef-Methode des Database-Objekts. An das neue TableDef-Objekt hängst du dann mit der Append-Methode des TableDef-Objekts die neuen Felder an, die du vorher mit der CreateField-Methode des TableDef-Objekts erzeugt hast. Wie du siehst ein recht aufwändiges Unterfangen (was aber zum Glück in der Access-Hilfe ausreichend beschrieben wird).
Wäre es da nicht einfacher, die dBASE-Datenbank einfach nur zum importieren? Siehe Menü Datei | Externe Daten | Importieren | Im Importieren-Dialog den Dateityp "dBASE IV" auswählen
Das war es dann auch eigentlich schon. Wenn du aber bei der VB-Variante bleiben willst, dann könntest du den Import auch mit der TransferDatabase-Methode des DoCmd-Objekts machen, das wäre dann dasselbe in grün.
Gruss
PotzBlitz
Antwort 2 von DixiDix
Natürlich wäre es einfacher mit der Importfunktion, aber mit dBase und FoxPro 2.6 Files hab ich Probleme damit. Ich suche eine Möglichkeit vor allem FoxPro Files zu verknüpfen. Mit Access 97 ging das noch ohne Probleme. Hab mir eben gedacht, dass ich von vorherein dem aus dem Weg gehe und mir auf diesem Weg die Daten zugänglich mache. Falls es natürlich einen einfacheren und vorallem schnelleren Weg gibt, wäre ich damit auch zufrieden. Solange eine Verknüpfung nicht möglich ist, bin ich auf andere Lösungen angewiesen. Diese lässt sich, sofern sie funktioniert, ganz leicht automatisieren.
Antwort 3 von 14071
Hallo DixiDix,
ist ja merkwürdig, ich hatte Probleme unter Access97 auf FoxPro-Dateien zuzugreifen. Seit der 2000-er Version geht´s jetzt. Habe mir eine Datenbankquelle erstellt und den FoxPro-Container eingebunden, damit entfällt auch das ständige herauslösen gebundener Tabellen.
Gruß
Jürgen
ist ja merkwürdig, ich hatte Probleme unter Access97 auf FoxPro-Dateien zuzugreifen. Seit der 2000-er Version geht´s jetzt. Habe mir eine Datenbankquelle erstellt und den FoxPro-Container eingebunden, damit entfällt auch das ständige herauslösen gebundener Tabellen.
Gruß
Jürgen
Antwort 4 von DixiDix
Ging sicherlich über ODBC. Kannst Du mir erklären, wie Du das angestellt hast?
Antwort 5 von 14071
na klar - Datei-ExterneDaten-Tabellen verknüpfen- bei Dateityp ODBC-Databases auswählen - Reiter Computerdatenquelle.
Neue auswählen und wichig - "Microsoft Visual-FoxPro Treiber" auswählen. Gibt auch nur Visual-FoxPro (Wenn das MS nicht vorne dran stand ging´s nicht.)
Dann beim Pfad zur Datenquelle angeben, wo der Datenbankcontainer liegt - und fertig. Dann kannst Du beim nächsten Aufruf der externen Tabellen über Odbc die Tabellen direkt einbinden. (jedenfalls funzt es hier - hoffe bei Dir auch)
Gruß
Jürgen
Neue auswählen und wichig - "Microsoft Visual-FoxPro Treiber" auswählen. Gibt auch nur Visual-FoxPro (Wenn das MS nicht vorne dran stand ging´s nicht.)
Dann beim Pfad zur Datenquelle angeben, wo der Datenbankcontainer liegt - und fertig. Dann kannst Du beim nächsten Aufruf der externen Tabellen über Odbc die Tabellen direkt einbinden. (jedenfalls funzt es hier - hoffe bei Dir auch)
Gruß
Jürgen

