| Class CSVFile |
| Public FileName As String |
| Public Delimiter As String |
| Public ImportDatabase As NotesDatabase |
| Public ImportForm As String |
| Public ImportFields As Variant ' ARRAY DER FELDNAMEN - INDEX MUSS MIT 1 STARTEN |
| Public RefreshForm As Variant |
| Public ShowProgress As Variant |
| Public QuoteDelimiter As Variant ' IST EIN DOPPELTER ANFÜHRUNGSSTRICH, DER VERWENDET WIRD, UM WERTE MIT KOMMAS ZU TRENNEN |
| Public Synchronize As Variant ' SOLLTE IMPORT ANHAND PRIMÄRSCHLÜSSEL SYNCHRONISIERT WERDEN |
| Public NumKeyFields As Integer ' WIE VIELE DER ERSTEN FELDER SIND PRIMÄRSCHLÜSSEL |
| Public SynchronizeView As String ' NAME DER ANSICHT, MIT DER DIE PRIMÄRSCHLÜSSEL SYNCHRONISIERT WERDEN |
| Public SynchronizeDeletions As Variant |
| Public SkipTitleLine As Variant |
| Public NumChanges As Integer |
| Public NumAdds As Integer |
| Public NumDeletes As Integer |
| |
| |
| Private SynchUNIDS List As String |
| |
| Sub New(st_FileName As String, st_FormName As String, v_FieldArray As Variant) |
| Dim lib_s As New NotesSession |
| Dim lib_ws As New NotesUIWorkspace |
| Dim v_ReturnValue As Variant |
| |
| If Trim(st_FileName) = "" Then ' WENN KEINE DATEI VORGEGEBEN WERDEN, NACH DATEI FRAGEN |
| v_ReturnValue = lib_ws.OpenFileDialog(False, "Wählen Sie eine CSV Datei", "CSV Files|*.CSV", "C:\") |
| If Not Isarray(v_ReturnValue) Then Exit Sub |
| If v_ReturnValue(0) = "" Then Exit Sub |
| st_FileName = v_ReturnValue(0) |
| End If |
| |
| Me.FileName = st_FileName |
| Set Me.ImportDatabase = lib_s.CurrentDatabase |
| Me.ImportForm = st_FormName |
| Me.ImportFields = v_FieldArray |
| Me.RefreshForm = True |
| Me.ShowProgress = True |
| Me.QuoteDelimiter = True |
| Me.NumKeyFields = 1 |
| Me.NumChanges = 0 |
| Me.NumAdds = 0 |
| Me.NumDeletes = 0 |
| |
| End Sub |
| |
| Sub Import |
| Dim i_FileNum As Integer |
| Dim st_LineData As String |
| Dim i_ImportCount As Integer |
| Dim vw_Lookup As NotesView |
| Dim doc_List As NotesDocument |
| |
| If Trim(Me.FileName) = "" Then |
| Messagebox "Kein Dateiname spezifiziert.", 16, "Error" |
| Exit Sub |
| End If |
| |
| If Me.Synchronize Then |
| Set vw_Lookup = Me.ImportDatabase.GetView(Me.SynchronizeView) |
| If vw_Lookup Is Nothing Then |
| Messagebox "Unzulässige Synchronisationsansicht.", 16, "Error" |
| Exit Sub |
| End If |
| |
| Call vw_Lookup.Refresh ' ERNEUERT DIE ANSICHT, DAMIT ALLE NEUEN DATEN SICHTBAR SIND. |
| |
| If Me.SynchronizeDeletions Then |
| |
| ' ERSTELLT LISTE |
| |
| Set doc_List = vw_Lookup.GetFirstDocument |
| Do While Not doc_List Is Nothing |
| Me.SynchUNIDS(doc_List.UniversalID) = False |
| Set doc_List = vw_Lookup.GetNextDocument(doc_List) |
| Loop |
| End If |
| End If |
| |
| If Not Isarray(Me.ImportFields) Then |
| Messagebox "Unzulässiger Feldnamen-Array.", 16, "Error" |
| Exit Sub |
| End If |
| |
| i_FileNum = Freefile() |
| |
| Open Me.FileName For Input As i_FileNum |
| |
| |
| i_ImportCount = 0 |
| |
| ' DIE TITELLINIE WIRD IN DER CSV-DATEI ÜBERSPRUNGEN (WENN WERT AUF 'TRUE') |
| If Not Eof(i_FileNum) And Me.SkipTitleLine Then Line Input #i_FileNum, st_LineData |
| |
| Do While Not Eof(i_FileNum) |
| i_ImportCount = i_ImportCount + 1 |
| If Me.ShowProgress Then Print "Importiere Datensatz # " & Cstr(i_ImportCount) |
| |
| Line Input #i_FileNum, st_LineData ' HOLT EINE DATEN-ZEILE AUS DER DATEI |
| |
| If Not Me.Synchronize Then |
| If Not ImportLine(st_LineData) Then |
| Messagebox "Fehler beim Import.", 16, "Error" |
| Close i_FileNum |
| Exit Sub |
| End If |
| Else |
| If Not SynchLine(st_LineData) Then |
| Messagebox "Fehler bei der Synchronisation.", 16, "Error" |
| Close i_FileNum |
| Exit Sub |
| End If |
| End If |
| Loop |
| |
| Close i_FileNum |
| |
| If Me.Synchronize And Me.SynchronizeDeletions Then |
| Forall x In Me.SynchUNIDS |
| If x = "False" Then ' WENN DER WERT DER ANSICHT NICHT IN DER CSV-DATEI GEFUNDEN WIRD, DATENSATZ LÖSCHEN |
| Call Me.ImportDatabase.GetDocumentByUNID(Listtag(x)).Remove(True) |
| Me.NumDeletes = Me.NumDeletes + 1 |
| End If |
| End Forall |
| End If |
| |
| Print "Import vollständig. " & Cstr(i_ImportCount) & " Datensätze verarbeitet. " & Cstr(Me.NumAdds) & " hinzugefügt " & Cstr(Me.NumChanges) & " geändert " & Cstr(Me.NumDeletes) & " gelöscht" |
| End Sub |
| |
| ' IMPORTIERT DIE DATEN - ERSTELLT EIN NEUES DOKUMENT FÜR JEDE LINIE |
| Private Function ImportLine(st_LineData As String) As Variant |
| Dim v_ValueArray As Variant |
| Dim i As Integer |
| Dim doc_Current As NotesDocument |
| |
| ImportLine = True |
| |
| v_ValueArray = ReturnValueArray(st_LineData) ' FASST DIE DATEN IN EINEN ARRAY |
| |
| Set doc_Current = Me.ImportDatabase.CreateDocument |
| |
| For i = Lbound(Me.ImportFields) To Ubound(Me.ImportFields) |
| Call doc_Current.ReplaceItemValue(Me.ImportFields(i), v_ValueArray(i)) |
| Next |
| |
| doc_Current.Form = Me.ImportForm |
| If Me.RefreshForm Then Call doc_Current.ComputeWithForm(False, True) |
| Call doc_Current.Save(True, False) |
| |
| End Function |
| |
| ' IMPORTIERT DIE DATEN - SYNCHRONISIERT DAS DOKUMENT AUF BASIS DER PRIMÄRSCHLÜSSEL |
| Private Function SynchLine(st_LineData As String) As Variant |
| Dim v_ValueArray As Variant |
| Dim v_Key As Variant |
| Dim v_TempKey (1 To 10) As Variant |
| Dim i As Integer |
| Dim doc_Current As NotesDocument |
| Dim vw_Lookup As NotesView |
| Dim v_FieldChange As Variant |
| |
| SynchLine = True |
| |
| v_ValueArray = ReturnValueArray(st_LineData) ' BREAK UP THE DATA INTO AN ARRAY |
| |
| ' ERSTELLT DEN SCHLÜSSEL |
| For i = 1 To Me.NumKeyFields |
| v_TempKey(i) = v_ValueArray(i) |
| Next |
| 'v_Key = Fulltrim(v_TempKey) |
| |
| ' INSTANZIIERT DIE ANSICHT |
| Set vw_Lookup = Me.ImportDatabase.GetView(Me.SynchronizeView) |
| |
| ' DURCHSUCHT DIE ANSICHT |
| 'Set doc_Current = vw_Lookup.GetDocumentByKey(v_Key, True) |
| Set doc_Current = vw_Lookup.GetDocumentByKey(v_ValueArray(1), True) |
| |
| If doc_Current Is Nothing Then ' ERSTELLT EIN NEUES DOKUMENT |
| |
| Set doc_Current = Me.ImportDatabase.CreateDocument |
| |
| For i = Lbound(Me.ImportFields) To Ubound(Me.ImportFields) |
| Call doc_Current.ReplaceItemValue(Me.ImportFields(i), v_ValueArray(i)) |
| Next |
| |
| doc_Current.Form = Me.ImportForm |
| If Me.RefreshForm Then Call doc_Current.ComputeWithForm(False, True) |
| Call doc_Current.Save(True, False) |
| Me.NumAdds = Me.NumAdds + 1 |
| Else ' WENN EIN DOKUMENT MIT DEM GLEICHEN PRIMÄRSCHLÜSSEL GEFUNDEN WIRD > PRÜFT, OB NOTWENIGKEIT ZUR AKTUALISIERUNG GEGEBEN IST. |
| |
| If Me.SynchronizeDeletions Then |
| Me.SynchUNIDS(doc_Current.UniversalID) = True ' MARKIERT DAS DOKUMENT, SO DASS ES NICHT GELÖSCHT WIRD |
| End If |
| |
| v_FieldChange = False |
| |
| For i = Lbound(Me.ImportFields) To Ubound(Me.ImportFields) |
| If Cstr(doc_Current.GetItemValue(Me.ImportFields(i))(0)) <> Cstr(v_ValueArray(i)) Then |
| v_FieldChange = True |
| Call doc_Current.ReplaceItemValue(Me.ImportFields(i), v_ValueArray(i)) |
| End If |
| Next |
| |
| If v_FieldChange Then |
| If Me.RefreshForm Then Call doc_Current.ComputeWithForm(False, True) |
| Call doc_Current.Save(True, False) |
| Me.NumChanges = Me.NumChanges + 1 |
| End If |
| |
| End If |
| |
| End Function |
| |
| Private Function ReturnValueArray(st_LineData) As Variant ' FASST EINE ZEILE DER CSV-DATEI IN EINEN ARRAY |
| Dim i As Integer |
| Dim doc_Current As NotesDocument |
| Dim i_NextDelimiter As Integer |
| Dim v_DoubleQuotes As Variant |
| Dim v_ValueArray(1 To 150) As Variant |
| |
| For i = 1 To Ubound(Me.ImportFields) |
| |
| v_DoubleQuotes = False |
| |
| If Me.QuoteDelimiter = True And Left(st_LineData, 1) = Chr(34) Then ' WENN WERT IN DOPPELTEN ANFÜHRUNGSSTRICHEN STEHT |
| |
| i_NextDelimiter = Instr(st_LineData,Chr(34) & Me.Delimiter) ' SCHLIESSENDES TRENNZEICHEN IST EIN ANDERER SATZ VON DOPPELTEN ANFÜHRUNGSSTRICHEN + TRENNZEICHEN |
| |
| v_DoubleQuotes = True |
| |
| Else |
| i_NextDelimiter = Instr(st_LineData, Me.Delimiter) |
| End If |
| |
| If i_NextDelimiter = 0 Then ' KEIN TRENNZEICHEN MEHR GEFUNDEN, SO DASS ES DER LETZTE WERT SEIN MUSS |
| |
| If v_DoubleQuotes Then |
| v_ValueArray(i) = Mid(st_LineData, 2, Len(st_LineData) - 2) ' ENTFERNT DOPPELTE ANFÜHRUNGSSTRICHE |
| Else |
| v_ValueArray(i) = st_LineData |
| End If |
| Exit For |
| End If |
| |
| If v_DoubleQuotes Then |
| |
| v_ValueArray(i) = Mid(st_LineData, 2, i_NextDelimiter - 2) |
| |
| Else |
| v_ValueArray(i) = Trim(Left(st_LineData, i_NextDelimiter - 1)) |
| |
| End If |
| |
| If v_DoubleQuotes = True Then |
| st_LineData = Trim(Mid(st_LineData, i_NextDelimiter + 2)) |
| Else |
| st_LineData = Trim(Mid(st_LineData, i_NextDelimiter + 1)) |
| End If |
| |
| Next |
| |
| ReturnValueArray = v_ValueArray |
| |
| End Function |
| End Class |