Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Textdatei in Access-Projekt einlesen

Begonnen von ellinho, März 01, 2012, 08:54:55

⏪ vorheriges - nächstes ⏩

ellinho

Hallo zusammen.

Ich habe meine Access-Personalverwaltung auf ein Projekt umgestellt.
Dabei wurde eine Textdatei monatlich importiert, die Personalnummer, Monat, Jahr und Stunden (für geleistete Stunden) enthielt.
Folgender Code läuft nun nicht mehr :

Option Compare Database
Option Explicit

Const Suchpfad_TXT$ = "W:\*.txt"
Const Import_Spez_TXT$ = "Datenimport_TXTImport"
Const Zwischentabelle$ = "Temp_TXTImport"
Const Datentabelle$ = "geleisteteStd"
Public Function TXT_Importieren()
  Dim cdb As Database
  Dim DateiQ$
  Dim Monat%, Jahr%, Antwort%
 
'------ Dateidialog zum Suchen und Selektieren der *.txt-Datei
  With Application.FileDialog(DialogType:=msoFileDialogOpen)
  .AllowMultiSelect = False
    .FilterIndex = 17
    .InitialFileName = Suchpfad_TXT$
    .InitialView = msoFileDialogViewDetails
    If .Show Then DateiQ$ = .SelectedItems(1)
  End With
  'falls im Dateidialog auf 'Abbrechen' geklickt wurde, beenden des Importes.
  If DateiQ$ = "" Then Exit Function
'------
  'Falls noch Datensätze in der Zwischentabelle 'Temp_TXTImport' enthalten sind, diese vorher löschen.
  DoCmd.RunSQL "DELETE * FROM " & Zwischentabelle$ & ";"
 
'------
  'Datenimport aus der *.txt-Datei in die Zwischentabelle Temp_TXTImport:
  'dafür muss vorher die Importspezifikation 'Datenimport_TXTImport' erzeugt und gespeichert worden sein.
  DoCmd.TransferText TransferType:=acImportDelim, SpecificationName:=Import_Spez_TXT$, _
        TableName:=Zwischentabelle$, FileName:=DateiQ$, HasFieldNames:=True
  'Nach dem Einlesen: Löschen der *.txt-Datei
  Kill DateiQ$

'------
  On Error Resume Next
  Set cdb = CurrentDb
 
' Ermitteln von Monat und Jahr aus dem 1.Satz der Zwischentabelle
  With cdb.OpenRecordset(Zwischentabelle$, dbOpenTable)
    .MoveFirst
    Monat% = !Monat
    Jahr% = !Jahr
    .Close
  End With
' Überprüfen, ob in der Tabelle 'geleisteteStd' Sätze mit Monat und Jahr
' wie in der Zwischentabelle vorhanden sind
  With cdb.OpenRecordset("SELECT Monat, Jahr FROM " & Datentabelle$ & _
                        " WHERE Monat=" & Monat% & " AND Jahr=" & Jahr% & ";", dbOpenDynaset)
    .MoveFirst
    If .EOF Then
      'Keine Sätze für Monat/Jahr in 'geleisteteStd' vorhanden
    Else
      'Es sind Sätze für Monat/Jahr 'in geleisteteStd' vorhanden
      Antwort = MsgBox("Es sind Datensätze für " & Monat% & "/" & Jahr% & " vorhanden." & vbCrLf & _
                       "Sollen diese überschrieben werden?", vbExclamation + vbOKCancel, "Datensätze für diesen Monat bereits vorhanden !!!")
      If Antwort = vbOK Then
        'Vorhandene Datensätze löschen (=überschreiben)
        Do Until .EOF
          .Delete
          .MoveNext
        Loop
        .Close
      Else
        'Vorhandene Datensätze nicht überschreiben -> Abbruch
        .Close
        Exit Function
      End If
    End If
  End With
  'Datensätze der Zwischentabelle 'Temp_TXTImport' anfügen an Tabelle 'geleisteteStd'
  DoCmd.RunSQL "INSERT INTO " & Datentabelle$ & " (Personalnummer, Monat, Jahr, Stunden) " & _
               "SELECT Personalnummer, Monat, Jahr, Stunden FROM " & Zwischentabelle$ & ";"
End Function

Dabei bekomme ich folgenden Fehler :

Dim cdb As Database (benutzerdefinierter Typ nicht definiert)

Hat jemand eine Idee, was ich umschreiben muss. Vorher lief die Funktion einwandfrei.


Gruß
Karsten

Wurliwurm

Zitat von: ellinho am März 01, 2012, 08:54:55
Dim cdb As Database (benutzerdefinierter Typ nicht definiert)

Hat jemand eine Idee, was ich umschreiben muss. Vorher lief die Funktion einwandfrei.

Nix umschreiben. Prüfe mal Deine Verweise auf DAO.

ellinho

Ok.
Habe nun die Verweise Microsoft DAO Object Library 3.51 und 3.6 aktiviert.
Nun hängt er bei msoFileDialogOpen

Gruß
Karsten

Wurliwurm

Zitat von: ellinho am März 01, 2012, 09:29:26
Nun hängt er beimsoFileDialogOpen

Schon, daß Du die erste Fehlermeldung weggekriegt hast. Das zweite Problem ist völlig analog. Such Dir raus, welche Bibliothek dafür eingebunden werden muß.

ellinho

Sorry, aber an dieser Stelle weiß ich absolut nicht, welcher Verweis dafür eingebunden werden muss. ???

Wurliwurm

#5
Zitat von: ellinho am März 01, 2012, 11:28:22
Sorry, aber an dieser Stelle weiß ich absolut nicht, welcher Verweis dafür eingebunden werden muss. ???

