Ist zwar schon ein älterer Thread, habe die Datei aus der Sandbox in einem aktuellen Projekt eingesetzt. Da das Script nicht lief, habe ich die bei mir auftretenden (Notes 5.0.11) Bugs im Originalscript der Sandbox gefixt:
- Der erste Primärschlüssel der CSV-Datei wird erkannt.
- Die Erkennung „Mit“ oder „Ohne Textbegrenzungszeichen“ funktioniert jetzt.
- Die globalen Einstellungen stehen im Agenten, nicht im Script der Scriptbibliothek.
- Kommentare eingedeutscht.
- Der letzte Fehler fällt mir gar nicht mehr ein ;-)
Anleitung:
- Neue Datenbank.
- Maske mit Namen ‚F_NAME’ erstellen.
- In dieser Maske die Felder ’SSN’, ‚FIRST’ und ‚LAST’ erstellen.
- Ansicht mit Namen ‚ V_LOOKUPBYSSN’ erstellen.
- Drei Spalten namens ’SSN’, ‚FIRST’ und ‚LAST’ erstellen und mit den gleichnamigen Feldern füttern.
- Agenten erstellen (Werte siehe unten).
- Script-Bibliothek erstellen (Werte unten).
- Agent starten, CSV wählen und warten.
Hoffe, ich habe nix vergessen.
Agent 'CSV-Import'Wann soll dieser Agent gestartet werden:
Manuell aus dem Menü 'Aktionen'
Options:
Option Public
Use "import"
Initialize:
'Original Script by LDD user [http://www.cadencesolutions.com/]
'Sandbox [http://www-10.lotus.com/ldd/sandbox.nsf/ecc552f1ab6e46e4852568a90055c4cd/7d3285a6721418ed85256df2006561e9?OpenDocument&Highlight=0,csv]
Dim csv As CSVFile
Dim st_Fields(1 To 3) As String
st_Fields(1) = "SSN"
st_Fields(2) = "FIRST"
st_Fields(3) = "LAST"
Set csv = New CSVFile("","F_NAME", st_Fields)
' WENN DIE WERTE SYNCHRONISIERT WERDEN SOLLEN (VERGLEICH, OB DATEN AKTUELL), DANN 'TRUE', ANSONSTEN 'FALSE'
csv.Synchronize = True
'NAME DER ANSICHT, DIE ZUR SYNCHRONISATION BENUTZT WERDEN SOLL
csv.SynchronizeView = "V_LOOKUPBYSSN"
'WENN DOKUMENTE GELÖSCHT WERDEN SOLLEN, SOBALD SIE IN DER CSV-DATEI FEHLEN, DANN 'TRUE', ANSONSTEN 'FALSE'
csv.SynchronizeDeletions = True
'WENN DIE CSV-DATEI EINE TITELZEILE BESITZT, DANN 'TRUE', ANSONSTEN 'FALSE'
csv.SkipTitleLine = True
'MIT WELCHEM ZEICHEN WERDEN DIE DATEN IN DER CSV-DATEI VONEINANDER GETRENNT
csv.Delimiter = ","
csv.NumChanges = 0
csv.NumAdds = 0
csv.NumDeletes = 0
Call csv.Import
Script-Bibliothek ''import'Options:
Declarations:
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