Solved

OLE Integration with FileNet

Posted on 1998-03-11
4
2,787 Views
Last Modified: 2010-05-18
Does any one have any ideas on how can I integrate FileNet imaging software "Watermark" through OLE
with Oracle Forms 4.5 and above , in order to get the full functionality of that software,
using Visual Basic I did that through CreateObject statement.
using set statement I can control any function like scanning, setting document properties, ...
thank you.
0
Comment
Question by:khaled022498
  • 2
  • 2
4 Comments
 
LVL 1

Accepted Solution

by:
yesnaud earned 50 total points
Comment Utility
Hi,
I am not too sure what you really want but here's some help on OLE.


Introduction
============
This article 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.


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:

 o The object classes exposed by the OLE automation server and the
   relationships between them (the OLE automation server's 'Object
   Model').

 o The properties of the OLE automation server's objects, their
   datatypes and valid values

 o The methods of the OLE automation server's objects, their syntax
   and arguments

 o 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 Word and the methods used by
Oracle Forms to perform OLE automation with Word.


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.
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.


Oracle Forms and OLE Automation
===============================
Oracle Forms can operate as an OLE automation client only.

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:

OBJ_TYPE        A handle to an OLE object
LIST_TYPE       A handle to an OLE argument list

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
  Deallocates all resources for an OLE object created by CREATE_OBJ  
  and destroys the object handle.
  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

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
    o sending OLE commands to an inactive server application
    o invoking non-existent methods
  LAST_EXCEPTION RETURN NUMBER


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.


Automating an independently executing 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 OLE2.OBJ_TYPE;

BEGIN

 -- Start WordBasic and make Word visible
  application:=OLE2.CREATE_OBJ('Word.Basic');
  OLE2.INVOKE(application, 'AppShow');

END;

At this point there are no open documents in Word and OLE automation is
restricted only 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 -- ) :

DECLARE
 -- Declare the OLE object
 application OLE2.OBJ_TYPE;

 -- Declare handle to the OLE argument list
 args OLE2.LIST_TYPE;

BEGIN

 -- Start WordBasic and make Word visible
  application:=OLE2.CREATE_OBJ('Word.Basic');
  OLE2.INVOKE(application, 'AppShow');
 
 -- Create a new Word document
  OLE2.INVOKE(application, 'FileNew');

 -- 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);

 -- Release the OLE object
 OLE2.RELEASE_OBJ(application);

END;

The equivalent WordBasic macro for these actions is shown below:

      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

The following points are worth noting :

o It is important to release all OLE objects and argument lists as early as
  possible to minimise Windows resource usage and at the very least these
  objects should be released at the end of the PL/SQL procedure.

o Argument names are not required for the WordBasic commands, just the values.  

o Default values will be used in place of missing WordBasic arguments.  
  (e.g. in the FileNew command it was not necessary to specify which
  document template should be used as this defaults to Normal.dot).

o The WordBasic arguments are position dependant so ensure values are supplied
  for all arguments up to the highest positioned argument you wish to use.

o When using an argument list with a different set of arguments it is necessary
  to destroy and recreate the argument list.  Failing to do this will result in
  a new set of arguments being appended to an old set.


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

 -- Declare the OLE object
 application OLE2.OBJ_TYPE;

 -- Declare handle to the OLE argument list
 args OLE2.LIST_TYPE;

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);

 -- Release the OLE object
 OLE2.RELEASE_OBJ(application);

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

 -- Declare the OLE object
 application OLE2.OBJ_TYPE;

 -- Declare handle to the OLE argument list
 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);

 -- Release the OLE object
 OLE2.RELEASE_OBJ(application);

END;

The following points are worth noting:

o To call a WordBasic function, the OLE2.INVOKE_CHAR or OLE2.INVOKE_NUM
  procedures are used instead of the OLE2.INVOKE procedure.

o To determine whether to use OLE2.INVOKE_CHAR or OLE2.INVOKE_NUM you need to
  know the datatype of the item being returned from the WordBasic function.
  You can derive this from the WordBasic function name.  Functions returning a
  character string have a $ as the last letter of the function name whereas
  functions returning numbers do not.

