Autor Thema: Suchen & Ersetzen Agent in Notes Script - Tipps für Anfänger?  (Gelesen 10809 mal)

Offline watschn

  • Junior Mitglied
  • **
  • Beiträge: 65
  • Geschlecht: Männlich
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.

Offline dirk_2909

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.173
  • Geschlecht: Männlich
  • Expand your Notes Client with ECM functionality..
    • d.velop
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)
Dirk

[IBM CLP R5]
[IBM CAD 6/6.5]
[IBM CAD 7]
[IBM CAD 8]


"Nein!! … Es genügt nicht Mails in einen anderen Ordner oder Datenbank zu verschieben, um sie zu archivieren!"

   
Disclaimer:
Ich Antworte nach besten Wissen und Gewissen. Sollte sich jemand durch meine Antwort persönlich angegriffen fühlen, ist dies nicht meine Absicht!
Ich bin auch nur ein Mensch, der Fehler machen kann. ....

Offline watschn

  • Junior Mitglied
  • **
  • Beiträge: 65
  • Geschlecht: Männlich
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

Offline dirk_2909

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.173
  • Geschlecht: Männlich
  • Expand your Notes Client with ECM functionality..
    • d.velop
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)
...


Dirk

[IBM CLP R5]
[IBM CAD 6/6.5]
[IBM CAD 7]
[IBM CAD 8]


"Nein!! … Es genügt nicht Mails in einen anderen Ordner oder Datenbank zu verschieben, um sie zu archivieren!"

   
Disclaimer:
Ich Antworte nach besten Wissen und Gewissen. Sollte sich jemand durch meine Antwort persönlich angegriffen fühlen, ist dies nicht meine Absicht!
Ich bin auch nur ein Mensch, der Fehler machen kann. ....

Driri

  • Gast
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")
...

Offline watschn

  • Junior Mitglied
  • **
  • Beiträge: 65
  • Geschlecht: Männlich
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.


Offline dirk_2909

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.173
  • Geschlecht: Männlich
  • Expand your Notes Client with ECM functionality..
    • d.velop
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)
Dirk

[IBM CLP R5]
[IBM CAD 6/6.5]
[IBM CAD 7]
[IBM CAD 8]


"Nein!! … Es genügt nicht Mails in einen anderen Ordner oder Datenbank zu verschieben, um sie zu archivieren!"

   
Disclaimer:
Ich Antworte nach besten Wissen und Gewissen. Sollte sich jemand durch meine Antwort persönlich angegriffen fühlen, ist dies nicht meine Absicht!
Ich bin auch nur ein Mensch, der Fehler machen kann. ....

Offline watschn

  • Junior Mitglied
  • **
  • Beiträge: 65
  • Geschlecht: Männlich
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

Offline dirk_2909

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.173
  • Geschlecht: Männlich
  • Expand your Notes Client with ECM functionality..
    • d.velop
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

Dirk

[IBM CLP R5]
[IBM CAD 6/6.5]
[IBM CAD 7]
[IBM CAD 8]


"Nein!! … Es genügt nicht Mails in einen anderen Ordner oder Datenbank zu verschieben, um sie zu archivieren!"

   
Disclaimer:
Ich Antworte nach besten Wissen und Gewissen. Sollte sich jemand durch meine Antwort persönlich angegriffen fühlen, ist dies nicht meine Absicht!
Ich bin auch nur ein Mensch, der Fehler machen kann. ....

Offline MadMetzger

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.052
  • Geschlecht: Männlich
  • f.k.a. Alexis Pyromanis
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

Offline watschn

  • Junior Mitglied
  • **
  • Beiträge: 65
  • Geschlecht: Männlich
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.

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Du brauchst doch vor dem @ReplaceSubstring nur die Bedingung anzugeben, die Du zu formulieren hast.

Bernhard

Offline watschn

  • Junior Mitglied
  • **
  • Beiträge: 65
  • Geschlecht: Männlich
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.

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
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 ...

Offline watschn

  • Junior Mitglied
  • **
  • Beiträge: 65
  • Geschlecht: Männlich
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

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
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

Offline watschn

  • Junior Mitglied
  • **
  • Beiträge: 65
  • Geschlecht: Männlich
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

Offline ata

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 5.092
  • Geschlecht: Männlich
  • drenaiondrufflos
    • Anton Tauscher Privat
... was funktioniert wie nicht? ...

Toni
Grüßle Toni :)

Offline watschn

  • Junior Mitglied
  • **
  • Beiträge: 65
  • Geschlecht: Männlich
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.

Offline dirk_2909

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.173
  • Geschlecht: Männlich
  • Expand your Notes Client with ECM functionality..
    • d.velop
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 ....
Dirk

[IBM CLP R5]
[IBM CAD 6/6.5]
[IBM CAD 7]
[IBM CAD 8]


"Nein!! … Es genügt nicht Mails in einen anderen Ordner oder Datenbank zu verschieben, um sie zu archivieren!"

   
Disclaimer:
Ich Antworte nach besten Wissen und Gewissen. Sollte sich jemand durch meine Antwort persönlich angegriffen fühlen, ist dies nicht meine Absicht!
Ich bin auch nur ein Mensch, der Fehler machen kann. ....

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz