OLE2 from Forms 10g to Microsoft Word 2007 Mail Merge
We have an Oracle Form that allows the user to print off information on the Form to a Microsoft Word document via OLE2 and mail merging; Forms version is 10.1.2.0.2 as it the version of OAS (from Linux Redhat AS4). This currently works fine if the user has Microsoft Word 2000, but since a recent upgrade to Office 2003 and now in some cases 2007, this functionality doesn't work. The JInitiator Console displays the following error messages:
---------------------------------
Oracle JInitiator: Version 1.3.1.22
Using JRE version 1.3.1.22-internal Java HotSpot(TM) Client VM
User home directory = C:\Documents and Settings\jovinc
Proxy Configuration: Manual Configuration
Proxy: stpproxy:80
Proxy Overrides: 172.27*,172.28*,10*,10.*,intranet.fnfis.com*,ljtcapd05.fnfis.com,ukbiprodlx01,ukbiprodlx01.certegy.com,ukbiprodlx02*,ukbiprodlx02.certegy.com*
JAR cache enabled
Location: C:\Documents and Settings\jovinc\Oracle Jar Cache
Maximum size: 50 MB
Compression level: 0
----------------------------------------------------
c: clear console window
f: finalize objects on finalization queue
g: garbage collect
h: display this help message
l: dump classloader list
m: print memory usage
q: hide console
s: dump system properties
t: dump thread list
x: clear classloader cache
0-5: set trace level to <n>
----------------------------------------------------
Loading http://ukbiprodlx01.certegy.com:7778/forms/java/frmall_jinit.jar from JAR cache
Loading http://ukbiprodlx01.certegy.com:7778/forms/java/frmrwinteg.jar from JAR cache
Loading http://ukbiprodlx01.certegy.com:7778/forms/java/frmwebutil.jar from JAR cache
Loading http://ukbiprodlx01.certegy.com:7778/forms/java/jacob.jar from JAR cache
Loading http://ukbiprodlx01.certegy.com:7778/forms/CTYCommonLive/CommonImages.jar from JAR cache
Loading http://ukbiprodlx01.certegy.com:7778/forms/CTYLogonLive/LogonImages.jar from JAR cache
Loading http://ukbiprodlx01.certegy.com:7778/forms/CTYXplorerLive/XplorerImages.jar from JAR cache
proxyHost=null
proxyPort=0
connectMode=HTTP, native.
Forms Applet version is : 10.1.2.0
2009-Aug-19 11:30:43.785 ERROR>WUO-714 [OleFunctions.setExceptionValues()] Unable to get the last OLE Error details; Exception
null
2009-Aug-19 11:30:43.785 ERROR>WUO-707 [OleFunctions.invoke_obj()] Unable to invoke Method: TypeText; Exception
com.jacob.com.ComFailException: A COM exception has been encountered:
At Invoke of: TypeText
Description: Type mismatch.
2009-Aug-19 11:30:44.848 ERROR>WUO-707 [OleFunctions.invoke_obj()] Unable to invoke Method: Execute; Exception
com.jacob.com.ComFailException: Invoke of: Execute
Source: Microsoft Word
Description: This method or property is not available because the document is not a mail merge main document.
---------------------------------------------------------
The below code is used within the Form when they invoke the 'Print' function:
-----------------------
PROCEDURE PR_print_invoice
IS
--
l_t_application CLIENT_OLE2.OBJ_TYPE;
l_t_documents CLIENT_OLE2.OBJ_TYPE;
l_t_source_doc CLIENT_OLE2.OBJ_TYPE;
l_t_letter_doc CLIENT_OLE2.OBJ_TYPE;
l_t_merge_doc CLIENT_OLE2.OBJ_TYPE;
l_t_mail_merge CLIENT_OLE2.OBJ_TYPE;
l_t_selection CLIENT_OLE2.OBJ_TYPE;
l_t_args CLIENT_OLE2.LIST_TYPE;
l_t_args_move_right CLIENT_OLE2.LIST_TYPE;
--
l_v_sourcefile VARCHAR2(2000);
l_v_letter VARCHAR2(2000);
l_v_mergefile VARCHAR2(2000);
l_v_destination_directory VARCHAR2(2000);
l_v_source_directory VARCHAR2(2000);
--
l_n_ok NUMBER;
l_n_tax NUMBER;
l_n_total_value NUMBER;
l_n_total_tax NUMBER;
l_v_country VARCHAR2(3);
l_t_bca_client_address_line1 bill_client_address.bca_client_address_line1%TYPE;
l_t_bca_client_address_line2 bill_client_address.bca_client_address_line2%TYPE;
l_t_bca_client_address_line3 bill_client_address.bca_client_address_line3%TYPE;
l_t_bca_client_address_line4 bill_client_address.bca_client_address_line4%TYPE;
l_t_bca_client_address_line5 bill_client_address.bca_client_address_line5%TYPE;
l_t_bca_client_address_line6 bill_client_address.bca_client_address_line6%TYPE;
l_t_bcl_client_name bill_client.bcl_client_name%TYPE;
l_t_bcl_client_id bill_client.bcl_client_id%TYPE;
l_t_trt_rate tax_rate.trt_rate%TYPE;
l_t_rli_description_1 reference_list.rli_description_1%TYPE;
l_n_item_count NUMBER := 0;
l_b_debug BOOLEAN;
l_b_ok BOOLEAN;
l_n_bookmark NUMBER := 0;
l_n_counter PLS_INTEGER;
--
CURSOR l_cur_client( p_ti_bcl_seq_num IN bill_client.bcl_seq_num%TYPE )
IS
SELECT bcl_client_id
, bcl_client_name
FROM bill_client
WHERE bcl_seq_num = p_ti_bcl_seq_num
;
--
CURSOR l_cur_client_address( p_ti_bcl_seq_num IN bill_client.bcl_seq_num%TYPE )
IS
SELECT bca_client_address_line1
, bca_client_address_line2
, bca_client_address_line3
, bca_client_address_line4
, bca_client_address_line5
, bca_client_address_line6
FROM bill_client_address bca
, role
WHERE bca_bcl_seq_num = p_ti_bcl_seq_num
AND rol_ref_type = 'INVPOINT'
AND rol_bcl_seq_num = p_ti_bcl_seq_num
AND rol_bca_seq_num = bca_seq_num
;
--
CURSOR l_cur_items( p_ti_mih_seq_num IN manual_invoice_header.mih_seq_num%TYPE )
IS
SELECT mil_tco_seq_num
, mil_value
, mil_description
, mil_quantity
, rownum
FROM manual_invoice_line mil
WHERE mil_mih_seq_num = p_ti_mih_seq_num
;
--
CURSOR l_cur_count_items( p_ti_mih_seq_num IN manual_invoice_header.mih_seq_num%TYPE )
IS
SELECT count(*)
FROM manual_invoice_line
WHERE mil_mih_seq_num = p_ti_mih_seq_num
;
--
CURSOR l_cur_tax_rate( p_ti_tco_seq_num IN tax_rate.trt_tco_seq_num%TYPE
, p_ti_mih_invoice_date manual_invoice_header.mih_invoice_date%TYPE )
IS
SELECT trt_rate
FROM tax_rate
WHERE trt_tco_seq_num = p_ti_tco_seq_num
AND p_ti_mih_invoice_date BETWEEN trt_effective_date AND NVL( trt_effective_end_date, p_ti_mih_invoice_date )
;
--
CURSOR l_cur_ref_list( p_ti_rli_code reference_list.rli_code%TYPE )
IS
SELECT rli_description_1
FROM reference_list
WHERE rli_rty_code = 'INTYP'
AND rli_bcy_seq_num = NVL( :GLOBAL.bcy_seq_num, 1 )
AND rli_code = p_ti_rli_code
;
--
CURSOR l_cur_country( p_ti_bcy_seq_num bill_country.bcy_seq_num%TYPE )
IS
SELECT bcy_short_name
FROM bill_country
WHERE bcy_seq_num = p_ti_bcy_seq_num
;
--
PROCEDURE PR_Insert_Cell( p_vi_text IN VARCHAR2 )
IS
l_n_bookmark NUMBER := 0;
BEGIN
--
l_n_bookmark := 1;
l_t_args := CLIENT_OLE2.CREATE_ARGLIST;
CLIENT_OLE2.ADD_ARG( l_t_args, p_vi_text );
CLIENT_OLE2.INVOKE( l_t_selection, 'TypeText', l_t_args);
CLIENT_OLE2.DESTROY_ARGLIST( l_t_args );
--
EXCEPTION
WHEN FORM_TRIGGER_FAILURE
THEN
RAISE;
WHEN OTHERS
THEN
PA_lib_msg.PR_others_exception( 'PA_hci_misc.PR_print_invoice.PR_insert_cell', l_n_bookmark );
END;
--
BEGIN
--
l_n_bookmark := 1;
SYNCHRONIZE;
--
l_n_bookmark := 2;
OPEN l_cur_country( :GLOBAL.bcy_seq_num );
FETCH l_cur_country INTO l_v_country;
CLOSE l_cur_country;
--
-- Determine invoice names and locations and fetch them from the server
l_n_bookmark := 3;
l_v_sourcefile := pa_lib_security.fn_fetch_environment( 'ManualInvoiceSourceFile' );
l_v_letter := pa_lib_security.fn_fetch_environment( l_v_country || 'ManualInvoiceMergeFile' );
l_v_source_directory := pa_lib_security.fn_fetch_environment( 'SourceManualInvoiceDirectory' );
l_v_destination_directory := pa_lib_security.fn_fetch_environment( 'DestinationManualInvoiceDir' );
l_b_debug := ( pa_lib_security.fn_fetch_environment( 'ManualInvoiceDebug' ) = 'Y' );
--
l_b_ok := webutil_file_transfer.as_to_client( l_v_destination_directory||l_v_sourcefile, l_v_source_directory||l_v_sourcefile );
l_b_ok := webutil_file_transfer.as_to_client( l_v_destination_directory||l_v_letter, l_v_source_directory||l_v_letter );
--
l_n_bookmark := 4;
IF ( :SYSTEM.FORM_STATUS = 'CHANGED' )
THEN
l_n_bookmark := 5;
DO_KEY('commit_form');
END IF;
--
l_n_bookmark := 6;
OPEN l_cur_count_items( :blk_manual_inv_header.mih_seq_num );
FETCH l_cur_count_items INTO l_n_item_count;
CLOSE l_cur_count_items;
--
IF ( l_n_item_count = 0 )
THEN
pa_lib_msg.pr_message_alert( 'STB', -119 );
RETURN;
END IF;
--
l_n_bookmark := 7;
SET_APPLICATION_PROPERTY( CURSOR_STYLE, 'BUSY' );
--
-- Start Word
l_n_bookmark := 8;
l_t_application := CLIENT_OLE2.CREATE_OBJ( 'Word.Application' );
l_t_documents := CLIENT_OLE2.GET_OBJ_PROPERTY( l_t_application, 'Documents' );
--
IF ( l_b_debug )
THEN
CLIENT_OLE2.SET_PROPERTY( l_t_application, 'Visible', 1 );
END IF;
--
-- Open source file
l_n_bookmark := 9;
l_t_args := CLIENT_OLE2.CREATE_ARGLIST;
CLIENT_OLE2.ADD_ARG( l_t_args, l_v_destination_directory||l_v_sourcefile );
l_t_source_doc := CLIENT_OLE2.INVOKE_OBJ( l_t_documents, 'Open', l_t_args );
CLIENT_OLE2.DESTROY_ARGLIST( l_t_args );
--
-- Populate source file with invoice items
l_n_bookmark := 10;
OPEN l_cur_client( :parameter.p_bcl_seq_num );
FETCH l_cur_client INTO l_t_bcl_client_id, l_t_bcl_client_name;
--
IF ( l_cur_client%NOTFOUND )
THEN
CLOSE l_cur_client;
pa_lib_msg.pr_message_alert( 'STB', -121 );
END IF;
CLOSE l_cur_client;
--
l_n_bookmark := 11;
OPEN l_cur_client_address( :parameter.p_bcl_seq_num );
FETCH l_cur_client_address INTO l_t_bca_client_address_line1
, l_t_bca_client_address_line2
, l_t_bca_client_address_line3
, l_t_bca_client_address_line4
, l_t_bca_client_address_line5
, l_t_bca_client_address_line6;
--
IF ( l_cur_client_address%NOTFOUND )
THEN
CLOSE l_cur_client_address;
pa_lib_msg.pr_message_alert( 'STB', -122 );
END IF;
CLOSE l_cur_client_address;
--
l_n_bookmark := 12;
OPEN l_cur_ref_list( :blk_manual_inv_header.mih_invoice_type );
FETCH l_cur_ref_list INTO l_t_rli_description_1;
--
IF ( l_cur_ref_list%NOTFOUND )
THEN
CLOSE l_cur_ref_list;
pa_lib_msg.pr_message_alert( 'STB', -123 );
END IF;
CLOSE l_cur_ref_list;
--
-- Move to first data column
l_n_bookmark := 13;
l_t_selection := CLIENT_OLE2.GET_OBJ_PROPERTY( l_t_application, 'Selection' );
l_t_args_move_right := CLIENT_OLE2.CREATE_ARGLIST;
CLIENT_OLE2.ADD_ARG( l_t_args_move_right, 12 );
CLIENT_OLE2.ADD_ARG( l_t_args_move_right, 1 );
CLIENT_OLE2.ADD_ARG( l_t_args_move_right, 0 );
--
FOR l_n_counter IN 1 .. 19
LOOP
CLIENT_OLE2.INVOKE( l_t_selection, 'MoveRight', l_t_args_move_right );
END LOOP;
--
l_n_bookmark := 14;
l_n_total_value := 0;
l_n_total_tax := 0;
--
FOR l_r_items IN l_cur_items( :blk_manual_inv_header.mih_seq_num )
LOOP
--
l_n_bookmark := 15;
OPEN l_cur_tax_rate( l_r_items.mil_tco_seq_num, :blk_manual_inv_header.mih_invoice_date );
FETCH l_cur_tax_rate INTO l_t_trt_rate;
--
IF ( l_cur_tax_rate%NOTFOUND )
THEN
CLOSE l_cur_tax_rate;
pa_lib_msg.pr_message_alert( 'STB', -124 );
END IF;
CLOSE l_cur_tax_rate;
--
l_n_tax := ROUND( l_r_items.mil_value * ( l_t_trt_rate / 100 ), 2 );
l_n_total_tax := l_n_total_tax + l_n_tax;
l_n_total_value := l_n_total_value + l_r_items.mil_value;
--
END LOOP;
--
l_n_bookmark := 16;
FOR l_r_items IN l_cur_items( :blk_manual_inv_header.mih_seq_num )
LOOP
--
l_n_bookmark := 17;
CLIENT_OLE2.INVOKE( l_t_selection, 'MoveRight', l_t_args_move_right );
PR_insert_cell( l_r_items.mil_description );
--
l_n_bookmark := 18;
CLIENT_OLE2.INVOKE( l_t_selection, 'MoveRight', l_t_args_move_right );
PR_insert_cell( TO_CHAR( l_r_items.mil_quantity ) );
--
l_n_bookmark := 19;
CLIENT_OLE2.INVOKE( l_t_selection, 'MoveRight', l_t_args_move_right );
PR_insert_cell( TO_CHAR( l_r_items.mil_value, '99999999.90' ) );
--
l_n_bookmark := 20;
CLIENT_OLE2.INVOKE( l_t_selection, 'MoveRight', l_t_args_move_right );
OPEN l_cur_tax_rate( l_r_items.mil_tco_seq_num, :blk_manual_inv_header.mih_invoice_date );
FETCH l_cur_tax_rate INTO l_t_trt_rate;
IF ( l_cur_tax_rate%NOTFOUND )
THEN
CLOSE l_cur_tax_rate;
pa_lib_msg.pr_message_alert( 'STB', -124 );
END IF;
CLOSE l_cur_tax_rate;
PR_insert_cell( TO_CHAR( l_t_trt_rate ) || '%' );
--
l_n_bookmark := 21;
CLIENT_OLE2.INVOKE( l_t_selection, 'MoveRight', l_t_args_move_right );
l_n_tax := ROUND( l_r_items.mil_value * ( l_t_trt_rate / 100 ), 2 );
PR_insert_cell( TO_CHAR( l_n_tax, '99999999.90' ) );
--
l_n_bookmark := 22;
CLIENT_OLE2.INVOKE( l_t_selection, 'MoveRight', l_t_args_move_right );
PR_insert_cell( TO_CHAR( l_r_items.rownum ) );
--
l_n_bookmark := 23;
CLIENT_OLE2.INVOKE( l_t_selection, 'MoveRight', l_t_args_move_right );
PR_insert_cell( UPPER( l_t_rli_description_1 ) );
--
l_n_bookmark := 24;
CLIENT_OLE2.INVOKE( l_t_selection, 'MoveRight', l_t_args_move_right );
PR_insert_cell( l_t_bcl_client_name );
--
l_n_bookmark := 25;
CLIENT_OLE2.INVOKE( l_t_selection, 'MoveRight', l_t_args_move_right );
PR_insert_cell( l_t_bca_client_address_line1 );
--
l_n_bookmark := 26;
CLIENT_OLE2.INVOKE( l_t_selection, 'MoveRight', l_t_args_move_right );
PR_insert_cell( l_t_bca_client_address_line2 );
--
l_n_bookmark := 27;
CLIENT_OLE2.INVOKE( l_t_selection, 'MoveRight', l_t_args_move_right );
PR_insert_cell( l_t_bca_client_address_line3 );
--
l_n_bookmark := 28;
CLIENT_OLE2.INVOKE( l_t_selection, 'MoveRight', l_t_args_move_right );
PR_insert_cell( l_t_bca_client_address_line4 );
--
l_n_bookmark := 29;
CLIENT_OLE2.INVOKE( l_t_selection, 'MoveRight', l_t_args_move_right );
PR_insert_cell( l_t_bca_client_address_line5 );
--
l_n_bookmark := 30;
CLIENT_OLE2.INVOKE( l_t_selection, 'MoveRight', l_t_args_move_right );
PR_insert_cell( l_t_bca_client_address_line6 );
--
l_n_bookmark := 31;
CLIENT_OLE2.INVOKE( l_t_selection, 'MoveRight', l_t_args_move_right );
PR_insert_cell( TO_CHAR( :blk_manual_inv_header.mih_invoice_date, 'DD/MM/YYYY' ) );
--
l_n_bookmark := 32;
CLIENT_OLE2.INVOKE( l_t_selection, 'MoveRight', l_t_args_move_right );
PR_insert_cell( l_t_bcl_client_id );
--
l_n_bookmark := 33;
CLIENT_OLE2.INVOKE( l_t_selection, 'MoveRight', l_t_args_move_right );
IF ( :blk_manual_inv_header.mih_invoice_prefix IS NULL )
THEN
PR_insert_cell( TO_CHAR( :blk_manual_inv_header.mih_invoice_number, '0000000009' ) || '/' ||
TO_CHAR( :blk_manual_inv_header.mih_issue_number, '09') );
ELSE
IF ( NVL( LENGTH( :blk_manual_inv_header.mih_invoice_prefix), 0 ) = 1 )
THEN
PR_insert_cell( :blk_manual_inv_header.mih_invoice_prefix ||
TO_CHAR( :blk_manual_inv_header.mih_invoice_number, '000000009' ) || '/' ||
TO_CHAR( :blk_manual_inv_header.mih_issue_number, '09' ) );
ELSE
PR_insert_cell( :blk_manual_inv_header.mih_invoice_prefix ||
TO_CHAR( :blk_manual_inv_header.mih_invoice_number, '00000009' ) || '/' ||
TO_CHAR( :blk_manual_inv_header.mih_issue_number, '09' ) );
END IF;
END IF;
--
l_n_bookmark := 34;
CLIENT_OLE2.INVOKE( l_t_selection, 'MoveRight', l_t_args_move_right );
IF ( l_r_items.rownum = 1 )
THEN
PR_insert_cell( TO_CHAR( l_n_total_value, '99999999.90') );
END IF;
--
l_n_bookmark := 35;
CLIENT_OLE2.INVOKE( l_t_selection, 'MoveRight', l_t_args_move_right );
IF ( l_r_items.rownum = 1 )
THEN
PR_insert_cell( TO_CHAR( l_n_total_tax, '99999999.90' ) );
END IF;
--
l_n_bookmark := 36;
CLIENT_OLE2.INVOKE( l_t_selection, 'MoveRight', l_t_args_move_right );
IF ( l_r_items.rownum = 1 )
THEN
PR_insert_cell( TO_CHAR( l_n_total_value + l_n_total_tax, '99999999.90' ) );
END IF;
--
END LOOP;
--
CLIENT_OLE2.DESTROY_ARGLIST( l_t_args_move_right );
--
-- Open merge file
l_n_bookmark := 37;
l_t_args := CLIENT_OLE2.CREATE_ARGLIST;
CLIENT_OLE2.ADD_ARG( l_t_args, l_v_destination_directory||l_v_letter );
l_t_letter_doc := CLIENT_OLE2.INVOKE_OBJ( l_t_documents, 'Open', l_t_args );
CLIENT_OLE2.DESTROY_ARGLIST( l_t_args );
--
-- Do mail merge
l_n_bookmark := 38;
l_t_mail_merge := CLIENT_OLE2.GET_OBJ_PROPERTY( l_t_letter_doc, 'MailMerge');
l_t_args := CLIENT_OLE2.CREATE_ARGLIST;
CLIENT_OLE2.INVOKE( l_t_mail_merge, 'Execute', l_t_args );
CLIENT_OLE2.DESTROY_ARGLIST( l_t_args );
--
-- Print
l_n_bookmark := 39;
l_t_args := CLIENT_OLE2.CREATE_ARGLIST;
l_t_merge_doc := CLIENT_OLE2.GET_OBJ_PROPERTY( l_t_application, 'ActiveDocument' );
CLIENT_OLE2.ADD_ARG( l_t_args, 0 );
CLIENT_OLE2.INVOKE( l_t_merge_doc, 'PrintOut', l_t_args );
CLIENT_OLE2.DESTROY_ARGLIST( l_t_args );
--
-- Cleanup
l_n_bookmark := 40;
IF ( NOT( l_b_debug ) )
THEN
--
l_t_args := CLIENT_OLE2.CREATE_ARGLIST;
CLIENT_OLE2.ADD_ARG( l_t_args, 0 );
CLIENT_OLE2.INVOKE( l_t_documents, 'Close', l_t_args );
CLIENT_OLE2.DESTROY_ARGLIST( l_t_args );
CLIENT_OLE2.INVOKE( l_t_application, 'QUIT' );
--
END IF;
--
CLIENT_OLE2.RELEASE_OBJ( l_t_selection );
CLIENT_OLE2.RELEASE_OBJ( l_t_mail_merge );
CLIENT_OLE2.RELEASE_OBJ( l_t_source_doc );
CLIENT_OLE2.RELEASE_OBJ( l_t_letter_doc );
CLIENT_OLE2.RELEASE_OBJ( l_t_merge_doc );
CLIENT_OLE2.RELEASE_OBJ( l_t_documents );
CLIENT_OLE2.RELEASE_OBJ( l_t_application );
--
l_n_bookmark := 41;
SET_APPLICATION_PROPERTY(CURSOR_STYLE,'DEFAULT');
--
EXCEPTION
--
WHEN FORM_TRIGGER_FAILURE
THEN
SET_APPLICATION_PROPERTY(CURSOR_STYLE,'DEFAULT');
RAISE;
WHEN OTHERS
THEN
PA_lib_msg.PR_others_exception('PA_hci_misc.PR_print_invoice',l_n_bookmark);
--
END;
---------------------------------