Mini Script um Access 2007 import funktion zu öfffnen, evt. mit bestimmten Vorgaben
Liebe Admins,
ich habe eine kleines Script zusammengebastelt mit einer super Hilfe eines netten Users, welches am Schluss ein VB-Script aufrufen sollte, welches folgendes machen sollte
1.) schau nach ob Access 2007 schon läuft
2.) wenn nicht dann öffne es mit einer bestimmten Datenbank
3.) öffne mir den Import Assistenten (Funktion) um txt Dateien in eine Tabelle einzufügen
4.) Der Clou an der Sache wäre wenn ich die Datei die zu importieren ist (imp.txt) schon irgendwie vorgeben kann
Ich denke mal dass dies nicht mehr wie ein 3 Zeiler wird....Kann und mag mir bitte jemand helfen...?
Grüße,
Roberth
ich habe eine kleines Script zusammengebastelt mit einer super Hilfe eines netten Users, welches am Schluss ein VB-Script aufrufen sollte, welches folgendes machen sollte
1.) schau nach ob Access 2007 schon läuft
2.) wenn nicht dann öffne es mit einer bestimmten Datenbank
3.) öffne mir den Import Assistenten (Funktion) um txt Dateien in eine Tabelle einzufügen
4.) Der Clou an der Sache wäre wenn ich die Datei die zu importieren ist (imp.txt) schon irgendwie vorgeben kann
Ich denke mal dass dies nicht mehr wie ein 3 Zeiler wird....Kann und mag mir bitte jemand helfen...?
Grüße,
Roberth
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 114396
Url: https://administrator.de/contentid/114396
Ausgedruckt am: 22.11.2024 um 13:11 Uhr
38 Kommentare
Neuester Kommentar
Hallo Roberth,
wenn deine Datensätze in der Textdatei immer die gleiche Struktur aufweisen ließe sich der Import ggfs auch komplett automatisieren.
Wenn das Beispiel aus deinem anderen Thread
Heißt vier Felder mit Semikolon getrennt fehlen noch Datenbank-,Tabellen- Feldnamen und Typen.
Gruß
LotPings
wenn deine Datensätze in der Textdatei immer die gleiche Struktur aufweisen ließe sich der Import ggfs auch komplett automatisieren.
Wenn das Beispiel aus deinem anderen Thread
A1234567;098234;oifdfdwd;000s04
Gruß
LotPings
Google existiert übrigens immer noch, mit ein paar geeigneten Suchbegriffen findet man fast alles.
Zum Beispiel hier dieses
Das weiter anpassen (zu lassen sollte möglich sein.
Gruß
LotPings
Zum Beispiel hier dieses
Set DataFile = CreateObject("Scripting.FileSystemObject").OpenTextFile("IMP.txt",1)
Set objConnection = CreateObject("ADODB.Connection")
objConnection.Open "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=database.mdb"
Set objRecordset = CreateObject("ADODB.Recordset")
objRecordset.CursorLocation = 3
objRecordset.Open "SELECT * FROM TableName" , objConnection, 3, 3
Do Until DataFile.AtEndOfStream
arrTemp = Split(DataFile.ReadLine, ";")
If IsArray(arrTemp) Then
objRecordset.AddNew
objRecordset("FieldName1") = arrTemp(0)
objRecordset("FieldName2") = arrTemp(1)
objRecordset("FieldName3") = arrTemp(2)
objRecordset.Update
Else
'Only one item of data is on this line
End If
Loop
DataFile.Close
objConnection.Close
Set DataFile = Nothing
Set objRecordset = Nothing
Set objConnection = Nothing
Das weiter anpassen (zu lassen sollte möglich sein.
Gruß
LotPings
Hallo roberth,
ich möchte LotPings ein wenig unterstützen und versuchen Deine Fragen zu beantworten
Eine wichtige Frage vorweg: Hat Deine Datenbank einen Passwortschutz. Dann wird's etwas komplizierter?
Alternativ können die Dateinamen auch per Batch als Argumente übergeben werden, ansonsten:
Zum Import:
Anstatt "IMP.txt" muss hier der komplette Dateipfad der Datei stehen z.B: "D:\Test\Import.Txt"
Zur Datenbank:
Anstatt Source=database.mdb" muss hier der komplette Dateipfad der Datei stehen z.B: ...Source=D:\Test\Datenbank.Mdb;"
Zu TableName und 3,3:
Anstatt TableName muss hier der Tabellenname der Tabelle in der Datenbank stehen z.B: ...FROM Tabelle1"...
Die 3,3 stehen für den Datenbankzugriff = adModeReadWrite, adUseClient
Zu Loop, IF, Feldnamen etc.:
1. Die Anweisung Do bis Loop bildet eine Schleife und wird für jede Textzeile in Import.Txt einmal ausgeführt.
2. If prüft ob die aktuelle Zeile Trennzeichen (;) enthält, wenn ja werden die Einträge in die Datenbank geschrieben
wenn Nein (Else) wird hier bestimmt was passieren soll, wenn eine Zeile keine Trennzeichen beinhaltet.
Entweder Else entfernen, was soviel heisst wie Zeile ignorieren oder mit Else eine Fehlermeldung ausgeben.
Aktuell steht hier nur ein Kommentar mit (') gekennzeichnet
3. Mit Feldnamen sind nicht die Einträge in der Import.Txt gemeint, sondern die Feldnamen, wie sie in der
Datenbank-Tabelle stehen. (B0704600;;;;;Abgenommen;22.04.2009;xy) sind Einträge und keine Feldnamen.
Hier wäre es nicht schlecht zu wissen ob die Anzahl der Einträge in Import.Txt und die Anzahl der Felder
in der Datenbank und auch die Reihenfolge übereinstimmt?
Hoffe, ich hab alles so erklärt, dass Du es auch verstehst.
Gruß Dieter
ich möchte LotPings ein wenig unterstützen und versuchen Deine Fragen zu beantworten
Eine wichtige Frage vorweg: Hat Deine Datenbank einen Passwortschutz. Dann wird's etwas komplizierter?
Alternativ können die Dateinamen auch per Batch als Argumente übergeben werden, ansonsten:
Zum Import:
Set DataFile = CreateObject("Scripting.FileSystemObject").OpenTextFile("IMP.txt",1)
Anstatt "IMP.txt" muss hier der komplette Dateipfad der Datei stehen z.B: "D:\Test\Import.Txt"
Zur Datenbank:
objConnection.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=database.mdb;"
Anstatt Source=database.mdb" muss hier der komplette Dateipfad der Datei stehen z.B: ...Source=D:\Test\Datenbank.Mdb;"
Zu TableName und 3,3:
objRecordset.Open "SELECT * FROM TableName" , objConnection, 3, 3
Anstatt TableName muss hier der Tabellenname der Tabelle in der Datenbank stehen z.B: ...FROM Tabelle1"...
Die 3,3 stehen für den Datenbankzugriff = adModeReadWrite, adUseClient
Zu Loop, IF, Feldnamen etc.:
Do Until DataFile.AtEndOfStream
arrTemp = Split(DataFile.ReadLine, ";")
If IsArray(arrTemp) Then
objRecordset.AddNew
objRecordset("FieldName1") = arrTemp(0)
objRecordset("FieldName2") = arrTemp(1)
objRecordset("FieldName3") = arrTemp(2)
objRecordset.Update
Else
'Only one item of data is on this line
End If
Loop
1. Die Anweisung Do bis Loop bildet eine Schleife und wird für jede Textzeile in Import.Txt einmal ausgeführt.
2. If prüft ob die aktuelle Zeile Trennzeichen (;) enthält, wenn ja werden die Einträge in die Datenbank geschrieben
wenn Nein (Else) wird hier bestimmt was passieren soll, wenn eine Zeile keine Trennzeichen beinhaltet.
Entweder Else entfernen, was soviel heisst wie Zeile ignorieren oder mit Else eine Fehlermeldung ausgeben.
Aktuell steht hier nur ein Kommentar mit (') gekennzeichnet
3. Mit Feldnamen sind nicht die Einträge in der Import.Txt gemeint, sondern die Feldnamen, wie sie in der
Datenbank-Tabelle stehen. (B0704600;;;;;Abgenommen;22.04.2009;xy) sind Einträge und keine Feldnamen.
Hier wäre es nicht schlecht zu wissen ob die Anzahl der Einträge in Import.Txt und die Anzahl der Felder
in der Datenbank und auch die Reihenfolge übereinstimmt?
Hoffe, ich hab alles so erklärt, dass Du es auch verstehst.
Gruß Dieter
Zitat von @roberth:
so, erstaml wieder danke und dann versuche ichs mal zu verstehn was da
angepasst werden muss:
-> muss das script jetzt in dem verzeichnis liegen wo auch die imp.txt ist ?
Neinso, erstaml wieder danke und dann versuche ichs mal zu verstehn was da
angepasst werden muss:
> Set DataFile =
> CreateObject("Scripting.FileSystemObject").OpenTextFile("IMP.txt",1)
>
>
-> muss das script jetzt in dem verzeichnis liegen wo auch die imp.txt ist ?
oder kann/muss ich mit pfaden arneiten ?
JAwenn ja mit mappings oder unc ?
AFAIK Beidesselbe frage: datasource= DATENBANKNAME aber muss das script jetzt in dem verzeichnis liegen wo auch die imp.txt ist ?
oder > kann/muss ich mit pfaden arneiten ? wenn ja mit mappings oder unc ?
> objRecordset.Open "SELECT * FROM TableName" ,
> objConnection, 3, 3
>
TableName = Tabellename ist klar, aber was heist die 3,3 dahinter ?
Do Until DataFile.AtEndOfStream
arrTemp = Split(DataFile.ReadLine, ";")
If IsArray(arrTemp) Then
objRecordset.AddNew
objRecordset("FieldName1") = arrTemp(0)
objRecordset("FieldName2") = arrTemp(1)
objRecordset("FieldName3") = arrTemp(2)
objRecordset.Update
meine interpretation:
gehe zum letzten datensatz
dann arrTemp = Split(DataFile.ReadLine, ";") da schreibt er sich ein temporäres array , dass er durch ; trennt
Richtig hatte ich schon so angepasst.dann muss ich in
objRecordset("FieldName1") = arrTemp(0)
alle meine Spaltennamen eintragen
also bei meinem bsp wären das dann
(B0704600;;;;;Abgenommen;22.04.2009;xy) 7 Fieldnames (spaltennamen)
Wobei aber der Text Fieldname1 durch deinen ersten Spaltenamen auszutauschen ist, die folgenden Zeilen entsprechend.objRecordset("FieldName1") = arrTemp(0)
alle meine Spaltennamen eintragen
also bei meinem bsp wären das dann
(B0704600;;;;;Abgenommen;22.04.2009;xy) 7 Fieldnames (spaltennamen)
Else
'Only one item of data is on this line
End If
Loop
dass versteh ich nicht ganz, also wann kommt das else end if und der loop ?
Das Else bezieht sich auf das vorherige IF (Dafür sind doch die Einrückungen da, um das zu verdeutlichen)'Only one item of data is on this line
End If
Loop
dass versteh ich nicht ganz, also wann kommt das else end if und der loop ?
Sprich wenn es ein Array IST werden die Spalten zugeordnet. Wenn es keine Array ist wird die Zeile ignoriert.
der rest ist klar, er löscht die variablen....
Stimmt das so ?
Siehe meine Anmerkungen, also nicht ganz Stimmt das so ?
Gruß
LotPings
Hallo roberth,
hast Du den Pfad der Datenbank-Datei richtig angegeben? Die Datei muss natürlich schon existieren.
Aber ich vermute mal, selbst wenn ja, das es so trotzdem noch nicht funktioniert, weil wahrscheinlich
noch UserID, User-Passwort etc beim Schreib-Modus mit angegeben werden müssen, was dann
leider auch noch den Zugriff auf die Sicherheitsdatei "%System32%\System.Mdw" erfordert.
Falls der Dateipfad stimmt und es trotzdem noch nicht funktioniert, muss Du etwas Geduld haben.
Muss es selbst erst testen.
Gruß Dieter
hast Du den Pfad der Datenbank-Datei richtig angegeben? Die Datei muss natürlich schon existieren.
Aber ich vermute mal, selbst wenn ja, das es so trotzdem noch nicht funktioniert, weil wahrscheinlich
noch UserID, User-Passwort etc beim Schreib-Modus mit angegeben werden müssen, was dann
leider auch noch den Zugriff auf die Sicherheitsdatei "%System32%\System.Mdw" erfordert.
Falls der Dateipfad stimmt und es trotzdem noch nicht funktioniert, muss Du etwas Geduld haben.
Muss es selbst erst testen.
Gruß Dieter
Hallo roberth,
das Script müsste nach entsprechender Anpassung funktionieren:
1. Dateipfade anpassen
2. Tabellenname anpassen (From Tabelle1)
Gruß Dieter
[edit]Korrekturen vorgenommen am24.04.2009 um 14:27[/edit]
das Script müsste nach entsprechender Anpassung funktionieren:
1. Dateipfade anpassen
2. Tabellenname anpassen (From Tabelle1)
Option Explicit
Const mdbPath = "F:\Test\Script05\Test.mdb"
Const csvPath = "F:\Test\Script05\Test.csv"
Const mdbSql = "SELECT * FROM [Tabelle1]"
Const adModeRead = 1
Const adModeReadWrite = 3
Const adUseClient = 3
Const adOpenKeyset = 1
Const adLockOptimistic = 3
Const adPromptComplete = 2
Dim mdbCon, mdbRec, Data, Fso, csvFile, i
'Main Begin
Set Fso = CreateObject("Scripting.FileSystemObject")
Set csvFile = Fso.OpenTextFile(csvPath)
Call OpenRecordset
Do Until csvFile.AtEndOfStream
Data = Split(csvFile.ReadLine, ";")
If UBound(Data) = 7 Then
With mdbRec
.AddNew
For i = 0 To 6: .Fields(i) = Data(i): Next
.Update
End With
End If
Loop
mdbRec.Close: mdbCon.Close: csvFile.Close
WScript.Quit
'Main End
Private Sub OpenRecordset()
Set mdbCon = CreateObject("ADODB.Connection")
Set mdbRec = CreateObject("ADODB.Recordset")
With mdbCon
.Mode = adModeReadWrite
.CursorLocation = adUseClient
.Provider = "Microsoft.ACE.OLEDB.12.0" 'Access 2007
.Properties("Data Source") = mdbPath
.Properties("Persist Security Info") = False
.Open
End With
With mdbRec
.ActiveConnection = mdbCon
.CursorLocation = adUseClient
.CursorType = adOpenKeyset
.LockType = adLockOptimistic
.Source = mdbSql
.Open
End With
End Sub
Gruß Dieter
[edit]Korrekturen vorgenommen am24.04.2009 um 14:27[/edit]
Hallo roberth,
dies ist im Prinzip genau identisch.
Der Unterschied ist nur, dass das was zwischen <With> und <With End> steht mit einem "." abgekürzt werden kann.
D.h. wenn da steht <With objRecordset> und dann <Punkt..AddNew> ist das dasselbe wie <objRecordset.AddNew>.
Die Feldnamen der Tabelle kann man auch über Item(0), Item(1) usw. ansprechen. D.h. Item(0) = Feld "Sytemnummer"
Item(1) = "Feld2" usw. Dadurch kann ich mit einem Zähler in der For-Schleife alle Felder mit der Zahl 1 - 7 ansprechen.
Ubound repräsentiert die Zahl bzw. Anzahl der Spalten im Import-Array.
Sofern Du keine Fehlermeldung ausgeben möchtest, falls sich in der Import.txt eine Leerzeile befindet, dann kann das Else entfallen.
Gruß Dieter
dies ist im Prinzip genau identisch.
Der Unterschied ist nur, dass das was zwischen <With> und <With End> steht mit einem "." abgekürzt werden kann.
D.h. wenn da steht <With objRecordset> und dann <Punkt..AddNew> ist das dasselbe wie <objRecordset.AddNew>.
Die Feldnamen der Tabelle kann man auch über Item(0), Item(1) usw. ansprechen. D.h. Item(0) = Feld "Sytemnummer"
Item(1) = "Feld2" usw. Dadurch kann ich mit einem Zähler in der For-Schleife alle Felder mit der Zahl 1 - 7 ansprechen.
Ubound repräsentiert die Zahl bzw. Anzahl der Spalten im Import-Array.
Sofern Du keine Fehlermeldung ausgeben möchtest, falls sich in der Import.txt eine Leerzeile befindet, dann kann das Else entfallen.
Gruß Dieter
Hallo roberth,
nö, hier soll Deine Pfadangabe für die Import-Datei stehen. Das war mein Pfad zum Testen
Habe ich doch am Anfang vom Code darauf hingewiesen?
Gruß Dieter
PS. Ob die Datei jetzt *.Csv oder *.Txt heisst, ist völlig wurscht. Wicht ist nur das die Einträge mit dem Trennzeichen ";" getrennt sind.
nö, hier soll Deine Pfadangabe für die Import-Datei stehen. Das war mein Pfad zum Testen
Habe ich doch am Anfang vom Code darauf hingewiesen?
Gruß Dieter
PS. Ob die Datei jetzt *.Csv oder *.Txt heisst, ist völlig wurscht. Wicht ist nur das die Einträge mit dem Trennzeichen ";" getrennt sind.
Hallo roberth,
habe im Code Zeile 26 eine Kleinigkeit übersehen und bereits geändert.
muss heissen:
Gruß Dieter
habe im Code Zeile 26 eine Kleinigkeit übersehen und bereits geändert.
If UBound(Data) Then
muss heissen:
If UBound(Data) = 6 Then
Gruß Dieter
Hallo roberth,
hast Du den Pfad der Datenbank-Datei in <mdbPath= "?"> richtig angegeben (*.mdb)?
hast Du den Tabellennamen angepasst <From ?(Tabellenname)>
Gruß Dieter
hast Du den Pfad der Datenbank-Datei in <mdbPath= "?"> richtig angegeben (*.mdb)?
hast Du den Tabellennamen angepasst <From ?(Tabellenname)>
Gruß Dieter
Hallo roberth,
also, trifft das zu: Die Datenbank-Datei *.Mdb existiert bereits und beinhaltet eine Tabelle mit 7 Feldern?
Den Tabellennamen hast Du in <FROM ?> anstelle von Tabelle1 hingeschrieben?
Gruß Dieter
also, trifft das zu: Die Datenbank-Datei *.Mdb existiert bereits und beinhaltet eine Tabelle mit 7 Feldern?
Den Tabellennamen hast Du in <FROM ?> anstelle von Tabelle1 hingeschrieben?
Gruß Dieter
Hallo roberth,
Der Fehler liegt vermutlich doch am Datenbank-Format.
Habe noch Access 2002 und Access 2007 hat wahrscheinlich ein anderes Format.
Dazu muss ich wissen, welche Dateierweiterung Deine Datenbank-Datei hat, *.mdb oder anders?
Wenn *.accdb, dann muss folgendes in Zeile 50 geändert werden:
<.Provider = "Microsoft.Jet.OLEDB.4.0"> in <.Provider="Microsoft.ACE.OLEDB.12.0">
Gruß Dieter
Der Fehler liegt vermutlich doch am Datenbank-Format.
Habe noch Access 2002 und Access 2007 hat wahrscheinlich ein anderes Format.
Dazu muss ich wissen, welche Dateierweiterung Deine Datenbank-Datei hat, *.mdb oder anders?
Wenn *.accdb, dann muss folgendes in Zeile 50 geändert werden:
<.Provider = "Microsoft.Jet.OLEDB.4.0"> in <.Provider="Microsoft.ACE.OLEDB.12.0">
Gruß Dieter
Hallo roberth,
da bin ich im Moment leider auch überfragt.
Ist Dir vielleicht eine Stringquote am String-Ende abhanden gekommen "SELECT ......"
Hast Du stehen "SELECT * FROM Tabellenname" ?
Dann Versuch mal: "SELECT * FROM [Tabellenname]"
Gruß Dieter
da bin ich im Moment leider auch überfragt.
Ist Dir vielleicht eine Stringquote am String-Ende abhanden gekommen "SELECT ......"
Hast Du stehen "SELECT * FROM Tabellenname" ?
Dann Versuch mal: "SELECT * FROM [Tabellenname]"
Gruß Dieter
Versuch mit [ ]: Const mdbSql = "SELECT * FROM [txt-import]"
Gruß Dieter
Gruß Dieter
Hallo roberth,
nö, natürlich nicht. Nur das, was hinter dem Doppelpunkt steht
Steht in der Import.Txt was drinne und enthält eine Zeile 6 oder 7 Trennzeichen ";" ?
Gruß Dieter
nö, natürlich nicht. Nur das, was hinter dem Doppelpunkt steht
Steht in der Import.Txt was drinne und enthält eine Zeile 6 oder 7 Trennzeichen ";" ?
Gruß Dieter
Hallo roberth,
das wäre schon mal richtig, aber es muss noch etwas geändert werden:
Und:
Leerzeichen sind egal, sofern Leerzeilen keine 7 Trennzeichen beinhalten.
Gruß Dieter
das wäre schon mal richtig, aber es muss noch etwas geändert werden:
If UBound(Data) = 7 Then
Und:
For i = 0 To 6: .Fields(i) = Data(i): Next
Leerzeichen sind egal, sofern Leerzeilen keine 7 Trennzeichen beinhalten.
Gruß Dieter
Hallo roberth,
eine 6 bitte. Es sind ja nur 7 Felder und in der For-Schleife wird ab 0 gezählt. D.h. von 0-6 ergibt 7 Felder.
Die For-Zeile genauso, wie angegeben.
Gruß Dieter
eine 6 bitte. Es sind ja nur 7 Felder und in der For-Schleife wird ab 0 gezählt. D.h. von 0-6 ergibt 7 Felder.
Die For-Zeile genauso, wie angegeben.
Gruß Dieter
Hallo roberth,
gottseidank
Schreibe bzw. kopiere diese Code-Zeile und füge sie im Script (siehe weiter oben) in Zeile 36 ein.
Dadurch wird die Datei auf 0 gesetzt und gespeichert..
Gruß Dieter
PS. Um eventuellen Missverständnissen vorzubeugen: Die Zeile 35 und 37 bleiben genauso wie sie sind.
gottseidank
Schreibe bzw. kopiere diese Code-Zeile und füge sie im Script (siehe weiter oben) in Zeile 36 ein.
Dadurch wird die Datei auf 0 gesetzt und gespeichert..
Set csvFile = Fso.CreateTextFile(csvPath): csvFile.Close
Gruß Dieter
PS. Um eventuellen Missverständnissen vorzubeugen: Die Zeile 35 und 37 bleiben genauso wie sie sind.
Hallo roberth,
Access schreibt auch mehrfach gleiche Datensätze in die Datenbank.
Und sollte ein Fehler auftreten, wird der Dateinhalt nicht gelöscht, da sich die Anweisungen - Datei auf 0 setzen - am Code-Ende befinden und nicht mehr ausgeführt werden.
Gruß Dieter
Access schreibt auch mehrfach gleiche Datensätze in die Datenbank.
Und sollte ein Fehler auftreten, wird der Dateinhalt nicht gelöscht, da sich die Anweisungen - Datei auf 0 setzen - am Code-Ende befinden und nicht mehr ausgeführt werden.
Gruß Dieter