Google und Medienkompetenz sagt Dir was? :-/
http://www.google.de/search?hl=de&q=msoFileDialogOpen+verweis
Erster Treffer liefert die Lösung

ellinho


ellinho

Leider fällt die Funktion beim Einlesen doch noch auf die Nase. In der Temp_TXTImport stehen noch Daten.

DoCmd.RunSQL "DELETE * FROM " & Zwischentabelle$ & ";"

Fehlt da wohl noch ein Verweis ?

Gruß
Karsten

Wurliwurm

Zitat von: ellinho am März 01, 2012, 15:25:21
DoCmd.RunSQL "DELETE * FROM " & Zwischentabelle$ & ";"

Die SQL-Syntax ist nicht nicht richtig. Es heißt DELETE FROM <Tabelle>, weil sich der Deletebefehl immer auf komplette Zeilen bezieht.

ellinho

Also muss die vollständige Zeile folgendermaßen lauten ?

DoCmd.RunSQL DELETE  FROM Zwischentabelle$

funktioniert aber leider nicht...

Wurliwurm

Zitat von: ellinho am März 01, 2012, 17:08:53
DoCmd.RunSQL DELETE  FROM Zwischentabelle$

funktioniert aber leider nicht...

Fehler? Baue mal eine Fehlerbehandlung ein und gib Err.Description aus.
Oder probiere alternativ CurrentDb.Execute("DELETE  FROM " & Zwischentabelle$)


Stapi

Hallo ellinho

Probiere doch mal:

CurrentDb.Execute "DELETE * FROM Zwischentabelle$"

Gruß Stefan

Grüße aus dem schönen NRW
Stefan

ellinho

@Wurliwurm & Stefan
Egal wie ich es eintrage :
So.......("DELETE  FROM " & Zwischentabelle$)
oder so.......CurrentDb.Execute "DELETE * FROM Zwischentabelle$"

Ich bekomme nun immer die Fehlermeldung :
Objektvariable oder With-Blockvariable nicht festgelegt

Was ist da noch verkehrt?

Bitsqueezer

Hallo Karsten,

wie Du zu Beginn geschrieben hast, hast Du Deine Datenbank auf ein Access PROJEKT (ADP) umgestellt. Das paßt auch zu den Fehlermeldungen, die Du bekommst. In einer ADP hast Du lediglich eine direkte Verbindung zu einem SQL Server, nichts mehr lokales und auch kein DAO mehr. Entsprechend gibt es auch kein "CurrentDb", sondern nur noch "CurrentProject".

Es ist NICHT empfehlenswert, in einer ADP DAO zu verwenden, da hier alles auf ADO eingestellt ist. Daher gibt es auch keinen standardmäßigen Verweis zu DAO in ADPs (so wie es auch keinen Verweis auf ADO in MDB/ACCDB gibt). Wenn Du also den zu Beginn beschwerlich erscheinenden Weg einer ADP gehst (den ich persönlich aber nur empfehlen kann), dann befasse Dich am besten erst einmal mit den Unterschieden und was Du alles ändern mußt. Vieles wird funktionieren wie vorher, aber einiges eben auch nicht, besonders in VBA formuliertes dynamisches SQL ist i.d.R. dann in Access SQL formuliert und benötigt Anpassung. So gibt es etwa in Access SQL ein "DELETE * FROM", in T-SQL dagegen heißt es "DELETE FROM".

Man KANN natürlich DAO aktivieren, allerdings muß man dann auch alles selbst machen, da ADPs eben auf ADO eingestellt sind. Das bedeutet etwa, daß Du nicht einfach "CurrentDb" verwenden kannst (es gibt ja keine lokale Datenbank mehr, Access ist hier nur SQL Server Frontend), sondern erst einmal eine Verbindung zum SQL Server herstellen mußt, also mit Connection String und allem drum und dran. Das ist unnötig aufwendig, da alle ADPs bereits beim Starten eine Verbindung zum in der ADP definierten SQL Server herstellen und man diese verwenden kann. Die Verbindung findet man in "CurrentProject.Connection". Recordsets sind natürlich ebenso ADO, genau wie Formulare usw. ADO-Recordsets verwenden.
Du wirst also nicht drumherum kommen, einiges in Deinem Code neu zu schreiben - oder die von Microsoft empfohlene Methode zu verwenden, eine normale MDB/ACCDB zu erstellen und die SQL Server Tabellen zu verknüpfen, dann kann Dein Code so bleiben, wie er ist. Ich persönlich empfinde diese Lösung alleine wegen der umständlichen Tabellenverknüpferei und vieler anderer Nachteile als zu umständlich.

Gruß

Christian

ellinho

Danke erstmal Christian.

Gibt es da irgendwo eine Hilfe, wo ich bezüglich ADO weiterlesen kann ?
Hier nochmal der Code und wo er stoppt :

Fehler : Die Textdateispezifikation 'Datenimport_TXTImport' ist nicht vorhanden.
Importieren, Exportieren oder Verknüpfen ist mit dieser Spezifikation nicht möglich.

'Datenimport aus der *.txt-Datei in die Zwischentabelle Temp_TXTImport:
  'dafür muss vorher die Importspezifikation 'Datenimport_TXTImport' erzeugt und gespeichert worden sein.

  DoCmd.TransferText TransferType:=acImportDelim, SpecificationName:=Import_Spez_TXT$, _
        TableName:=Zwischentabelle$, FileName:=DateiQ$, HasFieldNames:=True


Vielleicht siehst Du da auf Anhieb etwas. Dies ist nämlich so einer meiner letzten Handgriffe bei der Umstellung auf adp. Stehe kurz vorm Ziel.