Tabelle füllen mit externer Datei

Hallo,

ich habe folgendes Problem, ich möchte gerne in Access (2003) eine Tabelle mit einer Datei füllen, die extern auf einen anderen Server liegt und das mittels einen Button auf einem Formular als Beispiel:

Datei liegt auf v:\Daten\SDS.lst (evtl. muss man sie umbenennen in txt oder geht es auch so?)
Inhalt der Datei sind Daten in dem Format: „sds-time“ „user“ „Uhrzeit“ je Zeile.
Diese Daten sollen ausgelesen werden und in eine Tabelle eingefügt werden, nachdem ich auf dem Formular den Button z.B. Lesen drücke.

Ich weiß, diese Anfrage ist vielleicht schon tausend Mal gestellt worden, aber ich habe wirklich nichts gefunden und brauche diese Hilfe von Euch wirklich.

Danke & Gruss
Gerd

Hallo,

ich habe folgendes Problem, ich möchte gerne in Access (2003)
eine Tabelle mit einer Datei füllen, die extern auf einen
anderen Server liegt und das mittels einen Button auf einem
Formular als Beispiel:

als Erstes stellt sich mir die Frage, womit?
Access-VBA? VB6? Oder anders?

Datei liegt auf v:\Daten\SDS.lst (evtl. muss man sie
umbenennen in txt oder geht es auch so?)

Das geht so.

Inhalt der Datei sind Daten in dem Format: „sds-time“ „user“
„Uhrzeit“ je Zeile.

Da ist ein Trennzeichen dazwischen, nehme ich an. Welches?

Diese Daten sollen ausgelesen werden und in eine Tabelle
eingefügt werden, nachdem ich auf dem Formular den Button z.B.
Lesen drücke.

Wenn klar ist, womit Du das machen möchtest, ist das vermutlich kein größeres Problem. Mit VB6 wär’s ganz einfach.

Ach ja, ist die .mdb Passwort-geschützt? Wenn ja, hast Du das Passwort?

Gruß Rainer

Hallo,

ich habe folgendes Problem, ich möchte gerne in Access (2003)
eine Tabelle mit einer Datei füllen, die extern auf einen
anderen Server liegt und das mittels einen Button auf einem
Formular als Beispiel:

als Erstes stellt sich mir die Frage, womit?
Access-VBA? VB6? Oder anders?

****Access-VBA, also das was bei Access benutzt wird wenn man Strg G drückt.

Datei liegt auf v:\Daten\SDS.lst (evtl. muss man sie
umbenennen in txt oder geht es auch so?)

Das geht so.

***Super!

Inhalt der Datei sind Daten in dem Format: „sds-time“ „user“
„Uhrzeit“ je Zeile.

Da ist ein Trennzeichen dazwischen, nehme ich an. Welches?

***Als Trennzeichen ist ein blank.

Diese Daten sollen ausgelesen werden und in eine Tabelle
eingefügt werden, nachdem ich auf dem Formular den Button z.B.
Lesen drücke.

Wenn klar ist, womit Du das machen möchtest, ist das
vermutlich kein größeres Problem. Mit VB6 wär’s ganz einfach.

Ach ja, ist die .mdb Passwort-geschützt? Wenn ja, hast Du das
Passwort?

***MDB hat kein Passwort!

Gruß Rainer

Danke & Gruss Gerd

Hallo,

****Access-VBA, also das was bei Access benutzt wird wenn man
Strg G drückt.

Hmmm, erstes Problem, von Acces-VBA habe ich keine Ahnung. :frowning:
Der wesentliche Code ist aber in VB6 und VBA identisch, nur den etwas komplizierten Weg zur Datenbank brauchst Du nicht. Kannst Du denn mit Access-VBA etwas umgehen?

Da ist ein Trennzeichen dazwischen, nehme ich an. Welches?

***Als Trennzeichen ist ein blank.

Wenn sonst keine Blanks vorkommen ist das OK.

Ich poste Dir mal den Code, wie das in VB6 aussehen würde.

