Stripping Data from a Lotus Note

I will be receiving a Lotus Note and need to build an agent to strip the fields and assign the data to variables.  The body of each note will be something like this:

Contact:  John Doe
Phone:  555-1234
Location:  San Antonio, TX
Problem:  Client is trying to start windows and is receiving an application error.
Severity:  High

I need to get the values for each field from the body of the note.  The problem is, I'm not sure how long each field will be.  Surely I'm not the only person that has tried this.  Does anyone have some sample code that I can review?  Thanks.
UPRRDevelopersAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

Bill-HansonCommented:
Here's some LotusScript code that will do the trick.

There are 3 pieces of code below:

 - An agent that works on the current, open memo.
 - GetMemoText function needed by the agent.
 - ParseData function needed by the agent.

Sub Initialize
	
	Dim ws As New NotesUIWorkspace
	Dim memo As NotesDocument
	Dim body As String
	Dim contact As String, phone As String, location As String, problem As String, severity As String
	Set memo = ws.CurrentDocument.Document
	body = GetMemoText(memo)
	
	contact = ParseData(body, "Contact:", Chr(10))
	phone = ParseData(body, "Phone:", Chr(10))
	location = ParseData(body, "Location:", Chr(10))
	problem = ParseData(body, "Problem:", Chr(10))
	severity = ParseData(body, "Severity:", Chr(10))	
	
	Msgbox "Contact: " & contact & Chr(10) & _
	"Phone: " &  phone & Chr(10) & _
	"Location: " &  location & Chr(10) & _
	"Problem: " &  problem & Chr(10) & _
	"Severity: " &  severity
	
End Sub
 
 
Function GetMemoText(memo As NotesDocument)
	
	Dim sess As New NotesSession
	sess.ConvertMime = True
	GetMemoText = memo.GetItemValue("Body")(0)
	
End Function
 
 
Function ParseData(Byval body As String, Byval tagStart As String, Byval tagEnd As String) As String
	
	Dim parts As Variant
	If (Instr(1, body, tagStart, 5) = 0) Then Exit Function
	parts = Split(body, tagStart)
	If (Instr(1, parts(1), tagEnd, 5) = 0) Then ParseData = Trim(parts(1)) Else ParseData = Trim(Strleft(parts(1), tagEnd))
	
End Function

Open in new window

0
UPRRDevelopersAuthor Commented:
Outstanding!  It works perfectly.  I changed the agent to fire when an email is delivered to the mailbox, but it's not doing anything.  Is there a trick to make this run automatically when an email is delivered to the mailbox?
0
Bill-HansonCommented:
Yes.

You won't be able to use the agent above with an agent set to  "before new mail arrives" or "after new mail has arrived" because those trigger types do not have access to any front-end classes.  The example above gets a handle to the selected document using NotesUIWorkspace, which is a front-end class.  Also, the msgbox function only writes to the log file when used in a back-end agent.

Also, you should be aware that the two "mail-in" trigger types are quite different in how they are used.

Before new mail arrives
  • you can only have one agent in a database that is set to this type.
  • if you have a spam filter installed, you may already have a spam agent in your mail file that is using this type.
  • only one document is processed at a time, so it is much slower than the "after" trigger.
  • mail delivery is delayed slightly while the agent runs.
  • get a handle to the document using the NotesSession.DocumentContext property
After new mail has arrived
  • you can have an unlimited number of agents of this type.
  • you can process documents in batches.
  • mail delivery is not delayed.
  • get a handle to all unprocessed documents using the NotesDatabase.UnprocessedDocuments property.
Here's a simple example of an agent that works on "after new mail has arrived".  I don't know what you want to do with the data, so this agent just retrieves it, but does nothing with it.

Sub Initialize
	
	Dim sess As New NotesSession
	Dim db As NotesDatabase
	Dim dc As NotesDocumentCollection
	Dim doc As NotesDocument
	Dim body As String
	Dim contact As String, phone As String, location As String, problem As String, severity As String
	
	Set db = sess.CurrentDatabase
	Set dc = db.UnprocessedDocuments
	
	Set doc = dc.GetFirstDocument
	Do While (Not doc Is Nothing)
		
		body = GetMemoText(doc)
		
		contact = ParseData(body, "Contact:", Chr(10))
		phone = ParseData(body, "Phone:", Chr(10))
		location = ParseData(body, "Location:", Chr(10))
		problem = ParseData(body, "Problem:", Chr(10))
		severity = ParseData(body, "Severity:", Chr(10))
		
		' do something with the data here.
		
		Set doc = dc.GetNextDocument(doc)
		
	Loop
	
End Sub

Open in new window

0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
UPRRDevelopersAuthor Commented:
That's exactly what I needed.
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Lotus IBM

From novice to tech pro — start learning today.