Das Notes Forum
Domino 9 und frühere Versionen => ND7: Entwicklung => Thema gestartet von: Bruce Willis am 03.02.09 - 22:49:11
-
Hallo,
könnte man mit einer Formel-Schleife das Folgende tun?
Es gibt eine Maske mit 10 sichtbaren Text-Feldern für Kommentare der Benutzer.
Komment_1 ... Komment_10
Es gibt noch 10 versteckte Felder, wo der vorherige Inhalt der sichtbaren Felder gespeichert ist:
Komment_1_1 ... Komment_1_10
Beim Speichern des Dokuments werden alle Änderungen in die History geschrieben.
Zehnmal eigentlich dasselbe:
newEntry := Komment_1 ;
@If( Komment_1 != Komment_1_1 ; @Do (
@SetField("History"; @NewLine + newEntry + History ) ;
@SetField("Komment_1_1" ; Komment_1 )
); @Success );
....
newEntry := Komment_10 ;
@If( Komment_10 != Komment_1_10 ; @Do (
@SetField("History"; @NewLine + newEntry + History ) ;
@SetField("Komment_1_10" ; Komment_10 )
); @Success );
Für eine Idee wäre ich sehr dankbar.
Gruß
Leo
-
Willst Du den Stunt wirklich in Formelsprache machen? Nicht wirklich, oder? Nimm LotusScript.
Zehn Kommentarfelder (das ist starr!) und dazu zehn zur Historie und dann noch ein History Field itself - das klingt auch nicht nach der architektonischen Weisheit letzter Schluss. Aber für wirkliches Urteil weiss ich natürlich zu wenig über Deine Anwendung.
Schleifen kannst Du per Formeln bauen, auch ein @SetField kann damit bedient werden. Für Deine "Komment"-Items müsstest Du aber von hinten durch die Brust wieder das aktuelle Dokument auslesen - nö, das ist weder schön noch rationell.
Wie gesagt: Nimm LotusScript. Dann wird es ein übersichtlicher Wenigzeiler.
Bernhard
-
Ob nun das Ganze sinnvoll ist, kann ich nicht beurteilen, ich denke aber, die Formeln kann man mit einer Schleife ersetzen.
-Werner
@For( i := 1; i <= 10; i := i + 1;
iText := @Text(i);
newEntry := @GetField("Komment_" + iText);
@If( newEntry != @GetField("Komment_1_" + iText );
@Do (
@SetField("History"; @NewLine + newEntry + History ) ;
@SetField("Komment_1_" + iText ; newEntry )
);
""
)
);
-
Hallo Bernhard,
Danke für Dein schnelles Feedback.
Zehn Kommentarfelder (das ist starr!) und dazu zehn zur Historie und dann noch ein History Field itself - das klingt auch nicht nach der architektonischen Weisheit letzter Schluss.
Wie würdest Du etwas ähnliches (egal was) FLEXIBEL realisieren? :)
weiss ich natürlich zu wenig über Deine Anwendung.
Es geht um ein Formular (unter anderem eine Tabelle mit 10 Zeilen und mehreren Spalten). Eine der Spalten ist für Kommentare vorgesehen.
Die Formulare werden von mehreren Leuten bearbeitet.
Man möchte - unter anderem - wissen, wann, wer und was eingetragen, geändert oder gelöscht hat.
Gruß
Leo
-
Ob nun das Ganze sinnvoll ist, kann ich nicht beurteilen, ich denke aber, die Formeln kann man mit einer Schleife ersetzen...
Hallo Werner,
VIELEN DANK :knuddel:
für Deine schnelle Antwort und tolle Lösung !!!
Gruß
Leo
--------
WannWer := @Text(@Now;"D0T1") + " - " + @Name( [CN] ; @UserName ) ;
@For( i := 1; i <= 10; i := i + 1;
iText := @Text(i);
newEntry := WannWer + ", zum " + iText + ".Kommentar: " + @GetField("Komment_" + iText);
newValue := @GetField("Komment_" + iText);
oldValue := @GetField("Komment_1_" + iText);
@If( newValue != oldValue ;
@Do (
@SetField("History"; @NewLine + newEntry + History ) ;
@SetField("Komment_1_" + iText ; newValue )
);
""
)
);
-
Wie würdest Du etwas ähnliches (egal was) FLEXIBEL realisieren? :)
Egal was? Anbei ein Code Snippet, welches n * 3 Felder einer Maske im Frontend durchgeht und zwar keine History schreibt, aber leere Felder zwischen Feld n(x1) bis n(x3) und n+1(x1) und n+1(x3) entfernt. Das Prinzip ist aber genau identisch:
For iCounter = 1 To (iMaxLines - 1)
If uidocCurrent.FieldGetText ("SkillBez" & Cstr (iCounter)) = "" Then
'Copy each following line to the line before:
For iCounter2 = iCounter To (MaxLine - 1)
Call uidocCurrent.FieldSetText ("SkillBez" & Cstr (iCounter2), uidocCurrent.FieldGetText ("SkillBez" & Cstr (iCounter2 + 1)))
Call uidocCurrent.FieldSetText ("SkillNote" & Cstr (iCounter2), uidocCurrent.FieldGetText ("SkillNote" & Cstr (iCounter2 + 1)))
Call uidocCurrent.FieldSetText ("SkillBem" & Cstr (iCounter2), uidocCurrent.FieldGetText ("SkillBem" & Cstr (iCounter2 + 1)))
Next
'Delete the last line:
Call uidocCurrent.FieldSetText ("SkillBez" & Cstr (MaxLine), "")
Call uidocCurrent.FieldSetText ("SkillNote" & Cstr (MaxLine), "")
Call uidocCurrent.FieldSetText ("SkillBem" & Cstr (MaxLine), "")
'... and check this line again - maybe, the next line was empty, too:
iLoops = iLoops + 1
If iLoops < iMaxLines Then
iCounter = iCounter - 1
End If
End If
Next
Ich habe das vor ca. acht oder neun Jahren geschrieben und würde heute auch den "inneren Teil" durch eine Schleife ersetzen, aber ich denke, so kannst Du noch besser das Prinzip erkennen.
Also: Genau 20 Zeilen, um (in diesem Fall) 150 Felder im Frontend aufzuräumen (wobei das bei 5000 Feldern immer noch diese 20 Zeilen wären).
HTH,
Bernhard