Das Notes Forum

Domino 9 und frühere Versionen => ND7: Entwicklung => Thema gestartet von: watschn am 04.04.08 - 10:25:28

Titel: Suchen & Ersetzen Agent in Notes Script - Tipps für Anfänger?
Beitrag von: watschn am 04.04.08 - 10:25:28
Hallo zusammen,

ich versuche eine Suchen & Ersetzen Funktion zu programmieren.
Dazu habe ich eine Maske mit den Feldern SSuchen und SErsetzen erstellt, die ich als Dialogbox aufrufe. In die Felder werden die Suchkriterien eingegeben, durch Klick auf einen Button wird dann ein Agent aufgerufen, der die Suchen & Ersetzen Funktion auf die aktuelle Ansicht anwenden soll. Soweit die Theorie  ;)

Ich bringe diesen Agenten leider nicht so wirklich zum laufen. Für das eigentliche Suchen & Ersetzen benutze ich @ReplaceSubstring. Jetzt muss ich eben die Werte meiner beiden Felder in diese Formel übernehmen. Da mir hierzu in der Formel Sprache kein Weg bekannt ist, will ich das Ganze mittels Evaluate in Notes Script umsetzen. Mein Code Ansatz ist folgender:

Sub Initialize
   
   Dim workspace As New NotesUIWorkspace
   Dim such As String
   Dim ersetz As String
   Dim varResult As Variant
   Set uidoc = workspace.CurrentDocument
   Set doc = uidoc.Document   
   Set uiview = workspace.Currentview
   
   
   Set collection = db.AllDocuments
   Set doc = collection.GetFirstDocument
   
   Such = doc.SSuchen
   Ersetz = doc.SErsetzen
   
   Const strFormula = |@ReplaceSubstring( VKenntnis; Such; Ersetz)|
   
   varResult = Evaluate(strFormula, uiview)
   uiview.VKenntnis = varResult
   
End Sub


Wenn ich versuche dies auszuführen, so erhalte ich die Fehlermeldung "Object does not contain an object". Da ich bei einer Dialogbox keinen Debugger nutzen kann und zugegebnermassen auch ein blutiger Anfänger in Sachen Notes Programmierung bin, komme ich jetzt gar nicht mehr weiter. Bei meinem Code fehlt´s warscheinlich an mehreren Stellen.
Titel: Re: Suchen & Ersetzen Agent in Notes Script - Tipps für Anfänger?
Beitrag von: dirk_2909 am 04.04.08 - 10:47:02
Zitat
Const strFormula = |@ReplaceSubstring( VKenntnis; Such; Ersetz)|
   
   varResult = Evaluate(strFormula, uiview)

Das kann so nicjht gehen.
Oder gibt es in dem Dokument, dass Du gerade bearbeitest (  ;) ) die Felder "Such" und "Ersetz" ?

Und schau Dir Evaluate mal genau in der Designerhilfe an - die ist gut  8)
Titel: Re: Suchen & Ersetzen Agent in Notes Script - Tipps für Anfänger?
Beitrag von: watschn am 04.04.08 - 11:52:57
Ich hab mir die Hilfe zu Evaluate zigfach angesehen, werde aber daraus nicht schlau. Momentan versuche ich es mit festen Werten

varRet=Evaluate (|@ReplaceSubstring( VKenntnis; "Michael"; "Hans")|)

Geht ebenfalls nicht. Würde es ja liebend gern mit Formel Sprache machen und mir das Evaluate sparen. Da hab ich aber das Problem wie ich die Variablen auslesen kann.

Zu den Feldern "Such" und "Ersetz"
Ich habe in meiner Maske die Felder SSuch und SErsetz. Im Script weise ich doch dann die Werte zu.
   Such = doc.SSuchen
   Ersetz = doc.SErsetzen