Private Sub Command1\_Click()
 Dim strSQL As String
 Dim objRS As ADODB.Recordset
 Dim objConnection As ADODB.Connection
 Dim ff As Integer, Datei As String, Zl As String
 Dim Fld(2) As String, i As Integer

 Dim DB As String
 DB = "DeinPfad\DeineDatenbank.mdb"
 strSQL = "SELECT \* FROM DeineTabelle;"
 Set objConnection = New ADODB.Connection

 With objConnection
 .CursorLocation = adUseClient
 .Mode = adModeShareDenyNone
 .Provider = "Microsoft.Jet.OLEDB.4.0"
 .ConnectionString = DB
 .Open
 End With

 Set objRS = New ADODB.Recordset
 With objRS
 Set .ActiveConnection = objConnection
 .CursorLocation = adUseClient
 .CursorType = adOpenStatic
 .LockType = adLockOptimistic
 .Source = strSQL
 Call .Open
 End With

 'Bis hier her war nur 'Datenbank öffnen'. 
 'Ab hier kommt der Code, der Dich interessiert, 
 'der die Daten aus dem File liest und in die .mdb schreibt.

 'objRS ist das Recordset.

 Datei = "v:\Daten\SDS.lst"
 ff = FreeFile
 Open ff For Input As #ff
 While Not EOF(ff)
 Line Input #ff, Zl
 Fld = Split(Zl, DeinTrennzeichen)
 objRS.AddNew
 For i = 0 To 2
 objRS(i) = Fld(i)
 Next
 objRS.Update
 Wend
 Close #ff

 objRS.Close
 objConnection.Close
End Sub

Hilft das?

Gruß Rainer

Erstmal DANKE für die schnelle Hilfe!

So weit läuft alles bis zur Zeile:
Fld = Split(Zl, DeinTrennzeichen)

dort kommt die Meldung: keine Zuweisung an Datenfeld möglich

Bei DeinTrennzeichen habe ich zuerst " " (für blank) eingetragen, oder mache ich dort etwas falsch?

Gruss
Gerd

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo,

So weit läuft alles bis zur Zeile:
Fld = Split(Zl, DeinTrennzeichen)

dort kommt die Meldung: keine Zuweisung an Datenfeld möglich

sorry, mein Felhler ich hab’s gerade entdeckt.

Du musst
Dim Fld()
schreiben, ohne die ‚2‘. ich habe mich geirrt.

Gruß Rainer

Beispiel:

Private Sub Command2\_Click()
 Dim Fld() As String, a As String, i As Integer
 a = "123.345 Testtext 11.07.2008"
 Fld = Split(a, " ")
 For i = 0 To 2
 Me.Print Fld(i)
 Next
End Sub

Kein Problem, bin ja froh wenn mir jemand hilft :smile:

Hier der Code, so wie er bei mir steht. Beim Klick auf dem Button kommt bei „call.open“ die Fehlermeldung: Syntaxfehler bei From Klausel

Private Sub Befehl0_Click()
Dim strSQL As String
Dim objRS As ADODB.Recordset
Dim objConnection As ADODB.Connection
Dim ff As Integer, Datei As String, Zl As String
Dim Fld() As String, i As Integer

Dim DB As String
DB = „c:\SDS.mdb“
strSQL = „SELECT * FROM sds-task;“
Set objConnection = New ADODB.Connection

With objConnection
.CursorLocation = adUseClient
.Mode = adModeShareDenyNone
.Provider = „Microsoft.Jet.OLEDB.4.0“
.ConnectionString = DB
.Open
End With

Set objRS = New ADODB.Recordset
With objRS
Set .ActiveConnection = objConnection
.CursorLocation = adUseClient
.CursorType = adOpenStatic
.LockType = adLockOptimistic
.Source = strSQL
Call .Open
End With

Datei = „sds-task.txt“
ff = FreeFile
Open ff For Input As #ff
While Not EOF(ff)
Line Input #ff, Zl
Fld = Split(Zl, " ")
objRS.AddNew
For i = 0 To 2
objRS(i) = Fld(i)
Next
objRS.Update
Wend
Close #ff

objRS.Close
objConnection.Close

End Sub

Gruss Gerd

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo,

Hier der Code, so wie er bei mir steht. Beim Klick auf dem
Button kommt bei „call.open“ die Fehlermeldung: Syntaxfehler
bei From Klausel

das ist VB6-Code. Ich hoffe, daß das Access-VBA nicht zu weit abweicht.

strSQL = „SELECT * FROM sds-task;“

Deine Tabelle heißt sds-task richtig?

OK, das können wir doch ganz einfach lösen, wir schreiben ab. *fg*

Starte Dein Access und erzeuge eine Abfrage von der Tabelle über alle Felder. In der Box, in der Du die Felder auswählen kannst, hast Du dafür einen Stern.

Dann lässt Du Dir diese Abfrage als SQL-String anzeigen (Klick in Ansicht - SQL) und kopierst einfach, was dort angezeigt wird.

Da sollte stehen: ‚SELECT * FROM TabellenName;‘ wenn Du nicht weitere Bediungungen angibst.

Wenn das noch nicht klappt, würde ich einfach mal das Semikolon am Ende weg lassen.

Gruß Rainer

Richtig, dort steht SELECT [Sds-task].*
FROM [Sds-task]; aber ich kann Dir jetzt gar nicht mehr folgen, wohin soll ich das kopieren???

Gruss Gerd

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Gerd,

Richtig, dort steht SELECT [Sds-task].*
FROM [Sds-task]; aber ich kann Dir jetzt gar nicht mehr
folgen, wohin soll ich das kopieren?

im Code steht doch die Zeile:

strSQL = „SELECT * FROM sds-task;“

Da steht Dein SQL-String.
Du hast jetzt herausgefunden, daß der so aussehen muss:

strSQL = „SELECT [Sds-task].* FROM [Sds-task];“

Dann wird Dein Access den SQL-String auch nehmen. Da gibt es leichte Unterschiede zwischen VB6, VBA, SQL …

Gruß Rainer

Perfekt! Es läuft nun durch bis:

Open ff For Input As #ff und dort kommt die Meldung „Datei nicht gefunden“

Sorry, ich weiß es zieht sich…

Gruss Gerd

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo,

das läuft so in Access-VBA? Das ist ja Klasse! Ich bin angenehm überrascht. :smile:

Open ff For Input As #ff und dort kommt die Meldung „Datei
nicht gefunden“

Da habe ich ja auch Blödsinn geschrieben. Ohne Möglichkeit zu testen passiert mir so etwas immer wieder. Da hätte stehen sollen:

Open Datei For Input As #ff

Sorry, ich weiß es zieht sich …

*gg* Den Unfug habe doch ich veranstaltet. :smile:
Schön, daß Du genug Geduld hast, die Fehler zu beseitigen.

Nun erwarte ich noch einen Fehler. :smile:
Wenn wir Pech haben, passen die Datentypen nicht.
Dann öffne Deine Tabelle im Entwurfsmodus, schreib die Datentypen auf und verrate sie mir. Das Datum könnte statt String auch Date/Time sein.

Gruß Rainer

Toll, wir sind wieder einen Schritt weiter!

Jetzt hängen wir bei objRS(i) = Fld(i)

Dort kommt die Meldung: Fehler bei einem aus mehreren Schritten bestehender Vorgang. Prüfen Sie die einzellnen Statuswerte.

Gruss Gerd

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Gerd,

Toll, wir sind wieder einen Schritt weiter!

*gg* mühsam ernährt sich das Eichhörnchen … :smile:

Jetzt hängen wir bei objRS(i) = Fld(i)

Dort kommt die Meldung: Fehler bei einem aus mehreren
Schritten bestehender Vorgang. Prüfen Sie die einzellnen
Statuswerte.

Die Fehlermeldung kenne ich nicht. Ich vermute aber daß die Datentypen nicht passen, Fehlermeldungen sind nicht immer Aussagekräftig.
Verrate mir mal die Datentypen der Tabelle, dann bauen wir mal geringfügig um.

Gruß Rainer

Ergänzung
Hi Gerd,

nur zur Sicherheit, die exakten Feldnamen der Tabelle wären auch sinnvoll.

Gruß Rainer

ES LEBT!!!

Die Feldgröße musste nur vergrößert werden!

Danke Dir für die tolle Unterstützung und lauf mir ja nicht weg, brauche Dich bestimmt am Montag noch mal :smile:

Schönes Wochenende und Nochmal DANKE!

Gerd

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi Gerd,

ES LEBT!!!

wunderbar! Freut mich! :smile:

Die Feldgröße musste nur vergrößert werden!

Danke Dir für die tolle Unterstützung und lauf mir ja nicht
weg, brauche Dich bestimmt am Montag noch mal :smile:

Ich lauf nicht weg, ich ‚wohne‘ ja hier. *gg*

Schönes Wochenende und Nochmal DANKE!

Dir auch ein schönes Wochenende!

Gruß Rainer

Guten Morgen, lieber Rainer!

Das kleine Prg. läuft perfekt, nur in meiner Tabelle sind alle Werte mit Anführungszeichen (wurden so von der Datei mit übernommen) und die müssen weg. Was ist eigentlich wenn ich Tabelle mit 3 verschiedenen Dateien füllen möchte und nicht nur mit der einen, muss ich deinen Code dann einfach noch 2 mal kopieren oder ändern wir nur eine Zeile der Programmierung?

Besteht die Möglichkeit noch über einen anderen Weg uzu kommunizieren?

Gruss Gerd

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Guten Morgen Gerd,

Das kleine Prg. läuft perfekt, nur in meiner Tabelle sind alle
Werte mit Anführungszeichen (wurden so von der Datei mit
übernommen) und die müssen weg.

