Professional Documents
Culture Documents
Developer/2000 White Paper: Guide To OLE Automation - Oracle Forms To Microsoft Word
Developer/2000 White Paper: Guide To OLE Automation - Oracle Forms To Microsoft Word
Table of Contents
1. INTRODUCTION __________________________________________________________________ 2 2. BASIC OLE AUTOMATION PRINCIPLES ____________________________________________ 2 3. THE MICROSOFT WORD OBJECT MODEL__________________________________________ 3 4. ORACLE FORMS AND OLE AUTOMATION__________________________________________ 3 5. AUTOMATING AN INDEPENDENTLY EXECUTING MICROSOFT WORD APPLICATION 5 6. AUTOMATING EMBEDDED OR LINKED OLE2 OBJECTS ____________________________ 14 7. CONCLUSION ___________________________________________________________________ 18
1.
Introduction This paper explains the basic concepts of OLE automation and in particular how to use the OLE automation facilities within Oracle Forms V4.5 to automate Microsoft Word. Code examples are included.
2.
Basic OLE Automation principles Objects are the fundamental components of OLE applications. Every element of an OLE server application can be represented as an object. Each of these objects is defined by its properties (physical and logical characteristics) and its methods (actions which the object can perform). OLE server applications expose the properties and methods of their component objects to other Windows applications. OLE client applications can programmatically manipulate OLE server applications through reading/writing their exposed properties and invoking their exposed methods. This process of 'remote control' of OLE server applications from OLE client applications is known as 'OLE Automation'. The original OLE ('Object Linking and Embedding') specification, created in 1991 concentrated on the creation of compound documents via the linking or embedding of server application documents inside container applications (a process from which OLE gained its original and now obsolete title). The much broader OLE2 specification introduced the concept of OLE automation along with a number of other extensions to the original OLE specification. Only applications supporting the OLE2 specification can therefore participate in OLE automation. Separate aspects of the OLE2 specification cover OLE automation client and OLE automation server functionality so an application must support the respective aspects of the OLE2 specification to function as an OLE automation client, OLE automation server or both. Before writing code to perform OLE automation, it is necessary for an application developer to understand the following things:
The object classes exposed by the OLE automation server and the relationships between them (the OLE automation server's 'Object Model') The properties of the OLE automation server's objects, their datatypes and valid values The methods of the OLE automation server's objects, their syntax and arguments The methods used by the OLE automation client to access the methods and properties of the OLE automation server's objects
This article will describe the Object Model of Microsoft Word and the methods used by Oracle Forms to perform OLE automation with Microsoft Word.
3.
The Microsoft Word Object Model Microsoft Word can function as an OLE automation client or OLE automation server. This section describes the Object Model which enables Word to be used as an OLE automation server. In most OLE server applications (e.g. Microsoft Excel) there are many different OLE object classes in the Object Model (e.g. Worksheets, Charts, Titles in Excel) which can be individually manipulated via their properties and methods. However, in Microsoft Word there is just one object of interest. This is the WordBasic interpreter used by Microsoft Word to execute commands written in Word's own macro language, WordBasic. Instead of executing methods or setting properties for specific objects (e.g. Document, Header, Footer, Paragraph) within a Word document, WordBasic macro statements are sent to the WordBasic interpreter to perform the requested tasks on behalf of the OLE client application. Although this method of automation doesn't strictly comply to the spirit of OLE, it does make the process of remote automation of Word simple. All that is required is to create an OLE object of the class "Word.Basic" and send WordBasic macro statements to this object for execution.
4.
Oracle Forms and OLE Automation Oracle Forms can operate as an OLE automation client only. In other words, you can embed or control an OLE automation server such as Word within a Forms module, but you cannot embed nor control a Forms module from within Word. OLE automation client functionality is implemented in Oracle Forms through a number of built-in PL/SQL procedures and functions contained in the OLE2 PL/SQL package. The OLE2 PL/SQL package provides a PL/SQL API for creating OLE automation server objects and accessing the properties and methods of these objects. The OLE2 PL/SQL package defines two additional PL/SQL datatypes which are used by the OLE2 built-ins:
Each of the PL/SQL procedures and functions in the OLE2 package is described below along with its PL/SQL specification:
Object Management CREATE_OBJ Creates an OLE object and returns an object handle. CREATE_OBJ(OBJECT IN VARCHAR2) RETURN OBJ_TYPE RELEASE_OBJ Releases all resources for an OLE object created by CREATE_OBJ and destroys the object handle. 3
RELEASE_OBJ(OBJECT IN OBJ_TYPE)
Object Property Access GET_CHAR_PROPERTY Reads a character property of an OLE object. GET_CHAR_PROPERTY(OBJECT IN OBJ_TYPE, PROPERTY IN VARCHAR2, ARGLIST IN LIST_TYPE) RETURN VARCHAR2 GET_NUM_PROPERTY Reads a number property of an OLE object. GET_NUM_PROPERTY(OBJECT IN OBJ_TYPE, PROPERTY IN VARCHAR2, ARGLIST IN LIST_TYPE) RETURN NUMBER GET_OBJ_PROPERTY Reads an object property of an OLE object. GET_OBJ_PROPERTY(OBJECT IN OBJ_TYPE, PROPERTY IN VARCHAR2, ARGLIST IN LIST_TYPE) RETURN OBJ_TYPE SET_PROPERTY Sets the value of a number or character property of an OLE object. SET_PROPERTY(OBJECT IN OBJ_TYPE, PROPERTY IN VARCHAR2, VALUE IN NUMBER, ARGLIST IN LIST_TYPE) or SET_PROPERTY(OBJECT IN OBJ_TYPE, PROPERTY IN VARCHAR2, VALUE IN VARCHAR2, ARGLIST IN LIST_TYPE)
Object Method Execution INVOKE Executes a method of an OLE object which returns nothing. INVOKE(OBJECT IN OBJ_TYPE, METHOD IN VARCHAR2, ARGLIST IN LIST_TYPE) INVOKE_CHAR Executes a method of an OLE object which returns a character string. INVOKE(OBJECT IN OBJ_TYPE, METHOD IN VARCHAR2, ARGLIST IN LIST_TYPE) RETURN VARCHAR2 INVOKE_NUM Executes a method of an OLE object which returns a number. INVOKE(OBJECT IN OBJ_TYPE, METHOD IN VARCHAR2, ARGLIST IN LIST_TYPE) RETURN NUMBER INVOKE_OBJ Executes a method of an OLE object which returns an object handle. INVOKE(OBJECT IN OBJ_TYPE, METHOD IN VARCHAR2, ARGLIST IN LIST_TYPE) RETURN OBJ_TYPE 4
Developer/2000: Guide to OLE Automation - Oracle Forms to Microsoft Excel
Argument List Management CREATE_ARGLIST Creates an argument list to be used by an invoked method and returns an argument list handle. CREATE_ARGLIST RETURN LIST_TYPE ADD_ARG Appends a number or character string argument to an argument list. ADD_ARG(LIST IN LIST_TYPE, VALUE IN NUMBER) or ADD_ARG(LIST IN LIST_TYPE, VALUE IN VARCHAR2) DESTROY_ARGLIST Destroys an argument list created by CREATE_ARGLIST. DESTROY_ARGLIST(LIST IN LIST_TYPE)
Exception Handling LAST_EXCEPTION Returns the most recent OLE exception code. Some examples of conditions when OLE exceptions are raised are
sending OLE commands to an inactive server application invoking non-existent methods
The OLE2 PL/SQL package can be used to automate an independently executing OLE automation server application. It can also be used to automate an embedded or linked OLE object associated with an OLE container item in an Oracle Forms application. The remainder of this article will look at automating Word using both methods.
5.
Automating an independently executing Microsoft Word application Before any OLE automation to Word can be performed, the WordBasic interpreter must be started. This is achieved through the creation of an OLE object representing the WordBasic interpreter. The creation of this WordBasic OLE object (and an object handle for it) establishes an entry point to Word from which OLE automation can begin. The WordBasic interpreter is not visible. If you want to display the Word application on the screen during OLE automation you will need to send the macro command 'AppShow' to WordBasic. The following PL/SQL example creates a WordBasic object, obtains an object handle to it and displays the main application window for Word on the screen:
DECLARE -- Declare the OLE object application BEGIN -- Start WordBasic and make Word visible application:= ole2.create_obj('Word.Basic'); ole2.invoke(application, 'AppShow'); END; ole2.obj_type;
At this point there are no open documents in Word and OLE automation is restricted to the operations that can be performed from Word's File menu (e.g. create/open a document, create/open a template, execute a macro). To perform more extensive OLE automation, a Word document needs to be opened. The following PL/SQL example extends the previous example by creating a new document and inserting some text ( comments are preceded by -- ) :
-- Start WordBasic and make Word visible application:= ole2.create_obj('Word.Basic'); ole2.invoke(application, 'AppShow');
-- Insert the text 'Hello there!' into the Word document args:= ole2.create_arglist; ole2.add_arg(args, 'Hello there!'); ole2.invoke(application, 'Insert', args); ole2.destroy_arglist(args);
-- Save the document to the filesystem args:= ole2.create_arglist; ole2.add_arg(args, 'EXAMPLE.DOC'); ole2.invoke(application, 'FileSaveAs', args); ole2.destroy_arglist(args);
ole2.release_obj(application);
END;
Sub MAIN FileNew .Template = "C:\OFFICE95\Templates\Normal.dot", .NewTemplate = 0 Insert "Hello there!" FileSaveAs .Name = "EXAMPLE.DOC", .Format = 0, .LockAnnot = 0, .Password = "",.AddToMru = 1, .WritePassword = "", .RecommendReadOnly = 0, .EmbedFonts = 0, .NativePictureFormat = 0, .FormsData = 0, .SaveAsAOCELetter = 0 End Sub
Word bookmarks can be used to position the insertion point at a specific location within a document. These bookmarks can either be created and named in advance or can be created by macro commands (the latter is useful if you want to mark a location to revisit later). The following PL/SQL procedure illustrates the use of a predefined bookmark in a Word document:
DECLARE
BEGIN
-- Start WordBasic and make Word visible application:= ole2.create_obj('Word.Basic'); ole2.invoke(application, 'AppShow');
-- Open a Word document args:= ole2.create_arglist; ole2.add_arg(args, 'C:\TEMP\EXAMPLE.DOC'); ole2.invoke(application, 'FileOpen', args); ole2.destroy_arglist(args);
-- Navigate to the bookmark called 'LetterHead' args:= ole2.create_arglist; ole2.add_arg(args, 'LetterHead'); ole2.invoke(application, 'EditGoto', args); ole2.destroy_arglist(args);
-- Insert text at the bookmark location args:= ole2.create_arglist; ole2.add_arg(args, 'OLE Automation Limited'); ole2.invoke(application, 'Insert', args); ole2.destroy_arglist(args);
END;
As well as executing WordBasic commands, it is possible to return information from Word to Oracle Forms by invoking WordBasic functions. For example, the WordBasic function FONT$() returns a character string with the name of the font in use at the insertion point of a document. The following PL/SQL example demonstrates how this function can be called via OLE automation:
DECLARE
args
ole2.list_type;
-- Declare the PL/SQL variable to receive the font name fontname VARCHAR2(30);
BEGIN
-- Start WordBasic and make Word visible application:= ole2.create_obj('Word.Basic'); ole2.invoke(application, 'AppShow');
-- Open a Word document args:= ole2.create_arglist; ole2.add_arg(args, 'C:\TEMP\EXAMPLE.DOC'); ole2.invoke(application, 'FileOpen', args); OLE2.DESTROY_ARGLIST(args);
-- Display the font in use at the insertion point fontname:=ole2.invoke_CHAR(application, 'Font$'); MESSAGE(fontname);
END;
The following PL/SQL procedure illustrates how OLE automation can be used to perform a mail merge in Word. The example assumes that the main and data source documents have already been created and the placeholders for data source fields have been created in the main document (refer to the Word online help for details of setting up mail merge documents). The PL/SQL procedure simply populates the data source document with data from the Oracle database, invokes the mail merge and saves the resulting file.
DECLARE
-- Declare a SQL cursor to be used to fetch the records from -- the database. CURSOR emp_cursor IS select ename, sal from emp;
BEGIN
-- Start WordBasic and make Word visible application:= ole2.create_obj('Word.Basic'); ole2.invoke(application, 'AppShow');
-- Open the mail merge data source document args:= ole2.create_arglist; ole2.add_arg(args, 'C:\TEMP\MERGE1.DOC'); ole2.invoke(application, 'FileOpen', args); ole2.destroy_arglist(args);
--
ole2.invoke(application, 'NextCell');
---
Fetch each employee record and pass values of employee name and salary into the mail merge data table
--
args:= ole2.create_arglist; ole2.add_arg(args, emp_record.ename); ole2.invoke(application, 'Insert', args); ole2.destroy_arglist(args); -Move to next column of data table
10
ole2.destroy_arglist(args);
END LOOP;
-- Open the mail merge main document args:= ole2.create_arglist; ole2.add_arg(args, 'C:\TEMP\MERGE2.DOC'); ole2.invoke(application, 'FileOpen', args); ole2.destroy_arglist(args);
-- Perform the mail merge to create the merged document ole2.invoke(application, 'MailMergeToDoc');
-- Save the merged document to disk args:= ole2.create_arglist; ole2.add_arg(args, 'C:\TEMP\MERGE3.DOC'); ole2.invoke(application, 'FileSaveAs', args); ole2.destroy_arglist(args);
-- Close all three documents without prompting to save any changes -- ( FileCloseAll 2 = close all without saving changes ) args:= ole2.create_arglist; ole2.add_arg(args, 2); ole2.invoke(application, 'FileCloseAll', args); ole2.destroy_arglist(args);
END;
The following example invokes Word to perform a spelling check against an Oracle Forms text field ('LONGFIELD1' in block 'CONTROL') and return the corrected text:
DECLARE
11
BEGIN
-- Insert the text of field CONTROL.LONGFIELD into temporary document args:= ole2.create_arglist; ole2.add_arg(args, :CONTROL.LONGFIELD1); ole2.invoke(application, 'Insert', args); ole2.destroy_arglist(args);
-- Return corrected text to Oracle Forms ole2.invoke(application, 'EditSelectAll'); sel_text:= ole2.get_char_property(application, 'Selection');
-- The text brought back contains an extraneous control character -- (a paragraph marker) so get rid of it :CONTROL.LONGFIELD1:=SUBSTR(sel_text, 1, (LENGTH(sel_text)-1) );
END;
Generally, the best approach for developing PL/SQL code to perform sophisticated OLE automation to Word is to use Word's own macro recorder to record a WordBasic macro for the required actions and convert the resulting WordBasic macro into a series of OLE2.INVOKE, OLE2.INVOKE_CHAR and OLE2.INVOKE_NUM statements, using argument lists where appropriate. If the tasks you want to perform in Word are completely self-contained and do not require any parameters to be passed in from Oracle Forms, it may be preferable to create a WordBasic macro 12
Developer/2000: Guide to OLE Automation - Oracle Forms to Microsoft Excel
within Word itself to perform these tasks and invoke the macro via OLE automation. The following example executes the WordBasic macro MyMacro after the creation of a new Word document:
DECLARE
BEGIN
-- Start WordBasic and make Word visible application:= ole2.create_obj('Word.Basic'); ole2.invoke(application, 'AppShow');
-- Execute the macro called MyMacro args:= ole2.create_arglist; ole2.add_arg(args, 'MyMacro'); ole2.add_arg(args, 1); ole2.invoke(application, 'ToolsMacro', args); ole2.destroy_arglist(args);
END;
For further information on the syntax of WordBasic commands refer to Word's own online help and the documentation supplied with the Microsoft Office Developer's kit.
13
6.
Automating Embedded or Linked OLE2 objects The original concept behind OLE concerned the embedding or linking of objects created by an OLE server application inside a document created by a different application (referred to as an OLE container application). It is possible to combine this aspect of OLE with OLE automation to automate an embedded or linked object. Oracle Forms includes a special OLE container item into which an OLE object can be embedded or linked. The OLE object classes which can be embedded or linked into an OLE container are registered in the Windows OLE registration database when an OLE server application is installed. The 'OLE Class' property of an Oracle Forms OLE container indicates which object class it contains and must be one of those listed in the OLE registration database. The 'OLE Tenant Types' property indicates whether the OLE container holds an embedded or linked OLE object. The 'OLE In-Place Activation' property indicates whether the OLE server application shares the Oracle Forms application Window when it is activated or whether a separate Window is opened. For Word documents, the OLE container's 'OLE Class' property should be set to 'Word.Document'. However, Word's simplified OLE object model does not permit direct automation of the embedded or linked 'Word.Document' object class (unlike Excel which allows direct automation of the 'Excel.Worksheet' object class). All OLE automation against the 'Word.Document' class must be performed via the 'Word.Basic' class. To automate an embedded or linked Word document, the OLE2 PL/SQL package must be used in conjunction with the following PL/SQL procedures from the separate PL/SQL built-in package FORMS_OLE:
Name ACTIVATE_SERVER
Description Activates an OLE server application associated with an OLE container item and prepares it for OLE automation. Takes the name or item id of an Oracle Forms OLE container item as an argument. Causes an OLE server to execute a verb identified by a verb name or verb index. An OLE verb specifies an action you can perform on an OLE object. Deactivates an OLE server application associated with an OLE container item. Terminates the connection between the OLE server and the OLE container.
EXEC_VERB
CLOSE_SERVER
The following example illustrates how the FORMS_OLE and OLE2 procedures are used to automate an embedded or linked Word document (in this case a standard letter template). The document is stored in the Oracle database and displayed in the OLE container item 'DOC' of block 'OLEWORD'. The PL/SQL procedure opens the template document and fills it in by sending the contents of Oracle Forms fields to bookmarks in the document. The resulting document is then saved to disk, the changes undone to restore the template to its original state and the document is closed:
14
args BEGIN
ole2.list_type;
-- Go to EmployeeName bookmark args:= ole2.create_arglist; ole2.add_arg(args, 'EmployeeName'); ole2.invoke(application, 'EditGoto', args); ole2.destroy_arglist(args);
-- Transfer contents of the EMP field to document args:= ole2.create_arglist; ole2.add_arg(args, :EMP.ENAME); ole2.invoke(application, 'Insert', args); ole2.destroy_arglist(args);
-- Go to Salary bookmark args:= ole2.create_arglist; ole2.add_arg(args, 'Salary'); ole2.invoke(application, 'EditGoto', args); ole2.destroy_arglist(args);
-- Transfer contents of Salary field to document args:= ole2.create_arglist; ole2.add_arg(args, TO_CHAR(:EMP.SAL)); ole2.invoke(application, 'Insert', args); ole2.destroy_arglist(args);
-- Save the completed document to disk args:= ole2.create_arglist; ole2.add_arg(args, 'C:\TEMP\LETTER1.DOC'); ole2.invoke(application, 'FileSaveAs', args); ole2.destroy_arglist(args);
15
ole2.invoke(application, 'EditUndo');
END;
With Word V6.0 for Windows 3.x, even with 'In-place Activation' set to 'False' WordBasic (for some unknown reason) still disallows the use of the FileSave and FileSaveAs commands directly against an embedded or linked document. However, the FileNew command can be used so a workaround to this limitation is to create a temporary copy of the embedded or linked document via OLE automation and work on that. This has the effect of reenabling the restricted commands. The following PL/SQL procedure illustrates the previous example modified to work with Word V6.0:
DECLARE
16
BEGIN
-- Create a temporary copy of the document to enable the FileSave command ole2.invoke(application,'EditSelectAll'); ole2.invoke(application,'EditCopy'); ole2.invoke(application,'FileNew'); ole2.invoke(application,'EditPaste');
-- Go to EmployeeName bookmark args:= ole2.create_arglist; ole2.add_arg(args, 'EmployeeName'); ole2.invoke(application, 'EditGoto', args); ole2.destroy_arglist(args);
-- Transfer contents of the EMP field to document args:= ole2.create_arglist; ole2.add_arg(args, :EMP.ENAME); ole2.invoke(application, 'Insert', args); ole2.destroy_arglist(args);
-- Go to Salary bookmark args:= ole2.create_arglist; ole2.add_arg(args, 'Salary'); ole2.invoke(application, 'EditGoto', args); ole2.destroy_arglist(args);
-- Transfer contents of Salary field to document args:= ole2.create_arglist; ole2.add_arg(args, TO_CHAR(:EMP.SAL)); ole2.invoke(application, 'Insert', args); ole2.destroy_arglist(args);
17
-- Save the completed document to disk args:= ole2.create_arglist; ole2.add_arg(args, 'C:\TEMP\LETTER1.DOC'); ole2.invoke(application, 'FileSaveAs', args); ole2.destroy_arglist(args);
END;
7.
Conclusion This article has described the fundamental concepts of using the built-in OLE automation features of Oracle Forms V4.5 to manipulate Microsoft Word. Once these basic concepts and limitations are understood, the reader should be able to adapt the examples given in this article using the documentation provided with Microsoft Word to implement their specific OLE automation requirements.
18
Title:
Author: Updated:
This document is provided for informational purposes only and the information herein is subject to change without notice. Please report any errors to Oracle Corporation. Oracle Corporation does not provide any warranties covering this document and specifically disclaims any liability in connection with this document.
Copyright Oracle Corporation 1996 All Rights Reserved Printed in the USA
Oracle Corporation World Headquarters 500 Oracle Parkway Redwood Shores, CA 94065 USA
Oracle is a registered trademark and Oracle Forms, Oracle Graphics, Oracle Reports , Oracle Toolkit, Oracle7, PL/SQL, Developer/2000 are trademarks of Oracle Corporation.
All other company and product names are used for identification purposes only, and may be trademarks of their respective owners.
19