OLE automation with Word
I had forms developped with forms 4.5
I did things like that :
-- open OLE object in Word
Forms_OLE.Activate_Server(wordItem);
application :=OLE2.CREATE_OBJ('Word.Basic');
Forms_OLE.Exec_Verb(wordItem, 1);
-- insert text in Word document
args := OLE2.CREATE_ARGLIST;
OLE2.ADD_ARG(args, text);
OLE2.Invoke(application, 'Insert', args);
OLE2.Destroy_Arglist(args);
-- print document
args := OLE2.CREATE_ARGLIST;
OLE2.ADD_ARG(args, 0);
OLE2.Invoke(application, 'FilePrint', args);
OLE2.Destroy_Arglist(args);
-- exit Word
OLE2.Invoke(application, 'FileExit');
-- release server
if (Forms_OLE.Server_Active(item_id)) then
Forms_OLE.Close_Server(item_id);
end if;
With Form 6.0, Invoke method seems not to work anymore.
I suppose I have to use
Init_OleArgs(2);
Add_OleArg('insertText', VT_BSTR);
Add_OleArg('my text', VT_BSTR);
Call_Ole(itemName, ?);
Is it that and what should be the 2nd parameter of Call_Ole method ?
Thanks
Nico
null
With Forte Release2 supporting only OLE callout, you can use DDE
to pass data; but with Release 3 which supports OLE callin , you
should be able to pass data both ways.
- Arvind
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Arvind Kumar Krishnaswamy
Digital/Forte Software Products Group
Digital Equipment Corporation ______________________
1800,Harrison Street,Suite 1700, | | | | | | | |
Oakland.CA 94612 USA |d |i |g |i |t |a |l |
| | | | | | | |
Tel : 510-251-6537 ----------------------
Fax : 510-251-6531
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Similar Messages
-
RE: Ole Automation with forte.
Tran,
Here is a piece of code(using Forte Version 3OF2 & Word 97) that we've
used to determine if there is already an instance of Word running:
// Create an instance of a Word Application and activate it.
// If an a Word application exists, just activate it.
if ( aTasks <> NIL and aTasks.Exists(aWordApplication.Name) )
then
aWordApplication.visible = TRUE;
aWordApplication.Activate();
else
aWordApplication = new();
aTasks = new();
aWordApplication.CreateUsingProgID( 'word.application'
aWordApplication.visible = TRUE;
aWordApplication.Activate();
aTasks is an attribute of type Tasks on our window & aWordApplication is
an attribute of type _Application on our window. This code will work if
there already is an instance of Word that was started from a Forte
applicaiton. It doesn't recognize a instance of Word that was started
outside of a Forte app. Hope this helps!!
From: Quy Tran[SMTP:[email protected]]
Sent: Wednesday, May 20, 1998 11:17 PM
To: [email protected]
Subject: Ole Automation with forte.
Good Day forte users,
I'm trying to invoke MSWord from a forte application.
I set the objectreference using CreateUsingProgId(This is the only way
that I could get it to work).
The problem is when using CreateUsingProgId, forte will create another
instance of Word. Is there a way to know if the instance already
exists
and retrieve the objectreference of that instance?
Any help would be appreciated.
Thanks
Quy Tran
Lumley Technology
Analyst/Programmer
[email protected]
Ph : 612 93186722
To unsubscribe, email '[email protected]' with
'unsubscribe forte-users' as the body of the message.
Searchable thread archive
<URL:http://pinehurst.sageit.com/listarchive/>
If you are not the intended recipient, please notify the Sender.
Non-business opinions may not reflect opinions of Piper JaffrayHi Aurang
You can call almost all methods using OLE. What is required is to know how to interpret a script to ABAP OLE call. This is explained in the tutorial<a href="https://www.sdn.sap.comhttp://www.sdn.sap.comhttp://www.sdn.sap.com/irj/servlet/prt/portal/prtroot/docs/library/uuid/c1d54348-0601-0010-3e98-bd2a2dcd9e6c">"An Easy Reference For OLE Automation"</a>
Regards
*--Serdar <a href="https://www.sdn.sap.com:443http://www.sdn.sap.comhttp://www.sdn.sap.com/irj/servlet/prt/portal/prtroot/com.sap.sdn.businesscard.sdnbusinesscard?u=qbk%2bsag%2bjiw%3d">[ BC ]</a> -
OLE Automation for Word. EditGoto with Word 97
I found a solution. Instead EditGoto, use WW7_EditGoto.
Example:
.- A Word Template whith two bookmarks
(Texto1, Tabla1). A normal bookmark
(Texto1) and a bookmark into a Word
Table (Tabla1).
In the Word Table, is posible change
cell o create a new row with the same
command (NextCell).
The word table has two columns an two
rows.
The first row is the Header.
The second row the first column contain
a bookmark (Tabla1).
.- A Form whit two blocks:
First block with two items:
nombre_doc
texto1
Secod Block (multirecord) whit two items
col1
col2
with a When-Button-Pressed:
DECLARE
application OLE2.OBJ_TYPE;
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,'Plantilla.dot');
OLE2.INVOKE(application, 'FileOpen', args);
OLE2.DESTROY_ARGLIST(args);
-- Put Text in the first bookmark
args := OLE2.CREATE_ARGLIST;
OLE2.ADD_ARG(args,'Texto1');
OLE2.INVOKE(application, 'WW7_EditGoto', args);
OLE2.DESTROY_ARGLIST(args);
args := OLE2.CREATE_ARGLIST;
OLE2.ADD_ARG(args,:Texto1);
OLE2.INVOKE(application, 'Insert', args);
OLE2.DESTROY_ARGLIST(args);
-- Send data from Multirecord Block to Word Table
GO_BLOCK('MULTI');
FIRST_RECORD;
IF :SYSTEM.RECORD_STATUS != 'NEW' THEN
args := OLE2.CREATE_ARGLIST;
OLE2.ADD_ARG(args,'Tabla1');
OLE2.INVOKE(application, 'WW7_EditGoto', args);
OLE2.DESTROY_ARGLIST(args);
LOOP
IF :col1 IS NOT NULL THEN
args := OLE2.CREATE_ARGLIST;
OLE2.ADD_ARG(args,:col1);
OLE2.INVOKE(application, 'Insert', args);
OLE2.DESTROY_ARGLIST(args);
END IF;
OLE2.INVOKE(application, 'NextCell');
IF :col2 IS NOT NULL THEN
args := OLE2.CREATE_ARGLIST;
OLE2.ADD_ARG(args,:col2);
OLE2.INVOKE(application, 'Insert', args);
OLE2.DESTROY_ARGLIST(args);
END IF;
EXIT WHEN :SYSTEM.LAST_RECORD = 'TRUE';
NEXT_RECORD;
OLE2.INVOKE(application, 'NextCell');
END LOOP;
-- Save a Word document
args := OLE2.CREATE_ARGLIST;
OLE2.ADD_ARG(args,:nombre_doc);
OLE2.INVOKE(application, 'FileSaveas', args);
OLE2.DESTROY_ARGLIST(args);
--Release the OLE object
OLE2.RELEASE_OBJ(application);
END;
Sorry by the sintax, but i don't speak English.
I hope it solves this problem.Hello,
I am also trying to use the OLE2 package for OLE Automation. But
difference being that I am not using Word but am using an
invisible control for Mail services, using the objects
MAPISession, MAPImessages. If anyone out there had already done
this do please give me a code snippet.
Thanx in advance
Anup Mistry,
Programmer/Analyst,
IIS,Inc
Vasile (guest) wrote:
: Hi Daniel,
: I used OLE with forms 5 ,but now it work without problems in
: forms 6, too.
: A procedure that save doc. look like that:
: procedure filesaveas (fname in varchar2) is
: arglist ole2.list_type;
: begin
: arglist := ole2.create_arglist;
: ole2.add_arg (arglist, fname);
: ole2.invoke (obj_hnd, 'filesaveas', arglist);
: ole2.destroy_arglist (arglist);
: end;
: I hope this help you.
: Vasile
: Daniel Fox (guest) wrote:
: : I am using Forms 6.0
: : Can anyone help with OLE automation using OLE2.
: : I can open Word, document stored in long raw, even insert
data
: : from other form field into the Word Document (only at the
: : beginning of the Document, though).
: : All the File commands, such as FileSaveAs, EditGoTo, etc..
: don't
: : work. They are simply ignored - no error messages, nothing.
: : Does anyone use Word Automation through Forms 6.0?
: : Please, HELP....
: : Thanks in advance,
: : Desperate Daniel.
null -
Ole Automation with forte.
Good Day forte users,
I'm trying to invoke MSWord from a forte application.
I set the objectreference using CreateUsingProgId(This is the only way
that I could get it to work).
The problem is when using CreateUsingProgId, forte will create another
instance of Word. Is there a way to know if the instance already exists
and retrieve the objectreference of that instance?
Any help would be appreciated.
Thanks
Quy Tran
Lumley Technology
Analyst/Programmer
[email protected]
Ph : 612 93186722
To unsubscribe, email '[email protected]' with
'unsubscribe forte-users' as the body of the message.
Searchable thread archive <URL:http://pinehurst.sageit.com/listarchive/>Hi!
I am not sure that I can give you any "golden rules" for interfacing
with OLE, but I can give you some thoughts on where to look for problems
that can result in Segmentation Violations.
I have often seen segmentation violations arise as a result of a NIL
object. You might want to try turning on the trc:lo:25 trace flag to
see if there is a NIL object exception being raise right before the seg
v. You have to be careful with the trc:lo:25 flag, though, since it
will show you every exception, no matter what, that is raised within
Forte (even if it's been handled internally). This is of greater
significance to OLE projects, since Forte tries several different ways
of starting an OLE server and uses internally handled exceptions to
notify itself if a certain method failed.
Another thing to try is just-in-time debugging. You will need Microsoft
Visual C++ installed on the machine where the OLE code is running, and
you will need to set the FORTE_NOHANDLER environment variable to TRUE.
In the MSVC development environment, go to the Tools --> Options
properties sheet, and choose the Debug tab. On that tab, make sure that
Just-In-Time Debugging is selected. Then, run the application. When
you encounter the seg v, you should get a dialog box asking if you want
to debug the application. Choosing yes (actually, I think that pressing
Cancel does this - the dialog box tells you) will bring you into the
MSVC development environment, where you can try some intense debugging.
I hope this helps!
-Katie
[email protected] wrote:
>
Has anybody used Forte to communicate with external components using
OLE
Automation? We are creating segmentation violations through some of
our
use of this interface, and need to know if there are some 'golden
rules'
that can guide developers as they use the feature.
Thank you!--
Katie Carty
Forte Consulting
4801 Woodway Drive
Suite 300E
Houston, Texas 77056
vmail: 510-986-3802
email: [email protected]
----------------------------------------------- -
GPF and OLE Automation with Word6
Has anyone else had a problem with GPFs when trying to use Word6 as an OLE
Automation Server? Whenever our users try to open Word6 from the
application they get a GPF in QQKN.DLL at 000C:955C. What does the QQKN.DLL
do?
Any ideas?
- Scott Splavec - MIS 8
Business Analyst
Kirke-Van Orsdel, Inc.
1776 West Lakes Parkway
West Des Moines, IA 50398
(515) 248-6472
eMail: kvi!kvidm01![email protected]Hi Aurang
You can call almost all methods using OLE. What is required is to know how to interpret a script to ABAP OLE call. This is explained in the tutorial<a href="https://www.sdn.sap.comhttp://www.sdn.sap.comhttp://www.sdn.sap.com/irj/servlet/prt/portal/prtroot/docs/library/uuid/c1d54348-0601-0010-3e98-bd2a2dcd9e6c">"An Easy Reference For OLE Automation"</a>
Regards
*--Serdar <a href="https://www.sdn.sap.com:443http://www.sdn.sap.comhttp://www.sdn.sap.com/irj/servlet/prt/portal/prtroot/com.sap.sdn.businesscard.sdnbusinesscard?u=qbk%2bsag%2bjiw%3d">[ BC ]</a> -
Hi All,
Does anyone know of any reference/help/material on how to use OLE automation to download and format data from ABAP to Excel.
I need to know what the available methods and properties are so I could format the data the way I want.
Any help will be greatly appreciated.
Regards.Hi Aurang
You can call almost all methods using OLE. What is required is to know how to interpret a script to ABAP OLE call. This is explained in the tutorial<a href="https://www.sdn.sap.comhttp://www.sdn.sap.comhttp://www.sdn.sap.com/irj/servlet/prt/portal/prtroot/docs/library/uuid/c1d54348-0601-0010-3e98-bd2a2dcd9e6c">"An Easy Reference For OLE Automation"</a>
Regards
*--Serdar <a href="https://www.sdn.sap.com:443http://www.sdn.sap.comhttp://www.sdn.sap.com/irj/servlet/prt/portal/prtroot/com.sap.sdn.businesscard.sdnbusinesscard?u=qbk%2bsag%2bjiw%3d">[ BC ]</a> -
Discoverer 3i through ole automation
Do you know,
where to find information about using ole automation with Discoverer 3i.<BLOCKQUOTE><font size="1" face="Verdana, Arial">quote:</font><HR>Originally posted by jr vasquez ([email protected]):
Also, is there a method of bypassing the authentication and passing arguments into Discoverer rather than having to login? If I am maintaining a userlist in another application can I not use that authentication method and pass that into Discoverer?<HR></BLOCKQUOTE>
For the Client server application, You can bypass login by passing parameters to the application. This is documented in the Discoverer User's Guide, Under Advanced Features, Using Command Line Options.
Discoverer Viewer and Discoverer Plus (java) also permit this through the urls used to launch the application. This is also documented.
Documentation for Discoverer OLE Automation may be found via Oracle Metalink. Type in 'Discoverer, OLE' in the search window and a technical bulletin, "Programmatic Control of Discoverer 3.1", will be returned. -
PICTURE MTHOD in OLE AUTOMATION
Hi,
Can anyone send me information for the "picture" method using OLE AUTOMATION for Excel Objects.
Thanks and Regards
AKhi
good
go through the following links i hope this will help you to solve your problem.
Re: OLE Automation with Excel
http://www.sap-img.com/abap/download-to-excel-with-format-border-color-cell-etc.htm
http://sap.ittoolbox.com/code/archives.asp?d=3027&a=s&i=10
thanks
mrutyun -
OLE automation To Print picture in word document
We are upgrading from 4.6c to ECC 6.0.One of Our OLE automation Report is used to launch the word document to print CV and photo.But the program acts differently to the different Presentation servers even though they all have the same GUI and word versions.Text box and images are drawn at different sizes and at different locations in the word document.
Please advise.Sure,
I need to make an abap program to execute a word document
in this document I want to insert a picture
we have a picture in SAP in the transaction SE78 (Administration of Form Graphics)
I want to know if I can use this picture or if the only method is to have the picture in local into the PC
regards
Patrick -
What commands can be performed with COM/OLE automation?
I believe I have posted this question before. Let's hope I have better luck this time.
Where are the "remote control" (those available through COM/OLE automation) commands documented?
I would be satisfied if at least I can find out how to perform the following command programmatically:
Document | OCR Text Recogniotion | Recognize Text Using OCR
Can that particular command be performed from a plugin perhaps?
TIA,
-Ramon> OCR is NOT available via COM - it is only exposed to plugins.
I suppose, however, that it is possible to write a plugin which is remote controlled from outside and performs the OCR phase?
-Ramon -
[b]Tutorial:[/b] Simplify Developing OLE Automation Code Using VBA
INTRODUCTION
Automating Office applications from Oracle Forms can be a tedious, frustrating, and time-consuming process. Because the OLE2 and CLIENT_OLE2 built-ins do not validate the automation commands that they relay, code that compiles without errors often dies at runtime with a not-so-helpful error code. This tutorial will demonstrate how to simplify the development of automation code using a tool that ships with all Microsoft Office editions -- the Visual Basic for Applications (VBA) IDE.
The VBA IDE, a core Office component, is a full-fledged development environment featuring code completion, basic syntax highlighting, context-driven help and a runtime debugger. Its Object Browser provides a convenient means of browsing the Word object model, as well as searching by keyword.
For those who may not interested in following this tutorial in detail, I would like to stress the usefulness of the Object Browser as a tool for inspecting the functions supported by OLE server applications and, perhaps more importantly, valid values for function arguments. Whether/not anyone buys the assertion that starting with VBA prototypes is far more productive than pounding out OLE2 code from the very start, they will find the Object Browser invaluable as a reference -- I rely on it exclusively for this sort of documentation.
A BRIEF INTRODUCTION TO THE VBA IDE & THE OBJECT BROWSER UTILITY
Try this:
1. Open Word
2. Launch the VBA IDE by pressing <Alt><F11>
3. Open the Object Browser by pressing <F2>
The Object Browser allows you to visually navigate Word's class hierarchy. Its user interface is a bit crowded, so controls are unlabeled. Hovering the mouse cursor above a control will display a tooltip explaining that control's purpose. The browser's scope can be narrowed by using the Project/Library combo. Typing a keyword or substring in the Search Text combo and clicking on the Search button will cause all classes/members whose name contains the specified search text to be listed in the Search Results pane. Selecting an item from this list will update the two panes below it, showing the selected class, and its members. Beneath the Classes and Members panes is an untitled pane, gray in color, which displays details for the selected class/member, including hyperlinks to relevant information such as arguments, their types and allowable values. If Visual Basic Help is installed, pressing <F1> will display help on a selected class/member. (This feature can be installed from your Office install CD, if necessary.)
NOTE: While it is possible to cut-and-paste the code examples that follow, I highly recommend that they be typed in by hand. Doing so will provide a better understanding of how the IDE's code completion behaves. Use code completion most efficiently by not using the mouse or <Enter> key when selecting from completion lists. Instead, just type enough letters to select the desired list element, then continue along as if you had typed the entire element, typing the next operator in your statement. It really is slick!
HELLO WORLD - VBA-STYLE
1. Open Word
2. Launch the VBA IDE by pressing <Alt><F11>
3. Select Module from the Insert menu.
4. In the blank area that appears, enter the following code:
Public Sub HelloWorld()
Documents.Add
Selection.TypeText ("Hello, world!")
End Sub5. Press <F5> to run the code.
If you switch back to Word by pressing <Alt><F11>, there should appear a newly-created document containing the text Hello, world!.
A MORE AMBITIOUS EXAMPLE
In this example, we will launch Word, type some text, and alter its formatting. For the purposes of this tutorial, consider it the process we wish to automate from within Forms.
1. If Word is running, close it.
2. Open any Office application except Word, such as Excel, Outlook or PowerPoint
3. Launch the VBA IDE by pressing <Alt><F11>.
4. Select References from the Tools menu -- a dialog should pop up.
5. From within this dialog, locate and select Microsoft Word <version> Object Library, then click OK.
6. Select Module from the Insert menu.
7. In the blank area that appears, enter the following code:
Public Sub LaunchWord()
Dim app As Word.Application
Set app = CreateObject("Word.Application")
app.Visible = True '!!! IMPORTANT !!!
app.Documents.Add
With app.Selection
.TypeText "This is paragraph 1."
.TypeParagraph
.TypeText "This is paragraph 2."
.TypeParagraph
.TypeText "This is paragraph 3."
End With
With ActiveDocument
.Paragraphs(1).Range.Words(3).Bold = True
.Paragraphs(2).Range.Words(3).Italic = True
.Paragraphs(3).Range.Words(3).Underline = True
End With
End Sub8. Press <F5> to run the code.
A new Word session should have been launched. Switch to it, to view the results of our handiwork!
TAILORING VBA CODE INTENDED FOR OLE2 CONVERSION
Now, things get a bit uglier. The code listed above gives a good idea of how concise VBA code can be, but With blocks and chained object references do not translate readily into OLE2 code. Here's the same process, rewritten in a more OLE2-friendly style. Note the numerous intermediate object references that have been declared.
Public Sub LaunchWord()
Dim app As Word.Application
Dim doc As Word.Document
Dim docs As Word.Documents
Dim pars As Word.Paragraphs
Dim par As Word.Paragraph
Dim wrds As Word.Words
Dim sel As Word.Selection
Dim rng As Word.Range
Set app = CreateObject("Word.Application")
app.Visible = True '!!! IMPORTANT !!!
Set doc = app.Documents.Add
Set sel = app.Selection
sel.TypeText "This is paragraph 1."
sel.TypeParagraph
sel.TypeText "This is paragraph 2."
sel.TypeParagraph
sel.TypeText "This is paragraph 3."
Set pars = doc.Paragraphs
'select third word of first paragraph and make it bold
Set par = pars.Item(1)
Set rng = par.Range
Set wrds = rng.Words
Set rng = wrds.Item(3)
rng.Bold = True
'select third word of second paragraph and italicize it
Set par = pars.Item(2)
Set rng = par.Range
Set wrds = rng.Words
Set rng = wrds.Item(3)
rng.Italic = True
'select third word of second paragraph and underline it
Set par = pars.Item(3)
Set rng = par.Range
Set wrds = rng.Words
Set rng = wrds.Item(3)
rng.Underline = True
End Sub
TRANSFORMATION: CONVERTING VBA CODE INTO PL/SQL
Here is the PL/SQL counterpart to our previous VBA routine. Compare printouts of the two and note their similarities. Notice the need for argument lists -- this causes the code to fluff up quite a bit, and really interferes with readability.
PROCEDURE LAUNCH_WORD IS
v_app OLE2.OBJ_TYPE; -- Application
v_doc OLE2.OBJ_TYPE; -- Document
v_docs OLE2.OBJ_TYPE; -- Documents collection
v_pars OLE2.OBJ_TYPE; -- Paragraphs collection
v_par OLE2.OBJ_TYPE; -- Paragraph
v_wrds OLE2.OBJ_TYPE; -- Words collection
v_sel OLE2.OBJ_TYPE; -- Selection
v_rng OLE2.OBJ_TYPE; -- Range
v_args OLE2.LIST_TYPE; -- OLE2 argument list
BEGIN
/* launch Word and MAKE IT VISIBLE!!! */
v_app := OLE2.CREATE_OBJ('Word.Application');
OLE2.SET_PROPERTY(v_app, 'Visible', TRUE);
/* initialize key object references */
v_docs := OLE2.GET_OBJ_PROPERTY(v_app, 'Documents');
v_doc := OLE2.INVOKE_OBJ(v_docs, 'Add');
v_sel := OLE2.GET_OBJ_PROPERTY(v_app, 'Selection');
/* type first paragraph */
v_args := OLE2.CREATE_ARGLIST;
OLE2.ADD_ARG(v_args, 'This is paragraph 1.');
OLE2.INVOKE(v_sel, 'TypeText', v_args);
OLE2.DESTROY_ARGLIST(v_args);
OLE2.INVOKE(v_sel, 'TypeParagraph');
/* type second paragraph */
v_args := OLE2.CREATE_ARGLIST;
OLE2.ADD_ARG(v_args, 'This is paragraph 2.');
OLE2.INVOKE(v_sel, 'TypeText', v_args);
OLE2.DESTROY_ARGLIST(v_args);
OLE2.INVOKE(v_sel, 'TypeParagraph');
/* type third paragraph */
v_args := OLE2.CREATE_ARGLIST;
OLE2.ADD_ARG(v_args, 'This is paragraph 3.');
OLE2.INVOKE(v_sel, 'TypeText', v_args);
OLE2.DESTROY_ARGLIST(v_args);
/* set reference to Paragraphs collection */
v_pars := OLE2.GET_OBJ_PROPERTY(v_doc, 'Paragraphs');
/* select third word of first paragraph and make it bold */
v_args := OLE2.CREATE_ARGLIST;
OLE2.ADD_ARG(v_args, 1);
v_par := OLE2.INVOKE_OBJ(v_pars, 'Item', v_args);
OLE2.DESTROY_ARGLIST(v_args);
v_rng := OLE2.GET_OBJ_PROPERTY(v_par, 'Range');
v_wrds := OLE2.GET_OBJ_PROPERTY(v_rng, 'Words');
v_args := OLE2.CREATE_ARGLIST;
OLE2.ADD_ARG(v_args, 3);
v_rng := OLE2.INVOKE_OBJ(v_wrds, 'Item', v_args);
OLE2.SET_PROPERTY(v_rng, 'Bold', TRUE);
/* select third word of second paragraph and italicize it */
v_args := OLE2.CREATE_ARGLIST;
OLE2.ADD_ARG(v_args, 2);
v_par := OLE2.INVOKE_OBJ(v_pars, 'Item', v_args);
OLE2.DESTROY_ARGLIST(v_args);
v_rng := OLE2.GET_OBJ_PROPERTY(v_par, 'Range');
v_wrds := OLE2.GET_OBJ_PROPERTY(v_rng, 'Words');
v_args := OLE2.CREATE_ARGLIST;
OLE2.ADD_ARG(v_args, 3);
v_rng := OLE2.INVOKE_OBJ(v_wrds, 'Item', v_args);
OLE2.SET_PROPERTY(v_rng, 'Italic', TRUE);
/* select third word of second paragraph and underline it */
v_args := OLE2.CREATE_ARGLIST;
OLE2.ADD_ARG(v_args, 3);
v_par := OLE2.INVOKE_OBJ(v_pars, 'Item', v_args);
OLE2.DESTROY_ARGLIST(v_args);
v_rng := OLE2.GET_OBJ_PROPERTY(v_par, 'Range');
v_wrds := OLE2.GET_OBJ_PROPERTY(v_rng, 'Words');
v_args := OLE2.CREATE_ARGLIST;
OLE2.ADD_ARG(v_args, 3);
v_rng := OLE2.INVOKE_OBJ(v_wrds, 'Item', v_args);
OLE2.SET_PROPERTY(v_rng, 'Underline', TRUE);
END;
REFACTORING FOR REUSABILITY AND READABILITY
While the previous procedure runs without errors, it suffers from poor readability which, in turn, makes it difficult to maintain. Here, we address those issues by moving repetetive low-level operations into separate procedures.
PROCEDURE LAUNCH_WORD IS
v_app OLE2.OBJ_TYPE; -- Application
v_doc OLE2.OBJ_TYPE; -- Document
v_docs OLE2.OBJ_TYPE; -- Documents collection
v_sel OLE2.OBJ_TYPE; -- Selection
v_args OLE2.LIST_TYPE; -- OLE2 argument list
BEGIN
/* launch Word and MAKE IT VISIBLE!!! */
v_app := OLE2.CREATE_OBJ('Word.Application');
OLE2.SET_PROPERTY(v_app, 'Visible', TRUE);
/* create a new Word document */
v_docs := OLE2.GET_OBJ_PROPERTY(v_app, 'Documents');
v_doc := OLE2.INVOKE_OBJ(v_docs, 'Add');
v_sel := OLE2.GET_OBJ_PROPERTY(v_app, 'Selection');
/* add a few paragraphs */
PRINT_PARAGRAPH(v_sel, 'This is paragraph 1.');
PRINT_PARAGRAPH(v_sel, 'This is paragraph 2.');
PRINT_PARAGRAPH(v_sel, 'This is paragraph 3.');
/* apply formatting */
APPLY_FORMATTING(v_doc, 1, 3, 'Bold', TRUE);
APPLY_FORMATTING(v_doc, 2, 3, 'Italic', TRUE);
APPLY_FORMATTING(v_doc, 3, 3, 'Underline', TRUE);
END;
PROCEDURE APPLY_FORMATTING(
v_doc OLE2.OBJ_TYPE,
v_paragraph_num NUMBER,
v_word_num NUMBER,
v_attribute VARCHAR2,
v_value BOOLEAN) IS
v_pars OLE2.OBJ_TYPE; -- Paragraphs collection
v_par OLE2.OBJ_TYPE; -- Paragraph
v_wrds OLE2.OBJ_TYPE; -- Words collection
v_rng OLE2.OBJ_TYPE; -- Range
v_args OLE2.LIST_TYPE; -- OLE2 argument list
BEGIN
/* set reference to Paragraphs collection */
v_pars := OLE2.GET_OBJ_PROPERTY(v_doc, 'Paragraphs');
/* get specified paragraph */
v_args := OLE2.CREATE_ARGLIST;
OLE2.ADD_ARG(v_args, v_paragraph_num);
v_par := OLE2.INVOKE_OBJ(v_pars, 'Item', v_args);
OLE2.DESTROY_ARGLIST(v_args);
/* get words for specified paragraph */
v_rng := OLE2.GET_OBJ_PROPERTY(v_par, 'Range');
v_wrds := OLE2.GET_OBJ_PROPERTY(v_rng, 'Words');
/* apply formatting to word found at specified index */
v_args := OLE2.CREATE_ARGLIST;
OLE2.ADD_ARG(v_args, v_word_num);
v_rng := OLE2.INVOKE_OBJ(v_wrds, 'Item', v_args);
OLE2.SET_PROPERTY(v_rng, v_attribute, v_value);
END;
PROCEDURE PRINT_PARAGRAPH(v_sel OLE2.OBJ_TYPE, v_text VARCHAR2) IS
v_args OLE2.LIST_TYPE;
BEGIN
v_args := OLE2.CREATE_ARGLIST;
OLE2.ADD_ARG(v_args, v_text);
OLE2.INVOKE(v_sel, 'TypeText', v_args);
OLE2.DESTROY_ARGLIST(v_args);
OLE2.INVOKE(v_sel, 'TypeParagraph');
END;
CONCLUSION
It is my hope that this tutorial, despite it's introductory nature, has demonstrated the value of the VBA IDE, the ease with which automation processes can be prototyped using VBA, the noticeable similarity between VBA automation routines and their Forms PL/SQL counterparts, and the advantages of testing automation processes within the VBA IDE. Please feel free to follow up with any specific questions or concerns you may have.
Thanks,
Eric Adamson
Lansing, Michigan
FINAL NOTE: These examples use the OLE2 built-in, and will operate correctly when called from forms running in the Form Builder OC4J. Deploying them to an Oracle Application Server will launch Word on the server itself (if available), which is usually not the developer's intent! Automating Word client-side via web forms requires adding WebUtil support. Adapting the code for WebUtil is trivial -- just replace all instances of OLE2 with CLIENT_OLE2. Adapting forms for WebUtil and configuring OLE support into your Oracle Application Server, however, are beyond the scope of this tutorial.
REVISION HISTORY
This promises to be something of a 'living document'. I've snuck changes through without comment in the past, but in the future, I'll try to document significant changes here.
2006-08-21
* Prefaced boring subject line with text: 'Tutorial:' to clarify purpose
* Added emphasis on value of Object Browser as a referenceThanks James, for your kind words. I do hope this information will help folks out. I honestly believe that tinkering around in the VBA IDE will prove highly gratifying for automation developers. It can be assured that learning to make Word jump through hoops is much more straight-forward in this environment. I'm not one for mottos, but if I were pressed for a cheesy motto, I would say: First, make it work. Then, make it work in Oracle!
Once the idea has sunk in, that Visual Basic routines for automating Word are exact analogs to their OLE2 counterparts, we can remove keywords like Oracle and PL/SQL from our Google searches on Word automation which, at least in this context, are the proverbial kiss of death. Suddenly we find ourselves liberated by the possibility of steal-, ahem... borrowing ideas from the Visual Basic* community!
As for links, my link of choice is invariably http://groups.google.com -- if you don't already use it at least ten times a day, you must try it. This is the venerable USENET archive, including the holdings of now-extinct DejaNews. Another possible site of interest is http://word.mvps.org/FAQs/MacrosVBA, which may serve as a good starting point for those who wish to learn how to do fancy tricks with Word using VBA.
If these links don't prove immediately helpful, please feel free to give specifics on the sort of operations you are interested in automating, and I'll see if I can post an example that addresses it.
Regards,
Eric Adamson
Lansing, Michigan
PS: I do hope, as people read my posts, with every other acronym being VBA, that they are not mistakenly hearing a call to learn Visual Basic. I say this, not because I believe learning VB would be a Bad Thing, but because I assume that few of us feel we have the time to learn a new programming language. Despite having come to the Oracle camp already knowing VB/VBA, and having acquired a fair bit of experience with automating Office applications as an Access developer, I remain confident that what I am suggesting people attempt does not rise to the level of learning a language. What I am suggesting is that they learn enough of the language to get by.
*VB vs. VBA
Just a quick word on this, as readers may wonder why I seem to use these terms interchangeably. Visual Basic (VB) can refer to either a development platform or a programming language. Visual Basic for Applications (VBA) is a language -- more precisely, it is a subset of the Visual Basic language. One purchases VB, usually quite intentionally. VBA is included with Microsoft Office, as is VBA's development environment, the VBA IDE. The key distinction between VB and VBA is that VBA cannot be used to create self-contained executables. Rather, VBA relies on VBA-enabled applications, such as Microsoft Office applications, to serve as a container for VBA code, and to provide a runtime environment for that code. For the purposes of discussing OLE Automation, VB and VBA are quite interchangeable. -
Ole - writing to word document
Hi,
I have created a new word document with a table of 1 row and 3 columns using the ole concept. The text in all the 3 columns should be of different font and size. Please let me know if this can be done ?
Attached below is the code which i have used. But with this everything is getting printed with same font and size. Please let me know if there is anything wrong in it?
get property of gs_word 'documents' = gs_documents.
call method of gs_documents 'add'.
get property of gs_word 'activedocument' = gs_actdoc.
get property of gs_actdoc 'application' = gs_application.
get property of gs_application 'options' = gs_options.
set property of gs_options 'measurementunit' = '1'. "cm
get property of gs_application 'selection' = gs_selection.
get property of gs_selection 'font' = gs_font.
get property of gs_selection 'paragraphformat' = gs_parformat.
perform font_style using 'arial' '12' '1' '0' '0' '1'.
call method of gs_selection 'typeparagraph'.
perform create_table using '1' '3'.
perform fill_cell using '1' '2' 'abc'.
perform font_style using 'arial' '10' '0' '0' '0' '1'.
perform fill_cell using '1' '3' 'di-03
version 2.00'.
form font_style using value(p_0383)
value(p_0384)
value(p_0385)
value(p_0386)
value(p_0387)
value(p_0388).
set property of gs_font 'name' = p_0383.
set property of gs_font 'size' = p_0384.
set property of gs_font 'bold' = p_0385.
set property of gs_font 'italic' = p_0386.
set property of gs_font 'underline' = p_0387 .
set property of gs_parformat 'alignment' = p_0388.
endform.
form create_table using value(p_0262)
value(p_0263).
get property of gs_actdoc 'tables' = gs_tables.
get property of gs_selection 'range' = gs_range.
call method of gs_tables 'add' = gs_table
exporting
#1 = gs_range "handle for range entity
#2 = p_0262 "number of rows
#3 = p_0263. "number of columns
get property of gs_table 'borders' = gs_table_border.
set property of gs_table_border 'enable' = '1'. "with border
endform. " create_table
form fill_cell using value(p_0185)
value(p_0186)
value(p_0187).
call method of gs_table 'cell' = gs_cell
exporting
#1 = p_0185
#2 = p_0186.
get property of gs_cell 'range' = gs_range.
set property of gs_range 'text' = p_0187.
endform.
Thanks
ArunaHi Aruna,
Check this link.
An easy reference for ole automation.
https://www.sdn.sap.com/irj/servlet/prt/portal/prtroot/docs/library/uuid/c1d54348-0601-0010-3e98-bd2a2dcd9e6c
This may help you.
Thanks,
Bhaskar -
Auteur : Corinne Ribeyre-F085785 à _CARPO04
I need help with OLE Automation implementation (Excel,
CrystalReport,Word ...)
I generate Excel project with OleGen but no documentation exist for
this project. So I made severals tests (with Excel).
I can do (see examples):
- open a file
- open Excel Application
- open WorkBook, WoorkSheet
- Write and Read a Cell (but I am not sure it's the more efficient
method to do this)
- run a macro with parameters
But, I CAN'T do:
- run a command with parameters like PivotTableWizard (tableau croise
dynamique)
Does a Documentation exist about Forte project generated by Olegen
Tool (Excel..) ?
Does a Documentation exist about Forte/Crystal Report ?
Thank You for all answers and examples,
Corinne
Examples
-- Open Excel
theApplication : Excel . Application = New;
theApplication . CreateUsingProgID(NX('excel.application'));
--- Excel Visible /not visible
theApplication . Visible = VariantBoolean(Value = False);
-- Get all WorkBooks of Excel Application
theWorkBooks : Excel . WorkBooks = New;
theWorkBooks . SetDispatchObject(theApplication . Workbooks());
-- Open File.xls (added with previous Application)
theWorkBooks . Open (VariantString(Value = 'C:\\temp\\File.xls'));
-- Link file with a WorkBook
aWorkBook : Excel . WorkBook = New;
aWorkBook . SetDispatchObject(theApplication .
Workbooks(VariantString(value='File.xls')));
-- Link a Folder (Sheet1) from File with WorkSheet
aWorksheet : Excel . Worksheet = New;
aWorksheet . SetDispatchObject(aWorkBook .
Worksheets(VariantString(value='Sheet1')));
aRange : Excel . Range = New;
-- Fill Cell (1,1) with 'Article'
TitreArt : VariantString = VariantString(Value = 'Article');
aRange . SetDispatchObject(aWorksheet . Cells(VariantInteger(Value =
1), VariantInteger(Value = 1)));
aRange . Value = titreArt;
-- Fill Cell (1,2) with 'Date'
TitreDate : VariantString = VariantString(Value = 'Date');
aRange . SetDispatchObject(aWorksheet . Cells(VariantInteger(Value =
1), VariantInteger(Value = 2)));
aRange . Value = TitreDate;
-- Run a Macro
theApplication . Run(VariantString(Value = NX('MacroName')),
VariantInteger(Value = 65),
VariantInteger(Value = 7));
-- Page Setup
-- Link a Folder (Sheet2) from File with WorkSheet
aWorksheet . SetDispatchObject(aWorkBook .
Worksheets(VariantString(value='Sheet2')));
aPageSetup : Excel . PageSetUp = New;
aPageSetup . SetDispatchObject(aWorksheet.PageSetup);
aPageSetup . PrintTitleRows = VariantString (Value = '');
aPageSetup . PrintTitleColumns = VariantString (Value = '');
aPageSetup . LeftHeader = VariantString (Value = 'MICKEY');
aPageSetup . CenterHeader = VariantString (Value = 'MOUSE');
aPageSetup . RightHeader = VariantString (Value = '&J &H'); --
Attention J H en Excel Français; D T en Anglais
aPageSetup . LeftFooter = VariantString (Value = '');
aPageSetup . CenterFooter = VariantString (Value = 'DISNEYLAND
PARIS');
aPageSetup . RightFooter = VariantString (Value = '&P / &T');
aPageSetup . LeftMargin = VariantInteger(Value = 1);
aPageSetup . RightMargin = VariantInteger(Value = 1);
aPageSetup . TopMargin = VariantInteger(Value = 1);
aPageSetup . BottomMargin = VariantInteger(Value = 1);
aPageSetup . HeaderMargin = VariantDouble(Value = 0.5);
aPageSetup . FooterMargin = VariantDouble(Value = 0.5);
aPageSetup . PrintHeadings = VariantBoolean(Value = False);
aPageSetup . PrintGridlines = VariantBoolean(Value = False);
aPageSetup . PrintNotes = VariantBoolean(Value = False);
aPageSetup . CenterHorizontally = VariantBoolean(Value = True);
aPageSetup . CenterVertically = VariantBoolean(Value = True);
aPageSetup . Orientation = VariantInteger(Value = 2); --
(1:xlPortrait, 2:xlLandscape)
aPageSetup . Draft = VariantBoolean(Value = False);
aPageSetup . PaperSize = VariantInteger(Value = 9);
-- (8: xlPaperA3, 9: xlPaperA4)
aPageSetup . FirstPageNumber = VariantInteger(Value = -4105);
-- xlAutomatic
aPageSetup . Order = VariantInteger(Value = 1);
-- xlDownThenOver
aPageSetup . BlackAndWhite = VariantBoolean(Value = True);
aPageSetup . Zoom = VariantBoolean(Value = False);
aPageSetup . FitToPagesWide = VariantInteger(Value = 1);
aPageSetup . FitToPagesTall = VariantInteger(Value = 1);
-- Save File
aFilename : VariantString = VariantString(Value =
NX('C:/Temp/Essai.xls'));
aWorkBook . SaveAS(FileName = aFilename);
-- Print File
PrintOptions : PrintOptionsDesc;
PrintOptions = Self . Window . WindowSystem . DefaultPrintOptions .
Clone (Deep = True);
If (self.Window.PrintDialog (PrintOptions= PrintOptions,
ShowSetupDialog = TRUE,
ShowJobDialog = FALSE) = BV_OK) Then
aWorksheet . PrintOut();
End If;
-- Unlink
aWorkBook . RunAutoMacros(VariantInteger(Value = 2)); --xlAutoFermer
-- Cf doc VBA
aWorkBook . Close(variantboolean (Value = False));
TheApplication . Quit();
To unsubscribe, email '[email protected]' with
'unsubscribe forte-users' as the body of the message.
Searchable thread archive <URL:http://pinehurst.sageit.com/listarchive/>Hi all, forget this silly question...
I studied a little bit and learned how to handle OLEs properly...
Many thanks -
OLE Automation for Acrobat Reader
Hello guys
I have been reading some lines about OLE Automation for Acrobat READER and Full Acrobat.
So far I have seen most saying that Reader is not fully compliant with OLE. I really have zero experience with Adobe and before I buy a full acrobat license, I want to make sure of the following:
What I need to do is the next 4 simple calls:
Connect to Acrobat
Open a pdf file in invisible mode
Perform "Select All"
Copy Selection to clipboard
After that, I will importclipboard to my datawindow and I will be done for my programming task.
Have you had similar experiences about Acrobat OLE for PDF ?
some references are in help.adobe.com/livedocs/acrobat_sdk/10/Acrobat10_HTMLHelp
Thanks so much in advance for any hint.
RegardsHello again
Chris, thanks so much for your very quick response.
At a first glance, the PDF Toolkit looks good and with a good price too, but I did not see if I can call functionality from PowerBuilder code without opening a user interface. Are you familiar with this ?
Stuart, very nice approach for my need, but I apologize for not explaining clearly what I want.
I just want to process the content of some lines in the file to find specific strings.
As you may see, if you open the file with Adobe Reader or Adobe Acrobat and go to the edit menu, by clicking "Select All" and "Copy" you will get the text ready for pasting.
I want to automate this process to prevent the users from opening the Adobe application.
I'm now testing with the functions provided by Adobe documentation to perform OLE Automation and ALMOST gave me what I need with the following code:
Documentation is found in
http://help.adobe.com/livedocs/acrobat_sdk/10/Acrobat10_HTMLHelp/wwhelp/wwhimpl/js/html/wwhelp.htm?&accessible=true
// Start Code
boolean lb
oleobject luo_app, luo_file
luo_app = create oleobject
luo_app.connecttonewobject('AcroExch.app')
luo_file = create oleobject
luo_file.connecttonewobject('AcroExch.AvDoc')
luo_file.open('c:\some_file.pdf')
// Next three lines are for visual debugging and confirming that file is opening well during testing of code :=)
luo_file.show()
luo_file.bringtofront()
luo_file.setviewmode(1)
// Next two lines return FALSE, meaning they did not execute because the words "Select All" (or "SelectAll") and "Copy" are not the right words linked to the
// menu items
lb = luo_app.menuitemexecute('Select All') // Neither "SelectAll"
lb = luo_app.menuitemexecute('Copy')
// End of code
Everything works fine except the two lines. The Adobe application is open and the file shown, but when calling "Select All" and "Copy" in the function menuitemexecute, Adobe does not interpret these phrases.
Just to confirm that menuitemexecute has the right syntax, I tested a call for luo_app.menuitemexecute("find") and this command is well interpreted by Adobe, which immediately opens the find window at the right corner of the file
I hope not to be too dense with this explanation ( but maybe I was ) :=)
Thanks for your feedback -
Reliability of Forte's OLE Automation Server
Hi Forte Users,
We are currently working on the feasibility of developing OLE interface
for our existing Forte services. In that process we are wondering about the
reliability these Forte OLE servers as compared to any other normal Forte
Servers. Has anyone have any experience of using them or any ideas about the
thing we need to concentrate before starting the development of these
servers.
Any input on this issue will be appreciated.
Thanks in advance,
Charu.
To unsubscribe, email '[email protected]' with
'unsubscribe forte-users' as the body of the message.
Searchable thread archive <URL:http://pinehurst.sageit.com/listarchive/>A point worth mentioning here is about fail-over of service objects
that are configured as OLE automation servers.
If you are using Forte clients to talk to the service object,
then you really will not see any changes in automatic failover
situations.
However, in case of a non-Forte client( a.k.a. OLE client ), the
automatic failover does not happen. The non-Forte clients should be
coded to detect communication failures with the primary server. They
should have the intelligence to re-connect and retry methods on the (
new ) OLE server. This means you will have to program fail-over logic in
non-Forte clients, which you get for free with Forte clients.
I am not sure what kind of requirements is driving your process of
converting Forte services to OLE servers, but it is worth deliberating
on this problem, if you are not planning to use non-Forte clients, but
want to implement the services as OLE automation server.
Ofcourse you don't have to worry about this issue if you are not
planning to use non-Forte clients...
Good luck
Ajith Kallambella M.
Forte Consultant.
Please respond to Shi-Long Yin <[email protected]>
Subject: Re: Reliability of Forte's OLE Automation Server
Hi,
Essentially, I don't see any big differences between configuring and
exporting
the Forte service objects as normal Forte servers and DCE, Encina,
Tuxedo,
Object Broker, IIOP or OLE servers. We have already succeeded
configuring the
Forte servers as IIOP and OLE servers. Our Visual Basic client can
communicate
with the OLE server. The big difficulties are that there are two
limitations to
what elements of the service object€s class are available to an OLE
client.
First, an OLE client application can access any methods provided by that
service
object€s class, except for methods that use objects as parameters.
Second, OLE
clients can not access attributes of a Forte service object. OLE
clients can
only pass the following objects and data types as parameters and return
values:
TOOL data type Maps to OLE data type
Boolean Boolean
Cdispatch IDispatch
Cunknown IUnknown
Double Double
Float Float
Integer Long
i2 Iteger
string String
ui2 Short
ui4 Long
If a Forte service object includes methods that have object parameters
or return
values other than CUnknown and CDispatch, these methods are not included
as part
of the interface to this OLE server. Compared to the IIOP
configurations, the
limitations listed above may be too strict, especially, when you want to
export
your existing Forte services which may have interfaces with classes as
their
parameters or return types. But for IIOP, you can freely pass class
objects
(even deeply nested and derived) as method€s parameters or return
values. This
feature has significantly saved our development and maintenance time.
Other
alternatives may be to write the wrappers to overcome these limitations.
In one word, if you intend to integrate the EXISTING codes, which have
methods
with class parameters, you'd better to avoid configuring Forte service
objects
as OLE server. Try to use IIOP as much as you can because it is more
OOP
compatible and interoperable.
Shilong Yin
US West in Denver
=====================================================================
Charu wrote:
Hi Forte Users,
We are currently working on the feasibility of developing OLE interface
for our existing Forte services. In that process we are wondering about the
reliability these Forte OLE servers as compared to any other normal Forte
Servers. Has anyone have any experience of using them or any ideas about the
thing we need to concentrate before starting the development of these
servers.
Any input on this issue will be appreciated.
Thanks in advance,
Charu.
To unsubscribe, email '[email protected]' with
'unsubscribe forte-users' as the body of the message.
Searchable thread archive <URL:http://pinehurst.sageit.com/listarchive/>
To unsubscribe, email '[email protected]' with
'unsubscribe forte-users' as the body of the message.
Searchable thread archive <URL:http://pinehurst.sageit.com/listarchive/>
Get Your Private, Free Email at http://www.hotmail.com
To unsubscribe, email '[email protected]' with
'unsubscribe forte-users' as the body of the message.
Searchable thread archive <URL:http://pinehurst.sageit.com/listarchive/>
Maybe you are looking for
-
Is there a limit to number of images in Lightroom4 web gallery?
What is the total number of images that can be in a LR4 Web HTML Gallery? Is there a limit? I am using Mac OS LION.
-
HT5624 Why I can't use my iMessage features?
I can't use my iMessage features, it always says I need to verified it to my email address written in the screen, so when I check my email adders there is no verification link or email coming from Apple. And I don't have also FaceTime icon in my scre
-
LSMW fails when run in B/G but works in Frontend..why?
Hi All, i am trying to runa batch process by LSMW, my files are accurate, no problem with them, everything works fine but it fails when run in BG..works absolutely fine in front end. whats the diff with running in B/G? same thing happens when i am tr
-
Hi All, Please i need to know how i can implement the following:- i want to implement tax in an Invoice document in such that i can deduct 2 separate tax and also Witholding Tax at Payment level. i. e . 1. VAT - 5% of Net at Invoice Category -> link
-
How to set a RichTree (af:tree) as readonly?
There is no "readonly" property. editingMode supports 2 options only: click to edit, edit all. The doc http://docs.oracle.com/cd/E38668_01/apirefs.111230/e17488/oracle/adf/view/rich/component/rich/data/RichTree.html says "When a tree is rendered as r