Dann fügen wir eine kleine Änderung ein.
Hier …

 Datei = "v:\Daten\SDS.lst"
 ff = FreeFile
 Open ff For Input As #ff
 While Not EOF(ff)
 Line Input #ff, Zl
 Fld = Split(Zl, DeinTrennzeichen)
 objRS.AddNew
 For i = 0 To 2
 objRS(i) = Fld(i)
 Next
 objRS.Update
 Wend
 Close #ff

… haben wir die Daten und konnen das Anführungszeichen ersetzten. Ersetzen heißt ‚Replace‘.

 Datei = "v:\Daten\SDS.lst"
 ff = FreeFile
 Open ff For Input As #ff
 While Not EOF(ff)
 Line Input #ff, Zl
 Fld = Split(Zl, DeinTrennzeichen)
 objRS.AddNew
 For i = 0 To 2
 objRS(i) = Replace(Fld(i), Chr(34), "")
 Next
 objRS.Update
 Wend
 Close #ff

Was ist eigentlich wenn ich
Tabelle mit 3 verschiedenen Dateien füllen möchte und nicht
nur mit der einen, muss ich deinen Code dann einfach noch 2
mal kopieren

Das geht, ist aber nicht schön, langsam …

Du musst nur den Teil, der gerade hier steht kopieren. Besser ist es aber, das in eine Prozedur auszulagern.

oder ändern wir nur eine Zeile der Programmierung?

Ein wenig mehr als eine Zeile ist das schon. Wir ändern etwas am Prinzip, nutzen den modularen Aufbau.

Bevor ich mir alles zusammen suche, wieder alte Fehler einbaue … Poste doch mal den bisherigen Code, ich erweitere den dann.

Besteht die Möglichkeit noch über einen anderen Weg uzu
kommunizieren?

Klar, oben steht doch meine Mailadresse.
Was aber von allgemeinem Interesse sein könnte, steht im Forum besser. Wir machen das ja nicht nur für uns. Wenn wir fertig sind, kann das Jeder andere mit Google finden und verwenden.

Gruß Rainer

Der Code kann so nicht funktionieren, da ist ein Klammerzeichen zuviel, habe schon versucht die Klammer zu schließen, aber dann kommt eine Fehlermeldung:

objRS(i) = Replace(Fld(i), Chr(34), „“) -Dein Code-

Gruss
Gerd

Guten Morgen Gerd,

Das kleine Prg. läuft perfekt, nur in meiner Tabelle sind alle
Werte mit Anführungszeichen (wurden so von der Datei mit
übernommen) und die müssen weg.

Dann fügen wir eine kleine Änderung ein.
Hier …

Datei = „v:\Daten\SDS.lst“
ff = FreeFile
Open ff For Input As #ff
While Not EOF(ff)
Line Input #ff, Zl
Fld = Split(Zl, DeinTrennzeichen)
objRS.AddNew
For i = 0 To 2
objRS(i) = Fld(i)
Next
objRS.Update
Wend
Close #ff

haben wir die Daten und konnen das Anführungszeichen
ersetzten. Ersetzen heißt ‚Replace‘.

Datei = „v:\Daten\SDS.lst“
ff = FreeFile
Open ff For Input As #ff
While Not EOF(ff)
Line Input #ff, Zl
Fld = Split(Zl, DeinTrennzeichen)
objRS.AddNew
For i = 0 To 2
objRS(i) = Replace(Fld(i), Chr(34), „“)
Next
objRS.Update
Wend
Close #ff

Was ist eigentlich wenn ich
Tabelle mit 3 verschiedenen Dateien füllen möchte und nicht
nur mit der einen, muss ich deinen Code dann einfach noch 2
mal kopieren

Das geht, ist aber nicht schön, langsam …

Du musst nur den teil, der gerade hier steht kopieren, besser
ist es aber, da in eine Prozedur auszulagern.

oder ändern wir nur eine Zeile der Programmierung?

Ein wenig mehr als eine Zeile ist das schon, wir ändern etwas
am Prinzip, nutzen den modularen Aufbau.

Bevor ich mir alles zusammensuche, wieder alte Fehler einbaue
… poste doch mal den bisherigen Code, ich erweitere den
dann.

Besteht die Möglichkeit noch über einen anderen Weg uzu
kommunizieren?

Klar, oben steht doch meine Mailadresse.
Was aber von allgemeinem Interesse sein könnte, steht im Forum
besser. Wir machen das ja nicht nur für uns, wenn wir fertig
sind, kann das Jerder andere mit Google finden und verwenden.

Gruß Rainer