PDA

Vollständige Version anzeigen : Import Textdatei - Optimierung


killepitsch
19.04.2011, 13:33
Hallo,

den Code habe ich bereits in einem ungebundenen Startformular eingebaut und läuft auch problemlos. Ein paar Dinge würde ich gerne ändern, nur weiß ich momentan noch nicht wie.

Wenn der erste Start der Datenbank nicht vom Firmennetzwerk, sondern von zu Haus aus (Einwahl über VPN) erfolgt, dann soll der Code nicht ausgeführt werden. Die Datendatei hat ca. 70000 Datensätze à 140 Datenfelder. Das "Importieren" dauert normal schon eine halbe Minute, aber von zu Haus aus kann der ganze Vorgang inkl. komprimieren schon ne Stunde dauern. Wie könnte man das lösen? Eine JA/Nein Meldung, ich möchte jedoch verhindern das jeder Kollege Nein auswählt.

2) Das Abbrechen des Codes über ESC oder Shift würde ich gerne unterbinden.
3) Wenn der Vorgang gerade läuft, sollte kein anderer die Datenbank öffnen können, da der Vorgang sonst nicht korrekt durchgeführt wird.

Vielleicht haltet ihr das für zu übertrieben, aber ich habe jetzt nach einiger Zeit Praxiserfahrung bemerkt das die Korrekturen am Code schon sehr sinnvoll wären.

Grüße
killepitsch

Private Sub Form_Open(Cancel As Integer)

Const cFile As String = "\\abcde01\12345\Datenquellen\Datendatei.txt"
Dim dteLetzteAktualisierung As Date
Dim bReturn As Boolean

'Datum der letzten Aktualisierung ermitteln
dteLetzteAktualisierung = DMax("DatumUpdate", "tbl_Update")

If dteLetzteAktualisierung < Date And FileSize(cFile) > 80000000 Then
bReturn = Datendatei_Einlesen ()
If bReturn Then _
CurrentDb.Execute "INSERT INTO tbl_Update (DatumUpdate) SELECT Date()", dbFailOnError

' Datenbank komprimieren
CommandBars("Menu Bar"). _
Controls("Extras"). _
Controls("Datenbank-Dienstprogramme"). _
Controls("Datenbank komprimieren und reparieren..."). _
accDoDefaultAction
End If

End Sub


Function Datendatei_Einlesen() As Boolean
On Error GoTo Datendatei_Einlesen _Err

DoCmd.SetWarnings False 'Besser: mit CurrentDB.Execute / CurrentDbC.Execute
DoCmd.OpenQuery "Datendatei_Löschabfrage", acViewNormal, acEdit
DoCmd.OpenQuery "Datendatei_Anfügeabfrage", acViewNormal, acEdit
DoCmd.SetWarnings True 'Besser: mit CurrentDB.Execute / CurrentDbC.Execute
Datendatei_Einlesen = True

Datendatei_Einlesen _Exit:
Exit Function

Datendatei_Einlesen _Err:
MsgBox Error$
Resume Datendatei_Einlesen _Exit

End Function


Public Function FileSize(ByRef sFile As String) As Variant
Dim oFSO As Object
Dim oFile As Object

Set oFSO = CreateObject("Scripting.FileSystemObject")
Set oFile = oFSO.GetFile(sFile)
FileSize = oFile.Size
'Debug.Print oFile.DateCreated ' Erstellungsdatum
'Debug.Print oFile.DateLastModified ' Änderungsdatum
Set oFile = Nothing
Set oFSO = Nothing
End Function

Micha_DU
19.04.2011, 14:07
hm...
Ein Ansatz wäre vielleicht den Rechnernamen in einer Tabelle zu überprüfen in der du den Standort des Rechners erfasst hast. Das geht aber schief wenn man wie ich einen Laptop im Büro und im Homeoffice benutzt...

Wüßte jetzt nicht wie ich feststelle ob ich per VPN eingewählt bin...

killepitsch
19.04.2011, 14:31
Ja, so ist das bei uns auch... Durch die Laptops kommt man von der Arbeit nicht mehr los...

1) Werde ich wahrscheinlich über eine Fenster: Möchten Sie importieren..... machen
2) Hier habe ich noch folgendes gefunden... werde ich ausprobieren
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
If KeyCode = 27 Then KeyCode = 0
End Sub

3) Habe ich leider keinen Ansatz. Ich mir der wichtigste Punkt.

Micha_DU
19.04.2011, 15:09
zu 3, ohne Anspruch auf Richtigkeit und Eleganz:
Aufteilung in Front- und Backend, der Importvorgang legt zentral irgendeine Textdatei an. Frontends überprüfen beim Öffnen (autoexec-Makro) ob die Datei vorhanden ist, wenn ja wird die Datenbank gleich wieder geschlossen mit einem entsprechenden Hinweis. Fürs komprimieren des Backends zum Schluß gibts hier Lesestoff: http://www.donkarl.com?FAQ6.7
Zum Schluß muss natürlich die Textdatei wieder gelöscht werden...

Atrus2711
19.04.2011, 15:11
Wie wäres denn einfach mit einem Button, der die ganze Chose anstößt? Den muss halt ein Mensch drücken....

Micha_DU
19.04.2011, 15:19
andere Frage... woher kommen die 70.000 Datensätze überhaupt? Lädt irgendjemand die runter? Du müßtest ja auch noch sicherstellen, dass überhaupt eine Import-Datei vorhanden ist...

Es wäre auch zu prüfen, ob man die Datei nicht einfach verknüpfen könnte...

killepitsch
19.04.2011, 15:39
Die Datei stellt mir die IT täglich zur Verfügung. Verknüpfen klappt leider nicht, da dann immer nur ein Benutzer auf die Daten zugreifen kann.

Button: Möglich, ich habe nur die Befürchtung, dass er nicht betätigt wird bzw. in der Zwischenzeit die DB schon von mehreren Benutzern geöffnet ist.

Atrus2711
19.04.2011, 15:42
Setz ein J/N-Kennzeichen in einer zentralen Tabelle, das du beim Buttonklick abfragst. Nur wenn das Kennzeichen z.B. auf N steht, geht der Import los, der erste Akt des Importierens ist das Umstellen auf J, der letzte Akt ist das Rückstellen auf N.

killepitsch
19.04.2011, 16:11
Was bringt mir das? Wenn Kennzeichen = J dann kann kein anderer die DB starten? Was würde passierern wenn der Vorgang nicht erfolgreich war?

Atrus2711
19.04.2011, 16:17
Starten schon. Aber der Magic Button merkt dann, dass bereits eine Verarbeitung läuft, und steigt sofort wieder aus.

Und wenn die Chose nicht erfolgreich durchläuft, kommt es auch nicht zum Reset auf "nächster Import kann starten". Wenn eine gewisse Zeit rum ist - oder vielleicht auch durch Schaffung eines protokolls der Einzelschritte - kannst du also prüfen, wo es hängt.

ebs17
19.04.2011, 17:47
Wenn der erste Start der Datenbank nicht vom Firmennetzwerk, sondern von zu Haus aus (Einwahl über VPN) erfolgt, dann soll der Code nicht ausgeführt werden.
Kann man denn eine Datei (beliebige TXT-Datei) so platzieren, dass sie über das Firmennetzwerk zugänglich ist, jedoch nicht per VPN? Dann müsste man nur einen Test auf Erreichbarkeit dieser Datei vorschalten.