2015 Oct 07 12:20 PM
Hi Experts,
I have a requirement to post 351 by EBELN and not by line item. In my current code, my posting of 351 is by Line Item, I need to post it by PO-EBELN.
How can I modify my code to make my posting per PO(ebeln) ?
Example:
PO: 1001 ITEM: 10
1001 ITEM: 20
1001 ITEM: 30
All of this must have only one material Document.
PO: 1001 ITEM: 10
1001 ITEM: 20
1002 ITEM: 30
This must have 2 material document posted for PO 1001 and PO 1002. - this is my current code
LOOP AT it_data INTO wa_data.
"Header
gv_month = sy-datum+4(2).
gv_year = sy-datum+0(4).
CONCATENATE 'RMC DEL' wa_data-date INTO gv_header SEPARATED BY space.
CONCATENATE wa_data-prjcd gv_month gv_year INTO gv_matslip SEPARATED BY '-'.
ls_mmdochdr-pstng_date = sy-datum.
ls_mmdochdr-doc_date = sy-datum.
ls_mmdochdr-header_txt = gv_header.
ls_mmdochdr-pr_uname = sy-uname.
ls_mmdochdr-GR_GI_SLIP_NO = gv_matslip.
ls_mmdochdr-VER_GR_GI_SLIP = '3'.
ls_mmdochdr-VER_GR_GI_SLIPX = 'X'.
"Item
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = wa_data-matnr
IMPORTING
OUTPUT = wa_data-matnr.
SELECT SINGLE reswk
INTO ls_gm-plant
FROM ekko
WHERE ebeln EQ wa_data-ebeln.
* ls_gm-plant = wa_data-plant.
ls_gm-stge_loc = '0001'.
ls_gm-move_type = '351'.
ls_gm-material = wa_data-matnr.
ls_gm-entry_qnt = wa_data-vol.
* ls_gm-entry_uom = t_ekpo-meins.
ls_gm-po_number = wa_data-ebeln.
ls_gm-po_item = wa_data-ebelp.
ls_gm-item_text = gv_header.
APPEND ls_gm TO lt_gm.
CLEAR ls_gm.
SET PARAMETER ID 'NDR' FIELD 'X'.
CALL FUNCTION 'BAPI_GOODSMVT_CREATE'
EXPORTING
goodsmvt_header = ls_mmdochdr
goodsmvt_code = '04'
IMPORTING
goodsmvt_headret = ls_hdr
TABLES
goodsmvt_item = lt_gm
return = lt_ret.
IF lt_ret IS INITIAL.
CONCATENATE 'Material Document posted:' ls_hdr-mat_doc ' ' ls_hdr-doc_year INTO gv_result SEPARATED BY space.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
it_result351-type = 'S'.
it_result351-mblnr = ''.
it_result351-mvttyp = '351'.
CONCATENATE 'STO:' wa_data-ebeln ',' 'Line:' wa_data-ebelp INTO gv_status SEPARATED BY space.
it_result351-status = gv_status.
it_result351-message = gv_result.
APPEND it_result351.
REFRESH: lt_gm, lt_ret.
it_submit-matdoc = ls_hdr-mat_doc.
it_submit-year = ls_hdr-doc_year.
it_submit-headtext = gv_header.
it_submit-text = gv_header.
APPEND it_submit.
ELSE.
it_result351-type = 'E'.
it_result351-mblnr = ''.
it_result351-mvttyp = '351'.
CONCATENATE 'STO:' wa_data-ebeln ',' 'Line:' wa_data-ebelp INTO gv_status SEPARATED BY space.
it_result351-status = gv_status.
it_result351-message = lt_ret-message.
APPEND it_result351.
REFRESH: lt_gm, lt_ret.
ENDIF.
ENDLOOP. "
2015 Oct 07 12:25 PM
If you have the PO no in the internal table it_data then you can use at end of ebeln as below.
Loop at it_data into wa_data.
at new ebeln.
**** Code the header data here.
endat.
**** Code the item data here.
at end of ebeln.
**** Call you bapi for goods movement create.
endat.
Hope this helps.
Hi Experts,
I have a requirement to post 351 by EBELN and not by line item. In my current code, my posting of 351 is by Line Item, I need to post it by PO-EBELN.
How can I modify my code to make my posting per PO(ebeln) ?
Example:
PO: 1001 ITEM: 10
1001 ITEM: 20
1001 ITEM: 30
All of this must have only one material Document.
PO: 1001 ITEM: 10
1001 ITEM: 20
1002 ITEM: 30
This must have 2 material document posted for PO 1001 and PO 1002. - this is my current code
LOOP AT it_data INTO wa_data.
"Header
gv_month = sy-datum+4(2).
gv_year = sy-datum+0(4).
CONCATENATE 'RMC DEL' wa_data-date INTO gv_header SEPARATED BY space.
CONCATENATE wa_data-prjcd gv_month gv_year INTO gv_matslip SEPARATED BY '-'.
ls_mmdochdr-pstng_date = sy-datum.
ls_mmdochdr-doc_date = sy-datum.
ls_mmdochdr-header_txt = gv_header.
ls_mmdochdr-pr_uname = sy-uname.
ls_mmdochdr-GR_GI_SLIP_NO = gv_matslip.
ls_mmdochdr-VER_GR_GI_SLIP = '3'.
ls_mmdochdr-VER_GR_GI_SLIPX = 'X'.
"Item
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = wa_data-matnr
IMPORTING
OUTPUT = wa_data-matnr.
SELECT SINGLE reswk
INTO ls_gm-plant
FROM ekko
WHERE ebeln EQ wa_data-ebeln.
* ls_gm-plant = wa_data-plant.
ls_gm-stge_loc = '0001'.
ls_gm-move_type = '351'.
ls_gm-material = wa_data-matnr.
ls_gm-entry_qnt = wa_data-vol.
* ls_gm-entry_uom = t_ekpo-meins.
ls_gm-po_number = wa_data-ebeln.
ls_gm-po_item = wa_data-ebelp.
ls_gm-item_text = gv_header.
APPEND ls_gm TO lt_gm.
CLEAR ls_gm.
SET PARAMETER ID 'NDR' FIELD 'X'.
CALL FUNCTION 'BAPI_GOODSMVT_CREATE'
EXPORTING
goodsmvt_header = ls_mmdochdr
goodsmvt_code = '04'
IMPORTING
goodsmvt_headret = ls_hdr
TABLES
goodsmvt_item = lt_gm
return = lt_ret.
IF lt_ret IS INITIAL.
CONCATENATE 'Material Document posted:' ls_hdr-mat_doc ' ' ls_hdr-doc_year INTO gv_result SEPARATED BY space.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
it_result351-type = 'S'.
it_result351-mblnr = ''.
it_result351-mvttyp = '351'.
CONCATENATE 'STO:' wa_data-ebeln ',' 'Line:' wa_data-ebelp INTO gv_status SEPARATED BY space.
it_result351-status = gv_status.
it_result351-message = gv_result.
APPEND it_result351.
REFRESH: lt_gm, lt_ret.
it_submit-matdoc = ls_hdr-mat_doc.
it_submit-year = ls_hdr-doc_year.
it_submit-headtext = gv_header.
it_submit-text = gv_header.
APPEND it_submit.
ELSE.
it_result351-type = 'E'.
it_result351-mblnr = ''.
it_result351-mvttyp = '351'.
CONCATENATE 'STO:' wa_data-ebeln ',' 'Line:' wa_data-ebelp INTO gv_status SEPARATED BY space.
it_result351-status = gv_status.
it_result351-message = lt_ret-message.
APPEND it_result351.
REFRESH: lt_gm, lt_ret.
ENDIF.
ENDLOOP. "
2015 Oct 07 12:25 PM
If you have the PO no in the internal table it_data then you can use at end of ebeln as below.
Loop at it_data into wa_data.
at new ebeln.
**** Code the header data here.
endat.
**** Code the item data here.
at end of ebeln.
**** Call you bapi for goods movement create.
endat.
Hope this helps.
2015 Oct 08 1:46 AM
Hi Sir,
Thanks for the reply.
I have done what you said but still its not functioning as per PO.
When I tried to use breakpoint, it runs in every line of code inside at new and at end of each loop. It does not skip skip at new and at end statement.
SORT it_data BY ebeln ebelp.
LOOP AT it_data INTO wa_data.
AT NEW ebeln.
"Header
gv_month = sy-datum+4(2).
gv_year = sy-datum+0(4).
* CONCATENATE 'RMC DEL' wa_data-date INTO gv_header SEPARATED BY space.
CONCATENATE wa_data-prjcd gv_month gv_year INTO gv_matslip SEPARATED BY '-'.
ls_mmdochdr-pstng_date = sy-datum.
ls_mmdochdr-doc_date = sy-datum.
ls_mmdochdr-header_txt = gv_header.
ls_mmdochdr-pr_uname = sy-uname.
ls_mmdochdr-GR_GI_SLIP_NO = gv_matslip.
ls_mmdochdr-VER_GR_GI_SLIP = '3'.
ls_mmdochdr-VER_GR_GI_SLIPX = 'X'.
ENDAT.
"Item
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = wa_data-matnr
IMPORTING
OUTPUT = wa_data-matnr.
SELECT SINGLE reswk
INTO ls_gm-plant
FROM ekko
WHERE ebeln EQ wa_data-ebeln.
* ls_gm-plant = wa_data-plant.
ls_gm-stge_loc = '0001'.
ls_gm-move_type = '351'.
ls_gm-material = wa_data-matnr.
ls_gm-entry_qnt = wa_data-vol.
* ls_gm-entry_uom = t_ekpo-meins.
ls_gm-po_number = wa_data-ebeln.
ls_gm-po_item = wa_data-ebelp.
ls_gm-item_text = gv_header.
APPEND ls_gm TO lt_gm.
CLEAR ls_gm.
AT END OF ebeln.
SET PARAMETER ID 'NDR' FIELD 'X'.
CALL FUNCTION 'BAPI_GOODSMVT_CREATE'
EXPORTING
goodsmvt_header = ls_mmdochdr
goodsmvt_code = '04'
IMPORTING
goodsmvt_headret = ls_hdr
TABLES
goodsmvt_item = lt_gm
return = lt_ret.
IF lt_ret IS INITIAL.
CONCATENATE 'Material Document posted:' ls_hdr-mat_doc ' ' ls_hdr-doc_year INTO gv_result SEPARATED BY space.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
it_result351-type = 'S'.
it_result351-mblnr = ''.
it_result351-mvttyp = '351'.
CONCATENATE 'STO:' wa_data-ebeln ',' 'Line:' wa_data-ebelp INTO gv_status SEPARATED BY space.
it_result351-status = gv_status.
it_result351-message = gv_result.
APPEND it_result351.
REFRESH: lt_gm, lt_ret.
it_submit-matdoc = ls_hdr-mat_doc.
it_submit-year = ls_hdr-doc_year.
it_submit-headtext = gv_header.
it_submit-text = gv_header.
APPEND it_submit.
PERFORM save_finaldata. "save to zfinalrmcds
ELSE.
it_result351-type = 'E'.
it_result351-mblnr = ''.
it_result351-mvttyp = '351'.
CONCATENATE 'STO:' wa_data-ebeln ',' 'Line:' wa_data-ebelp INTO gv_status SEPARATED BY space.
it_result351-status = gv_status.
it_result351-message = lt_ret-message.
APPEND it_result351.
REFRESH: lt_gm, lt_ret.
ENDIF.
* ENDIF.
ENDAT.
ENDLOOP. "
2015 Oct 08 4:51 AM
Hi,
The code changes that you have done look good.
Did you debug if the control break statement(At end of .... endat) is executing properly.
EBELN should be your first field in the structure it_data , please check if that is so.
Hope this helps.
2015 Oct 08 7:17 AM
2015 Oct 08 7:38 AM
Oh yes,
As suggested by Raymond , better take another work area say wa_data1 same like wa_data and write like below.
loop at it_data into wa_data1.
wa_data = wa_data1.
*** keep all the rest code as it is.
endloop.
Hope this helps.
2015 Oct 08 7:47 AM
Hi
I had a similar requirement, but i did it in this way.. It is working fine.
The logic is as follows:
Your main loop is
LOOP AT it_data INTO wa_data
Before that form a group that contains only PO number table. say it_pos.
so do the loop as follows:
LOOP at it_pos into wa_pos
LOOP AT it_data INTO wa_data WHERE po = wa_pos-po
your usual code goes here
ENDLOOP.
ENDLOOP.
Regards,
Venkat