Das Notes Forum
Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: gfunkus am 05.05.03 - 12:31:02
-
Hallo,
Ich schreibe gerade an einem Agenten welcher mir aus einer Mail verschiedene Informationen heraussucht.
Leider klappt das nicht bei allen Informationen. Bei meinem unten aufgeführten BSP. Source findet er Informationen nur für den Searchstring Name! Bei allen anderen keine Ergebnisse habt ihr eine Vermutung was ich falsch mache???
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
i=0
For i=i 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 searchString$="" Then Exit Sub
Set doc = dc.GetFirstDocument
Set body = doc.GetFirstItem("Body")
Set rtnav = body.CreateNavigator
Set rtrange = body.CreateRange
'searchString$ = Inputbox$("Enter the search string", _
' "Search string")
If rtnav.FindFirstString(searchString$, _
RT_FIND_CASEINSENSITIVE) Then
Call rtrange.SetBegin(rtnav)
Messagebox rtrange.TextRun
' Messagebox rtrange.TextRun,, searchString$
Else
Messagebox searchString$,, "String not found"
End If
Next i
-
i=0
For i=i To 4
... besser: For i = 0 to 4
If searchString$="" Then Exit Sub
... kannst du dir sparen,da du zuvor eindeutige Zuweisungen machst
Set doc = dc.GetFirstDocument
... warum 5 x das doc neu initialisieren?
Set body = doc.GetFirstItem("Body")
Set rtnav = body.CreateNavigator
... ich würde auf jeden Fall eine Validierung des Body einbauen, ist es existent und ist es vom Type Richtext - ansonsten gilt noch das selbe wie zuvor beim Dokument - warum 5 x initialisieren?
... du verwedest in deinem For-Next immer nur das erste Dokument, ansonsten
Set doc = dc.GetFirstDocument
Set body = doc.GetFirstItem("Body")
If Not body is Nothing Then
If body.Type = 1 Then
' # RichTextItem
Else
' # kein RichText-Feld
Exit Sub ' # oder Function
End If
Else
Exit Sub '# oder Function
End If
For i = 1 to dc.Count
' # ... dein Code
' # ....
Set doc = dc.GetNextDocument(doc)
Next
ata
-
Nun gut, aber das Skript findet nur den Namen nicht die anderen im Dokument vorhandenenInformationen...???
-
andere lösungsansätze sind natürluch gerne gesehen... ;-)
-
... du hast in deinem Script nur einen Durchlauf, kannst also nur den ersten Begriff finden - schau dir mein Posting bei For...Next an...
... hast du denn meine Änderungen umgesetzt?
ata
-
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:"
-
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...
-
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.
-
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
-
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
-
kannst du mir evtl. zeigen wie er mir statt der msgbox "gefunden" jetzt einen P weiterschaltet und anzeigt???
-
zeigen...? Da steht doch der Code bereits 1:1 so drin und in fett gemarked die wichtigen Stellen zur Verdeutlichung wie man navigiert..ich weiß leider nicht, was ich Dir noch dazu jetzt zeigen soll. Ich weiß, daß ich es nicht so dolle erklären kann, denn ich mußte mich gestern selbst in das Thema reinbeißen. Allerdings werde ich keine Schulungen hier abhalten, sorry, nicht bös gemeint. Wenn Du Dich weiter einarbeiten möchtest, weil Du Verständnisprobleme hast, lese bitte das R6 Developer Handbook. Das hat mir gestern sehr gut geholfen, das neue Zeugs in R6 bzgl. der RichtText Klasse zu schnackeln. ;)
-
ich ahbe mich nochmal ein wenig schlau gemacht... und jetzt mache ich das ganze ganz anders. :-)
Und zwar mit :FindNthElement method ... :)
danke für eure hilfe.
-
(http://mysmilies.no-ip.com/mysmilies/daumen.gif)