# Access - .dat-Datei einlesen und in ein Array schreiben



## friedemannhw (11. Februar 2010)

Hallo zusammen

ich benötige bitte Eure Hilfe!
Ich muss eine .dat-Datei in Access einlesen und die damit gewonnenen Daten in unterschiedliche Tabellen aufteilen.
Hab leider  nur Grundwissen was Access betrifft! :-(
Die Daten haben folgende Struktur:

380|10|100|SDA44000100801|20070116|1127|DPAG-EDICC|5007734370|
380|10|200|1|6909103191|50077343700150|20070110||Bis zum 20.01.2007 ohne Abzug|20070102|20070110|EUR|
380|10|210|DPEED GMBH & CO. OHG|NL V EXPRESS DEUTSCHLAND|||RUNGEDAMM||HAMBURG|21035||DE||4073465440|4073465449||DE813312787|DE|37010050|235506|Postbank|51222 Köln|||
380|10|220|Testkunde||||Bburgallee 50||Trier|54294|Hamburg|DE||040/85560-0|0651-490||DE801182049||||||||
380|10|300|1||512-513|||20070102|100510315|EUROPACK national BIS 31,5 KG|||||||80|ST|0.000|0.000|0.000|B|251.20||C1|19.00|||0.00||251.20||

Ich möchte also zu allererst die komplette Datei (kann bis zu 40000 Zeilen enthalten) in ein Array einlesen, aber schon dort scheitere ich... 

Wo liegt in meinem Code der Hund begraben? (Habe grad erst angefangen zu schreiben, also ist es noch nicht so umfangreich. Es geht mir hauptsächlich erst einmal um das Befüllen des Arrays "RDaten")


```
Option Compare Database

Function Einlesen()
Dim strsql As String
Dim Rechnungsnummer As Long
Rechnungsnummer = 0
Dim filecontents As String
Dim RDaten(33)
Dim Zeile, Feld
Open "C:\temp\ElektronischeRechnung.Dat" For Input As #1
Do Until EOF(1)
Input #1, filecontents
'Debug.Print filecontents
RDaten = Split(filecontents, "|")
Debug.Print RDaten

Select Case RDaten(1)

    Case 380
    
        Select Case RDaten(3)
            Case 100
            Case 200
            
                If Rechnungsnummer <> RDaten(5) Then
                Rechnungsnummer = RDaten(5)
                End If
            
            strsql = "Insert into Rechnungen(Rechnungsnummer,Kundennummer,Rechnungsdatum) select " & Rechnungsnummer & ", " & RDaten(6) & ", '" & RDaten(7) & "'"
            Debug.Print strsql
            
            Case 210
            Case 220
            Case 230
            Case 300
            Case 301
            Case 310
            Case 330
            Case 340
            Case 400
            Case 800
            Case 890
        End Select
            
    Case 381
    
        Select Case RDaten(3)
            Case 100
            Case 200
            Case 210
            Case 220
            Case 230
            Case 300
            Case 301
            Case 310
            Case 330
            Case 340
            Case 400
            Case 800
            Case 890
        End Select

End Select
End If
Loop
Close #1
End Function
```

Vielen Dank im Voraus für Eure Hilfe

friedemannhw


----------



## Yaslaw (11. Februar 2010)

Was hast du denn für einen Fehlermeldung?
Was egben dir deine zwei debug.prints aus?

```
Debug.Print filecontents
Debug.Print RDaten
```


----------



## friedemannhw (11. Februar 2010)

An der Stelle 


```
RDaten = Split .......
```

erhalte ich den Fehler:

Fehler beim Kompilieren:
Keine Zuweisung an Datenfeld möglich!

Aufgrund dieses Fehlers erhalte ich gar keine Ausgabe durch 
	
	
	



```
Debug.Print...
```


----------



## Yaslaw (11. Februar 2010)

RDaten ist falsch definiert. Du musst RDaten als String-Array ohne Dimension angeben

Ich hab das mal schnell ausprobiert

```
Public Sub testArray()
    Dim RDaten() As String
    RDaten = Split("a|b|c", "|")
    Debug.Print RDaten(1)
End Sub
```


----------



## friedemannhw (11. Februar 2010)

Hallo yaslaw

ich hab meinen Code nun mal auf das Nötigste beschränkt und die Änderung eingepflegt:


```
Option Compare Database

Function Einlesen()
Dim strsql As String
Dim Rechnungsnummer As Long
Rechnungsnummer = 0
Dim filecontents As String
Dim RDaten() As String
Open "C:\temp\ElektronischeRechnung.Dat" For Input As #1
Do Until EOF(1)
Input #1, filecontents
'Debug.Print filecontents
RDaten = Split(filecontents, "|")
'Debug.Print RDaten

Loop
Close #1
End Function
```

Nun erhalte ich folgenden Fehler:

Fehler beim kompilieren:
Variable oder Prozedur anstelle eines Moduls erwartet.

Leider wirft er mir den Fehler nur beim Ausführen des Codes und nicht beim kompilieren raus.
Ich kann also nicht mit Bestimmtheit sagen, an welcher Stelle der Fehler nun auftritt, aber ich schätze mal,
dass mit RDaten noch etwas im Argen liegt!?


----------



## Yaslaw (11. Februar 2010)

Debugen.... Dann weisst du wo der Fehler passiert


----------



## friedemannhw (11. Februar 2010)

OK, das funktioniert soweit erstmal.
Vielen Dank

Nun hab ich aber noch eine Frage:

Wie muss ich den o.g. Code anpassen, damit ich ein vordimensioniertes Array erhalte?
Also z.B. 33 Spalten und beliebig viele Zeilen!

Mit 
	
	
	



```
Dim RDaten(33) As String
```
 funktioniert es nicht


----------



## Yaslaw (11. Februar 2010)

Mit Split kannst du keinen vordefinierten Array füllen.
Die einzige möglichkeit die ich gerade sehe, ist im kopieren...


```
Public Sub testArray()
    Dim tempFields() As String
    Dim RDaten(3) As String
    Dim i
    
    tempFields = Split("a|b|c", "|")
    
    'IsEmptyArray ist eine Funktion aus meiner ArrayFunctons-Sammlung
    'http://wiki.yaslaw.info/wikka/VbaArrayFunctions
    If IsEmptyArray(tempFields) Then
        'Leere Ziele
    Else
        For i = 0 To UBound(RDaten)
            If UBound(tempFields) >= i Then
                RDaten(i) = tempFields(i)
            End If
        Next i
    
    End If
    
    Debug.Print RDaten(3)

End Sub
```


----------

