an mich ist die Bitte herangetragen worden, eine Excel-Tabelle durch eine Notes-DB abzulösen, da hierdurch viele Vorteile gegeben sind.
Im Moment steht der Umsetzung gedanklich nur ein unregelmäßiger Import von Daten aus einer txt-Datei entgegen.
In der Datenbank sind derzeit ca. 4.500 Datensätze.
Bei jedem ca. halbjährlichen Import kommen ca. 300 - 500 Datensätze hinzu.
Bei dem Import müsste anhand von einer eindeutigen Kundennummer und einer weiteren eindeutigen Nummer geprüft werden, ob dieser Datensatz bereits existiert.
Hallo Markus,
für den Test, ob ein Dokument bereits vorhanden ist, könntest Du Dir eine spezielle Ansicht basteln. Diese sollte in der ersten Spalte eine Kombination aus Kundennummer und der anderen eindeutigen Nummer enthalten. Angenommen, die beiden Nummern wären numerisch und maximal 10 Stellen lang, dann könntest Du Dir in der Ansicht einen String daraus machen, so dass aus der KDNR 123456789 und der anderen Nummer 63050000 z.B. der String "01234567890063050000" in der ersten Spalte wird.
Im Agent, welcher die TXT-Datei einließt würde ich wie folgt vorgehen
Alle Dokumente durchgehen und z.B. das Feld bearbeitung="" setzen.
Lese TextDatei
Bilde SuchString aus Kundennummer und anderer eindeutigen Nummer aus TextDatei
Über view.GetDocumentByKey(Suchstring) prüfen, ob Dokument existiert
Dokument existiert
ja --> Änderungen vornehmen
feld bearbeitung auf "geändert" setzen
Dokument existiert nicht
Dokument anlegen und mit Werten füllen
feld bearbeitung auf "neu" setzen
Ende Lese TextDatei
Über das (optionale) Feld "bearbeitung" könntest Du dann noch Ansichten basteln, in denen nur alle geänderten / hinzugefügten Dokumente aufgelistet werden.
Ich kann Dir hier noch ein paar Code-Samples anhängen. Zum einen eine Klasse für das Einlesen von CSV-Dateien:
Class CSVImport
Public EOF As Boolean
Public strDelimiter As String
Sub New(strCSVFile As String, strDelimiter As String)
Me.strDelimiter = strDelimiter
Dim strFeldname As String
Dim vFeldArray As Variant
Dim i As Integer
Me.EOF = False
If Not FileExists(strCSVFile) Then
Me.EOF = True
Exit Sub
End If
fileNum% = FreeFile()
Open strCSVFile For Input As fileNum%
If EOF(fileNum%) Then
Me.EOF = True
Exit Sub
End If
Line Input #fileNum%, strZeile
vFeldArray = Split(strZeile,strDelimiter)
If UBound(vFeldArray) = 0 Then
Me.EOF = True
Exit Sub
End If
For i=LBound(vFeldArray) To UBound(vFeldArray)
strFeldname = VereinfacheUeberschrift$(vFeldArray(i))
strFeldliste(strFeldname) = i
Next
End Sub
Sub ReadNext
Line Input #fileNum%, strZeile
vDatenArray = Split(strZeile, strDelimiter)
If EOF(fileNum%) Then
Me.EOF = True
Close fileNum%
End If
End Sub
' Übergabe von Feldnummer oder Feldname, Rückgabe von Feldinhalt
Function Feldwert(vFeld As Variant) As String
Dim iFeldNummer As Integer
Dim strFeldname As String
Dim strFeldwert As String
iFeldNummer = -1
If DataType(vFeld) = 8 Then ' Feldname wurde übergeben
strFeldname = vFeld
strFeldname = VereinfacheUeberschrift$(strFeldname)
If IsElement(strFeldliste(strFeldname)) Then
iFeldNummer = strFeldliste(strFeldname)
End If
Else
iFeldNummer = vFeld
End If
If iFeldNummer >= LBound(vDatenArray) And iFeldNummer <= UBound(vDatenArray) Then
strFeldwert = vDatenArray(iFeldNummer)
strFeldwert = VereinfacheDaten$(strFeldwert )
Else
strFeldwert = ""
End If
Feldwert = strFeldwert
End Function
Public Function FileExists(strFile As String) As Boolean
FileExists = True
Dim dummy As Long
Err=0
On Error Resume Next
dummy = FileLen(strFile)
If Err <> 0 Then
FileExists = False
End If
On Error GoTo 0
End Function
' Entferne Anführungszeichen, außerdem alles in groß
Private Function VereinfacheUeberschrift$(Ueberschrift$)
Dim src$(0)
Dim fnd$(0)
Dim rep$(0)
Dim ret As Variant
src$(0) = Ueberschrift$
fnd$(0) = {"}
rep$(0) = ""
ret = Replace(src$,fnd$,rep$)
VereinfacheUeberschrift$ = Trim(UCase(ret(0)))
End Function
' Entferne Anführungszeichen und Zeilenumbrüche
Private Function VereinfacheDaten$(Daten$)
Dim src$(0)
Dim fnd$(1)
Dim rep$(1)
Dim ret As Variant
src$(0) = Daten$
fnd$(0) = Chr$(10)+Chr$(13)
fnd$(1) = {"}
rep$(0) = " "
rep$(1) = ""
ret = Replace(src$,fnd$,rep$)
VereinfacheDaten$ = ret(0)
End Function
End Class
und dann noch ein Code-Gerüst für das eben beschriebene:
Sub Initialize
Dim obCSV As New CSVImport(strFilename, Chr$(9) )
Do Until obCSV.EOF
obCSV.ReadNext
strSuche = Right$("0000000000" + obCSV.Feldwert("Kundennummer"),10)
GoSub BearbeiteDoc
Loop
Exit Sub
' Pro gelesener CSV-Zeile
BearbeiteDoc:
Set view = session.Currentdatabase.GetView( "AnsichtFuerSuche" )
Set doc = view.GetDocumentByKey ( strSuche, True )
If doc Is Nothing Then ' Dokument existiert nicht
Set doc = New NotesDocument ( session.CurrentDatabase )
doc.Form = "Maske"
doc.Feld1 = obCSV.Feldwert("Feld1")
doc.Feld2 = obCSV.Feldwert("Feld2")
else
doc.Feld1 = obCSV.Feldwert("Feld1")
doc.Feld2 = obCSV.Feldwert("Feld2")
End If
Call doc.Save(True,False)
Return
End Sub