Titel: Re: Suchen & Ersetzen Agent in Notes Script - Tipps für Anfänger?
Beitrag von: dirk_2909 am 04.04.08 - 12:36:16
Aus der Hilfe:
Zitat
Evaluate ( macro [ , object ] )
Elements
macro
A string expression specifying the text of a Lotus software application macro, in the syntax that the product recognizes. Refer to the Lotus software documentation for the correct syntax of the macro.
If the macro text is in a constant or string literal, the Lotus software application needs to do only initial processing of the macro once, at compile time, while variable strings incur that processing each time the macro is evaluated.
object
Optional. The name of a product object. Refer to the product documentation to determine if the macro requires an object, and what the object is.

Also, wenn Du Änderungen an einem Dokument machen möchtest, musst Du auch auf ein entsprechendes Objekte referenzieren.

Eine uiview ist bestimmt nicht das entsprechende korrekte Object.
Also:

Set doc = collection.GetFirstDocument
   
Such = doc.SSuchen
Ersetz = doc.SErsetzen
   
Const strFormula = |@ReplaceSubstring( VKenntnis; Such; Ersetz)|
   
varResult = Evaluate(strFormula, uiview)
Const C_strFormula = |@ReplaceSubstring( VKenntnis; SSuchen ; SErsetzen)|
varResult = Evaluate(c_strFormula, doc)
...


Titel: Re: Suchen & Ersetzen Agent in Notes Script - Tipps für Anfänger?
Beitrag von: Driri am 04.04.08 - 13:01:47
Du kannst das auch mit Replace ohne die Formelsprache machen.

z.B. :

...
Dim var1 As Variant, var2 As Variant
...
var1 = doc.GetItemValue("Text")
var2 = Replace(var1, "A", "B")
...
Titel: Re: Suchen & Ersetzen Agent in Notes Script - Tipps für Anfänger?
Beitrag von: watschn am 07.04.08 - 11:18:24
Hallo nochmal, ich bin übers Wochenende nicht zu programmieren gekommen.
Hab den Tipp von Dirk_2909 probiert, bekomme aber immer noch die Meldung "Variant does not contain an object".

Nochmal zum Verständniss, ich möchte die Änderungen auf alle Dokumente meiner Ansicht anwenden. Nicht nur auf ein einzelnes Dokument.
Mit @ReplaceSubstring funktioniert das ganz prima. Nur muss ich für jede Namensänderung den Agent umprogrammieren. Um dies zu vereinfachen wollte ich eben die Namensauswahl per Dialogbox machen.

Titel: Re: Suchen & Ersetzen Agent in Notes Script - Tipps für Anfänger?
Beitrag von: dirk_2909 am 07.04.08 - 11:23:10
Wenn Du @ReplaceSubstring benutzt, dann doch sicher in einem Agenten, der als Ziel Markierte Dokumente oder Alle Dokumnte in der Ansicht hat.
"intern" werden dann die Dokumente einzeln verarbeitet.

Wenn Du das mit LS machst, musst Du selber die einzelnen Doks verarbeiten.

Also  :
db.UnprocessedDocuments ...
set doc = coll.getFirstDocument ...
While not doc is nothing .....
 (nur so als Ansatzhilfe)
Titel: Re: Suchen & Ersetzen Agent in Notes Script - Tipps für Anfänger?
Beitrag von: watschn am 07.04.08 - 13:17:51
Stimmt, der ganze Vorgang wird per Agent ausgeführt und ich habe dort "Alle Dokumente in der Ansicht" eingestellt. Das funktioniert doch dann auch, wenn ich es mit LS mache?

Jetzt läuft mein Agent immerhin ohne Fehlermeldung durch. Allerdings greift er wohl auf das falsche DOC zu. Bin immer im Rückwantwort-Dokument, die Änderungen sollen aber für das Antwortdok angewendet werden. Ich habe mir hierfür eine Ansicht erstellt, die ich auswähle bevor ich den Agent starte. Funktioniert aber nicht.

Das ist im moment mein Code
Sub Initialize
   Dim workspace As New NotesUIWorkspace
   Dim varResult As Variant
   Dim session As New NotesSession
   Dim collection As NotesDocumentCollection
   Set db = session.CurrentDatabase   
   Set uidoc = workspace.CurrentDocument
   Set uiview = workspace.Currentview
   Set collection = db.AllDocuments
   Set doc = collection.GetFirstDocument
   
   'Const C_strFormula = |@ReplaceSubstring( VKenntnis; SSuchen ; SErsetzen)|
   Const C_strFormula = |@ReplaceSubstring( VKenntnis; "Michael" ; "Hans")|
   varResult = Evaluate(c_strFormula, doc)
   
End Sub
Titel: Re: Suchen & Ersetzen Agent in Notes Script - Tipps für Anfänger?
Beitrag von: dirk_2909 am 07.04.08 - 14:02:46
Zitat
Set collection = db.AllDocuments

Ist hier nicht so sinnvoll, wenn Du auf Dokumente/markierte Dokument in der Ansicht gehst ;-)

Ersetzt das mal durch:

set coll = db.UnprocessedDocuments

lese Dir auch unbedingt das entsprechende Dokument in der Designerhilfe durch !!

Dann benötigst Du noch eine Schleife, um alle Dokumente der Collection zu verarbeiten:

While not( doc is Nothing )
....
set doc = ......
Wend

Titel: Re: Suchen & Ersetzen Agent in Notes Script - Tipps für Anfänger?
Beitrag von: MadMetzger am 07.04.08 - 18:38:05
Hm... Vielleicht liege ich auch ganz falsch, aber kann man sich das alles nicht sparen, wenn man hier mit Namensfeldern arbeitet? Dann würde der Administrationsprozess die Änderungen automatisch mitmachen, wenn sich der Name eines Benutzers ändert. Das geht natürlich nur, wenn du in den betroffenen Feldern nur Notes-Benutzer enthalten haben kannst. Dauert dann zwar, aber man vergisst es auch nicht...  ;D
Titel: Re: Suchen & Ersetzen Agent in Notes Script - Tipps für Anfänger?
Beitrag von: watschn am 08.04.08 - 15:47:48
Ne, also ich krieg das nicht hin. Verwende ich db.UnprocessedDocuments, so greift er auf mein Haupt-Dokument zu, ich brauche aber das Antwortdokument. Wenn ich dann Testweise den Agenten auf ein Feld im Haupt-Dokument anwende, so bekomme ich nur die Meldung "Operation failed", im Debugger kann ich keine Fehlerursache erkennen. Mir fehlt´s dann doch zu sehr an den nötigen Kenntnissen um das jetzt auf die Schnelle noch hinzubekommen.

Ich werde jetzt für jeden Suchen & Ersetzen Vorgang meinen Agenten einfach umschreiben. Hierzu hätte ich noch eine Frage.

FIELD VKenntnis := @ReplaceSubstring(VKenntnis;"Michael";"Hans");
FIELD hVKennzeichen := ("Vorgangskennzeichen123");
SELECT @All

Wenn ich das so ausführe, dann wird für alle Dokumente in meiner DB das Vorgangskennzeichen gesetzt. Ich brauch das aber nur für die Dokumente, bei denen der Name ersetzt wurde. Geht das?

@MadMetzger
Also wenn ich das richtig verstanden habe, dann bringt mir dein Tipp leider nichts. Die Notes User bleiben ja bestehen. Es soll nur User1 gegen User2 im jeweiligen Dokument ausgetauscht werden.
Titel: Re: Suchen & Ersetzen Agent in Notes Script - Tipps für Anfänger?
Beitrag von: koehlerbv am 08.04.08 - 16:05:02
Du brauchst doch vor dem @ReplaceSubstring nur die Bedingung anzugeben, die Du zu formulieren hast.

