2007 Mar 21 11:56 PM
Hi,
I am new to BADI. can any one help me. How to declare internal table in badi and populate data into internal table using select statment. for example how can we write code for this in badi methods.
1.When W_STAT_ORDERNO equals 5 (closed status), sum all UDMCASEATTR00-AMOUNTs (1-10). If they do not equal the UDMCASEATTR00-FIN_ORIGINAL_AMT, pass an error message back to the screen.
Thanks,
Ankitha.
2007 Mar 22 2:26 AM
Hi chandra,
i am sending the code, in which i want to add that logic.
METHOD IF_EX_SCMG_BEFORE_VALID_C~CHANGE .
DATA:
W_SRMADID TYPE SRMADID,
W_VBELN TYPE BELNR_D,
W_KUNNR TYPE KUNNR,
W_CLERK TYPE BUSAB,
W_CLERK_KNB5 TYPE BUSAB,
W_CLERK_KNB1 TYPE BUSAB,
W_ACCT_CLERK TYPE BUSAB,
W_CLERK_KNKK TYPE SBGRP_cm,
W_IM_VALUE TYPE STRING,
W_FIN_DOCUMENT TYPE ZZFIN_DOCUMENT,
W_BELNR TYPE UDM_KUNNR,
W_LINE_NO TYPE BUZEI,
W_GJAHR TYPE GJAHR,
W_CASE_GUID TYPE SYSUUID_C,
W_CASE_GUID_CURRENT TYPE SYSUUID_C,
W_EXT_KEY TYPE SCMG_EXT_KEY,
W_STAT_ORDERNO TYPE SCMGSTATUSONR,
LREF_CX_ROOT TYPE REF TO CX_ROOT,
L_MSGTEXT(72) TYPE C,
EX_MESSAGES TYPE SCMG_T_ATTR_RETURN_VALUE.
CLEAR: W_VBELN,
W_KUNNR,
W_CLERK, W_ACCT_CLERK, W_CLERK_KNB5, W_CLERK_KNB1,
W_FIN_DOCUMENT, W_CLERK_KNKK,
W_BELNR,
W_LINE_NO,
W_GJAHR.
To switch on GOS - to attach files to the case
*
DATA: GO_MYOBJECT TYPE REF TO CL_GOS_MANAGER,
LS_OBJECT TYPE BORIDENT,
LS_OBJECT_KEY TYPE SIBFINSTID,
Ex TYPE REF TO cx_scmg_case_badi.
trigger generic object services
IF GO_MYOBJECT IS INITIAL.
LS_OBJECT-OBJTYPE = 'BUS2022'.
LS_OBJECT = 'BUS2022'.
CREATE OBJECT GO_MYOBJECT
EXPORTING
IS_OBJECT = LS_OBJECT
IP_NO_INSTANCE = 'x'
EXCEPTIONS OTHERS = 1.
ENDIF.
TRY.
Want to ensure that the document & line number are not
already in an open case.
Order Status = 5 = Closed
CALL METHOD IM_CASE->GET_GUID
RECEIVING
RE_GUID = W_CASE_GUID_CURRENT.
LS_OBJECT-OBJKEY = W_CASE_GUID_CURRENT.
LS_OBJECT-OBJTYPE = 'BUS2022'.
CALL METHOD GO_MYOBJECT->SET_ID_OF_PUBLISHED_OBJECT
EXPORTING
IS_OBJECT = LS_OBJECT
EXCEPTIONS
OTHERS = 1.
W_SRMADID = 'FIN_DOCUMENT'.
CALL METHOD IM_CASE->GET_SINGLE_ATTRIBUTE_VALUE
EXPORTING
IM_SRMADID = W_SRMADID
RECEIVING
RE_VALUE = W_FIN_DOCUMENT.
SELECT SINGLE CASE_GUID FIN_DOCUMENT
INTO (W_CASE_GUID, W_FIN_DOCUMENT )
FROM UDMCASEATTR00
WHERE FIN_DOCUMENT = W_FIN_DOCUMENT.
IF SY-SUBRC = 0.
IF W_CASE_GUID_CURRENT <> W_CASE_GUID.
SELECT SINGLE EXT_KEY STAT_ORDERNO
INTO (W_EXT_KEY, W_STAT_ORDERNO)
FROM SCMG_T_CASE_ATTR
WHERE CASE_GUID = W_CASE_GUID.
IF SY-SUBRC = 0 AND W_STAT_ORDERNO <> 5. "DEVK950418
IF SY-SUBRC = 0.
MESSAGE I004(ZF) WITH W_FIN_DOCUMENT W_EXT_KEY.
RAISE EXCEPTION TYPE cx_scmg_case_badi "DEVK950418
EXPORTING
TEXTID = 'CASE ALREADY EXISTS'.
RETURN.
ENDIF.
ENDIF. "DEVK950418
ENDIF.
ENDIF.
Need to get the account clerk based on customer number
if it is not entered get it from KNB1
If supplied, verify against knb1 & KNB5.
if valid do nothing, if not - move out the value based on
order status
W_SRMADID = 'STAT_ORDERNO'.
CALL METHOD IM_CASE->GET_SINGLE_ATTRIBUTE_VALUE
EXPORTING
IM_SRMADID = W_SRMADID
RECEIVING
RE_VALUE = W_STAT_ORDERNO.
W_SRMADID = 'CUSTOMER'.
CALL METHOD IM_CASE->GET_SINGLE_ATTRIBUTE_VALUE
EXPORTING
IM_SRMADID = W_SRMADID
RECEIVING
RE_VALUE = W_KUNNR.
W_SRMADID = 'ACCT_CLERK'.
CALL METHOD IM_CASE->GET_SINGLE_ATTRIBUTE_VALUE
EXPORTING
IM_SRMADID = W_SRMADID
RECEIVING
RE_VALUE = W_ACCT_CLERK.
SELECT SINGLE BUSAB INTO W_CLERK_KNB1
FROM KNB1
WHERE KUNNR = W_KUNNR
AND BUKRS = '1001'.
SELECT SINGLE BUSAB INTO W_CLERK_KNB5
FROM KNB5
WHERE KUNNR = W_KUNNR
AND BUKRS = '1001'.
If no clerk,& status = 00 send out KNB1 value
IF W_STAT_ORDERNO = 00.
IF W_ACCT_CLERK IS INITIAL.
W_SRMADID = 'ACCT_CLERK'.
W_IM_VALUE = W_CLERK_KNB1.
CALL METHOD IM_CASE->SET_SINGLE_ATTRIBUTE_VALUE
EXPORTING
IM_VALUE = W_IM_VALUE
IM_SRMADID = W_SRMADID.
MESSAGE I006(ZF) WITH W_CLERK_KNB1.
ELSE.
IF ( W_ACCT_CLERK = W_CLERK_KNB1
OR W_ACCT_CLERK = W_CLERK_KNB5 ). "* Do nothing
ELSE.
W_SRMADID = 'ACCT_CLERK'.
W_IM_VALUE = W_CLERK_KNB1. "** Send out KNB1 value
CALL METHOD IM_CASE->SET_SINGLE_ATTRIBUTE_VALUE
EXPORTING
IM_VALUE = W_IM_VALUE
IM_SRMADID = W_SRMADID.
MESSAGE I006(ZF) WITH W_CLERK_KNB1.
ENDIF.
ENDIF.
ENDIF.
*
IF ( W_STAT_ORDERNO = 1 OR W_STAT_orderno = 2
or W_STAT_ORDERNO = 3 ) .
IF W_ACCT_CLERK = W_CLERK_KNB1. "* Do nothing
ELSE.
W_SRMADID = 'ACCT_CLERK'.
W_IM_VALUE = W_CLERK_KNB1. "** Send out KNB1 value
CALL METHOD IM_CASE->SET_SINGLE_ATTRIBUTE_VALUE
EXPORTING
IM_VALUE = W_IM_VALUE
IM_SRMADID = W_SRMADID.
MESSAGE I006(ZF) WITH W_CLERK_KNB1.
ENDIF.
ENDIF.
*
IF W_STAT_ORDERNO = 1.
W_SRMADID = 'ZRESPONS'.
W_IM_VALUE = 'UNASSIGNED'.
CALL METHOD IM_CASE->SET_SINGLE_ATTRIBUTE_VALUE
EXPORTING
IM_VALUE = W_IM_VALUE
IM_SRMADID = W_SRMADID.
ENDIF.
If status = 4, send validate against Knkk
*
IF ( W_STAT_ORDERNO = 4 ) .
SELECT SINGLE SBGRP INTO W_CLERK_KNKK
FROM KNKK
WHERE KUNNR = W_KUNNR
AND KKBER = 'US01'.
IF W_ACCT_CLERK = W_CLERK_KNKK. "* Do nothing
ELSE.
W_SRMADID = 'ACCT_CLERK'.
W_IM_VALUE = W_CLERK_KNKK. "** Send out KNkk value
CALL METHOD IM_CASE->SET_SINGLE_ATTRIBUTE_VALUE
EXPORTING
IM_VALUE = W_IM_VALUE
IM_SRMADID = W_SRMADID.
MESSAGE I006(ZF) WITH W_CLERK_KNKK.
ENDIF.
ENDIF.
*
Need to ensure the document is valid
First check BSID, if not there BSAD, if not there
error message
*
W_BELNR = W_FIN_DOCUMENT(10).
W_LINE_NO = W_FIN_DOCUMENT+10(3).
IF NOT W_KUNNR IS INITIAL AND
NOT W_FIN_DOCUMENT IS INITIAL.
SELECT GJAHR INTO W_GJAHR
UP TO 1 ROWS FROM BSID
WHERE BUKRS = '1001'
AND BELNR = W_BELNR
AND KUNNR = W_KUNNR.
ENDSELECT.
IF SY-SUBRC NE 0.
SELECT GJAHR INTO W_GJAHR
UP TO 1 ROWS FROM BSAD
WHERE BUKRS = '1001'
AND BELNR = W_BELNR
AND KUNNR = W_KUNNR.
ENDSELECT.
IF SY-SUBRC NE 0.
MESSAGE I005(ZF) WITH W_BELNR W_KUNNR.
RETURN.
ENDIF.
ENDIF.
ENDIF.
2007 Mar 22 1:47 AM
Ankita,
This is just an example how you decalre and int table:
TYPES: BEGIN OF typ_xxx,
abc TYPE xxx,
efg TYPE yyy,
ijk TYPE zzz,
END OF typ_xxx.
DATA: ls_xxx TYPE typ_xxx.
You can fill the int table just the way you do in a report.
The code you asked may look something like this.
CASE W_STAT_ORDERNO .
total = UDMCASEATTR00-AMOUNT1 + UDMCASEATTR00-AMOUNT2 + UDMCASEATTR00-AMOUNT3 + UDMCASEATTR00-AMOUNT4 + UDMCASEATTR00-AMOUNT5 + UDMCASEATTR00-AMOUNT6 + UDMCASEATTR00-AMOUNT7 + UDMCASEATTR00-AMOUNT8 + UDMCASEATTR00-AMOUNT9 + UDMCASEATTR00-AMOUNT10.
if total <> UDMCASEATTR00-FIN_ORIGINAL_AMT.
MESSAGE Exxx(message class) .
endif.
when '5'.
ENDACSE.
Regards,
Chandra Kancharla
2007 Mar 22 2:20 AM
Hi Chandra,
thanks for u response, i have some problem.....
Types: begin of it_udmcaseattr00,
amount1 type udmcaseattr00-amount1,
amount2 type udmcaseattr00-amount2,
amount3 type udmcaseattr00-amount3,
.
.
.
amount10 type udmcaseattr00-amount10,
total type udmcaseattr00-amount,
end of it_udmcaseattr00.
data: it_udmcaseattr001 type table of it_udmcaseattr00.
data: wa_udmcaseattr001 like line of it_udmcaseattr001.
if ( w_stat_orderno = 5).
select * from udmcaseattr00 into table it_udmcaseattr001.
total = UDMCASEATTR00-AMOUNT1 + UDMCASEATTR00-AMOUNT2 + UDMCASEATTR00-AMOUNT3 + UDMCASEATTR00-AMOUNT4 + UDMCASEATTR00-AMOUNT5 + UDMCASEATTR00-AMOUNT6 + UDMCASEATTR00-AMOUNT7 + UDMCASEATTR00-AMOUNT8 + UDMCASEATTR00-AMOUNT9 + UDMCASEATTR00-AMOUNT10.
endselect.
endif.
if total <> UDMCASEATTR00-FIN_ORIGINAL_AMT.
MESSAGE i007(zf) .
endif.
When i checked thid code i am getting error in select statement. the error is it_udmcaseattr001 unicode not convertable.
can u tell me how to select the day from table udmcaseattr00 and place them into internal table.Plz help me...i am waiting for ur reply
Thanks,
Ankitha
2007 Mar 22 2:26 AM
Hi chandra,
i am sending the code, in which i want to add that logic.
METHOD IF_EX_SCMG_BEFORE_VALID_C~CHANGE .
DATA:
W_SRMADID TYPE SRMADID,
W_VBELN TYPE BELNR_D,
W_KUNNR TYPE KUNNR,
W_CLERK TYPE BUSAB,
W_CLERK_KNB5 TYPE BUSAB,
W_CLERK_KNB1 TYPE BUSAB,
W_ACCT_CLERK TYPE BUSAB,
W_CLERK_KNKK TYPE SBGRP_cm,
W_IM_VALUE TYPE STRING,
W_FIN_DOCUMENT TYPE ZZFIN_DOCUMENT,
W_BELNR TYPE UDM_KUNNR,
W_LINE_NO TYPE BUZEI,
W_GJAHR TYPE GJAHR,
W_CASE_GUID TYPE SYSUUID_C,
W_CASE_GUID_CURRENT TYPE SYSUUID_C,
W_EXT_KEY TYPE SCMG_EXT_KEY,
W_STAT_ORDERNO TYPE SCMGSTATUSONR,
LREF_CX_ROOT TYPE REF TO CX_ROOT,
L_MSGTEXT(72) TYPE C,
EX_MESSAGES TYPE SCMG_T_ATTR_RETURN_VALUE.
CLEAR: W_VBELN,
W_KUNNR,
W_CLERK, W_ACCT_CLERK, W_CLERK_KNB5, W_CLERK_KNB1,
W_FIN_DOCUMENT, W_CLERK_KNKK,
W_BELNR,
W_LINE_NO,
W_GJAHR.
To switch on GOS - to attach files to the case
*
DATA: GO_MYOBJECT TYPE REF TO CL_GOS_MANAGER,
LS_OBJECT TYPE BORIDENT,
LS_OBJECT_KEY TYPE SIBFINSTID,
Ex TYPE REF TO cx_scmg_case_badi.
trigger generic object services
IF GO_MYOBJECT IS INITIAL.
LS_OBJECT-OBJTYPE = 'BUS2022'.
LS_OBJECT = 'BUS2022'.
CREATE OBJECT GO_MYOBJECT
EXPORTING
IS_OBJECT = LS_OBJECT
IP_NO_INSTANCE = 'x'
EXCEPTIONS OTHERS = 1.
ENDIF.
TRY.
Want to ensure that the document & line number are not
already in an open case.
Order Status = 5 = Closed
CALL METHOD IM_CASE->GET_GUID
RECEIVING
RE_GUID = W_CASE_GUID_CURRENT.
LS_OBJECT-OBJKEY = W_CASE_GUID_CURRENT.
LS_OBJECT-OBJTYPE = 'BUS2022'.
CALL METHOD GO_MYOBJECT->SET_ID_OF_PUBLISHED_OBJECT
EXPORTING
IS_OBJECT = LS_OBJECT
EXCEPTIONS
OTHERS = 1.
W_SRMADID = 'FIN_DOCUMENT'.
CALL METHOD IM_CASE->GET_SINGLE_ATTRIBUTE_VALUE
EXPORTING
IM_SRMADID = W_SRMADID
RECEIVING
RE_VALUE = W_FIN_DOCUMENT.
SELECT SINGLE CASE_GUID FIN_DOCUMENT
INTO (W_CASE_GUID, W_FIN_DOCUMENT )
FROM UDMCASEATTR00
WHERE FIN_DOCUMENT = W_FIN_DOCUMENT.
IF SY-SUBRC = 0.
IF W_CASE_GUID_CURRENT <> W_CASE_GUID.
SELECT SINGLE EXT_KEY STAT_ORDERNO
INTO (W_EXT_KEY, W_STAT_ORDERNO)
FROM SCMG_T_CASE_ATTR
WHERE CASE_GUID = W_CASE_GUID.
IF SY-SUBRC = 0 AND W_STAT_ORDERNO <> 5. "DEVK950418
IF SY-SUBRC = 0.
MESSAGE I004(ZF) WITH W_FIN_DOCUMENT W_EXT_KEY.
RAISE EXCEPTION TYPE cx_scmg_case_badi "DEVK950418
EXPORTING
TEXTID = 'CASE ALREADY EXISTS'.
RETURN.
ENDIF.
ENDIF. "DEVK950418
ENDIF.
ENDIF.
Need to get the account clerk based on customer number
if it is not entered get it from KNB1
If supplied, verify against knb1 & KNB5.
if valid do nothing, if not - move out the value based on
order status
W_SRMADID = 'STAT_ORDERNO'.
CALL METHOD IM_CASE->GET_SINGLE_ATTRIBUTE_VALUE
EXPORTING
IM_SRMADID = W_SRMADID
RECEIVING
RE_VALUE = W_STAT_ORDERNO.
W_SRMADID = 'CUSTOMER'.
CALL METHOD IM_CASE->GET_SINGLE_ATTRIBUTE_VALUE
EXPORTING
IM_SRMADID = W_SRMADID
RECEIVING
RE_VALUE = W_KUNNR.
W_SRMADID = 'ACCT_CLERK'.
CALL METHOD IM_CASE->GET_SINGLE_ATTRIBUTE_VALUE
EXPORTING
IM_SRMADID = W_SRMADID
RECEIVING
RE_VALUE = W_ACCT_CLERK.
SELECT SINGLE BUSAB INTO W_CLERK_KNB1
FROM KNB1
WHERE KUNNR = W_KUNNR
AND BUKRS = '1001'.
SELECT SINGLE BUSAB INTO W_CLERK_KNB5
FROM KNB5
WHERE KUNNR = W_KUNNR
AND BUKRS = '1001'.
If no clerk,& status = 00 send out KNB1 value
IF W_STAT_ORDERNO = 00.
IF W_ACCT_CLERK IS INITIAL.
W_SRMADID = 'ACCT_CLERK'.
W_IM_VALUE = W_CLERK_KNB1.
CALL METHOD IM_CASE->SET_SINGLE_ATTRIBUTE_VALUE
EXPORTING
IM_VALUE = W_IM_VALUE
IM_SRMADID = W_SRMADID.
MESSAGE I006(ZF) WITH W_CLERK_KNB1.
ELSE.
IF ( W_ACCT_CLERK = W_CLERK_KNB1
OR W_ACCT_CLERK = W_CLERK_KNB5 ). "* Do nothing
ELSE.
W_SRMADID = 'ACCT_CLERK'.
W_IM_VALUE = W_CLERK_KNB1. "** Send out KNB1 value
CALL METHOD IM_CASE->SET_SINGLE_ATTRIBUTE_VALUE
EXPORTING
IM_VALUE = W_IM_VALUE
IM_SRMADID = W_SRMADID.
MESSAGE I006(ZF) WITH W_CLERK_KNB1.
ENDIF.
ENDIF.
ENDIF.
*
IF ( W_STAT_ORDERNO = 1 OR W_STAT_orderno = 2
or W_STAT_ORDERNO = 3 ) .
IF W_ACCT_CLERK = W_CLERK_KNB1. "* Do nothing
ELSE.
W_SRMADID = 'ACCT_CLERK'.
W_IM_VALUE = W_CLERK_KNB1. "** Send out KNB1 value
CALL METHOD IM_CASE->SET_SINGLE_ATTRIBUTE_VALUE
EXPORTING
IM_VALUE = W_IM_VALUE
IM_SRMADID = W_SRMADID.
MESSAGE I006(ZF) WITH W_CLERK_KNB1.
ENDIF.
ENDIF.
*
IF W_STAT_ORDERNO = 1.
W_SRMADID = 'ZRESPONS'.
W_IM_VALUE = 'UNASSIGNED'.
CALL METHOD IM_CASE->SET_SINGLE_ATTRIBUTE_VALUE
EXPORTING
IM_VALUE = W_IM_VALUE
IM_SRMADID = W_SRMADID.
ENDIF.
If status = 4, send validate against Knkk
*
IF ( W_STAT_ORDERNO = 4 ) .
SELECT SINGLE SBGRP INTO W_CLERK_KNKK
FROM KNKK
WHERE KUNNR = W_KUNNR
AND KKBER = 'US01'.
IF W_ACCT_CLERK = W_CLERK_KNKK. "* Do nothing
ELSE.
W_SRMADID = 'ACCT_CLERK'.
W_IM_VALUE = W_CLERK_KNKK. "** Send out KNkk value
CALL METHOD IM_CASE->SET_SINGLE_ATTRIBUTE_VALUE
EXPORTING
IM_VALUE = W_IM_VALUE
IM_SRMADID = W_SRMADID.
MESSAGE I006(ZF) WITH W_CLERK_KNKK.
ENDIF.
ENDIF.
*
Need to ensure the document is valid
First check BSID, if not there BSAD, if not there
error message
*
W_BELNR = W_FIN_DOCUMENT(10).
W_LINE_NO = W_FIN_DOCUMENT+10(3).
IF NOT W_KUNNR IS INITIAL AND
NOT W_FIN_DOCUMENT IS INITIAL.
SELECT GJAHR INTO W_GJAHR
UP TO 1 ROWS FROM BSID
WHERE BUKRS = '1001'
AND BELNR = W_BELNR
AND KUNNR = W_KUNNR.
ENDSELECT.
IF SY-SUBRC NE 0.
SELECT GJAHR INTO W_GJAHR
UP TO 1 ROWS FROM BSAD
WHERE BUKRS = '1001'
AND BELNR = W_BELNR
AND KUNNR = W_KUNNR.
ENDSELECT.
IF SY-SUBRC NE 0.
MESSAGE I005(ZF) WITH W_BELNR W_KUNNR.
RETURN.
ENDIF.
ENDIF.
ENDIF.
2007 Mar 22 2:53 AM
I aint sure which system you are in. I dont see table udmcaseattr00 in my R/3 system (ecc 5.0).
But try with this statement and see if this works,
select * from udmcaseattr00 into corresponding fileds of table it_udmcaseattr001.
Thanks,
Chandra
2007 Mar 22 3:23 PM
Hi ,
how can we write code in above method for this case....
1.For each UDMCASEATTR00-COST_CENTER (1-10) make sure the respective COMPANY_CODE (1-10) and BUSINESS (1-10) areas are filled. You will have to search table CSKS for this information. Use CONTROLLING_AREA CONU (find the BUKRS and GSBER for the KOSTL).
please if any can help me.
Thanks,
Ankitha