Autor Thema: Skript von anderem Button in Skript-Bibliothek  (Gelesen 7239 mal)

Offline Mich90

  • Frischling
  • *
  • Beiträge: 19
Skript von anderem Button in Skript-Bibliothek
« am: 15.06.11 - 14:35:21 »
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:
Code
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:
Code
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:

Code
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
Zitat
Call UpdateDocuments(docAdmin)
genau das selbe gemacht werden, wie in dem Button ganz oben (vom Katalog).

Vielen vielen Dank  :-:
« Letzte Änderung: 16.06.11 - 10:55:32 von Mich90 »

klaussal

  • Gast
Re: Skript von anderem Button in Skript-Bibliothek
« Antwort #1 am: 15.06.11 - 14:39:07 »
Schon mal mit dem Debugger getestet ?

Offline Mich90

  • Frischling
  • *
  • Beiträge: 19
Re: Skript von anderem Button in Skript-Bibliothek
« Antwort #2 am: 15.06.11 - 14:54:07 »
Ja, ich habe das schon versucht, aber da konnte ich nichts erkennen. Ich weiß auch nicht, nach was ich suchen soll.  ???

klaussal

  • Gast
Re: Skript von anderem Button in Skript-Bibliothek
« Antwort #3 am: 15.06.11 - 15:10:15 »
Du musst ja "nur" nachverfolgen, ob der Code das macht, was er soll.

Offline Mich90

  • Frischling
  • *
  • Beiträge: 19
Re: Skript von anderem Button in Skript-Bibliothek
« Antwort #4 am: 15.06.11 - 15:21:18 »
Das ist es ja  ;D es sieht meiner Meinung nach richtig aus.

Die Frage ist, ob da vllt ein genereller Fehler drin ist.
Ich habe das Skript in der Bibliothek folgendermaßen gesetzt:
Statt des Button gibt es nun das Katalogdokument als Übergabeparameter. dann wird das uiDoc einfach nicht mehr neu gesetzt. Problem: auch, wenn ich das Skript im Katalogdokument ausführe, funktioniert es nicht (den ursprünglichen Button so umgebaut, dass das Skript mit dem aktuellen Dokument aufgerufen wird). Das verstehe ich nicht.  :-: Ich habe ja alles einfach kopiert.  :-:

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: Skript von anderem Button in Skript-Bibliothek
« Antwort #5 am: 15.06.11 - 16:25:22 »
Du verstehst sicherlich, dass man nicht mal so eben 500++ Zeilen Code auf Korrektheit prüfen kann. Was mir aufgefallen ist, dass Du im ursprünglichen Code mit oUIDoc As NotesUIDocument arbeitest.

In der Routine der Scriptbibliothek übergibst Du dann ein oUIDoc As NotesDocument, und an der spannendsten Stelle schreibst Du nur [alles identisch].

Wenn es identisch ist, kann es nicht funktionieren, ein NotesDocument ist kein NotesUIDocument. In der aufrufenden Routine übergibst Du auch ein NotesDocument (docAdmin). An der Stelle würde ich nochmal genauer nachsehen.

Offline Mich90

  • Frischling
  • *
  • Beiträge: 19
Re: Skript von anderem Button in Skript-Bibliothek
« Antwort #6 am: 16.06.11 - 08:14:19 »
Zitat
Du verstehst sicherlich, dass man nicht mal so eben 500++ Zeilen Code auf Korrektheit prüfen kann.
Nein, deswegen versuche ich das Problem ja eben möglichst einzugrenzen.

Ich habe nun versucht, den ursprünglichen Button des Katalogdokumentes so umzuschreiben, dass dieser über das Skript funktioniert und bin kläglich gescheitert. Ich sehe aber nicht, wo mein "Fehler" liegt. Es wird alles ausgeführt, aber wie auch zuvor scheint nicht alles zu funktionieren. Irgendetwas wird nicht erledigt. Es muss also an meiner Überführung des Skripts des Buttons in die Skriptbibliothek liegen. Das ist das einzige, was geändert wird (eben das Button-Skript und das oUIDoc im Skript übergeben wird, statt es mit Set oUIDoc = oWS.CurrentDocument zu setzen).

Hier mal die neue Version:
Button ursprünglich:
Code
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 der "neue Button" mit dem Skriptaufruf:
Code
Sub Click(Source As Button)
	
	Dim oWS As New NotesUIWorkspace	
	Dim oDB As NotesDatabase
	Dim oView As NotesView
	Dim oUIDoc As NotesUIDocument
	
	'aktuelle DB
	Set oSess = New NotesSession
	Set oDB = oSess.CurrentDatabase
	Set oUIDoc = oWS.CurrentDocument
	
	'aktuelle DB
	
	Set oSess = New NotesSession
	Set oDB = oSess.CurrentDatabase
	Set oUIDoc = oWS.CurrentDocument
	
	Call UpdateDocuments(oUIDoc)
	
End Sub

Und hier die Skriptbibliothek:
Code
Sub UpdateDocuments(oUIDoc As NotesUIDocument)
	
	'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 = 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

Wie gesagt, bis darauf, dass ich oUIDoc im Skript übergebe statt es zu setzen, habe ich nichts geändert. Ich arbeite jetzt auch im Skript mit NotesUIDocument.
Da sonst nichts geändert wurde, muss der Fehler doch in der Überführung vom alten Skriptbutton in den neuen + Bibliothek liegen, oder? :-:

