‎2007 Jul 05 10:00 PM
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
‎2007 Jul 05 10:40 PM
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
‎2007 Jul 05 10:18 PM
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
‎2007 Jul 05 10:23 PM
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
‎2007 Jul 05 10:40 PM
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
‎2007 Jul 06 5:51 AM
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