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

Perform statement in BADI Method..

Former Member
0 Likes
1,389

Hi All,

I am working on BADI for Posting goods movements. 'IF_EX_LE_SHP_GOODSMOVEMENT'

with the method 'CHANGE_INPUT_HEADER_AND_ITEMS'.

I tried to post the data by using MB1B from BADI.

But it is giving an error when i insert the code for BDC data. like blow...

perform bdc_dynpro using 'SAPMM07M' '0400'.

perform bdc_field using 'BDC_CURSOR'

'RM07M-SOBKZ'.

if use abobe statements in my BADI method, It is giving error message as, 'FORMSs cannot be defined in class pool. for this reason, there are no PERFORM statements for inter FORMs. for internal forms'.

Con't we create perform statements in BADI, please suggest on the same..

Thx

1 ACCEPTED SOLUTION
Read only

RichHeilman
Developer Advocate
Developer Advocate
0 Likes
902

You can't really call a PERFORM within a method unless you specify a program in the call. So if you would create a subroutine pool, or simply an execute program with these FORM routines in them, then you can call them like so.

perform bdc_dynpro in program <your_program_name> using 'SAPMM07M' '0400'.
perform bdc_field in program <your_program_name> using 'BDC_CURSOR'
'RM07M-SOBKZ'.

But really you should use the BAPI instead of BDC. Try using the BAPI, BAPI_GOODSMVT_CREATE

REgards,

RIch Heilman

4 REPLIES 4
Read only

varun_maharshi
Active Participant
0 Likes
902

I guess we cannot use Performs in Classes. But what my suggestion for you on this is you can create a method instead of perform and call that in your Class for updating the bdcdata table

Read only

Former Member
0 Likes
902

Hi,

Create a method in the same implementation class..

Then use the object me to call the method..

CALL METHOD ME->BDC_DNPYO

EXPORTING

IMPORTING

Thanks

Naren

Read only

RichHeilman
Developer Advocate
Developer Advocate
0 Likes
903

You can't really call a PERFORM within a method unless you specify a program in the call. So if you would create a subroutine pool, or simply an execute program with these FORM routines in them, then you can call them like so.

perform bdc_dynpro in program <your_program_name> using 'SAPMM07M' '0400'.
perform bdc_field in program <your_program_name> using 'BDC_CURSOR'
'RM07M-SOBKZ'.

But really you should use the BAPI instead of BDC. Try using the BAPI, BAPI_GOODSMVT_CREATE

REgards,

RIch Heilman

Read only

Former Member
0 Likes
902

Hi Rao,

You can use <b>macros</b> insted of perform stmts in BADI,my self alos face the same issue in BADI_LE_SHP_GOODSMOVEMNT.my badi calls MB11 t.code inside BADI and for IS-OIL reqirement No BAPI_goodsmvt_create will not work.you can use insted of that

CALL FUNCTION 'MB_CREATE_GOODS_MOVEMENT otherwise you prefer BDC Inside BADI_LE_SHP_GOODSMOVEMT

Here is my code.

METHOD if_ex_le_shp_goodsmovement~change_input_header_and_items .

----


  • Internal table declaration

----


DATA: t_lipsheader TYPE TABLE OF lipsvb .

DATA :t_messtab TYPE TABLE OF bdcmsgcoll.

DATA: t_lipsitem TYPE TABLE OF lipsvb.

DATA :t_bdcdata TYPE TABLE OF bdcdata.

----


  • Structure declaration

----


DATA: wa_lipsheader TYPE lips.

DATA: wa_likp TYPE likp.

DATA: wa_lips TYPE lipsvb.

DATA: wa_bdcdata TYPE bdcdata.

DATA: wa_messtab TYPE bdcmsgcoll.

DATA: wa_textout TYPE t100-text.

----


  • variable declaration

----


DATA :fval TYPE bdc_fval.

DATA :ctumode TYPE ctu_params-dismode,

cupdate TYPE ctu_params-updmode.

DATA :date1(10) TYPE c,date2(10) TYPE c.

DATA: budat TYPE sy-datum,

bldat TYPE likp-bldat,

usnam TYPE sy-uname,

uzeit TYPE sy-uzeit,

hhmm(4) TYPE n.