o WordBasic functions are distinguished from commands by brackets following the
  function name.  Do not use these brackets when referring to the function in a
  PL/SQL procedure.


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 the OLE object
 application OLE2.OBJ_TYPE;

 -- Declare handle to the OLE argument list
 args OLE2.LIST_TYPE;

 -- 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);

  --  Move to end of first row in data table (merge field names)
  OLE2.INVOKE(application, 'NextCell');
 
  --  Fetch each employee record and pass values of employee name
  --  and salary into the mail merge data table

  FOR emp_record IN emp_cursor LOOP

    --  Move onto next row of data table
    OLE2.INVOKE(application, 'NextCell');
    --  Insert employee name
    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
    OLE2.INVOKE(application, 'NextCell');
    --  Insert salary
    args:=OLE2.CREATE_ARGLIST;
    OLE2.ADD_ARG(args, TO_CHAR(emp_record.sal));
    OLE2.INVOKE(application, 'Insert', args);
    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 )
  args:=OLE2.CREATE_ARGLIST;
  OLE2.ADD_ARG(args, 2);
  OLE2.INVOKE(application, 'FileCloseAll', args);
  OLE2.DESTROY_ARGLIST(args);

 -- Release the OLE object
  OLE2.RELEASE_OBJ(application);

END;

The following points are worth noting :

o It is not possible to use a numeric datatype as an argument to the WordBasic
  Insert command.  To insert a salary figure the TO_CHAR function was used to
  convert to a character string first.


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

 -- Declare the OLE object
 application OLE2.OBJ_TYPE;

 -- Declare handle to the OLE argument list
 args OLE2.LIST_TYPE;

 -- Declare a temporary local variable for returned text
 sel_text VARCHAR2(1000);

BEGIN

 -- Start WordBasic
 application:=OLE2.CREATE_OBJ('Word.Basic');
 
 -- Create a temporary document to do the spell check in
 OLE2.INVOKE(application, 'FileNew');

 -- 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);

 -- Invoke the spell checker
 OLE2.INVOKE(application, 'ToolsSpelling');
 
 -- Return corrected text to Oracle Forms
 OLE2.INVOKE(application, 'EditSelectAll');
 sel_text:=OLE2.GET_CHAR_PROPERTY(application, 'Selection');
 
 --Release the OLE object
 OLE2.RELEASE_OBJ(application);

 -- 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.

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.


Automating Embedded or Linked Word documents
============================================
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:

  ACTIVATE_SERVER
  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.

  EXEC_VERB
  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.

  CLOSE_SERVER
  Deactivates an OLE server application associated with an OLE container item.
  Terminates the connection between the OLE server and the OLE container.

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:

DECLARE

 -- Declare the OLE object
 application OLE2.OBJ_TYPE;

 -- Declare handle to the OLE argument list
 args OLE2.LIST_TYPE;

BEGIN
 
 -- Activate Word
  FORMS_OLE.ACTIVATE_SERVER('OLEWORD.DOC');

 -- Start WordBasic
  application:=OLE2.CREATE_OBJ('Word.Basic');

 -- Open the embedded document for editing
  FORMS_OLE.EXEC_VERB('OLEWORD.DOC',1);

 -- 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);

 -- Restore the letter template to it's original state
  OLE2.INVOKE(application, 'EditUndo');
  OLE2.INVOKE(application, 'EditUndo');

 -- Release the OLE object
  OLE2.RELEASE_OBJ(application);

 -- Close Word
  FORMS_OLE.CLOSE_SERVER('OLEWORD.DOC');

END;

The following points are worth noting:

o The ACTIVATE_SERVER, CREATE_OBJ and EXEC_VERB commands must be performed in
  the order given.  Due to the relationship between the 'Word.Document' and
  'Word.Basic' object classes, failure to use this sequence may cause
  unexpected behaviour (e.g. the Word application window does not close when
  the CLOSE_SERVER command is issued).

o Verb index 1 is used by EXEC_VERB to open a Word document for editing.

o There is no need to use an AppShow command as the EXEC_VERB statement will
  make Word visible.

o There is no need to close the embedded document via WordBasic.  This is done
  implicitly by the CLOSE_SERVER command.

o In place of the FileSaveAs command a FilePrint could have been used to send
  the document to the printer rather than disk.

o If the embedded Word document is attached to a Word template (.DOT file), a
  copy of the .DOT file must exist on all PCs using the document from within
  Oracle Forms.  The .DOT file is not stored in the database with the embedded
  document.  Without this file on the hard disk, macros, autoText entries and
  custom toolbar, menu and shortcut keys defined in the .DOT file will be
  inaccessible.

o With Word V7.0 for Windows 95, the previous example only works if the
  'In-place Activation' property of the OLE container is set to 'False'.
  If this property is set to 'True', WordBasic does not permit the use of any
  commands available from the File menu (e.g. FileSave, FileSaveAs, FilePrint).
  These commands will just be ignored.
  If no commands from the File menu are issued via OLE automation,
  'In-place Activation' can be set to 'True' or 'False'.

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

 -- Declare the OLE object
 application OLE2.OBJ_TYPE;

 -- Declare handle to the OLE argument list
 args OLE2.LIST_TYPE;

BEGIN

 -- Activate Word
  FORMS_OLE.ACTIVATE_SERVER('OLEWORD.DOC');

 -- Start WordBasic
  application:=OLE2.CREATE_OBJ('Word.Basic');

 -- Open the embedded document for editing
  FORMS_OLE.EXEC_VERB('OLEWORD.DOC',1);

 -- 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);

 -- 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);
 
 -- Close the temporary document (without prompting to save any changes)

  args:=OLE2.CREATE_ARGLIST;
  OLE2.ADD_ARG(args, 2);
  OLE2.INVOKE(application, 'FileClose', args);
  OLE2.DESTROY_ARGLIST(args);

 -- Close the embedded document
 FORMS_OLE.CLOSE_SERVER('OLEWORD.DOC');

 -- Release the OLE object
  OLE2.RELEASE_OBJ(application);  

END;

The following points are worth noting:

o In this procedure there is no need to undo changes as the embedded document
  is never modified.  Only the temporary document is modified which is
  discarded at the end.

o A FileClose is required to close the temporary document but not the embedded
  document as this is implicitly closed by the CLOSE_SERVER command.


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.


0
 
LVL 2

Author Comment

by:khaled022498
Comment Utility
what I really want is to implement the following VBCode using Oracle , I've tried but it did not work the way I want, because the way you are Starting OLE Server is different

Public Sub CustomizeWorkspace()
      Dim wmMainWindow As Object
      Dim wmApp As Object
           
      set wmApp=CreateObject("Watermark.Application")
            Set wmMainWindow = g_wmWorkspace.MainWindow
      ' set the caption of the window
      wmMainWindow.Caption = "Out of Place Watermark Workspace"
      ' only show toolbars (no menu)
      wmMainWindow.ShowUI (2 Or 4)
      wmMainWindow.ShowWindow (2 Or 64)
            'Start Scanning
             wmApp.scan StartPage, Increment, MaxPages, Flags
             'OCR The Current Page and Set user Index Fields
             wmApp.Document.UserIndex("Name") =wmApp.OCR CurrentPage, PageCount
      Exit Sub

ErrorHandler:
      If (Err) Then MsgBox Err.Description
      
End Sub

forget about error handler, and all other accessories, the thing i want is how to start OLE server, passing commands from my program to OLE.
Thanks.
0
 
LVL 1

Expert Comment

by:yesnaud
Comment Utility
Hi,

I can't test what the code below but I think that's the way I would do it...

Declare
application ole2.obj_type

begin
-- That will start an ole server.
application := ole2.create_obj('WaterMark.Application');

/*
** Here use ole2 built-in functions to call functions, get properties...etc..etc...
*/
-- that will stop the ole server
ole2.release_obj(application);

end;

0
 
LVL 2

Author Comment

by:khaled022498
Comment Utility
Thank you, you have been very helpful
0

Featured Post

PRTG Network Monitor: Intuitive Network Monitoring

Network Monitoring is essential to ensure that computer systems and network devices are running. Use PRTG to monitor LANs, servers, websites, applications and devices, bandwidth, virtual environments, remote systems, IoT, and many more. PRTG is easy to set up & use.

Join & Write a Comment

Suggested Solutions

Title # Comments Views Activity
Cross Outer Join 4 50
Format Number Field 10 39
Oracle queries --Challenging Question 12 62
Oracle 12c patching 1 28
I remember the day when someone asked me to create a user for an application developement. The user should be able to create views and materialized views and, so, I used the following syntax: (CODE) This way, I guessed, I would ensure that useā€¦
Using SQL Scripts we can save all the SQL queries as files that we use very frequently on our database later point of time. This is one of the feature present under SQL Workshop in Oracle Application Express.
Via a live example show how to connect to RMAN, make basic configuration settings changes and then take a backup of a demo database
This video shows how to copy a database user from one database to another user DBMS_METADATA.  It also shows how to copy a user's permissions and discusses password hash differences between Oracle 10g and 11g.

744 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

13 Experts available now in Live!

Get 1:1 Help Now