Application Development and Automation Discussions
Join the discussions or start your own on all things application development, including tools and APIs, programming models, and keeping your skills sharp.
cancel
Showing results for 
Search instead for 
Did you mean: 
Read only

Simple mail functionality

Former Member
0 Likes
1,285

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

8 REPLIES 8
Read only

Former Member
0 Likes
1,160

If the code is triggered in update mode u cant execute commit work and hence u cant debug,-

Read only

0 Likes
1,160

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

Read only

Clemenss
Active Contributor
0 Likes
1,160

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

Read only

Former Member
0 Likes
1,160

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

Read only

Clemenss
Active Contributor
0 Likes
1,160

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

Read only

Former Member
0 Likes
1,160

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

  • * mail

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

Read only

Clemenss
Active Contributor
0 Likes
1,160

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

Read only

Former Member
0 Likes
1,160

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