----


  • Constant declaration

----


CONSTANTS: nodata TYPE c VALUE '/' .

CONSTANTS: c_bwart TYPE lips-bwart VALUE '101'.

  • Logic for Posting date and Document date.

  • Check for Actual GI date from delivery.

IF is_likp-wadat_ist NE space.

budat = is_likp-wadat_ist.

ELSE.

  • If Actual GI date is initial then populate today's date

budat = sy-datum.

ENDIF.

  • Populate today's date for document date

bldat = sy-datum.

usnam = sy-uname.

----


  • Start new screen

----


DEFINE bdc_dynpro.

clear wa_bdcdata.

wa_bdcdata-program = &1.

wa_bdcdata-dynpro = &2.

wa_bdcdata-dynbegin = 'X'.

append wa_bdcdata to t_bdcdata.

END-OF-DEFINITION.

----


  • Insert field

----


DEFINE bdc_field.

if fval <> nodata.

clear wa_bdcdata.

wa_bdcdata-fnam = &1.

wa_bdcdata-fval = &2.

append wa_bdcdata to t_bdcdata.

endif.

END-OF-DEFINITION.

----


  • loops through the internal table and validates *

  • the data in the internal table *

----


LOOP AT it_xlips INTO wa_lipsheader.

IF wa_lipsheader-uepos IS INITIAL AND wa_lipsheader-pstyv =

'taq' AND wa_lipsheader-oic_mot = 'PK'.

MOVE wa_lipsheader-matnr TO wa_lips-ummat.

MOVE wa_lipsheader-werks TO wa_lips-umwrk.

MOVE wa_lipsheader-werks TO wa_lips-werks.

MOVE wa_lipsheader-lgort TO wa_lips-lgort .

MOVE wa_lipsheader-lgort TO wa_lips-umlgo.

MOVE c_bwart TO wa_lips-bwart.

MOVE wa_lipsheader-posnr TO wa_lips-posnr.

MOVE wa_lipsheader-lfimg TO wa_lips-lfimg.

MOVE wa_lipsheader-meins TO wa_lips-meins.

MOVE wa_lipsheader-volum TO wa_lips-volum.

MOVE wa_lipsheader-vbeln TO wa_lips-vbeln.

MOVE wa_lipsheader-bwtar TO wa_lips-bwtar.

APPEND wa_lips TO t_lipsheader.

ELSE.

IF wa_lipsheader-uepos IS NOT INITIAL AND wa_lipsheader-pstyv

= 'TAE'.

MOVE wa_lipsheader-matnr TO wa_lips-matnr.

MOVE wa_lipsheader-werks TO wa_lips-werks.

MOVE wa_lipsheader-lgort TO wa_lips-lgort.

MOVE wa_lipsheader-lfimg TO wa_lips-lfimg.

MOVE wa_lipsheader-posnr TO wa_lips-posnr.

MOVE wa_lipsheader-voleh TO wa_lips-voleh.

MOVE wa_lipsheader-meins TO wa_lips-meins.

MOVE wa_lipsheader-volum TO wa_lips-volum.

MOVE wa_lipsheader-vbeln TO wa_lips-vbeln.

MOVE wa_lipsheader-bwtar TO wa_lips-bwtar.

IF wa_lips-lgort IS INITIAL.

wa_lips-lgort = wa_lips-umlgo.

ENDIF.

APPEND wa_lips TO t_lipsitem.

ENDIF.

ENDIF.

ENDLOOP.

----


  • BDC TABLE CONTROL

----


LOOP AT t_lipsheader INTO wa_lipsheader.

WRITE : bldat TO date1 MM/DD/YYYY,

budat TO date2 MM/DD/YYYY.

bdc_dynpro 'SAPMM07M' '0400'.

bdc_field 'BDC_CURSOR' 'RM07M-LGORT'.

bdc_field 'BDC_OKCODE' '/00' .

bdc_field 'MKPF-BLDAT' date1.

bdc_field 'MKPF-BUDAT' date2.

bdc_field 'MKPF-OIB_BLTIME' hhmm.

bdc_field 'RM07M-BWARTWA' c_bwart.

bdc_field 'RM07M-WERKS' wa_lips-werks.

bdc_field 'RM07M-LGORT' wa_lips-lgort.

