Guten Tag,
wieder mal ein kleines Problem von meiner Seite:
Ich habe ein Katalogdokument, welches ein anderes Dokument (mit dem gleichen Land) aktualisiert (über einen Button).
Diese Funktion wird jetzt auch in dem "Tochter"-Dokument benötigt, denn dieses Dokument kann nun auch bestimmte Werte des Katalogdokumentes ändern.
Also wäre der Ablauf: Tocherdokument ändert Katalogdokument -> Funktion des Katalogdokument zur Aktualisierung wird benötigt.
Rufe ich diese beiden Funktionen nacheinander auf, heißt ich verändere Daten im Tochterdokument und aktualisiere danach mit dem Katalogdokument, funktioniert alles. Das soll jetzt aber in einen Schritt zusammengefasst werden.
Deshalb habe ich die Funktion des Button des Katalogs in eine Skript-Bibliothek geschrieben, um diese dann im Tochterdokument aufzurufen. Ich denke aber, da habe ich etwas falsch gemacht, denn das Skript läuft zwar durch, aber es wird wohl nicht alles vom ursprünglichen Skript des Katalogs durchgeführt.
Hier das ursprüngliche Skript des Katalog-Buttons:
Sub Click(Source As Button)
'08.10.09 JE, Conet: neu
'25.12.09 JE, Conet: fldCol_used nach Year/Country-Doku schreiben
'Erzwingt die Neubelegung der Spaltenköpfe für die Budget-Matrix im
'Jahr/Länder-Dokument. In den abhängigen HIER-Dokumenten wird die Daten
'ebenfalls nachgeführt.
Dim oSess As NotesSession
Dim oWS As New NotesUIWorkspace
Dim oDB As NotesDatabase
Dim oView As NotesView
Dim oColl As NotesDocumentCollection
Dim oDoc As NotesDocument
Dim oUIDoc As NotesUIDocument
Dim sCou_ID_new As String
Dim sCou_Name_new As String
Dim sProd_Indications_new As String
Dim sProd_Products_new As String
Dim sProd_Brands_new As String
On Error Goto ErrHandling
'aktuelle DB
Set oSess = New NotesSession
Set oDB = oSess.CurrentDatabase
Set oUIDoc = oWS.CurrentDocument
'Aktualisierung der abhängigen Dokumente
'--------------------------------------------------------------------------
' Kopfdaten (spaltenweise) im Year/Country-Dokument
Dim aVar() As String
iCoumns_n = 48
Redim aVar(1 To iCoumns_n) As String
sCou_ID_new = oUIDoc.FieldGetText("fldCou_ID")
sCou_Name_new = oUIDoc.FieldGetText("fldCou_Name")
sProd_Indications_new = oUIDoc.FieldGetText("fldProd_Indications")
sProd_Products_new = oUIDoc.FieldGetText("fldProd_Products")
sProd_Brands_new = oUIDoc.FieldGetText("fldProd_Brands")
Print "GBD: Column header for " + sCou_Name_new + " will be changed ..."
Set oView = Nothing
Set oColl = Nothing
Set oDoc = Nothing
'CountryYear-Dokument aktualisieren (soweit vorhanden)
Set oView = oDB.GetView("vwLookupAllActiveCountry")
Set oColl = oView.GetAllDocumentsByKey(sCou_ID_new, True)
Set oDoc = oColl.GetFirstDocument
If Not(oDoc Is Nothing) Then
'Strings in Arrays umsetzen, um sie den Listenfeldern zuzuweisen zu können
'H1
For i = 1 To iCoumns_n
aVar(i) = Strtoken(sProd_Indications_new, NL, i)
Next
oDoc.fldMed00H1 = aVar
'H2
Erase aVar
Redim aVar(1 To iCoumns_n) As String
For i = 1 To iCoumns_n
aVar(i) = Strtoken(sProd_Products_new, NL, i)
Next
oDoc.fldMed00H2 = aVar
'H3
Erase aVar
Redim aVar(1 To iCoumns_n) As String
For i = 1 To iCoumns_n
aVar(i) = Strtoken(sProd_Brands_new, NL, i)
Next
oDoc.fldMed00H3 = aVar
oDoc.fldProd_i = Cint(oUIDoc.FieldGetText("fldCol_used"))
Call oDoc.Save(True, True)
End If
'HIER-Dokumente -----------------------------------------------------------
Dim aKey(1) As String
Dim sToken As String
Set oView = Nothing
Set oColl = Nothing
Set oDoc = Nothing
Set oView = oDB.GetView("vwLookupAllActiveHIERColumns")
aKey(0) = sCou_ID_new
'geänderte Indications
For i = 1 To iCoumns_n
aKey(1) = Trim(Str(i))
sToken = Strtoken(sProd_Indications_new, NL, i)
Set oColl = oView.GetAllDocumentsByKey(aKey, True)
If oColl.Count > 0 And i = 1 Then
Print "GBD: ... Indication field in " + Str(oColl.Count) + " " + sCou_Name_new + " documents"
End If
Set oDoc = oColl.GetFirstDocument
While Not(oDoc Is Nothing)
'ändert die Spalten-Dokumente für jedes Media sowie das Summen-Doku der Spalte
oDoc.fldInd_Name = sToken
Call oDoc.Save(True, True)
Set oDoc = oColl.GetNextDocument(oDoc)
Wend
Next
Set oColl = Nothing
Set oDoc = Nothing
'geänderte Products
For i = 1 To iCoumns_n
aKey(1) = Trim(Str(i))
sToken = Strtoken(sProd_Products_new, NL, i)
Set oColl = oView.GetAllDocumentsByKey(aKey, True)
If oColl.Count > 0 And i = 1 Then
Print "GBD: ... Product field in " + Str(oColl.Count) + " " + sCou_Name_new + " documents"
End If
Set oDoc = oColl.GetFirstDocument
While Not(oDoc Is Nothing)
oDoc.fldPro_Name = sToken
Call oDoc.Save(True, True)
Set oDoc = oColl.GetNextDocument(oDoc)
Wend
Next
Set oColl = Nothing
Set oDoc = Nothing
'geänderte Brands
For i = 1 To iCoumns_n
aKey(1) = Trim(Str(i))
sToken = Strtoken(sProd_Brands_new, NL, i)
Set oColl = oView.GetAllDocumentsByKey(aKey, True)
If oColl.Count > 0 And i = 1 Then
Print "GBD: ... Brand field in " + Str(oColl.Count) + " " + sCou_Name_new + " documents"
End If
Set oDoc = oColl.GetFirstDocument
While Not(oDoc Is Nothing)
oDoc.fldBra_Name = sToken
Call oDoc.Save(True, True)
Set oDoc = oColl.GetNextDocument(oDoc)
Wend
Next
Print "GBD: Refreshing has been successful complited"
m3:
Ende:
Exit Sub
ErrHandling:
Msgbox "GBD: Error Refresh Catalog Country: Line " + Cstr(Erl) + " Message: " + Error
Err = 0
Resume Ende
End Sub
Hier das, was ich dann als Skript-Bibliothek geschrieben habe:
Sub UpdateDocuments(oUIDoc As NotesDocument)
'Dim oSess As NotesSession
Dim oWS As New NotesUIWorkspace
Dim oDB As NotesDatabase
Dim oView As NotesView
Dim oColl As NotesDocumentCollection
Dim oDoc As NotesDocument
Dim sCou_ID_new As String
Dim sCou_Name_new As String
Dim sProd_Indications_new As String
Dim sProd_Products_new As String
Dim sProd_Brands_new As String
On Error Goto ErrHandling
'aktuelle DB
Set oSess = New NotesSession
Set oDB = oSess.CurrentDatabase
'Aktualisierung der abhängigen Dokumente
'--------------------------------------------------------------------------
' Kopfdaten (spaltenweise) im Year/Country-Dokument
Dim aVar() As String
iCoumns_n = 14
Redim aVar(1 To iCoumns_n) As String
...[alles identisch]...
ErrHandling:
Msgbox "GBD: Error Refresh Catalog Country: Line " + Cstr(Erl) + " Message: " + Error
Err = 0
Resume Ende
End Sub
So, und hier noch der Button in meinem Tochterdokument. Hier wird das Skript aufgerufen:
Sub Click(Source As Button)
Dim session As New NotesSession
Dim ws As New NotesUIWorkspace
Dim uidoc As NotesUIDocument
Dim db As NotesDatabase
Dim land As NotesItem
Dim feldZuKopierenIndication As NotesItem
Dim feldZuKopierenInhaltIndication As String
Dim feldZuKopierenAI As NotesItem
Dim feldZuKopierenInhaltAI As String
Dim feldZuKopierenBrand As NotesItem
Dim feldZuKopierenInhaltBrand As String
Set uidoc = ws.CurrentDocument
Set db = session.CurrentDatabase
Set doc = New NotesDocument ( db )
'hole aus dem geöffneten Dokument den Inhalt des zu kopierenden Feldes
Set feldZuKopierenIndication = uidoc.Document.GetFirstItem("fldProd_Indications_User")
feldZuKopierenInhaltIndication = feldZuKopierenIndication.Text
'Simikolons ersetzen
Dim feldZuKopierenInhaltIndicationOhneS As Variant
feldZuKopierenInhaltIndicationOhneS = Evaluate({@ReplaceSubstring("} & feldZuKopierenInhaltIndication & {"; ";" ; @NewLine)})
Set feldZuKopierenAI = uidoc.Document.GetFirstItem("fldProd_Products_User")
feldZuKopierenInhaltAI = feldZuKopierenAI.Text
Dim feldZuKopierenInhaltAIOhneS As Variant
feldZuKopierenInhaltAIOhneS = Evaluate({@ReplaceSubstring("} & feldZuKopierenInhaltAI & {"; ";" ; @NewLine)})
Set feldZuKopierenBrand = uidoc.Document.GetFirstItem("fldProd_Brands_User")
feldZuKopierenInhaltBrand = feldZuKopierenBrand.Text
Dim feldZuKopierenInhaltBrandOhneS As Variant
feldZuKopierenInhaltBrandOhneS = Evaluate({@ReplaceSubstring("} & feldZuKopierenInhaltBrand & {"; ";" ; @NewLine)})
uidoc.Document.fldMed00H1 = feldZuKopierenInhaltIndicationOhneS
uidoc.Document.fldMed00H2 = feldZuKopierenInhaltAIOhneS
uidoc.Document.fldMed00H3 = feldZuKopierenInhaltBrandOhneS
'Land-Feld speichern
Set land = uidoc.Document.GetFirstItem("fldCou_Name")
'Anzahl übertragen
Dim anzahl As NotesItem
Dim anzahlWert As String
Set anzahl = uidoc.Document.GetFirstItem("fldCol_used_User")
anzahlWert = anzahl.Text
'uidoc.Document.fldProd_i = anzahlWert
'hier werden alle Dokumente der Maske frmCatalog_Country durchlaufen
Dim coll As NotesDocumentCollection
Dim docAdmin As NotesDocument
Dim itemCopy As NotesItem
Set coll=db.search(|Form="frmCatalog_Country"|, Nothing, 0)
Set docAdmin=coll.getfirstdocument
While Not docAdmin Is Nothing
'prüfen, ob Land übereinstimmt
If docAdmin.GetFirstItem("fldCou_Name").Text = land.Text Then
'Inhalt des Feldes ersetzen
docAdmin.fldProd_Indications = feldZuKopierenInhaltIndicationOhneS
docAdmin.fldProd_Products = feldZuKopierenInhaltAIOhneS
docAdmin.fldProd_Brands = feldZuKopierenInhaltBrandOhneS
'Dokument speichern und schließen
Call docAdmin.Save(True,True)
End If
'nächstes Dokument
Set docAdmin=coll.getnextdocument(docAdmin)
Wend
Call uidoc.Document.Save(True,True) 'aktuelles Dokument am Ende noch speichern
'refreshing all documents
'ruft das Skript in dem richtigen Dokument auf
Set coll=db.search(|Form="frmCatalog_Country"|, Nothing, 0)
Set docAdmin=coll.getfirstdocument
While Not docAdmin Is Nothing
'prüfen, ob Land übereinstimmt
If docAdmin.GetFirstItem("fldCou_Name").Text = land.Text Then
Call UpdateDocuments(docAdmin)
End If
'nächstes Dokument
Set docAdmin=coll.getnextdocument(docAdmin)
Wend
End Sub
Kann mir jemand sagen, was ich vergessen habe? Es soll einfach bei
Call UpdateDocuments(docAdmin)
genau das selbe gemacht werden, wie in dem Button ganz oben (vom Katalog).
Vielen vielen Dank