Supportnet / Forum / Datenbanken
Abfragen über eine wachsende Anzahl von Tabellen
Frage
Hallo,
ich habe eine Datenbank in der eine ständig wachsende Anzahl von Tabellen (TXT Files) verknüpft werden. Da ich jederzeit den aktuellsten Stand als Zusammenfassung, Suche nach Doppelungen, Versionshistorie, Unterscheidung nach Land etc. bräuchte, habe ich nun ein Problem.
Mit der Hilfe in Access bin ich nicht zurecht gekommen. Bis dato muß ich jede Verknüpfung per Hand in eine Abfrage einbauen (und bin mir nicht sicher ob das Ergebnis korrekt ist!). Dabei haben alle Tabellen das Ende gleich, nur der Anfang unterscheidet sich durch das aktuelle Datum. Kann ich sowas wie eine Wildcard setzen, soll ich alles erst in eine neue Tabelle kopieren oder..... ???
Welche Alternativen kann ich anwenden, ich bin ein relativer Anfänger ohne Programmierkenntnisse.
Über zahlreiche Vorschläge von euch würde ich mich freuen. Vielen Dank schon mal im voraus.
Ciao
Gerry
Antwort 1 von Teddy7
Hallo Gerry !
Wie immer gibt es auch hier mehrere Wege.
Schau mal in der Hilfe unter "Importieren oder Verknüpfen von Daten".
Es gibt eine Funktion zum Einlesen von Textdateien in eine Tabelle. Man kann es auch über VBA machen.
Der dritte Weg ist der, den Du bisher verwendet hast - nämlich die Textdateien nur zu verknüpfen.
In jedem Fall ist es hilfreich erst mal die vorhandenen Dateinamen zu kennen.
Das folgende Programm liest die Dateien einer vorgegebenen Maskierung (hier: *.txt) eines Ordners (Pfad vorgeben im Textfeld txtPfad auf dem Formular).
Zusätzlich liest es den Inhalt der Textdateien in eine Tabelle ein.
Wenn Du das nicht willst kannst Du den Teil ja weglassen.
Schau es Dir einfach mal an.
-------------
Private Sub cmdDateinamen_Click()
On Error GoTo fehlerhandler
´ Das Beispiel verwendet zur Suche der Dateien das
´ FileSearch-Objekt. dazu benötigt man einen verweis
´ auf die MS Office 8.0 bzw. 9.0 Objektbibliothek
Dim DateiinhaltStr As String
Dim DateinameStr As String
Dim FsoObj As FileSearch
Dim Hnd As Long
Dim i As Long
Dim j As Integer
Dim PfadDateiStr As String
Dim SuchergebnisLng As Long
Dim TabelleRes As DAO.Recordset
´ Pflichteingabe überprüfen
If Nz(Me.txtPfad, "") = "" Then
MsgBox "Bitte geben Sie einen Pfad an, aus dem Dateien importiert werden sollen", vbInformation
GoTo verlassen
End If
´ Recordset anlegen
Set TabelleRes = CurrentDb.OpenRecordset("Select * from tblDateiinhalte", dbOpenDynaset)
´ File-System-Objekt anlegen
Set FsoObj = Application.FileSearch
With FsoObj
´ nur Textfiles importieren
.FileType = msoFileTypeAllFiles
.FileName = "*.txt"
´ Verzeichnis angeben, das durchsucht werden soll
.LookIn = Me.txtPfad
´ Unterverzeichnisse nicht mitdurchsuchen
.SearchSubFolders = False
´ Suche ausführen
SuchergebnisLng = .Execute(msoSortByFileName, msoSortOrderAscending)
´ Wurde überhaupt ein File gefunden ?
If SuchergebnisLng > 0 Then
´ alle gefundenen Files durchgehen
For i = 1 To .FoundFiles.Count
´ Dateinamen des aktuellen Files mitsamt Pfadangabe auslesen
PfadDateiStr = .FoundFiles(i)
´ zuerst die Pfadangabe eleminieren
DateinameStr = PfadDateiStr
Do While InStr(DateinameStr, "\")
DateinameStr = Right(DateinameStr, Len(DateinameStr) - InStr(DateinameStr, "\"))
Loop
´ dann noch die Dateiendung abschneiden
DateinameStr = Left(DateinameStr, InStr(DateinameStr, ".") - 1)
´ Datei zum auslesen öffnen
Hnd = FreeFile
Open PfadDateiStr For Input As Hnd
´ sehen, ob der Dateiname in der Zieltabelle aufgeführt ist
TabelleRes.FindFirst "Dateiname = " & DateinameStr & ""
If TabelleRes.NoMatch Then
TabelleRes.AddNew
TabelleRes!Dateiname = DateinameStr
Else
TabelleRes.Edit
End If
´ Dateiinhalt in Tabelle schreiben
MsgBox (DateinameStr & "--" & LOF(Hnd))
If LOF(Hnd) > 0 Then
TabelleRes!Dateiinhalt = Input(LOF(Hnd), Hnd)
End If
TabelleRes.Update
´ nachdem die Datei importiert wurde, das Ding wieder schließen
Close Hnd
Next
End If
End With
´ Da die neu importierten Daten im selben Formular angezeigt werden, von dem
´ aus auch der Import gestartet wurde, muß die Datenherkunft des Formulars
´ nun noch aktualisiert werden
Me.Requery
verlassen:
On Error Resume Next
Close Hnd
TabelleRes.Close
Set TabelleRes = Nothing
Set FsoObj = Nothing
Exit Sub
fehlerhandler:
MsgBox CStr(Err.Number) & ":" & Err.Description, vbCritical
Resume verlassen
End Sub
----------------
Gruß
Teddy
Wie immer gibt es auch hier mehrere Wege.
Schau mal in der Hilfe unter "Importieren oder Verknüpfen von Daten".
Es gibt eine Funktion zum Einlesen von Textdateien in eine Tabelle. Man kann es auch über VBA machen.
Der dritte Weg ist der, den Du bisher verwendet hast - nämlich die Textdateien nur zu verknüpfen.
In jedem Fall ist es hilfreich erst mal die vorhandenen Dateinamen zu kennen.
Das folgende Programm liest die Dateien einer vorgegebenen Maskierung (hier: *.txt) eines Ordners (Pfad vorgeben im Textfeld txtPfad auf dem Formular).
Zusätzlich liest es den Inhalt der Textdateien in eine Tabelle ein.
Wenn Du das nicht willst kannst Du den Teil ja weglassen.
Schau es Dir einfach mal an.
-------------
Private Sub cmdDateinamen_Click()
On Error GoTo fehlerhandler
´ Das Beispiel verwendet zur Suche der Dateien das
´ FileSearch-Objekt. dazu benötigt man einen verweis
´ auf die MS Office 8.0 bzw. 9.0 Objektbibliothek
Dim DateiinhaltStr As String
Dim DateinameStr As String
Dim FsoObj As FileSearch
Dim Hnd As Long
Dim i As Long
Dim j As Integer
Dim PfadDateiStr As String
Dim SuchergebnisLng As Long
Dim TabelleRes As DAO.Recordset
´ Pflichteingabe überprüfen
If Nz(Me.txtPfad, "") = "" Then
MsgBox "Bitte geben Sie einen Pfad an, aus dem Dateien importiert werden sollen", vbInformation
GoTo verlassen
End If
´ Recordset anlegen
Set TabelleRes = CurrentDb.OpenRecordset("Select * from tblDateiinhalte", dbOpenDynaset)
´ File-System-Objekt anlegen
Set FsoObj = Application.FileSearch
With FsoObj
´ nur Textfiles importieren
.FileType = msoFileTypeAllFiles
.FileName = "*.txt"
´ Verzeichnis angeben, das durchsucht werden soll
.LookIn = Me.txtPfad
´ Unterverzeichnisse nicht mitdurchsuchen
.SearchSubFolders = False
´ Suche ausführen
SuchergebnisLng = .Execute(msoSortByFileName, msoSortOrderAscending)
´ Wurde überhaupt ein File gefunden ?
If SuchergebnisLng > 0 Then
´ alle gefundenen Files durchgehen
For i = 1 To .FoundFiles.Count
´ Dateinamen des aktuellen Files mitsamt Pfadangabe auslesen
PfadDateiStr = .FoundFiles(i)
´ zuerst die Pfadangabe eleminieren
DateinameStr = PfadDateiStr
Do While InStr(DateinameStr, "\")
DateinameStr = Right(DateinameStr, Len(DateinameStr) - InStr(DateinameStr, "\"))
Loop
´ dann noch die Dateiendung abschneiden
DateinameStr = Left(DateinameStr, InStr(DateinameStr, ".") - 1)
´ Datei zum auslesen öffnen
Hnd = FreeFile
Open PfadDateiStr For Input As Hnd
´ sehen, ob der Dateiname in der Zieltabelle aufgeführt ist
TabelleRes.FindFirst "Dateiname = " & DateinameStr & ""
If TabelleRes.NoMatch Then
TabelleRes.AddNew
TabelleRes!Dateiname = DateinameStr
Else
TabelleRes.Edit
End If
´ Dateiinhalt in Tabelle schreiben
MsgBox (DateinameStr & "--" & LOF(Hnd))
If LOF(Hnd) > 0 Then
TabelleRes!Dateiinhalt = Input(LOF(Hnd), Hnd)
End If
TabelleRes.Update
´ nachdem die Datei importiert wurde, das Ding wieder schließen
Close Hnd
Next
End If
End With
´ Da die neu importierten Daten im selben Formular angezeigt werden, von dem
´ aus auch der Import gestartet wurde, muß die Datenherkunft des Formulars
´ nun noch aktualisiert werden
Me.Requery
verlassen:
On Error Resume Next
Close Hnd
TabelleRes.Close
Set TabelleRes = Nothing
Set FsoObj = Nothing
Exit Sub
fehlerhandler:
MsgBox CStr(Err.Number) & ":" & Err.Description, vbCritical
Resume verlassen
End Sub
----------------
Gruß
Teddy
Antwort 2 von GerryG
WOW WOW
Jetzt bin ich aber baff ;-)))
Ich gehe mal davon aus das ich ein Modul erzeugen sollte. Dazu habe ich bereits den Code (?) von dir in ein Modul (Standardname MODUL1) eingebaut (MS Visual Basic).
Sobald ich auf debuggen gehe erhalte ich bei den Kommentaren mit dem Zeichen ´ eine Fehlermeldung.
Leider weiß ich nicht mehr damit anzufangen und komme so nicht weiter, Sorry.
Kannst du mir eine Blindenanleitung zur Implementierung des Codes geben ???
Wie schon erwähnt kenne ich Access nur ohne eine Zeile Programmierung geschrieben zu haben.
Vielen Dank schon mal für die enorme Programmierarbeit von dir.
Ciao
Gerry
Jetzt bin ich aber baff ;-)))
Ich gehe mal davon aus das ich ein Modul erzeugen sollte. Dazu habe ich bereits den Code (?) von dir in ein Modul (Standardname MODUL1) eingebaut (MS Visual Basic).
Sobald ich auf debuggen gehe erhalte ich bei den Kommentaren mit dem Zeichen ´ eine Fehlermeldung.
Leider weiß ich nicht mehr damit anzufangen und komme so nicht weiter, Sorry.
Kannst du mir eine Blindenanleitung zur Implementierung des Codes geben ???
Wie schon erwähnt kenne ich Access nur ohne eine Zeile Programmierung geschrieben zu haben.
Vielen Dank schon mal für die enorme Programmierarbeit von dir.
Ciao
Gerry
Antwort 3 von Teddy7
Ups ! Das hätte ich dabei schreiben sollen.
Also: Das Zeichen ´ soll ein Hochkomma sein. Dieses Hochkomma wird aber von supportnet verschluckt. Es gibt da zwar ein beeindruckendes script von struppi, mit dem man dieses Zeichen umsetzen kann, aber wenn ich das hier auf der Arbeit einsetze bekomme ich wahrscheinlich Ärger.
Außerdem bin ich faul und habe einfach vorausgesetzt, daß das als Kommentar erkannt wird.
Es ist eine alte Programmiererkrankheit beim User zuviel vorauszusetzen. Sorry !
Also grundsätzlich: in Visual Basic wird alles, was hinter einem Hochkomma steht als Kommentar angesehen.
Das Hochkomma ist in diesem Fall auf der Tastatur das Zeichen über dem #.
Ersetze also bitte ´ durch Hochkomma (oder lösche diese Zeilen ganz raus).
Ein extra Modul brauchst Du hier nicht.
Bau einfach eine Befehlsschaltfläche in ein Formular ein. Dann mit der rechten Maustaste draufklicken und auf Eigenschaften gehen. Ändere Name in cmdDateinamen.
Dann klickst Du in die Zeile Beim Klicken. Es erscheinen rechts außen 3 Punkte ... Darauf klicken und Code-Editor auswählen. Access springt jetzt in den Editormodus (Klassenmodul der Form) und gibt bereits Kopf und Ende vor. Dazwischen mußt Du nur noch obigen Code einfügen. Kopf(sub...) und Ende (end sub) nicht nochmal mitkopieren.
Zur Erklärung: Access ist ein event-gesteuertes System - d.h. es reagiert auf "Vorfälle".
Wenn Du auf die Befehlsschaltfläche klickst löst Du so einen "Vorfall" aus.
Die Programmierung ist dann nichts anderes als dem System zu sagen, was es tun soll, wenn jemand auf diese Schaltfläche fällt.
So - jetzt brauchst Du aber noch ein Textfeld auf dem Formular.
Der Name muß sein: txtPfad.
Hier gibst Du den Pfad des Ordners vor, den das Programm durchsuchen soll.
Vergiß nicht die Tabelle tblDateiinhalte anzulegen mit den Feldern Dateiname (Text) und Dateiinhalt(Memo) (und einem Feld lfdnr mit Autowert als Primärschlüssel).
Mehr fällt mir nicht dazu ein. Wenn Du sonst noch Fragen hast melde Dich nochmal.
Wenn ich nicht online bin werden Dir sicher andere genauso helfen können.
Denk immer daran: Es gibt keine dummen Fragen - nur dumme Antworten.
Mir ist es lieber wenn einer fragt bis er es tatsächlich verstanden hat als wenn er meine Anwort als unbrauchbar abtut.
Gruß
Teddy
Also: Das Zeichen ´ soll ein Hochkomma sein. Dieses Hochkomma wird aber von supportnet verschluckt. Es gibt da zwar ein beeindruckendes script von struppi, mit dem man dieses Zeichen umsetzen kann, aber wenn ich das hier auf der Arbeit einsetze bekomme ich wahrscheinlich Ärger.
Außerdem bin ich faul und habe einfach vorausgesetzt, daß das als Kommentar erkannt wird.
Es ist eine alte Programmiererkrankheit beim User zuviel vorauszusetzen. Sorry !
Also grundsätzlich: in Visual Basic wird alles, was hinter einem Hochkomma steht als Kommentar angesehen.
Das Hochkomma ist in diesem Fall auf der Tastatur das Zeichen über dem #.
Ersetze also bitte ´ durch Hochkomma (oder lösche diese Zeilen ganz raus).
Ein extra Modul brauchst Du hier nicht.
Bau einfach eine Befehlsschaltfläche in ein Formular ein. Dann mit der rechten Maustaste draufklicken und auf Eigenschaften gehen. Ändere Name in cmdDateinamen.
Dann klickst Du in die Zeile Beim Klicken. Es erscheinen rechts außen 3 Punkte ... Darauf klicken und Code-Editor auswählen. Access springt jetzt in den Editormodus (Klassenmodul der Form) und gibt bereits Kopf und Ende vor. Dazwischen mußt Du nur noch obigen Code einfügen. Kopf(sub...) und Ende (end sub) nicht nochmal mitkopieren.
Zur Erklärung: Access ist ein event-gesteuertes System - d.h. es reagiert auf "Vorfälle".
Wenn Du auf die Befehlsschaltfläche klickst löst Du so einen "Vorfall" aus.
Die Programmierung ist dann nichts anderes als dem System zu sagen, was es tun soll, wenn jemand auf diese Schaltfläche fällt.
So - jetzt brauchst Du aber noch ein Textfeld auf dem Formular.
Der Name muß sein: txtPfad.
Hier gibst Du den Pfad des Ordners vor, den das Programm durchsuchen soll.
Vergiß nicht die Tabelle tblDateiinhalte anzulegen mit den Feldern Dateiname (Text) und Dateiinhalt(Memo) (und einem Feld lfdnr mit Autowert als Primärschlüssel).
Mehr fällt mir nicht dazu ein. Wenn Du sonst noch Fragen hast melde Dich nochmal.
Wenn ich nicht online bin werden Dir sicher andere genauso helfen können.
Denk immer daran: Es gibt keine dummen Fragen - nur dumme Antworten.
Mir ist es lieber wenn einer fragt bis er es tatsächlich verstanden hat als wenn er meine Anwort als unbrauchbar abtut.
Gruß
Teddy
Antwort 4 von GerryG
Ich bedanke mich erstmal sehr für deine ausführliche Hilfe. Ich werde das mal über das Wochenende ausprobieren und hoffe das ich damit zurecht komme. Ansonsten bin ich auch der Typ der lieber zweimal frägt als das ich nichts damit anfangen kann ;-)
"Denk immer daran: Es gibt keine dummen Fragen - nur dumme Antworten."
--> In anderen Teilen der Foren versuche ich eine ähnliche Vorgehensweise, lieber doppelt erklärt als nicht verstanden. Es gibt immer wieder Anfänger die grundlegende Fragen haben oder Leute die mit bestimmten Programmen sonst nicht viel zu tun haben etc. und da für Ihre Probleme eine verständliche Antwort brauchen, wie das bei mir mit Access die Sachlage ist.
Vielen Dank für deine bisherige und extrem schnelle Hilfe.
Ciao und ein schönes Wochenende
Gerry
"Denk immer daran: Es gibt keine dummen Fragen - nur dumme Antworten."
--> In anderen Teilen der Foren versuche ich eine ähnliche Vorgehensweise, lieber doppelt erklärt als nicht verstanden. Es gibt immer wieder Anfänger die grundlegende Fragen haben oder Leute die mit bestimmten Programmen sonst nicht viel zu tun haben etc. und da für Ihre Probleme eine verständliche Antwort brauchen, wie das bei mir mit Access die Sachlage ist.
Vielen Dank für deine bisherige und extrem schnelle Hilfe.
Ciao und ein schönes Wochenende
Gerry

