News Stay informed about the latest enterprise technology news and product updates.

How do I open a Word doc from a Shared Resource File in LotusScript?

PLCP Cregg Hardwick, a Lotus Notes developer since 1998, fields questions from SearchDomino.com members on tips and tricks in LotusScript.

Cregg Hardwick is Collaboration Solutions Technical Lead for CenterPoint Energy in Houston. He has an MBA, a PCLP and an MCAD and focuses on collaboration and business process support applications, and has been a Notes developer since 1998. He has graciously agreed to answer some of the many questions that come in regarding LotusScript.

Question #1: I need to know a way to open a Word document from Lotus Shared Resources File from a Lotus document using LotusScript. Is there a way to save a Word template in the Lotus database, and use that to create a Word document on the client side using LotusScript?

Cregg Hardwick: This is one of those areas that is so frustrating to the Lotus developer! Lotus comes up with a great, sensible, useful feature and then fails to see how it fits into the overall platform! Shared resources are typical. Designed to support non-Notes resources within a Domino (web) database, they are a powerful, flexible way to provide resources to—and cut support costs for--any Notes application. Unfortunately, this apparently didn't occur to our friends at Lotus, and so they added no programmatic support for shared resources (that I have been able to find).

It is, however, possible to address a resource file through a URL, and the ?OpenFileResource URL syntax allows us to call up a file in a browser. In fact, though I haven't tried it, that syntax, in an @urlOpen formula, would probably open the file in Word. But since you are using LotusScript, you most likely want to do something more than just open the file, and for that, you need a COM reference to Word.

Since Word knows how to open files from a Web server using a URL, and Domino knows how to serve up resource files given a URL, you can use this URL syntax along with some good old-fashioned COM programming to open a resource file in Word. Of course, this will only work if the database is located on a server running the Domino HTTP task and addressable from your location and if you are using R6 or later. (There are other limitations that lead me to question the utility of this method.) But first, here is a subroutine that will do the trick:

Sub LaunchSharedWordDoc(docName As String)
 Dim session As New NotesSession
 Dim db As NotesDatabase 
 Set db = session.currentdatabase
 
 If db.server<>"" Then 
' we are on a server, let's hope it's 
running the http task

  Dim server As New NotesName(db.server) 
('Get the common name of the server, because we need it to build the url.)
  Dim servername As String
  serverName = Format(server.Common, "<")
   
  Dim filePath As String ' Convert the file
 path of the database to url syntax
  filePath = Replace(db.filepath, "\", "/")
  
  Dim url As String  

(' Create url to the desired document. The shared resources are located relative to the database, so it's pretty easy to construct the url.)

            url = "http://" + serverName +
 ".YourDomain.com/"+ fileName + "/"+docName

(' Note: "YourDomain" is whatever you tack after the server name to access it at your site. You could use an IP address here instead.)

  Dim wApp As Variant 

(' Launch Word and return an object reference to it so its COM methods can be called…)

  Set wApp = createObject("Word.application")
  wapp.visible=True  
  Call wApp.activate
  wApp.documents.open(url) 
  . . . Call whatever methods and change whatever 
properties of the Word application (wApp) you desire.
 Else
  Error 5101,"Shared resource files can only be 
opened from a domino server running the HTTP task."
 End If
End Sub

Now, this code is pretty self-explanatory. The key is that you are constructing a URL that looks something like this. If you add ?openFileResource to the end, such a URL will launch a file from the address line of a browser. Spoon-fed to Word, this URL will cause the Domino to serve the file from the Notes database into the open instance of Word (in this case, "wApp") where you can use the extensive object COM model to programatically interact with word. By the way, this will also work with Excel or any other application that exposes and API through COM.

The problem with this approach is that it won't work on a local machine or on a server not running the HTTP (Domino) task. You also have to determine what type of file you are dealing with manually. You have no easy way to access the MIME-type table in Windows to determine that, for example, Excel is supposed to open file with a .xls extension. You also have no way to present the user with a list of files to choose among or allow them to add files. . .things you might likely want to do.

Fortunately, there is a simple way to do all of these things; Just create your own "resource form" containing a rich text field and attach the files to the rich text field on documents created using this form. You can include a key on the form so the the correct resource can be looked up at runtime. Once you find the correct document, the following code will launch it and return a handle to its COM object so that you can interact with the word document through the COM API:

. . .
Dim rtitem As NotesRichTextItem
Set rtitem = doc.GetFirstItem( "Body" ) 
(We are assuming here that you have guaranteed that the document will always contain one rich text field called "Body")
Dim o  As NotesEmbeddedObject
' Use Forall o In rtitem.EmbeddedObjects for 
multiples (but then don't declare it)
Set o=rtitem.EmbeddedObjects(0)
Dim app as variant
Set app= o.Activate(True)
. . .

I say this will launch it. According to the documentation, this will launch it. I've found the "Activate" method to be a bit "dodgy." But in theory, this would open it using whatever application is installed on your machine that can open this file type. You can then check to see which file type it is and make appropriate method calls for that product. This is, of course, quite a bit more complex, but in theory more flexible.

Dig Deeper on LotusScript

Join the conversation

1 comment

Send me notifications when other members comment.

By submitting you agree to receive email from TechTarget and its partners. If you reside outside of the United States, you consent to having your personal data transferred to and processed in the United States. Privacy

Please create a username to comment.

Not able to call word document Macro using below code, Could some one suggest what going wrong here. Looks Like Notes stooped supporting run method If any other way can we call.  
offDoc.Run ("NewMacros")
Cancel

-ADS BY GOOGLE

SearchWindowsServer

Search400

  • iSeries tutorials

    Search400.com's tutorials provide in-depth information on the iSeries. Our iSeries tutorials address areas you need to know about...

  • V6R1 upgrade planning checklist

    When upgrading to V6R1, make sure your software will be supported, your programs will function and the correct PTFs have been ...

  • Connecting multiple iSeries systems through DDM

    Working with databases over multiple iSeries systems can be simple when remotely connecting logical partitions with distributed ...

SearchEnterpriseLinux

SearchDataCenter

SearchExchange

SearchContentManagement

Close