Imports System.IO.File Imports System.Data.SqlClient Imports System.Data.SqlTypes Imports System.ComponentModel Imports System Imports System.IO Imports System.SystemException '''EDKB08 - Hauptprogramm '''EDKB08 ist ein Importfunktion für Dokumente, welche durch '''Fremdanwendungen geliefert und in EDOKA importiert werden sollen. ''' '''Als Input werden die einzelenen Dokumente sowie eine oderer mehrer Dateien mit '''den zugehörenden Indexinformationen in ein definiertes Verzeichnis gestellt. ''' '''EDKB08 überwacht das definierte Verzeichnis. Sobald eine Datei mit der Endung '''".IND" angeliefert wird, startet der eigentliche Importvorgang. Module Main #Region "Deklarationen" '''Variable mit dem Namen des zu überwachenden Verzeichnises Dim Watch_Directory As String '''FileSystemWatcher '''Dieser Reagiert auf das Ereignis OnCreate im angegebenen Verzeichnis '''(Watch_Directory) Dim FileWatch As New FileSystemWatcher() '''Varaible zum Zwischenspeichern der Indexdaten einer '''Indexdaten-Datei Dim indexdata As DataTable Dim WithEvents JournalTimer As New Timers.Timer() #End Region #Region "Hauptverarbeitung" '''Steuerroutine für EDKB08 '''Diese Routine wird beim Programmstart durchlaufen. Dabei werden die '''benötigten Parameter ausgelesen und an der Konsole angezeigt. ''' '''Nach erfolgreicher Initialisierung werden Aktivitäten im vordefinierten '''Verzeichnis abgewartet. Public Sub Main() PrintOut("Start EDKB08") JournalTimer.Interval = 3600000 JournalTimer.Enabled = True 'Parameter auslesen If Params.Loadparameters = False Then PrintOut(Params.Meldung) PrintOut("Verarbeitung abgebrochen") Exit Sub Else Watch_Directory = Params.Inputverzeichnis PrintOut(Params.Meldung) PrintOut("Parameter:") PrintOut("Überwachtes Verzeichnis: " + Params.Inputverzeichnis) PrintOut("E-Mail OK: " + Params.MailAdresseOK) PrintOut("E-Mail NOK:" + Params.MailAdresseNOK) End If 'Datenbank initialisieren Dim db_conn As New edokadb.DB_Connection() 'Verzeichnis-Überwachung initialisieren und starten If Not Init_Filewatcher() Then PrintOut("Verarbeitung gestoppt", EventLogEntryType.Error) End If If Not Start_Watching() Then PrintOut("Verarbeitung gestoppt", EventLogEntryType.Error) Exit Sub End If PrintOut("") PrintOut("Return-Taste betätigen, um EDKB08 zu stoppen") Console.ReadLine() PrintOut("EDKB08 gestoppt") End Sub '''Verarbeitung von angelieferten Indexdateien. Die Verarbeitung läuft so '''lange, bis keine .IND-Dateien mehr im Improt-Verzeichnis vorhanden '''sind. '''Die angeleiferten Indexdateien im Verzeichnis werden eingelesen und '''verarbeitet. Private Sub Verarbeiten() Dim looper As Boolean = True Dim counter As Integer counter = 0 While looper = True counter = counter + 1 Globals.Journal.Open_Journal() 'Alle .IND-Dateien im Verzeichnis auslesen Dim clsindex As New clsIndexData() Dim di As New IO.DirectoryInfo(Watch_Directory) Dim diar1 As IO.FileInfo() = di.GetFiles("*.ind") Dim dra As IO.FileInfo If diar1.Length = 0 Then looper = False clsindex = Nothing di = Nothing diar1 = Nothing Globals.Journal.Delete_Entry() Exit Sub End If For Each dra In diar1 Globals.Journal.Insert_Journal("", "", "", dra.FullName, "", "Start der Verarbeitung", "", "") PrintOut("File-Nr " + counter + ": " + dra.FullName) clsindex.IndexFileName = dra.FullName If clsindex.getindexdata Then indexdata = clsindex.Indexdata Dim check_and_import As New clsCheckandImport() check_and_import.IndexData = indexdata If check_and_import.Herkunftsapplikationen_auslesen Then 'Sofern die Herkunftsapplikation erruiert werden konnte, wird die Journaltabelle mit der Applikationsid nachgeführt Globals.Journal.Update_Journal() 'Verarbeitung der Daten check_and_import.CheckandImport() check_and_import = Nothing End If End If Journal.Insert_Journal("", "", "", dra.FullName, "", "Total Index-Datensätze: " + LTrim(Str(indexdata.Rows.Count)), "", "") Journal.Insert_Journal("", "", "", dra.FullName, "", "Verarbeitung abgeschlossen.", "", "") Logdatei_Erstellen() Next clsindex = Nothing di = Nothing diar1 = Nothing Globals.Journal.Close_Journal() End While End Sub '''Journaldatei erstellen und je nach Applikationseinstellungen '''versenden '''Erstellt eine Journaldatei mit den Journaldaten der Verarbeitung und '''sendet diese mittels Mail bzw. mittls DTO weiter Private Sub Logdatei_Erstellen() Dim filename As String Try If Globals.Herkunftsapplikation.Rows(0).Item("log_per_mail") = False And Globals.Herkunftsapplikation.Rows(0).Item("log_mit_dto") = False Then Exit Sub If Globals.Herkunftsapplikation.Rows(0).Item("log_per_mail") = True And Globals.Herkunftsapplikation.Rows(0).Item("Mail_Periodizitaet") = 0 Then filename = Journal.Print_Log(Globals.Herkunftsapplikation.Rows(0).Item(0), Globals.Herkunftsapplikation.Rows(0).Item(1), Globals.Herkunftsapplikation.Rows(0).Item("outputformat")) End If If Globals.Herkunftsapplikation.Rows(0).Item("log_mit_dto") = True Then filename = Journal.Print_Log(Globals.Herkunftsapplikation.Rows(0).Item(0), Globals.Herkunftsapplikation.Rows(0).Item(1), Globals.Herkunftsapplikation.Rows(0).Item("outputformat")) Send_DTO(filename) End If Catch End Try End Sub '''DTO-Versand ''' Private Sub Send_DTO(ByVal filename As String) Try Dim i As Integer Dim tw As TextWriter Dim s As String s = Herkunftsapplikation.Rows(0).Item(3) s = s.Replace("%1", filename) tw = New StreamWriter(New FileStream(Params.TempPfad + "dtotransfer.cmd", FileMode.Create)) tw.WriteLine(s) tw.Flush() tw.Close() i = Microsoft.VisualBasic.Shell(Params.TempPfad + "dtotransfer.cmd", AppWinStyle.Hide, True) Catch End Try End Sub Private Sub Send_Mail(ByVal filename As String, ByVal empfaenger As String) Try Dim i As Integer Dim tw As TextWriter Dim s As String s = Herkunftsapplikation.Rows(0).Item(3) s = s.Replace("%1", filename) tw = New StreamWriter(New FileStream(Params.TempPfad + "dtotransfer.cmd", FileMode.Create)) tw.WriteLine(s) tw.Flush() tw.Close() i = Microsoft.VisualBasic.Shell(Params.TempPfad + "dtotransfer.cmd", AppWinStyle.Hide, True) Catch End Try End Sub #End Region #Region "FileWatcher" '''Initialisierung des Filewacher-Objektes '''Das Filewacher-Objekt wird mit den entpsrechenden Pfad- sowie '''Dateifilter-Angaben initialisiert. Private Function Init_Filewatcher() As Boolean Try FileWatch.Path = Watch_Directory FileWatch.IncludeSubdirectories = False FileWatch.Filter = "*.*" Return True Catch ex As Exception PrintOut("Fehler bei der Initialisierung des Filewacherobjekts auf " + Watch_Directory) Return False End Try End Function '''Eventhandler des FileWatching-Objektes aktivieren Private Function Start_Watching() As Boolean Try AddHandler FileWatch.Created, New FileSystemEventHandler(AddressOf OnFileEvent) FileWatch.EnableRaisingEvents = True PrintOut("Event-Handler initialisiert") Return True Catch ex As Exception PrintOut("Fehler bei der Event-Initialisierung") Return False End Try End Function '''Aktivitäten im Inputverzeichnis verarbeiten '''Wird eine Datei mit der Endung .IND angeliefert, wird der Eventhandler '''gestoppt und die anstehenden Dokumente verarbeitet. ''' '''Nach abgeschlossener Verarbeitung wird der Eventhandler wieder '''eingeschaltet ''' ''' Private Sub OnFileEvent(ByVal source As Object, ByVal e As FileSystemEventArgs) If UCase(Microsoft.VisualBasic.Right(e.FullPath, 4)) = ".IND" Then PrintOut("Neue Datei " + e.FullPath) FileWatch.EnableRaisingEvents = False Verarbeiten() FileWatch.EnableRaisingEvents = True End If End Sub #End Region #Region "Utils" #End Region 'Public Sub JournalTimer_Elapsed(ByVal sender As Object, ByVal e As System.Timers.ElapsedEventArgs) Handles JournalTimer.Elapsed ' If Now.Hour > 0 And Now.Hour < 1 Then ' Dim filename As String ' Dim dt As DataTable ' Dim i As Integer ' PrintOut("Start Tägliche Journalerstellung") ' dt = get_applikationen() ' For i = 0 To dt.Rows.Count - 1 ' filename = Journal.Print_Log(dt.Rows(i).Item(0), dt.Rows(i).Item(1), dt.Rows(i).Item(2)) ' Send_Mail(filename, dt.Rows(i).Item(3)) ' PrintOut(dt.Rows(i).Item(1) + ": " + "Journal gesendet") ' Next ' End If 'End Sub 'Private Function get_applikationen() As DataTable ' Dim scmCmdToExecute As SqlCommand = New SqlCommand() ' Dim dtToReturn As DataTable = New DataTable() ' Dim sdaAdapter As SqlDataAdapter = New SqlDataAdapter(scmCmdToExecute) ' scmCmdToExecute.CommandText = "dbo.sp_edoka_import_Journalversand] " ' scmCmdToExecute.CommandType = CommandType.StoredProcedure ' scmCmdToExecute.Connection = conn_edoka.scoDBConnection ' Try ' sdaAdapter.Fill(dtToReturn) ' Return dtToReturn ' Catch ex As Exception ' PrintOut("Tägliche Journalerstellung fehlgeschlagen. " + ex.Message, EventLogEntryType.Error) ' Finally ' scmCmdToExecute.Dispose() ' sdaAdapter.Dispose() ' dtToReturn.Dispose() ' End Try 'End Function End Module