2007 Oct 16 1:33 PM
Hi,
I am testing the simple mail functionality in transaction VA01.
In customizing (output determination processing routines) for simple mail is being used a program and a smartform. It was not me who developed them.
The problem is that when I try to test this through VA01 (I choose simple mail, etc), I get a dump saying: Invalid commit work in an update function module. Termination occurred in the ABAP program SAPLSOI1 in SO_DOCUMENT_SEND_API1. The main program was RSM13000.
My problem now is how can I try to debug this when I am in transaction VA02? I am not able to execute the program I have in customizing
How can I found more information about this?
Thanks a lot
2007 Oct 16 1:40 PM
If the code is triggered in update mode u cant execute commit work and hence u cant debug,-
2007 Oct 16 1:52 PM
This commit work is happening in a standard FM: SO_DOCUMENT_SEND_API1:
set commit work
if commit_work = on.
commit work.
endif.
I only want to know how can i test this...
2007 Oct 16 1:57 PM
thor thor,
try to find out where the COMMIT WORK comes from.
transactions VA01 and VA02 do all their database update (obviously including the mail task) in a separate process called UPDATE TASK. One or more functions are called in UPDATE TASK. That means all interface data are stored in a buffer. When the calling program issues a COMMIT WORK at the end of the transaction, the buffer is processed.
If the COMMIT WORK is not issued or a ROLLBACK WORK occurs, all the data are deleted.
Regards,
Clemens
2007 Oct 16 1:59 PM
Hi,
The commit work comes from function module: SO_DOCUMENT_SEND_API1 (lines 352). But i am not able to debug this... and i am not able to know why i have this error...
Thanks
2007 Oct 16 2:08 PM
thor thor,
your system is not consistent, what realease?
We have no COMMIT WORK in this function.
CALL FUNCTION 'SO_OBJECT_SEND' starts in line 322 and ends in 355 (release 46C). I checked our ECC600 Retail system, no COMMIT WORK either.
You may check the version history of the function and I'r recommend uregtly to restore the orginal version.
And the one who did the modification may be sent anywhere.
Regards,
Clemens
2007 Oct 16 2:16 PM
Weird..
I am working with SAP ECC 6.0 - release 700
In version history no one has modified the program...
function so_document_send_api1.
*"----
""Lokale Schnittstelle:
*" IMPORTING
*" VALUE(DOCUMENT_DATA) LIKE SODOCCHGI1 STRUCTURE SODOCCHGI1
*" VALUE(PUT_IN_OUTBOX) LIKE SONV-FLAG DEFAULT SPACE
*" VALUE(SENDER_ADDRESS) LIKE SOEXTRECI1-RECEIVER DEFAULT SY-UNAME
*" VALUE(SENDER_ADDRESS_TYPE) LIKE SOEXTRECI1-ADR_TYP DEFAULT 'B'
*" VALUE(COMMIT_WORK) LIKE SONV-FLAG DEFAULT SPACE
*" EXPORTING
*" VALUE(SENT_TO_ALL) LIKE SONV-FLAG
*" VALUE(NEW_OBJECT_ID) LIKE SOFOLENTI1-OBJECT_ID
*" VALUE(SENDER_ID) LIKE SOUDK STRUCTURE SOUDK
*" TABLES
*" PACKING_LIST STRUCTURE SOPCKLSTI1
*" OBJECT_HEADER STRUCTURE SOLISTI1 OPTIONAL
*" CONTENTS_BIN STRUCTURE SOLISTI1 OPTIONAL
*" CONTENTS_TXT STRUCTURE SOLISTI1 OPTIONAL
*" CONTENTS_HEX STRUCTURE SOLIX OPTIONAL
*" OBJECT_PARA STRUCTURE SOPARAI1 OPTIONAL
*" OBJECT_PARB STRUCTURE SOPARBI1 OPTIONAL
*" RECEIVERS STRUCTURE SOMLRECI1
*" EXCEPTIONS
*" TOO_MANY_RECEIVERS
*" DOCUMENT_NOT_SENT
*" DOCUMENT_TYPE_NOT_EXIST
*" OPERATION_NO_AUTHORIZATION
*" PARAMETER_ERROR
*" X_ERROR
*" ENQUEUE_ERROR
*"----
data begin of object_hd_change.
include structure sood1.
data end of object_hd_change.
data begin of attach_hd_change.
include structure sood1.
data end of attach_hd_change.
data begin of object_data.
include structure soodd.
data end of object_data.
data begin of objhead occurs 1.
include structure soli.
data end of objhead.
data begin of objcont occurs 100.
include structure soli.
data end of objcont.
data begin of atthead_tab occurs 1.
include structure soli.
data end of atthead_tab.
data begin of attcont_tab occurs 10.
include structure soli.
data end of attcont_tab.
data begin of atthead occurs 1.
include structure soli.
data end of atthead.
data begin of attcont occurs 10.
include structure soli.
data end of attcont.
data begin of new_pack_list occurs 10.
include structure soxpl.
data end of new_pack_list.
data begin of rec_table occurs 10.
include structure soos1.
data end of rec_table.
data begin of object_fl_change.
include structure sofm1.
data end of object_fl_change.
data rcode like sonv-rcode.
data object_type like sood-objtp.
data object_id_new like soodk.
data file_format(3).
data: originator like soos1-recextnam,
originator_type like soos1-recesc.
data: hex_size like sy-tabix.
data: old_object like swotobjid,
* sh070900 5.0A reconvert R30 into OBJ Docs is possible.
sood_id like soodk.
data: old_folder_id like soodk,
old_object_id like soodk,
old_forwarder like soud-usrnam,
old_object_data like sood2.
data hex_mode type sonv-flag value space.
data dummy_hex type solix_tab.
**data i.
**if sy-uname = ''
while i ne 1.
endwhile.
**endif.
describe table contents_bin lines hex_size.
if hex_size gt 0.
call function 'SO_CONVERT_CONTENTS_BIN'
exporting
it_contents_bin = contents_bin[]
importing
et_contents_bin = contents_bin[].
data l_new_size type i.
data l_line_size type i.
data l_new_doc_size type i.
describe table contents_bin lines l_new_size.
if l_new_size <> hex_size.
describe field contents_bin-line length l_line_size in character mode.
loop at packing_list where transf_bin = on.
packing_list-body_start = packing_list-body_start * 2 - 1.
packing_list-body_num = packing_list-body_num * 2.
l_new_doc_size = packing_list-body_num * l_line_size / 2.
if packing_list-doc_size <= l_new_doc_size.
packing_list-doc_size = l_new_doc_size * 2.
endif.
modify packing_list.
endloop.
endif.
endif.
describe table contents_hex lines hex_size.
if hex_size gt 0.
refresh contents_bin.
MOVE CONTENTS_HEX[] TO CONTENTS_BIN[].
hex_to_cont contents_hex contents_bin.
endif.
* transfer document data
perform transfer_objdat_to_obj using document_data
object_hd_change
object_fl_change.
perform set_default_object_data using object_hd_change.
**********************************************************************
* read object out of table
* take API1, so no receiver conversion is necessary here
**********************************************************************
read table packing_list index 1. "first object is document
if sy-subrc ne ok. "no packing list
raise parameter_error.
endif.
perform read_object_out_of_tables tables object_header
contents_txt
contents_bin
objhead
objcont
using packing_list
object_data
rcode.
* parameters for tracing
LOOP AT OBJHEAD.
PERFORM TRACE(RSSOEXTR) USING 'OBJHEAD' OBJHEAD-LINE.
ENDLOOP.
if rcode ne ok. "no object found
raise parameter_error.
endif.
* out of object data use only extern content flag and perhaps the size
move object_data-extct to object_hd_change-extct.
if object_hd_change-objlen = 0 or
object_hd_change-objlen is initial.
move object_data-objlen to object_hd_change-objlen.
endif.
perform format_prepare_for_insert in program sapfssoa "873845
using packing_list-transf_bin
dummy_hex
changing objhead[]
objcont[]
packing_list-doc_type
object_hd_change-file_ext
rcode.
move packing_list-doc_type to object_type.
* for old types move size to header
perform size_to_header tables objhead
using object_type
document_data-doc_size.
**********************************************************************
get now all attachments, decreibed in packing list
**********************************************************************
refresh new_pack_list.
refresh atthead_tab.
refresh attcont_tab.
loop at packing_list from 2.
clear new_pack_list.
perform read_object_out_of_tables tables object_header
contents_txt
contents_bin
atthead
attcont
using packing_list
object_data
rcode.
check rcode = ok.
* sh240899 46C check for executable mail attachment (MAPI)
if packing_list-doc_type = 'R3O'.
read table attcont index 21 into old_object.
if old_object-objtype = 'SOFM'.
read table attcont index 22.
if attcont = 'PROCESS'.
* it's an attachment created by MAPI because of an executable
* read old mail and fill new one with process parameters
move: old_object-objkey(17) to old_folder_id,
old_object-objkey+17(17) to old_object_id,
old_object-objkey+34(12) to old_forwarder.
call function 'SO_OBJECT_READ'
exporting
folder_id = old_folder_id
forwarder = old_forwarder
object_id = old_object_id
importing
object_hd_display = old_object_data
tables
objpara = object_para
objparb = object_parb
exceptions
folder_not_exist = 4
folder_no_authorization = 5
object_not_exist = 6
object_no_authorization = 7
operation_no_authorization = 8
owner_not_exist = 9
parameter_error = 10
others = 15.
if sy-subrc = 0.
move: old_object_data-vmtyp to object_hd_change-vmtyp,
old_object_data-skips to object_hd_change-skips,
old_object_data-acnam to object_hd_change-acnam,
old_object_data-acmem to object_hd_change-acmem.
endif.
continue.
elseif attcont = 'DISPLAYATTACHMENT'.
* sh070900 5.0A reconvert R30 into OBJ Docs is possible.
* get object instance and method into attachment body
refresh: attcont, atthead.
move old_object-objkey+17(17) to sood_id.
perform socx_select(sapfsso0) tables atthead
attcont
object_para
object_parb
using sood_id
hex_mode
rcode.
move atthead[] to attcont[].
* fill new packing list parameter
describe table atthead lines packing_list-head_num.
describe table attcont lines packing_list-body_num.
packing_list-doc_size = '255'.
packing_list-doc_type = obj.
endif.
endif.
endif.
move-corresponding packing_list to new_pack_list.
move: packing_list-obj_descr to new_pack_list-objdes,
packing_list-obj_name to new_pack_list-objnam,
packing_list-doc_size to new_pack_list-objlen,
packing_list-obj_langu to new_pack_list-objla,
packing_list-mess_type to new_pack_list-extct,
packing_list-doc_type to new_pack_list-objtp,
packing_list-transf_bin to new_pack_list-transf_bin."873845
describe table atthead_tab lines new_pack_list-head_start.
add 1 to new_pack_list-head_start.
describe table attcont_tab lines new_pack_list-body_start.
add 1 to new_pack_list-body_start.
perform format_prepare_for_insert in program sapfssoa "873845
using packing_list-transf_bin
dummy_hex
changing atthead[]
attcont[]
new_pack_list-objtp
new_pack_list-file_ext
rcode.
get new sizes (also for attcont, someone forgot this...)
describe table atthead lines new_pack_list-head_num.
describe table attcont lines new_pack_list-body_num.
loop at atthead.
clear atthead_tab.
move atthead to atthead_tab.
append atthead_tab.
endloop.
loop at attcont.
clear attcont_tab.
move attcont to attcont_tab.
append attcont_tab.
endloop.
append new_pack_list.
endloop.
* transfer receiver data
perform transfer_rec_to_tab tables receivers
rec_table.
* sender in right format
move sender_address to originator.
perform convert_sndart_esc using sender_address_type
originator_type.
call function 'SO_OBJECT_SEND'
exporting
EXTERN_ADDRESS = ' '
FOLDER_ID = ' '
FORWARDER = ' '
object_fl_change = object_fl_change
object_hd_change = object_hd_change
OBJECT_ID = ' '
object_type = object_type
outbox_flag = put_in_outbox
originator = originator
originator_type = originator_type
OWNER = ' '
STORE_FLAG = ' '
importing
object_id_new = object_id_new
sent_to_all = sent_to_all
originator_id = sender_id
tables
objcont = objcont
objhead = objhead
objpara = object_para
objparb = object_parb
packing_list = new_pack_list
att_head = atthead_tab
att_cont = attcont_tab
receivers = rec_table
exceptions
object_not_sent = 15
object_type_not_exist = 17
operation_no_authorization = 21
parameter_error = 23
too_much_receivers = 73
others = 1000.
case sy-subrc.
when ok.
move object_id_new to new_object_id.
when object_not_sent.
perform transfer_tab_to_rec tables rec_table
receivers.
raise document_not_sent.
when too_much_receivers.
raise too_many_receivers.
when object_type_not_exist.
raise document_type_not_exist.
when operation_no_authorization.
raise operation_no_authorization.
when parameter_error.
raise parameter_error.
when others.
raise x_error.
endcase.
MOVE OBJECT_ID TO NEW_OBJECT_ID.
perform transfer_tab_to_rec tables rec_table
receivers.
set commit work
if commit_work = on.
commit work.
endif.
endfunction.
2007 Oct 16 2:30 PM
thor thor,
you are right, ECC600 has an import parameter commit_work.
if commit_work = on.
commit work. "Line 353
endif.
This function module must not be called with parameter commit_work = 'X'. In the scope of any SAP transaction, nobody except SAP is allowed to and knows when to COMMIT WORK.
Correct the program. Make comment of line COMMIT_WORK = ... because SPACE is the default.
Regards,
Clemens
2007 Oct 16 1:58 PM
I hope you have configured custom code for o/p type.
before saving output, give /H in command line and save, immediately after that swith on update debugging from
menu bar>.Settings>update debugging,
set break point in the subroutine in ur code, Menu>break ponits>subroutine.
then press F8, it will take you to the code