Autor Thema: Suche nach String???  (Gelesen 5346 mal)

Offline gfunkus

  • Aktives Mitglied
  • ***
  • Beiträge: 224
  • Geschlecht: Männlich
  • www.atnotes.de! Hier werden sie geholfen.
Suche nach String???
« 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

Offline ata

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 5.092
  • Geschlecht: Männlich
  • drenaiondrufflos
    • Anton Tauscher Privat
Re:Suche nach String???
« Antwort #1 am: 05.05.03 - 13:51:56 »
Zitat

i=0
   
   For i=i To 4

... besser:  For i = 0 to 4

Zitat
If searchString$="" Then Exit Sub

... kannst du dir sparen,da du zuvor eindeutige Zuweisungen machst

Zitat
Set doc = dc.GetFirstDocument

... warum 5 x das doc neu initialisieren?

Zitat
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
Grüßle Toni :)

Offline gfunkus

  • Aktives Mitglied
  • ***
  • Beiträge: 224
  • Geschlecht: Männlich
  • www.atnotes.de! Hier werden sie geholfen.
Re:Suche nach String???
« Antwort #2 am: 05.05.03 - 14:26:22 »
Nun gut, aber das Skript findet nur den Namen nicht die anderen im Dokument vorhandenenInformationen...???

Offline gfunkus

  • Aktives Mitglied
  • ***
  • Beiträge: 224
  • Geschlecht: Männlich
  • www.atnotes.de! Hier werden sie geholfen.
Re:Suche nach String???
« Antwort #3 am: 05.05.03 - 15:29:43 »
andere lösungsansätze sind natürluch gerne gesehen... ;-)

Offline ata

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 5.092
  • Geschlecht: Männlich
  • drenaiondrufflos
    • Anton Tauscher Privat
Re:Suche nach String???
« Antwort #4 am: 05.05.03 - 16:55:11 »
... 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
« Letzte Änderung: 05.05.03 - 16:57:23 von ata »
Grüßle Toni :)

Offline Rob Green

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.651
  • Geschlecht: Männlich
    • Meipor
Re:Suche nach String???
« Antwort #5 am: 05.05.03 - 17:20:25 »
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:"
« Letzte Änderung: 05.05.03 - 17:22:51 von Rob Green »
Vielleicht verdirbt Geld wirklich den Charakter.
Auf keinen Fall aber macht Mangel an Geld ihn besser.
(John Steinbeck)

Meiporblog: http://www.meipor.de/blog
allg. Unternehmerblog: http://www.m-e-x.de/blog

Offline gfunkus

  • Aktives Mitglied
  • ***
  • Beiträge: 224
  • Geschlecht: Männlich
  • www.atnotes.de! Hier werden sie geholfen.
Re:Suche nach String???
« Antwort #6 am: 06.05.03 - 09:54:57 »
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...


Offline Rob Green

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.651
  • Geschlecht: Männlich
    • Meipor
Re:Suche nach String???
« Antwort #7 am: 06.05.03 - 10:05:45 »
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.
Vielleicht verdirbt Geld wirklich den Charakter.
Auf keinen Fall aber macht Mangel an Geld ihn besser.
(John Steinbeck)

Meiporblog: http://www.meipor.de/blog
allg. Unternehmerblog: http://www.m-e-x.de/blog

Offline gfunkus

  • Aktives Mitglied
  • ***
  • Beiträge: 224
  • Geschlecht: Männlich
  • www.atnotes.de! Hier werden sie geholfen.
Re:Suche nach String???
« Antwort #8 am: 06.05.03 - 10:26:58 »
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

Offline Rob Green

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.651
  • Geschlecht: Männlich
    • Meipor
Re:Suche nach String???
« Antwort #9 am: 06.05.03 - 10:33:04 »
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
Vielleicht verdirbt Geld wirklich den Charakter.
Auf keinen Fall aber macht Mangel an Geld ihn besser.
(John Steinbeck)

Meiporblog: http://www.meipor.de/blog
allg. Unternehmerblog: http://www.m-e-x.de/blog

Offline gfunkus

  • Aktives Mitglied
  • ***
  • Beiträge: 224
  • Geschlecht: Männlich
  • www.atnotes.de! Hier werden sie geholfen.
Re:Suche nach String???
« Antwort #10 am: 06.05.03 - 11:11:51 »
kannst du mir evtl. zeigen wie er mir statt der msgbox "gefunden" jetzt einen P weiterschaltet und anzeigt???

Offline Rob Green

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.651
  • Geschlecht: Männlich
    • Meipor
Re:Suche nach String???
« Antwort #11 am: 06.05.03 - 11:16:23 »
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.  ;)
Vielleicht verdirbt Geld wirklich den Charakter.
Auf keinen Fall aber macht Mangel an Geld ihn besser.
(John Steinbeck)

Meiporblog: http://www.meipor.de/blog
allg. Unternehmerblog: http://www.m-e-x.de/blog

Offline gfunkus

  • Aktives Mitglied
  • ***
  • Beiträge: 224
  • Geschlecht: Männlich
  • www.atnotes.de! Hier werden sie geholfen.
Re:Suche nach String???
« Antwort #12 am: 06.05.03 - 12:36:08 »
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.

Offline Rob Green

  • Freund des Hauses!
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.651
  • Geschlecht: Männlich
    • Meipor
Re:Suche nach String???
« Antwort #13 am: 06.05.03 - 13:35:20 »
Vielleicht verdirbt Geld wirklich den Charakter.
Auf keinen Fall aber macht Mangel an Geld ihn besser.
(John Steinbeck)

Meiporblog: http://www.meipor.de/blog
allg. Unternehmerblog: http://www.m-e-x.de/blog

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz