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

BAPI_goodsmvt_create per PO

Former Member
0 Likes
2,111

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

1 ACCEPTED SOLUTION
Read only

Former Member
0 Likes
1,696

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

6 REPLIES 6
Read only

Former Member
0 Likes
1,697

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.

Read only

0 Likes
1,696

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

Read only

0 Likes
1,696

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.

Read only

0 Likes
1,696

In the "AT NEW ebeln." you cannot use fields to its right, they are either filled with "*" if character type else they carry initial value. 


Hint: check values of wa_data-date,wa_data-prjcd in debug.


Regards,

Raymond

Read only

0 Likes
1,696

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.

Read only

venkateswaran_k
Active Contributor
0 Likes
1,696

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