Das Notes Forum

Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: reraru am 10.05.05 - 10:10:06

Titel: Lotus Script und Textfeld
Beitrag von: reraru am 10.05.05 - 10:10:06
Moin zusammen!

Ich habe in einer Maske ein Textfeld und ein Datumsfeld.
Diese nutze ich als Protokoll für eine kleine Anwendung.

Bisher habe ich das Protokoll ausschliesslich per Formelsprache
befüllt. Nun möchte ich aber an einer Stelle einen Eintrag mit Lotus
Script ergänzen.

Hier erstmal die Formel:

@If(prot_Date="";@SetField("prot_Date";@Now);@SetField("prot_Date"; prot_Date : @Now));
@SetField("prot_Action";prot_Action : "Auftrag wurde erfasst / bearbeitet");


Ich füge also jeden Eintrag in einer neuen Zeile an. In der Formel mach ich das mit dem ":" als Trennzeichen.

In Lotus Script habe ich es mal ähnlich versucht:


Call doc.ReplaceItemValue("prot_Date", prot_Date + ":" + Now)
Call doc.ReplaceItemValue("prot_Action", prot_Action + ":" + "Der Auftrag wurde komplett abgeschlossen")


Leider ohne Erfolg!

Kann mir jemand sagen wie ich das realisieren kann?

Vielen Dank im Voraus!

Gruß

René
Titel: Re: Lotus Script und Textfeld
Beitrag von: Semeaphoros am 10.05.05 - 10:17:49
Leider ohne Erfolg!


Perfekte Fehlerbeschreibung, man weiss gleich, was schief läuft ......  :-[



Das sind Multivalue-Felder, die lassen sich in Script so nicht bearbeiten. Zudem sind Listen in Script deutlich anders realisiert als in @Formel. Im Grunde genommen ist es nicht sehr sinnvoll, hier die Formel durch Script zu ersetzen.

Zum Thema selber: Schau mal in der Hilfe die Methoden GetItemValue und AppendToTextList an, das geht dann mal fürs Textfeld. Fürs Datumsfeld wird es komplizierter, da muss man das alte Feld in einen Array auslesen und dann wieder über ReplaceItemValue zurückschreiben.
Titel: Re: Lotus Script und Textfeld
Beitrag von: reraru am 10.05.05 - 10:36:31
Hi Semeaphoros!

Vielen Dank für die prompte Antwort.

Es ist so, das ich bei bestimmten Aktionen (Formeln) einen Protokolleintrag hinzufüge.

Im Querysave der Maske wir dann per Script abgeprüft ob alle Statusfelder den Status "abgeschlossen" tragen. Sollte dies bei allen Statusfeldern der Fall sein, so wollte ich
im Protokoll den Eintrag "Der gesamte Auftrag wurde abgeschlossen" ausgeben.

Weiss nicht wie ich das sonst steuern soll. Könnte ich evtl. per Lotus Script einen Agenten
aufrufen? Dieser sollte nur dann ausgeführt werden wenn bei den Statusfeldern der Status abgeschlossen ist.

Gibt es alternativen?

Gruß René
Titel: Re: Lotus Script und Textfeld
Beitrag von: Semeaphoros am 10.05.05 - 10:40:51
Schau Dir in LotusScript die Evaluate Funktion/Statement an
Titel: Re: Lotus Script und Textfeld
Beitrag von: reraru am 10.05.05 - 13:46:59
Mahlzeit!

Ich bin ersteinmal verwirrt. Werde mal schauen wie ich das Problem nun löse.

Vielen Dank erstmal!

Gruß René
Titel: Re: Lotus Script und Textfeld
Beitrag von: koehlerbv am 11.05.05 - 00:04:56
Ich würde sagen, Du kannst es machen wir Pfarrer Nolte: So oder so.

Hier die Variante mit LS:
Code
Sub Click (Source As Button)
	
	Dim ws As New NotesUIWorkspace
	Dim docCurrent As NotesDocument
	Dim vDTList As Variant
	Dim vActDT As Variant
	
	Set docCurrent = ws.CurrentDocument.Document
	
	If Not (Isdate (docCurrent.DTList (0) )) Then
		docCurrent.DTList = Now
	Else
		vDTList = docCurrent.DTList
		vActDT = Now
		vDTList = Arrayappend (vDTList, vActDT)
		docCurrent.DTList = vDTList 
	End If
	
	Call ws.ViewRefresh
	
End Sub

Zu beachten ist, das Arrayappend eine etwas fragile Konstruktion ist (ich habe dafür eine eigene Routine und verzichte komplett auf Arrayappend): Wenn Du nicht den Umweg über vActDT = Now gehst, sondern als zweiten Parameter gleich Now einsetzt, kannst Du Quincy (R5) oder dem NSD (R6) bei der Arbeit zusehen - Notes geht gnadenlos krachen. Vorteil: Wenn Du danach den Desktop komprimierst (ein Totalcrash ist eine hervorragende Möglichkeit dafür  ;D ), dann wird dieser anschliessend wieder wunderbar klein.. Nur nicht wundern, dass einige Icon längst gelöschter DBs wieder auftauchen  ;)


Und hier die kürzere Variante: Der Rückgriff auf die mächtigen und meist effektiven @functions via Evaluate:
Code
Sub Click (Source As Button)
	
	Dim ws As New NotesUIWorkspace
	Dim docCurrent As NotesDocument
	Dim vDTList As Variant
	Dim vActDT As Variant
	
	Set docCurrent = ws.CurrentDocument.Document
	
	If Not (Isdate (docCurrent.DTList (0) )) Then
		docCurrent.DTList = Evaluate ("@Now")
	Else
		docCurrent.DTList = Evaluate ("DTList : @Now", docCurrent)
	End If
	
	Call ws.ViewRefresh
	
End Sub

Anmerkung:
Ich habe für diese Snippets auf ErrorHandler verzichtet. Das ist m.E. für Prinzipbeispile dieser Art unnötig. Ausserdem hat jeder anständige Programmierer da sowieso eigene Standards.
Und: Die Variante mit Evaluate lässt sich mittels @Trim noch verfeinern und auf eine (eigentliche) Zeile eindampfen. Logisch. Für die Gegenüberstellung habe ich es aber mal so gelassen.

HTH,
Bernhard