Imports DocumentFormat.OpenXml.Wordprocessing Public Class frmDatenarchivarchiv Dim SQL As New VERAG_PROG_ALLGEMEIN.SQL Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Try Me.Cursor = Cursors.WaitCursor Dim maxEintraege As Integer Dim datumVon As Date Dim datumBis As Date If Not Integer.TryParse(txtMax._value, maxEintraege) OrElse maxEintraege <= 0 Then Exit Sub If Not Date.TryParse(txtVon._value, datumVon) Then Exit Sub If Not Date.TryParse(txtBis._value, datumBis) Then Exit Sub If datumVon.Date > datumBis.Date Then Exit Sub If datumBis.Date = Date.MaxValue.Date Then Exit Sub If String.IsNullOrWhiteSpace(txtKategorie.Text) Then Exit Sub If String.IsNullOrWhiteSpace(txtOrdner.Text) Then Exit Sub Dim sqlText As String = "SELECT TOP (" & maxEintraege & ") da.da_id " & "FROM tblDatenarchiv da " & "WHERE da.da_vorlage = 0 " & "AND da.da_kategorie = '" & txtKategorie.Text.Replace("'", "''") & "' " & "AND da.da_ordner = '" & txtOrdner.Text.Replace("'", "''") & "' " & "AND da.da_id >= 392150 " & "AND EXISTS (" & "SELECT 1 FROM tblDatenarchiv_Collection coll " & "WHERE coll.coll_daId = da.da_id " & "AND coll.coll_date >= '" & datumVon.ToString("yyyyMMdd") & "' " & "AND coll.coll_date < '" & datumBis.AddDays(1).ToString("yyyyMMdd") & "' " & "AND coll.coll_pfad NOT LIKE '%\\stor01.verag.ost.dmn\DatenArchivArchiv%' " & "AND coll.coll_pfad NOT LIKE '\\DELETED\%' " & ") ORDER BY da.da_id" Dim DT = SQL.loadDgvBySql(sqlText, "FMZOLL") If DT Is Nothing OrElse DT.Rows.Count = 0 Then MsgBox("Keine Einträge gefunden.", vbInformation) Exit Sub End If If MsgBox("Es werden '" & DT.Rows.Count & "' Einträge verschoben - fortfahren?", vbYesNoCancel) <> vbYes Then Exit Sub Button1.Enabled = False RichTextBox1.Clear() ProgressBar1.Minimum = 0 ProgressBar1.Maximum = DT.Rows.Count ProgressBar1.Value = 0 Dim erfolgreich As Integer = 0 Dim fehler As Integer = 0 Dim fehlerListe As New List(Of String) Dim angezeigteFehler As Integer = 0 Dim logOrdner = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "AVISO", "ArchivMigration") System.IO.Directory.CreateDirectory(logOrdner) Dim logPfad As String = System.IO.Path.Combine(logOrdner, "ArchivFehler_" & Date.Now.ToString("yyyyMMdd_HHmmss") & ".txt") System.IO.File.WriteAllText(logPfad, "Archivmigration gestartet: " & Date.Now.ToString("dd.MM.yyyy HH:mm:ss") & Environment.NewLine & Environment.NewLine, System.Text.Encoding.UTF8) Dim sw As Stopwatch = Stopwatch.StartNew() For Each ROW As DataRow In DT.Rows Try Dim DS = New VERAG_PROG_ALLGEMEIN.cDATENSERVER(ROW("da_id")) If DS.DATA_LIST.LIST.Count > 0 Then If DS.moveTo_ARCHIVARCHIV(fehlerListe, logPfad) Then erfolgreich += 1 Else fehler += 1 End If End If Catch ex2 As Exception fehler += 1 Dim eintrag = Date.Now.ToString("dd.MM.yyyy HH:mm:ss") & " | FEHLER | da_id=" & ROW("da_id").ToString() & " | " & ex2.Message fehlerListe.Add(eintrag) System.IO.File.AppendAllText(logPfad, eintrag & Environment.NewLine, System.Text.Encoding.UTF8) End Try ' Neue Fehler laufend in RichTextBox1 anzeigen If fehlerListe.Count > angezeigteFehler Then For i As Integer = angezeigteFehler To fehlerListe.Count - 1 RichTextBox1.AppendText(fehlerListe(i) & Environment.NewLine) Next angezeigteFehler = fehlerListe.Count RichTextBox1.SelectionStart = RichTextBox1.TextLength RichTextBox1.ScrollToCaret() RichTextBox1.Refresh() End If ' Fortschritt und Statistik aktualisieren ProgressBar1.Value += 1 Dim laufzeit As TimeSpan = sw.Elapsed Dim dauer As String = String.Format("{0:00}:{1:00}:{2:00}", CInt(Math.Floor(laufzeit.TotalHours)), laufzeit.Minutes, laufzeit.Seconds) Label1.Text = ProgressBar1.Value & "/" & DT.Rows.Count & vbNewLine & "Erfolgreich: " & erfolgreich & vbNewLine & "Fehler: " & fehler & vbNewLine & "Laufzeit: " & dauer ProgressBar1.Refresh() Label1.Refresh() ' UI-Ereignisse verarbeiten, damit die Anzeige aktuell bleibt Application.DoEvents() Next sw.Stop() System.IO.File.AppendAllText(logPfad, Environment.NewLine & "Archivmigration beendet: " & Date.Now.ToString("dd.MM.yyyy HH:mm:ss") & " | Erfolgreich: " & erfolgreich & " | Fehler: " & fehler & " | Laufzeit: " & sw.Elapsed.ToString("hh\:mm\:ss") & Environment.NewLine, System.Text.Encoding.UTF8) MsgBox("Archivierung abgeschlossen." & vbNewLine & "Erfolgreich: " & erfolgreich & vbNewLine & "Datensätze mit Fehlern: " & fehler & vbNewLine & "Einzelne Fehler: " & fehlerListe.Count & vbNewLine & "Laufzeit: " & sw.Elapsed.ToString("hh\:mm\:ss") & vbNewLine & vbNewLine & "Fehlerprotokoll: " & logPfad, vbInformation) Catch ex As Exception VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, ex.StackTrace, System.Reflection.MethodBase.GetCurrentMethod.Name) Finally Button1.Enabled = True Me.Cursor = Cursors.Default End Try End Sub Private Sub frmDatenarchivarchiv_Load(sender As Object, e As EventArgs) Handles Me.Load Dim monate As New List(Of VERAG_PROG_ALLGEMEIN.MyListItem) For i As Integer = 1 To 12 monate.Add(New VERAG_PROG_ALLGEMEIN.MyListItem(New Date(2000, i, 1).ToString("MMMM", New System.Globalization.CultureInfo("de-AT")), i.ToString())) Next MyComboBox1.fillWithMyListItem(monate) MyComboBox1._value = Date.Today.Month.ToString() MyTextBox1._value = Date.Today.Year.ToString() UpdateZeitraum() End Sub Private Sub MyComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles MyComboBox1.SelectedIndexChanged UpdateZeitraum() End Sub Private Sub MyTextBox1_TextChanged(sender As Object, e As EventArgs) Handles MyTextBox1.TextChanged UpdateZeitraum() End Sub Private Sub UpdateZeitraum() Dim jahr As Integer Dim monat As Integer If Not Integer.TryParse(MyTextBox1._value, jahr) Then Exit Sub If Not Integer.TryParse(MyComboBox1._value, monat) Then Exit Sub If jahr < 1 OrElse jahr > 9999 OrElse monat < 1 OrElse monat > 12 Then Exit Sub txtVon._value = New Date(jahr, monat, 1).ToString("dd.MM.yyyy") txtBis._value = New Date(jahr, monat, Date.DaysInMonth(jahr, monat)).ToString("dd.MM.yyyy") End Sub End Class