‎2009 Jan 10 9:42 AM
Dear All,
I have written a function module for changing the schedule line dates for a Sales Order using BAPI_SALESORDER_CHANGE. I have added this FM to a Standard Task which will be triggerred on tcode VA02 (Change SO).
When I execute the FM, it works fine and the sales order is getting updated.
But when I update the SO using VA02, the FM is triggered by the Standard Task, but stops at some point in the code and comes out. So the SO is not updated.
I have found out that the execution stops at a conversion exit CONVERSION_EXIT_TSTRG_OUTPUT.
If i comment out the conv exit, the exec stops at the next FM i.e 'DATE_CONVERT_TO_FACTORYDATE'.
I've pasted my code below.
Pls Help.
reg,
Jinson
************************************************************************
FUNCTION zsdf_update_dates_from_toc.
*"----------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" REFERENCE(VBELN) TYPE VBAK-VBELN
*"----------------------------------------------------------------------
*
* TABLES : ztest.
* DATA: endwhile TYPE c VALUE 'X'.
* IF sy-uname = 'ZCVENAJINS'.
* WHILE endwhile = 'X'.
*
* ENDWHILE.
* ENDIF.
DATA : w_serno TYPE ztest.
w_serno-serno = 'JFIRST'.
INSERT into ztest values w_serno.
COMMIT WORK.
*
DATA : it_soltoc TYPE TABLE OF zpptsol_toc,
it_jstat1 TYPE TABLE OF jstat,
it_vbap TYPE TABLE OF vbap,
it_vbep TYPE TABLE OF vbep.
DATA : wa_soltoc TYPE zpptsol_toc,
wa_t630r TYPE t630r,
wa_xvbap TYPE vbap,
wa_xvbep TYPE vbep,
wa_tvst TYPE tvst,
wa_tvro TYPE tvro,
wa_jstat1 TYPE jstat,
wa_tj301 TYPE tj30.
DATA : lv_date TYPE datum,
lv_date_factory TYPE datum,
lv_date_ind,
lv_rvdate TYPE datum,
lv_stonr2 TYPE tj30-stonr,
lv_objnr2 LIKE jsto-objnr,
lv_obtyp2 LIKE jsto-obtyp,
lv_stsma2 LIKE jsto-stsma,
lv_updflag, "Flag = X if SO needs to be updated
lv_tocflag, "Flag = X if TOC Run
lv_error TYPE c,
lv_vkorg TYPE vkorg.
DATA : c_toc(5) VALUE 'E0002'.
DATA:
it_bapisditmx TYPE STANDARD TABLE OF bapisditmx,
it_bapisditm TYPE STANDARD TABLE OF bapisditm,
it_bapischdlx TYPE STANDARD TABLE OF bapischdlx,
it_bapischdl TYPE STANDARD TABLE OF bapischdl,
it_bapiret2 TYPE STANDARD TABLE OF bapiret2.
DATA: gs_salesdoc TYPE vbak-vbeln,
wa_order TYPE bapisdh1,
wa_orderx TYPE bapisdh1x,
wa_bapisditmx TYPE bapisditmx,
wa_bapisditm TYPE bapisditm,
wa_bapischdlx TYPE bapischdlx,
wa_bapischdl TYPE bapischdl,
wa_bapiret2 TYPE bapiret2.
* Check for Sales Order Change ONLY
* CHECK sy-tcode = 'VA02'.
break zcvenajins.
REFRESH it_soltoc.
SELECT SINGLE vkorg INTO lv_vkorg
FROM vbak WHERE vbeln = vbeln.
CHECK lv_vkorg = '0080'.
SELECT *
FROM vbap
INTO TABLE it_vbap
WHERE vbeln = vbeln.
IF NOT it_vbap[] IS INITIAL.
SELECT *
FROM vbep
INTO TABLE it_vbep
FOR ALL ENTRIES IN it_vbap
WHERE vbeln = it_vbap-vbeln
AND posnr = it_vbap-posnr.
* Get data from TOC for all line SO items.
SELECT *
FROM zpptsol_toc
INTO TABLE it_soltoc
FOR ALL ENTRIES IN it_vbap
WHERE werks = it_vbap-werks
AND ord_no = it_vbap-vbeln
AND itm_nr = it_vbap-posnr.
SORT it_soltoc BY werks ord_no itm_nr.
LOOP AT it_vbep INTO wa_xvbep.
READ TABLE it_vbap INTO wa_xvbap
WITH KEY vbeln = wa_xvbep-vbeln
posnr = wa_xvbep-posnr.
IF sy-subrc = 0.
* Check Status for TOC RUN
REFRESH it_jstat1.
lv_objnr2 = wa_xvbap-objnr.
CALL FUNCTION 'STATUS_READ'
EXPORTING
client = sy-mandt
objnr = lv_objnr2
only_active = 'X'
IMPORTING
obtyp = lv_obtyp2
stsma = lv_stsma2
stonr = lv_stonr2
TABLES
status = it_jstat1
EXCEPTIONS
object_not_found = 1
OTHERS = 2.
IF NOT it_jstat1[] IS INITIAL.
CLEAR lv_tocflag.
READ TABLE it_jstat1 INTO wa_jstat1 WITH KEY stat = c_toc.
IF sy-subrc EQ 0.
LOOP AT it_jstat1 INTO wa_jstat1 WHERE stat EQ c_toc.
SELECT SINGLE *
FROM tj30
INTO wa_tj301
WHERE stsma EQ lv_stsma2
AND estat EQ wa_jstat1-stat.
IF sy-subrc NE 0.
* No TOC Run
CLEAR lv_tocflag.
CONTINUE.
ELSE.
lv_tocflag = 'X'.
EXIT.
ENDIF.
ENDLOOP.
ELSE.
* No TOC Run
CLEAR lv_tocflag.
ENDIF.
* Do not proceed if TOC not run
CHECK lv_tocflag = 'X'.
READ TABLE it_soltoc INTO wa_soltoc
WITH KEY werks = wa_xvbap-werks
ord_no = wa_xvbep-vbeln
itm_nr = wa_xvbep-posnr
BINARY SEARCH.
IF sy-subrc = 0.
IF wa_xvbep-mbdat NE wa_soltoc-mat_avld.
lv_updflag = 'X'.
* Change original Delivery date with Mat Availability Date from TOC
wa_xvbep-mbdat = wa_soltoc-mat_avld.
* Calculate the New Loading date
SELECT SINGLE *
FROM t630r
INTO wa_t630r
WHERE vstel = wa_xvbap-vstel
AND route = wa_xvbap-route.
IF sy-subrc = 0.
CALL FUNCTION 'CONVERSION_EXIT_TSTRG_OUTPUT'
EXPORTING
input = wa_t630r-pipatg
IMPORTING
output = wa_t630r-pipatg.
wa_xvbep-lddat = wa_xvbep-mbdat + wa_t630r-pipatg.
CLEAR: lv_date,lv_date_factory,lv_date_ind.
lv_date = wa_xvbep-lddat.
CALL FUNCTION 'DATE_CONVERT_TO_FACTORYDATE'
EXPORTING
correct_option = '+'
date = lv_date
factory_calendar_id = 'FI'
IMPORTING
date = lv_date_factory
workingday_indicator = lv_date_ind
EXCEPTIONS
calendar_buffer_not_loadable = 1
correct_option_invalid = 2
date_after_range = 3
date_before_range = 4
date_invalid = 5
factory_calendar_not_found = 6
OTHERS = 7.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
wa_xvbep-lddat = lv_date_factory. "New Loading date
ENDIF.
* Calculate the New Goods Issue date
SELECT SINGLE *
FROM tvst
INTO wa_tvst
WHERE vstel = wa_xvbap-vstel.
IF sy-subrc = 0.
CALL FUNCTION 'CONVERSION_EXIT_TSTRG_OUTPUT'
EXPORTING
input = wa_tvst-loadtg
IMPORTING
output = wa_tvst-loadtg.
wa_xvbep-wadat = wa_xvbep-lddat + wa_tvst-loadtg.
CLEAR: lv_date,lv_date_factory,lv_date_ind.
lv_date = wa_xvbep-wadat.
CALL FUNCTION 'DATE_CONVERT_TO_FACTORYDATE'
EXPORTING
correct_option = '+'
date = lv_date
factory_calendar_id = 'FI'
IMPORTING
date = lv_date_factory
workingday_indicator = lv_date_ind
EXCEPTIONS
calendar_buffer_not_loadable = 1
correct_option_invalid = 2
date_after_range = 3
date_before_range = 4
date_invalid = 5
factory_calendar_not_found = 6
OTHERS = 7.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
wa_xvbep-wadat = lv_date_factory. "New Goods Issue date
ENDIF.
* Calculate the New Delivery Date
SELECT SINGLE *
FROM tvro
INTO wa_tvro
WHERE route = wa_xvbap-route.
IF sy-subrc = 0.
* CONCATENATE rv45a-etdat+6(4) rv45a-etdat+3(2) rv45a-etdat+0(2)
* INTO lv_rvdate.
lv_rvdate = wa_xvbep-edatu.
CALL FUNCTION 'CONVERSION_EXIT_TSTRG_OUTPUT'
EXPORTING
input = wa_tvro-traztd
IMPORTING
output = wa_tvro-traztd.
lv_rvdate = lv_rvdate + wa_tvro-traztd.
CLEAR: lv_date,lv_date_factory,lv_date_ind.
lv_date = lv_rvdate.
CALL FUNCTION 'DATE_CONVERT_TO_FACTORYDATE'
EXPORTING
correct_option = '+'
date = lv_date
factory_calendar_id = 'FI'
IMPORTING
date = lv_date_factory
workingday_indicator = lv_date_ind
EXCEPTIONS
calendar_buffer_not_loadable = 1
correct_option_invalid = 2
date_after_range = 3
date_before_range = 4
date_invalid = 5
factory_calendar_not_found = 6
OTHERS = 7.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
lv_rvdate = lv_date_factory. "New Delivery date
* CONCATENATE lv_rvdate+6(2) lv_rvdate+4(2) lv_rvdate+0(4)
* INTO rv45a-etdat SEPARATED BY '.'.
wa_xvbep-edatu = lv_rvdate.
ENDIF.
MODIFY it_vbep FROM wa_xvbep.
wa_orderx-updateflag = 'U'.
wa_bapisditm-itm_number = wa_xvbep-posnr.
APPEND wa_bapisditm TO it_bapisditm.
wa_bapisditmx-itm_number = wa_xvbep-posnr.
wa_bapisditmx-updateflag = 'U'.
APPEND wa_bapisditmx TO it_bapisditmx.
wa_bapischdl-itm_number = wa_xvbep-posnr.
wa_bapischdl-sched_line = wa_xvbep-etenr.
wa_bapischdl-ms_date = wa_xvbep-mbdat.
wa_bapischdl-load_date = wa_xvbep-lddat.
wa_bapischdl-gi_date = wa_xvbep-wadat.
wa_bapischdl-req_date = wa_xvbep-edatu.
APPEND wa_bapischdl TO it_bapischdl.
wa_bapischdlx-itm_number = wa_xvbep-posnr.
wa_bapischdlx-sched_line = wa_xvbep-etenr.
wa_bapischdlx-ms_date = 'X'.
wa_bapischdlx-load_date = 'X'.
wa_bapischdlx-gi_date = 'X'.
wa_bapischdlx-req_date = 'X'.
wa_bapischdlx-updateflag = 'U'.
APPEND wa_bapischdlx TO it_bapischdlx.
ELSE.
CLEAR lv_updflag.
ENDIF.
ENDIF.
ENDIF. "it_jstat1[] IS INITIAL
ENDIF.
ENDLOOP.
IF lv_updflag = 'X'.
DELETE ADJACENT DUPLICATES FROM: it_bapisditm,
it_bapisditmx,
it_bapischdl,
it_bapischdlx.
CALL FUNCTION 'BAPI_SALESORDER_CHANGE'
EXPORTING
salesdocument = vbeln
order_header_inx = wa_orderx
TABLES
return = it_bapiret2
order_item_in = it_bapisditm
order_item_inx = it_bapisditmx
schedule_lines = it_bapischdl
schedule_linesx = it_bapischdlx.
CLEAR lv_error.
LOOP AT it_bapiret2 INTO wa_bapiret2
WHERE type = 'A'
OR type = 'X'
OR type = 'E'.
lv_error = 'X'.
EXIT.
ENDLOOP.
* If any error occured, then send error message to Spool, Else Do Commit Work.
IF lv_error NE 'X'.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
ELSE.
DATA: ls_print_parameters TYPE pri_params,
ls_valid_flag TYPE c LENGTH 1.
CALL FUNCTION 'GET_PRINT_PARAMETERS'
EXPORTING
mode = 'CURRENT'
no_dialog = 'X'
IMPORTING
out_parameters = ls_print_parameters
valid = ls_valid_flag
EXCEPTIONS
invalid_print_params = 2
OTHERS = 4.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
NEW-PAGE PRINT ON PARAMETERS ls_print_parameters
NO DIALOG.
WRITE: / 'Sales Document'(001),
vbeln,
'Has Error when updating the Delivery Date'(002).
LOOP AT it_bapiret2 INTO wa_bapiret2.
WRITE: / wa_bapiret2-message,
wa_bapiret2-message_v1,
wa_bapiret2-message_v2,
wa_bapiret2-message_v3,
wa_bapiret2-message_v4.
ENDLOOP.
NEW-PAGE PRINT OFF.
ENDIF.
ENDIF.
ENDIF.
ENDFUNCTION.
‎2009 Jan 10 12:11 PM
Hello Jinson
I have three suggestions and recommendations that you might try:
CHECK lv_vkorg = '0080'. " Why not blocking processing in the first place?
SELECT SINGLE vkorg INTO lv_vkorg
FROM vbak WHERE vbeln = vbeln.
"CHECK lv_vkorg = '0080'.
...
CALL FUNCTION 'CONVERSION_EXIT_TSTRG_OUTPUT'
EXPORTING
input = wa_t630r-pipatg
IMPORTING
output = ld_pipatg. " wa_t630r-pipatg.
wa_t630r-pipatg = ld_pipatg. " I prefer to use a different field for the import
Regarding the second fm that fails I would try to run it in SE37 using the values you see in the debugger.
Regards
Uwe
‎2009 Jan 12 8:41 AM
Thanks Uwe for the reply.
As for your first suggestion, I am fetching the vkorg based on vbeln and then blocking if its not '0080'. so I cannot put the check unless I have some value in lv_vkorg.
The second and the third suggestions accepted. But still its not working.
As I said, when I execute the FM in SE37, it works fine. But when its called from a Standard Task, the code below the first conv exit does not get executed. If I comment that FM call, the execution stops at the next FM call does and so on...
I am also not able to debug when the FM is being called from the Standard Task. I also tried to put an Infinite Loop in the code so that I can debug the code from SM50. But that was also of no use.
So for testing, I created a Z table and inserted differnt values into it at diffrent points in code.
Please convey if you have any more suggestions.
Thanks & regards,
Jinson.