klaussal

  • Gast
Re: Skript von anderem Button in Skript-Bibliothek
« Antwort #7 am: 16.06.11 - 08:17:47 »
Ich habe auch nicht wirklich "Lust" (und auch keine Zeit), das ganze Script Zeile für Zeile zu untersuchen.

Ich bin der Meinung, dass das Problem bei richtiger Anwendung des Debuggers zu lösen sein sollte.

Offline Axel

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.658
  • Geschlecht: Männlich
  • It's not a bug, it's Notes
Re: Skript von anderem Button in Skript-Bibliothek
« Antwort #8 am: 16.06.11 - 08:50:31 »
Du wirst hier kaum jemand finden, der Zeit hat sich durch den Code zu kämpfen und ihn auf irgendwelche Fehler zu untersuchen.

Schau dir den Code mit dem Debugger an und prüfe ob die Variablen die Werte enthalten, die sie zu dem entsprechenden Zeitpunkt haben sollen.

Du kannst den Code auch in einzelne Abschnitt unterteilen. D.h. führe ihn bis zu einem bestimmten Punkt aus und schau die das Ergebnis an ob es deinen Vorstellungen entspricht. Wenn ja, das häng das nächste Stück dran und teste wieder. So hangelst du dich dann Stück für Stück weiter.

Wenn dabei konkrete Fragen auftauchen sind wir gerne bereit zu helfen.

Axel
Ohne Computer wären wir noch lange nicht hinterm Mond!

Offline ata

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 5.092
  • Geschlecht: Männlich
  • drenaiondrufflos
    • Anton Tauscher Privat
Re: Skript von anderem Button in Skript-Bibliothek
« Antwort #9 am: 16.06.11 - 09:27:45 »
... der Code im neuen Button macht nicht wirklich Sinn - du dimensionierst Dinge, die du gar nicht brauchst.

Eigentlich wärst du mit ...

Dim oWS As New NotesUIWorkspace
Call UpdateDocuments( oWS.CurrentDocument )

... ausreichend bedient.

In deiner Funktion initialisiert du die aktuelle Datenbank über eine neue Session-Instanz. Das würde ich über das übergebene UIDoc machen...

Set oDB = UIdoc.Document.ParentDatabase

... der Rat der Vorredner ist gesetzt - nimm den Debugger - damit siehst du effizient, was wo nicht tickt... ;)

Toni
Grüßle Toni :)

Offline Mich90

  • Frischling
  • *
  • Beiträge: 19
Re: Skript von anderem Button in Skript-Bibliothek
« Antwort #10 am: 16.06.11 - 10:18:01 »
Nachdem ich jetzt eine Stunde über dem Debugger gehangen habe und wieder mal keine Unterschiede zwischen den Möglichkeiten gefunden habe, habe ich mir einen Workaround überlegt.

Es gibt die Möglichkeit mit JavaScript das onClick Event von einem Button aufzurufen. Das funktioniert, wenn man das in einem Button ausführt, auch schon ganz gut:
Code
document.forms[0].refreshButton.click()

Jetzt möchte ich diesen Code einfach vor oder nach dem Speichern durchführen, weshalb ich das in das PostSave Event geschrieben habe. Aber leider wird während des Skripts das PostSave Event nicht aufgerufen, obwohl ich doch mit
Code
Call docAdmin.Save(True,True)
das Dokument speichere? Es wird auf jeden Fall gespeichert, da die durch das Skript geänderten Werte gespeichert sind.
Warum wird das PostSave nicht aufgerufen? Gibt es eine Möglichkeit, das trotzdem zu tun?

Vielen Dank!

PS: Gibt man in dem PostSave eine MsgBox aus, so wird diese auch nicht angezeigt, das Postsave wird also nicht aufgerufen.
« Letzte Änderung: 16.06.11 - 10:22:56 von Mich90 »

klaussal

  • Gast
Re: Skript von anderem Button in Skript-Bibliothek
« Antwort #11 am: 16.06.11 - 10:25:01 »
Zitat
und wieder mal keine Unterschiede zwischen den Möglichkeiten gefunden habe,

Keine Unterschiede suchen, sondern den Code Step-by-Step durchgehen und bei jeder Zeile prüfen, ob das
Script die Felder richtig füllt, das richtige Dokument an der Angel hat, etc pp..

Offline Peter Klett

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.713
  • Geschlecht: Männlich
Re: Skript von anderem Button in Skript-Bibliothek
« Antwort #12 am: 16.06.11 - 10:37:44 »
PostSave (und auch QuerySave) wird nur aufgerufen, wenn das Dokument im Frontend gespeichert wird, Du speicherst das Dokument im Backend.

NotesDocument.Save -> Backend -> ohne Events
NotesUIDocument.Save -> Frontend -> mit Events

Offline Mich90

  • Frischling
  • *
  • Beiträge: 19
Re: Skript von anderem Button in Skript-Bibliothek
« Antwort #13 am: 16.06.11 - 10:55:23 »
Vielen Dank für den Tipp!

Lösung für Interessenten:

Code
Dim uiDocNew As NotesUIDocument
Set uiDocNew = ws.EditDocument(True, docAdmin)
			Call uiDocNew.Save()
			Call uiDocNew.Close(True)

 :)

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz