Readdy Write  
0,00 €
Your View Money
Views: Count
Self 20% 0
Your Content 60% 0

Users by Links 0
u1*(Content+Views) 10% 0
Follow-Follower 0
s2*(Income) 5% 0

Count
Followers 0
Login Register as User

Access: Import Dateien mit verschiedenen Spalten Reihenfolgen

10.03.2019 (­čĹü1541)

Kann man mit Access dynamische Dateien einlesen anhand der Kopfzeilen?

Antwort : nur via Excel

Ja:

Mit Excel als Daten-Austausch-Dateien ist die Position der Spalte egal,

Nein:

Mit .csv Dateien mit semikolon ; als Trennzeichen muss leider immer genau die Position in der sogenannten Importfilter-Specification definiert werden

Mit .txt FixedImport ist sogar die Zeichenl├Ąnge bestimmt

Beim Import mit MS Access kann man folgende Import-Formate einstellen

TransferType:
acImportDelim          ->mit Semikolon festgelegt

acImportFixed          ->Feste Anzahl Zeichen pro Feld also ID=10 Zeichen, dann Name=25 Zeichen

acImportHTML          ->als HTML

 

Import mit ; Semikolon getrenneten CSV Dateien

DoCmd.TransferText acImportDelim, "my_Import_specification _UTF8_" & sTyp, sImport_Tablename, sDatei_mitPfad, True

 

 

Hier wird jede Spalte genau definiert und muss in einer definierten Reihenfolge vorhanden sein.

'=========================< #region: Import >=========================

Private Function fl_Import_to_Buffer(ByVal sDateiname As StringByVal sTyp As StringByVal intIDImport As LongAs Long

    '----< Funktion : Datei importieren >----

    addStep "< Import : Start >"

    'default returnwert

    fl_Import_to_Buffer = 0

 

    '< Kontrolle >

    If sDateiname Like "" Then

        MsgBox "es ist keine Importdatei angegeben", vbCritical, "fl_Import_to_Buffer()"

        Exit Function

    End If

    '</ Kontrolle >

 

    '< init >

    Dim sDatei_mitPfad As String

    sDatei_mitPfad = tbxPfad_Ordner & sDateiname

    '</ init >

 

 

    addStep "import: Datei=" & sDateiname

 

    '< Kopf ermitteln >

    addLog "ermittle Berichtskopf"

    Dim rMaster As Recordset

    Set rMaster = CurrentDb.OpenRecordset("SELECT TOP 1 * FROM tbl_" & sTyp & "_MasterFiles WHERE IDImport_" & sTyp & "_File=" & intIDImport)

    If Not rMaster.EOF Then

        addStep "├╝berschreiben"

        rMaster.Edit

    Else

        addStep "neu"

        rMaster.AddNew

    End If

    rMaster!dtImport = Now

    rMaster!Filename = sDateiname

    rMaster!FileLong = sDatei_mitPfad

    rMaster.Update

    rMaster.MoveLast

    ┬░IDImport = rMaster("IDImport_" & sTyp & "_File")

    rMaster.Close

    '< Kopf ermitteln >

 

    '< reset >

    Dim sImport_Tablename As String

    sImport_Tablename = "_Import_" & sTyp

 

    addLog "reset Importpuffer"

    CurrentDb.Execute "DELETE * FROM " & sImport_Tablename

    '</ reset >

 

    On Error Resume Next

    '----< Import csv Datei mit Umlauten >----

    DoCmd.TransferText acImportDelim, "my_Import_specification _UTF8_" & sTyp, sImport_Tablename, sDatei_mitPfad, True

    '----</ Import csv Datei mit Umlauten >----

 

    If Err.Number <> 0 Then

        MsgBox Err.Description & sAbbruch, vbCritical, "Fehler beim Import von Excel"

        ┬░IDImport = 0

        Exit Function

    End If

    addLog "Import in Puffer: ok"

    '</ Import Details >

 

 

    '< Anzeigen >

    ctlListe_Imported.Requery

    fl_Import_to_Buffer = ┬░IDImport

    

    addStep "</ Import : Stop >"

    '</ Anzeigen >

    '----</ Funktion : Datei importieren >----

End Function

Access Datei-Import mit automatischer Zuordnung anhand der ersten Zeile mit Header

DoCmd.TransferSpreadsheet acImport, , "_Import_" & ┬░Area & "_Daten", sDatei_Pfad, True

 

Code-Beispiel

'=========================< #region: Import >=========================

Private Function fxImportieren() As Boolean

    '----< Funktion : Datei importieren >----

    addStep "< Import : Start >"

    'return=0

    fxImportieren = False

 

    '< Kontrolle >

    If IsNull(ctlListe_Import.Column(0)) Then

        MsgBox "es ist keine Importdatei markiert", vbCritical, "Kontrolle Datei"

        Exit Function

    End If

    '</ Kontrolle >

 

    '< init >

    Dim dtReport As Date

    Dim sDatei_Pfad As String, sDateiname As String

    Dim sJahr As String, sMonat As String

    Dim sAbbruch As String

    Dim sOrganisation As String

 

 

    dtReport = ctldtReport

    sJahr = Year(ctldtReport) '4stellen

    sMonat = Format(Month(dtReport), "00")

    sDateiname = ctlListe_Import.Column(0)

    sDatei_Pfad = tbxPfad_Ordner & sDateiname

    sAbbruch = vbCrLf & "Der Vorgang wird abgebrochen."

    sOrganisation = ctlOrganisation

    '</ init >

 

    '< Kontrolle Dateiname >

    addLog "pr├╝fe Dateikennungen.."

    If optNamenskontrolle = -1 Then

        Dim sFilelong As String

        sFilelong = sDatei_Pfad & "\" & sDateiname

        '< Jahr >

        Dim intPosJahr As Integer

        intPosJahr = InStr(1, sFilelong, sJahr, vbTextCompare)

        If Not intPosJahr > 0 Then

            MsgBox "Der Import-Dateiname " & sDateiname & " enth├Ąlt nicht die Jahreskennung " & sJahr & sAbbruch, vbCritical, "Abbruch Import: Kontrolle Dateikennung"

            Exit Function

        End If

        '</ Jahr >

        '< Monat >

        '*rechts vom Jahr

        If Not InStr(intPosJahr + 4, sFilelong, sMonat, vbTextCompare) > 0 Then

            '*Links vom Jahr

            If Not InStrRev(sFilelong, sMonat, intPosJahr, vbTextCompare) > 0 Then

                MsgBox "Der Import-Dateiname " & sDateiname & " enth├Ąlt nicht die Monatskennung " & sMonat & sAbbruch, vbCritical, "Abbruch Import: Kontrolle Dateikennung"

                Exit Function

            End If

        End If

        '</ Monat >

    End If

    '</ Kontrolle Dateiname  >

 

    addStep "import: dtReport=" & dtReport

    addStep "import: Datei=" & sDateiname

 

    '< Kopf ermitteln >

    addLog "ermittle Berichtskopf"

    Dim rMaster As Recordset

    Set rMaster = CurrentDb.OpenRecordset("SELECT TOP 1 * FROM tbl_RF_Master WHERE IDReport = " & ┬░IDMaster)

    If rMaster.EOF Then

        addStep "neu"

        rMaster.AddNew

    Else

        addStep "├╝berschreiben"

        rMaster.Edit

    End If

    rMaster!dtReport = dtReport

    rMaster!dtImport = Now

    rMaster!Organisation = sOrganisation

    rMaster!Filename = sDateiname

    rMaster!FileLong = sDatei_Pfad

    rMaster.Update

    rMaster.MoveLast

    ┬░IDMaster = rMaster!IDReport

    rMaster.Close

    addStep "IDReport=" & ┬░IDMaster

    '< Kopf ermitteln >

    

    '< reset >

    addLog "reset Importpuffer"

    CurrentDb.Execute "DELETE * FROM _Import_" & ┬░Area & "_Daten"

    '=qryImport_Act_00a_temp_reset

    '</ reset >

    

    '< Import Details>

    addLog "Importiere Excel-Datei in Puffer : start"

    On Error Resume Next

    DoCmd.TransferSpreadsheet acImport, , "_Import_" & ┬░Area & "_Daten", sDatei_Pfad, True

    If Err.Number <> 0 Then

        MsgBox Err.Description & sAbbruch, vbCritical, "Fehler beim Import von Excel"

        Exit Function

    End If

    addLog "Import in Puffer: ok"

    '</ Import Details >

 

 

    '< Anzeigen >

    ctlListe_vorhanden.Requery

    addStep "</ Import >"

    fxImportieren = True

    '</ Anzeigen >

    '----</ Funktion : Datei importieren >----

End Function

'=========================</ #region: Import >=========================