Domino 9 und frühere Versionen > ND6: Entwicklung
Suche nach String???
Rob Green:
Check mal bitte das Script hier, weil ich denke, daß in Deinem Script ein prinzipieller Fehler mit der Textsuche drinliegt..
Du vergleichst einen beliebigen Vorgabe-Text (Deine Suchstrings) mit einem Text im Body (RichText). Was Notes Dir als Vergleichaus dem Body an Inhalt zurückgibt ist Paragraphenbezogen. Wenn nun der zu suchende Text am Anfang steht, klappt das (Heute = Heute ist ein schöner Tag). Aber nicht mehr, wenn "Heute" mittendrin steht, also "Heute <> Aber es ist Heute kein schöner Tag" Dat findet er nicht.
Daher mußt Du
a.) Paragraph für Paragraph vorgehen und dort den Text per Loop suchen (mW ist ein Paragraph für Notes dann ein neuer Paragraph, wenn die einzelnen Absätze mit RETURN getrennt sind !!! ..kann aber sogar der Style eines Absatzes sein...bin mir nicht zu sicher)
b.) nimm die Instr Function, die ist sowas wie Contains und führt zu
Heute = Heute ist ein schöner Tag
wie auch
Heute = Aber es ist Heute kein schöner Tag
Ok genug gelabert hier der Code:
(komplett kopieren, in einen Agent rein und dort ins Initialize Event einfügen, dabei das vorgegebene leere "Initialize" mit einschießen bis zum "End Sub" beim Einfügen, sonst doppelt)
'das ist Dein Global Part = Declarations
Dim session As NotesSession
Dim db As NotesDatabase
Dim dc As NotesDocumentCollection
Dim doc As NotesDocument
Dim body As NotesRichTextItem
Dim nav As NotesRichTextNavigator
Dim range As NotesRichTextRange
'das ist der eigentliche Code
Sub initialize
Set session = New NotesSession
Set db = session.CurrentDatabase
Set dc = db.UnprocessedDocuments
Set doc = dc.GetFirstDocument
If dc.Count = 0 Then
Messagebox "Nothing selected",, "No documents"
Exit Sub
End If
Set body = doc.GetFirstItem("Body")
found = False
Set range = body.CreateRange
Set nav = body.CreateNavigator
Set nextPar = nav.Clone
flag = nav.FindFirstElement(RTELEM_TYPE_TEXTPARAGRAPH)
While flag 'hier kommt das Durchnavigieren durch alle Textparagraphen
range.SetBegin nav 'Anfang des P.
nextPar.SetPosition nav
flag = nextPar.FindNextElement(RTELEM_TYPE_TEXTPARAGRAPH)
positionOfChar& = Instr(1, range.TextParagraph, "Bote:") 'hier das @Contains quasi
If positionOfChar& > 0 Then
found = True
If Not flag Then
' this is the last paragraph. Let our range go to the end.
Set range = body.CreateRange
range.SetBegin nav
Else
' Not the last paragraph. Set range to end at next paragraph.
range.SetEnd nextPar
End If
Msgbox "Gefunden"
End If
nav.SetPosition nextPar
Wend
End Sub
Das Bsp habe ich aus dem empfehlenswerten R6 Developer Handbook (LDD Red Books Sektion), ca. ab Seite ~720 abgewandelt. Was Du oben statt der fettgedruckten Zeile als Suchstring verwendest, ist dann Dein Code. Einfach anpassen. Ich nehme den statischen suchtext "Bote:"
gfunkus:
So,
Hier erstmal mein neues Skript:
Sub Initialize
Set session = New NotesSession
Set db = session.CurrentDatabase
Set dc = db.UnprocessedDocuments
If dc.Count = 0 Then
Messagebox "No document selected",, "No doc"
Exit Sub
End If
Set doc = dc.GetFirstDocument
Set body = doc.GetFirstItem("Body")
Set rtnav = body.CreateNavigator
Set rtrange = body.CreateRange
For i=0 To 4
If i=0 Then searchString$="Mitgliedsname:"
If i=1 Then searchString$="Name:"
If i=2 Then searchString$="Straße: "
If i=3 Then searchString$="Ort: "
If i=4 Then searchString$="Land: "
If rtnav.FindFirstString(searchString$, _
RT_FIND_CASEINSENSITIVE) Then
Call rtrange.SetBegin(rtnav)
Msgbox rtrange.TextParagraph
Else
Messagebox searchString$,, "String not found"
End If
Next i
'Hier später get nextdocument...
End Sub
@Ata es ist gewollt, das ich nur dieses eine erste gefundene Document suche. Dies reicht mir in diesem Test Versuch.
Um evtl. unklarheiten zu beseitigen:
Ich durchsuche ein Document (Mail) nach mehreren Stichworten...
in dieser reihenfolge..
1.Mitgliedsname:
2.Name:
3.Straße:
4.Ort:
5.Land:
dies ist der inhalt des Dokumentes(Mail):
Kontaktinformationen des Käufers:
Mitgliedsname: gmueller
Name: Georg Müller
Straße: jjjjweg 1
Ort: 79379 Müllhausen
Land: Deutschland
aber meine Suchroutine findet nur Georg Müller...
@Rob Green und wie zeige mit dieser Routine den gesuchten String an??? Also Mitgliedsname: usw. ohne das "Name:" sondern nur Georg Müller????
Danke für eure Hilfe...
Rob Green:
simple Antwort: ich weiß es nicht mit der obigen Methode.
Was Du benötigst ist eine Logik zum Durchparsen des reinen Textes.
Dabei scheint Dein Ende eines Wertes das RETURN zu sein.
Dann kommt ein neuer Bezeichner.
Logik:
- hol Dir den reinen Text per getformattedText (oder was nur gettext) aus der Richtext Klasse.
- suche nach dem ersten Bezeichner "Name:" zB
- ab dem Doppelpunkt bis zum Return Zeichen (sollte intern Chr(0) sein...schau mal ins Forum...R5 Entwicklung dazu..war genau so ein Thema mit den "was ist ein Wagenrücklaufzeichen", "neue Zeile"....) den Wert auslesen
- neuen Bezeichner suchen...
Dazu brauchst Du aber soweit ich das beurteile kann die neuen RT Klassen/Methoden von Notes nicht. Kann mich natürlich täuschen.
gfunkus:
Ich denke das es mit deiner Lösung geht... habe mal eine MSGBOX während des durchnavigieren der Paragraphen zwischen geschaltet und Notes sieht das dann in meinem Bsp. so.1. Paragraph Name: zweiter P. Georg Müller. Jetzt müsste ich theoretisch einfach nur nac hdem der String gefunden wurde einen P weiterschalten und PENG!?
Aber habe das Skript noch nicht 100% verstanden. Mit welchem Befehl schaltet man einen P. weiter???
Mfg
Rob Green:
P. weiterschalten...oben in dem Code (meine damit Posting von mir mit dem Schnippsel) steht wie man durch P´s navigiert:
Set range = body.CreateRange
Set nav = body.CreateNavigator
Set nextPar = nav.Clone
flag = nav.FindFirstElement(RTELEM_TYPE_TEXTPARAGRAPH)
While flag 'hier kommt das Durchnavigieren durch alle Textparagraphen
range.SetBegin nav 'Anfang des P.
nextPar.SetPosition nav
flag = nextPar.FindNextElement(RTELEM_TYPE_TEXTPARAGRAPH)
positionOfChar& = Instr(1, range.TextParagraph, "Bote:") 'hier das @Contains quasi
If positionOfChar& > 0 Then
found = True
If Not flag Then
' this is the last paragraph. Let our range go to the end.
Set range = body.CreateRange
range.SetBegin nav
Else
' Not the last paragraph. Set range to end at next paragraph.
range.SetEnd nextPar
End If
Msgbox "Gefunden"
End If
nav.SetPosition nextPar
Wend
Navigation
[0] Themen-Index
[#] Nächste Seite
[*] Vorherige Sete
Zur normalen Ansicht wechseln