Bernhard
Titel: Re: Suchen & Ersetzen Agent in Notes Script - Tipps für Anfänger?
Beitrag von: watschn am 08.04.08 - 16:17:28
Sorry, aber das versteh ich jetzt nicht so ganz Welche Bedingung hab ich vor dem @ReplaceSubstring denn zu formulieren? Die Funktion soll doch auf die gesamte Datenbank angewandt werden und das geht mittels Agent.

Wenn dann bräuchte ich ja eine Bedingung nach Anwendung von @ReplaceSubsting. Wenn ein Wert ersetzt wurde, dann soll bei dem betreffenden Dokument das Vorganskennzeichen geschrieben werden.
Titel: Re: Suchen & Ersetzen Agent in Notes Script - Tipps für Anfänger?
Beitrag von: koehlerbv am 08.04.08 - 16:23:12
Das hast Du aber missverständlich beschrieben ...

Das geht natürlich auch hinterher, wenn Du eine Veränderung im Dokument dokumentieren willst. Du brauchst Du ja nur vor dem @ReplaceSubstring den alten Wert in eine Variable einzulesen und danach diese Werte zu vergleichen.

Aber vielleicht beschreibst Du das selber nochmal genauer, damit auch wir, die wir nicht direkt mit Deinem Problem beschäftigt sind, da wirklich durchsehen. Und bei einer guten Beschreibung erkennt man oft schon selbst die Lösung  ;)

Bernhard

PS: Wenn Du einen ansprechbaren Namen unter Deine Postings setzt, dann ist die Motivation zum Antworten auch grösser ...
Titel: Re: Suchen & Ersetzen Agent in Notes Script - Tipps für Anfänger?
Beitrag von: watschn am 08.04.08 - 16:44:15
Ok, nochmal eine Erklärung :-)

Ich habe einen kleinen Agent erstellt, der ein Feld nach einer bestimmten Zeichenfolge durchsucht und diese dann durch eine andere Zeichenfolge ersetzt. Hierzu verwende ich die @ReplaceSubstring Formel. Der Agent wird auf die gesamte DB angwandt, es werden aber natürlich nur die Dokumete geändert, die den gesuchten Wert enthalten. Wird ein Dokument auf diese Weise geändert (also bei einem "Treffer"), so muss ein zusätzlich noch ein sog. Vorgangskennzeichen gesetzt werden. Es wird also einfach nur ein Text in das Feld "Vorgangskennzeichen" geschrieben. Das brauche ich zum Ausführen eines weiteren Agenten der nachts läuft und eben nur Dokuemte mit Vorgangskennzeichen bearbeiten soll.

Ich habe vor der letzten Antwort den Code meines Agenten gepostet. Funktioniert einwandfrei, nur wird hier für jedes Dokument in der DB dieses Vorgangkennzeichen gesetzt. Das ist aber falsch, ich will das Zeichen nur bei den Dokumenten, die der Agent geändert hat.

Ich hoffe das ist jetzt etwas verständlicher fomuliert ;-)

Die Problemschilderung am Anfang meines Postes bezieht sich darauf, dass ich für meinen Agenten gerne eine Eingabemaske hätte. Daran scheitere ich aber mangels Script Kenntnissen.

Und klar hab ich auch einen Namen :-)

Michael
Titel: Re: Suchen & Ersetzen Agent in Notes Script - Tipps für Anfänger?
Beitrag von: koehlerbv am 08.04.08 - 17:47:08
Hallo Michael,

natürlich kann man das auch machen - beschrieben hatte ich das ja schon.
Folgender Code ist aus dem Gedächtnis gepinselt ohne Check in einer realen DB, sollte aber den Ansatz verdeutlichen können:

VKenntnis_Orig := VKenntnis;
FIELD VKenntnis := @ReplaceSubstring(VKenntnis;"Michael";"Hans");
FIELD hVKennzeichen := @If (VKenntnis_Orig != VKenntnis; ("Vorgangskennzeichen123"); hVKennzeichen);

HTH,
Bernhard
Titel: Re: Suchen & Ersetzen Agent in Notes Script - Tipps für Anfänger?
Beitrag von: watschn am 09.04.08 - 11:21:43
Ok, auf das hätte ich fast noch selbst kommen können ;-)

Ich habe nun folgenden Agenten:

SELECT @IsResponseDoc ;

Such:= "Michael";
Ersetz:= "Hans";

VKenntnis_Orig := VKenntnis;
FIELD VKenntnis := @ReplaceSubstring(VKenntnis;Such;Ersetz);

VZuarbeit_Orig := VZuarbeit;
FIELD VZuarbeit:= @ReplaceSubstring(VZuarbeit;Such;Ersetz);

VErledigung_Orig := VErledigung;
FIELD VErledigung:= @ReplaceSubstring(VErledigung;Such;Ersetz);

VBerechtigt_Orig := VBerechtigt;
FIELD VBerechtigt:= @ReplaceSubstring(VBerechtigt;Such;Ersetz);

FIELD hVKennzeichen := @If (VKenntnis_Orig != VKenntnis | VZuarbeit_Orig!=VZuarbeit | VErledigung_Orig!=VErledigung
|VBerechtigt_Orig!=VBerechtigt;("Vorgangskennzeichen123"); hvKennzeichen);


Es sollen mehrere Felder nach der Zeichenfolge geprüft werden. Ich will aber die Suchkriterien nur einmal eingeben und dann in den @ReplaceSubsting Befehlen die Variablen "Such" und "Ersetz" verwenden.

So wie ich das habe funktioniert´s aber nicht. Was ist hier der Fehler?

Gruß,
Michael
Titel: Re: Suchen & Ersetzen Agent in Notes Script - Tipps für Anfänger?
Beitrag von: ata am 09.04.08 - 12:18:35
... was funktioniert wie nicht? ...

Toni
Titel: Re: Suchen & Ersetzen Agent in Notes Script - Tipps für Anfänger?
Beitrag von: watschn am 09.04.08 - 13:12:15
Ok, das war ein Schnellschuss meinerseits. Der Agent läuft jetzt so wie er soll :-)

Das Problem wäre dann soweit gelöst. Bis auf die Dialogbox, auf die ich aber dann verzichten werde.
Titel: Re: Suchen & Ersetzen Agent in Notes Script - Tipps für Anfänger?
Beitrag von: dirk_2909 am 09.04.08 - 13:15:51
Warum musst Du auf die Dialogbox verzichten?

Lass doch die Werte über eine Dialogbox eingeben/auswählen.

Du solltest nur keine Formelagenten mit der Dialgbox aufrufen. Der läuft über alle Doks und ruft bei jedem die Box auf.

Besser LS-Agent mit UnpriocessedDocuments etc. ;-)

oder vor Aufruf des Formelagenten eine Dialogbox und dann die Werte in die ini ....
Titel: Re: Suchen & Ersetzen Agent in Notes Script - Tipps für Anfänger?
Beitrag von: watschn am 09.04.08 - 13:31:50
Ich habe einfach das Problem, dass ich diese Funktion jetzt brauche. Und bevor ich gar kein Ergebnis habe, begnüge ich mich eben mit meiner Variante. Meine Kenntnisse reichen im Moment nicht aus, um mit vertretbaren Zeitaufwand eine bessere Lösung zu bekommen.

Danke für die zahlreiche Hilfe.

Michael
Titel: Re: Suchen & Ersetzen Agent in Notes Script - Tipps für Anfänger?
Beitrag von: dirk_2909 am 09.04.08 - 13:45:42
Die Lösung wurde hier schon gepostet.
Man muss nur ein wenig selber (!!) machen.

Für ungeübte : Dauer ca. 20min - ansonsten 5