bdc_field 'XFULL' 'X'.

bdc_field 'RM07M-WVERS2' 'X'.

bdc_dynpro 'SAPMM07M' '0421'.

bdc_field 'BDC_CURSOR' 'MSEG-WERKS(02)'.

bdc_field 'BDC_OKCODE' '/00'.

bdc_field 'MSEGK-UMWRK' wa_lips-umwrk.

bdc_field 'MSEGK-UMLGO' wa_lips-umlgo.

bdc_field 'MSEGK-UMMAT' wa_lips-ummat.

----


  • Data declaration

----


DATA:quan(17) TYPE c.

DATA:ftable(20) TYPE c.

DATA:k TYPE n.

MOVE 1 TO k.

LOOP AT t_lipsitem INTO wa_lips WHERE vbeln

= wa_lipsheader-vbeln.

IF sy-subrc = 0.

CONCATENATE 'MSEG-MATNR(' k ')' INTO ftable.

bdc_field ftable wa_lips-matnr.

MOVE wa_lips-lfimg TO quan.

CONCATENATE 'MSEG-ERFMG(' k ')' INTO ftable.

bdc_field ftable quan .

CONCATENATE 'MSEG-LGORT(' k ')' INTO ftable.

bdc_field ftable wa_lips-lgort.

CONCATENATE 'MSEG-CHARG(' k ')' INTO ftable.

bdc_field ftable wa_lips-bwtar.

CONCATENATE 'MSEG-WERKS(' k ')' INTO ftable.

bdc_field ftable wa_lips-werks.

ENDIF.

k = k + 1.

ENDLOOP.

bdc_field 'DKACB-FMORE' 'X'.

bdc_dynpro 'SAPLKACB' '0002'.

bdc_field 'BDC_OKCODE' '=ENTE' .

bdc_dynpro 'SAPLOIB_QCI' '0500'.

bdc_field 'BDC_CURSOR' 'OIB_A08-TDICH'.

bdc_field 'BDC_OKCODE' '=CALC'.

bdc_dynpro 'SAPLOIB_QCI' '0500'.

bdc_field 'BDC_CURSOR' 'OIB_A08-TDICH'.

bdc_field 'BDC_OKCODE' '=CONT'.

bdc_dynpro 'SAPLKACB' '0002'.

bdc_field 'BDC_OKCODE' '=ENTE'.

bdc_dynpro 'SAPLOIB_QCI' '0500'.

bdc_field 'BDC_CURSOR' 'OIB_A08-TDICH'.

bdc_field 'BDC_OKCODE' '=CALC'.

bdc_dynpro 'SAPLOIB_QCI' '0500'.

bdc_field 'BDC_CURSOR' 'OIB_A08-TDICH'.

bdc_field 'BDC_OKCODE' '=CONT'.

bdc_dynpro 'SAPLKACB' '0002'.

bdc_field 'BDC_OKCODE' '=ENTE'.

bdc_dynpro 'SAPMM07M' '0421'.

bdc_field 'BDC_CURSOR' 'MSEG-ERFMG(01)'.

bdc_field 'BDC_OKCODE' '=BU'.

bdc_field 'DKACB-FMORE' 'X'.

bdc_dynpro 'SAPLKACB' '0002'.

bdc_field 'BDC_OKCODE' '=ENTE'.

*set the parametrs for call transaction.

ctumode = 'N'.

cupdate = 'L'.

CALL TRANSACTION 'MB11' USING t_bdcdata MODE ctumode

UPDATE cupdate MESSAGES INTO t_messtab.

LOOP AT t_messtab INTO wa_messtab .

CALL FUNCTION 'MESSAGE_TEXT_BUILD'

EXPORTING

msgid = wa_messtab-msgid

msgnr = wa_messtab-msgnr

msgv1 = wa_messtab-msgv1

msgv2 = wa_messtab-msgv2

msgv3 = wa_messtab-msgv3

msgv4 = wa_messtab-msgv4

IMPORTING

message_text_output = wa_textout.

MESSAGE wa_textout TYPE wa_messtab-msgtyp.

ENDLOOP.

ENDLOOP.

ENDMETHOD.

<b>Reward points</b>

Regards

Message was edited by:

skk