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

how to use BAPI_OBJCL_CHANGE?

former_member1137458
Participant
14,296

I want to update (MSC3N) classification tab -> characteristic values, Is it using this FM?

input what value of OBJECTKEY and OBJECTTABLE

CALL FUNCTION 'BAPI_OBJCL_CHANGE'
  EXPORTING
    OBJECTKEY                =
    OBJECTTABLE              =
    CLASSNUM                 =
    CLASSTYPE                =
*   STATUS                   = '1'
*   STANDARDCLASS            =
*   CHANGENUMBER             =
*   KEYDATE                  = SY-DATUM
*   NO_DEFAULT_VALUES        = ' '
* IMPORTING
*   CLASSIF_STATUS           =
  TABLES
    ALLOCVALUESNUMNEW        =
    ALLOCVALUESCHARNEW       =
    ALLOCVALUESCURRNEW       =
    RETURN                   =
          .

Edited by: cpliu903 on Oct 26, 2010 3:39 PM

1 ACCEPTED SOLUTION
Read only

Former Member
0 Likes
9,816

Hello,

Yes You have to use FM to do it. Please find the usage below.

length = strlen(ekpo-matnr).

Write "batch" to objek+18(10).

Write ekpo-matnr to objek+0(length) LEFT-JUSTIFIED.

lt_charvalues-charact='XYZ' "Char Name

lt_charvalues-value_char='A' "Value

Call BAPI_OBJCL_CHANGE with OBJEK, OBJECTTABLE = 'MCH1', <Your Class Name>, <Class type> and alloccharvaluesnew as i took character type characterstic in my example(Need to use corresponding table based on datatype)

Hope it helps!

Pavan.

Hello,

Yes You have to use FM to do it. Please find the usage below.

length = strlen(ekpo-matnr).

Write "batch" to objek+18(10).

Write ekpo-matnr to objek+0(length) LEFT-JUSTIFIED.

lt_charvalues-charact='XYZ' "Char Name

lt_charvalues-value_char='A' "Value

Call BAPI_OBJCL_CHANGE with OBJEK, OBJECTTABLE = 'MCH1', <Your Class Name>, <Class type> and alloccharvaluesnew as i took character type characterstic in my example(Need to use corresponding table based on datatype)

Hope it helps!

Pavan.

14 REPLIES 14
Read only

Former Member
0 Likes
9,817

Hello,

Yes You have to use FM to do it. Please find the usage below.

length = strlen(ekpo-matnr).

Write "batch" to objek+18(10).

Write ekpo-matnr to objek+0(length) LEFT-JUSTIFIED.

lt_charvalues-charact='XYZ' "Char Name

lt_charvalues-value_char='A' "Value

Call BAPI_OBJCL_CHANGE with OBJEK, OBJECTTABLE = 'MCH1', <Your Class Name>, <Class type> and alloccharvaluesnew as i took character type characterstic in my example(Need to use corresponding table based on datatype)

Hope it helps!

Pavan.

Read only

0 Likes
9,817

Message Type E

Table not supported for class type 022

what problem??

Data: length type I,
      objek(50) type C.

length = STRLEN( 'PIC12F510-I/MC' ).

Write '0000120255' to objek+18(10).

Write  'PIC12F510-I/MC' to objek+0(length) LEFT-JUSTIFIED.

WRITE :/ length, objek .

DATA: GT_VALUES_NUM TYPE TABLE OF BAPI1003_ALLOC_VALUES_NUM,

      GT_VALUES_CHAR TYPE TABLE OF BAPI1003_ALLOC_VALUES_CHAR,

      GT_VALUES_CURR TYPE TABLE OF BAPI1003_ALLOC_VALUES_CURR,

      GT_BAPIRET2 TYPE TABLE OF BAPIRET2,

      LS_BAPIRET2 TYPE BAPIRET2.


DATA: GS_VALUES_NUM TYPE BAPI1003_ALLOC_VALUES_NUM,

      GS_VALUES_CHAR TYPE BAPI1003_ALLOC_VALUES_CHAR,

      GS_VALUES_CURR TYPE BAPI1003_ALLOC_VALUES_CHAR,

      GC_FLAG_X(1) TYPE C VALUE 'X'.

START-OF-SELECTION.

  GS_VALUES_CHAR-CHARACT = 'Z_STORAGE_BIN' .

  GS_VALUES_CHAR-VALUE_CHAR = 'SH9999'.

  APPEND GS_VALUES_CHAR TO GT_VALUES_CHAR.


CALL FUNCTION 'BAPI_OBJCL_CHANGE'
  EXPORTING
    OBJECTKEY                = objek
    OBJECTTABLE              = 'MCH1'
    CLASSNUM                 = 'EP_BATCH_01'
    CLASSTYPE                = '022'
*   STATUS                   = '1'
*   STANDARDCLASS            =
*   CHANGENUMBER             =
*   KEYDATE                  = SY-DATUM
*   NO_DEFAULT_VALUES        = ' '
* IMPORTING
*   CLASSIF_STATUS           =
  TABLES
    ALLOCVALUESNUMNEW        = GT_VALUES_NUM
    ALLOCVALUESCHARNEW       = GT_VALUES_CHAR
    ALLOCVALUESCURRNEW       = GT_VALUES_CURR
    RETURN                   = GT_BAPIRET2
          .


      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'

        EXPORTING

          WAIT   = 'X'

        IMPORTING

          RETURN = LS_BAPIRET2.


   WRITE:'Message Type',LS_BAPIRET2-TYPE .

   LOOP AT GT_BAPIRET2 INTO LS_BAPIRET2.

     WRITE:'Message Type',LS_BAPIRET2-TYPE ,LS_BAPIRET2-MESSAGE.

   ENDLOOP.

Read only

0 Likes
9,817

Hello!

look at table TCLA

for 022 class you must use OBJECTTABLE = 'MCHA'

Thank you!

Read only

0 Likes
9,817

The Object Key also is MANTR + CHARG ??

MANTR : PIC12F510-I/MC

CHARG: 0000120255

Data: length type I,
      objek(50) type C.

length = STRLEN( 'PIC12F510-I/MC' ).

Write '0000120255' to objek+18(10).

Write  'PIC12F510-I/MC' to objek+0(length) LEFT-JUSTIFIED.

when object table change to MCHA, that will be appear "Object PIC12F510-I/MC0000120255 does not exist"

Read only

0 Likes
9,817

Use the following structures to build objkey


  DATA  : BEGIN OF MCHAKEY,
            MATNR  LIKE MCHA-MATNR,
            WERKS  LIKE MCHA-WERKS,
            CHARG  LIKE MCHA-CHARG.
  DATA  : END   OF MCHAKEY.
  DATA  : BEGIN OF MCH1KEY,
            MATNR  LIKE MCHA-MATNR,
            CHARG  LIKE MCHA-CHARG.
  DATA  : END   OF MCH1KEY.

(You forgot WERKS, perform some tests via SE37 with function modules OBJECT_CHECK_MCH1 or OBJECT_CHECK_MCHA,"Existence check for batch classification")

Regards,

Raymond

Read only

0 Likes
9,816

not work, It prompt error message "Enter a batch" .

DATA  : BEGIN OF MCHAKEY,
            MATNR  LIKE MCHA-MATNR,
            WERKS  LIKE MCHA-WERKS,
            CHARG  LIKE MCHA-CHARG.
DATA  : END   OF MCHAKEY.


DATA ITAB LIKE TABLE OF MCHAKEY WITH HEADER LINE.

SELECT MATNR WERKS CHARG INTO CORRESPONDING FIELDS OF TABLE ITAB FROM MCHA
WHERE MATNR = 'PIC12F510-I/MC' AND
      WERKS = '8001' AND
      CHARG = '0000120255'.

DATA L_OBJNUM(50) TYPE C.

LOOP AT ITAB.
	L_OBJNUM(18)      = ITAB-MATNR.
	L_OBJNUM+18(4)    = ITAB-WERKS.
	L_OBJNUM+22(10)   = ITAB-CHARG.
ENDLOOP.

DATA: GT_VALUES_NUM TYPE TABLE OF BAPI1003_ALLOC_VALUES_NUM,

      GT_VALUES_CHAR TYPE TABLE OF BAPI1003_ALLOC_VALUES_CHAR,

      GT_VALUES_CURR TYPE TABLE OF BAPI1003_ALLOC_VALUES_CURR,

      GT_BAPIRET2 TYPE TABLE OF BAPIRET2,

      LS_BAPIRET2 TYPE BAPIRET2.


DATA: GS_VALUES_NUM TYPE BAPI1003_ALLOC_VALUES_NUM,

      GS_VALUES_CHAR TYPE BAPI1003_ALLOC_VALUES_CHAR,

      GS_VALUES_CURR TYPE BAPI1003_ALLOC_VALUES_CHAR,

      GC_FLAG_X(1) TYPE C VALUE 'X'.

START-OF-SELECTION.

  GS_VALUES_CHAR-CHARACT = 'Z_STORAGE_BIN' .

  GS_VALUES_CHAR-VALUE_CHAR = 'SH8005'.

  APPEND GS_VALUES_CHAR TO GT_VALUES_CHAR.


CALL FUNCTION 'BAPI_OBJCL_CHANGE'
  EXPORTING
    OBJECTKEY                = L_OBJNUM
    OBJECTTABLE              = 'MCHA'
    CLASSNUM                 = 'EP_BATCH_01'
    CLASSTYPE                = '022'

  TABLES
    ALLOCVALUESNUMNEW        = GT_VALUES_NUM
    ALLOCVALUESCHARNEW       = GT_VALUES_CHAR
    ALLOCVALUESCURRNEW       = GT_VALUES_CURR
    RETURN                   = GT_BAPIRET2
          .

      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'

        EXPORTING

          WAIT   = 'X'

        IMPORTING

          RETURN = LS_BAPIRET2.

   WRITE: LS_BAPIRET2-TYPE .

   LOOP AT GT_BAPIRET2 INTO LS_BAPIRET2.

     WRITE: 'MESSAGE TYPE', LS_BAPIRET2-TYPE ,LS_BAPIRET2-MESSAGE.

   ENDLOOP.

Read only

0 Likes
9,816

You need to concatenate them with the syntax 'RESPECTING BLANKS' .

Concatenate Matnr Charg into lv_objkey RESPECTING BLANKS.

The key is build up with full length of the matnr/charg in your case matnr is 14 char so after 'PIC12F510-I/MC' there will be 4 spaces .

Your key should look like this 'PIC12F510-I/MC 0000120255' instead of 'PIC12F510-I/MC0000120255'

Read only

0 Likes
9,816

Thank you very much.

It is correct...

However, the characteristics values does not change. why?

It's also not work Run in SE37.

GS_VALUES_CHAR-CHARACT = 'Z_STORAGE_BIN' .
GS_VALUES_CHAR-VALUE_CHAR = 'SH8005'.

Read only

0 Likes
9,816

Replace

SELECT MATNR WERKS CHARG INTO CORRESPONDING FIELDS OF TABLE ITAB FROM MCHA
WHERE MATNR = 'PIC12F510-I/MC' AND
      WERKS = '8001' AND
      CHARG = '0000120255'.
 
DATA L_OBJNUM(50) TYPE C.
 
LOOP AT ITAB.
	L_OBJNUM(18)      = ITAB-MATNR.
	L_OBJNUM+18(4)    = ITAB-WERKS.
	L_OBJNUM+22(10)   = ITAB-CHARG.
ENDLOOP.

with

mchakey-matnr = 'PIC12F510-I/MC'.
mchakey-werks = '8001'.
mchakey-charg = '0000120255'.
l_objnum = mchakey.

But the correct way is use of BAPI_OBJCL_CONCATENATEKEY_KEY to build the key (or BAPI_OBJCL_CONCATENATEKEY)

REFRESH lt_key.

lv_key-key_field = 'MATNR'
* lv_ket-VALUE_INT = mcha-matnr.  " actual program
lv_key-value_ext = 'PIC12F510-I/MC'. " test program

lv_key-key_field = 'WERKS'.
* lv_ket-VALUE_INT = mcha-werks.
lv_key-value_ext = '8001'.

lv_key-key_field = 'CHARG'.
* lv_ket-VALUE_INT = mcha-charg.
lv_key-value_ext = '0000120255'.

APPEND lv_key TO lt_key.

CALL FUNCTION 'BAPI_OBJCL_CONCATENATEKEY_KEY'
     EXPORTING
          objecttable    = 'MCHA'
          classtype      = '022'
     IMPORTING
          clobjectkeyout = l_objnum
     TABLES
          objectkeytable = lt_key
          return         = return.

Regards,

Raymond

Read only

0 Likes
9,816

Is it pass this value

IMPORTING

clobjectkeyout = l_objnum

to BAPI_OBJCL_CHANGE

EXPORTING

OBJECTKEY = L_OBJNUM

I have try this, but it has run time error.

Read only

0 Likes
9,816

Hello,

Try adding this line to your coding

GS_VALUES_CHAR-CHARACT = 'Z_STORAGE_BIN' .

GS_VALUES_CHAR-VALUE_CHAR = 'SH8005'.

GS_VALUES_CHAR-value_neutral = 'SH8005'. <=

Edited by: tony pang on Oct 27, 2010 1:53 PM

Read only

Former Member
0 Likes
9,815

I believe you are trying to change characteristic values. BAPI_OBJCL_CHANGE is to change/create class and class assignments. Try BAPI_CHARACT_CHANGE to change characteristics values. See FM documents for more details.

regards,

Pranav

Read only

RaymondGiuseppi
Active Contributor
9,816

OSS [Note 1083986 - BAPIs for classification - Overview|https://service.sap.com/sap/support/notes/1083986] is a good starting point for you.

- Also read [Note 1348099 - BAPI_OBJCL_CREATE: Operating instructions|https://service.sap.com/sap/support/notes/1348099] very similar parameters to [BAPI_OBJCL_CHANGE|http://www.sdn.sap.com/irj/scn/advancedsearch?query=bapi_objcl_change] "Change Properties of Assignment"

- And read [Note 1479120 - BAPI_CHARACT_CREATE: Operating instructions|https://service.sap.com/sap/support/notes/1479120] very similar parameters to [BAPI_CHARACT_CHANGE|http://www.sdn.sap.com/irj/scn/advancedsearch?query=bapi_charact_change] "Change Characteristic"

- Last read [Note 1083984 - BAPI_OBJCL_CONCATENATEKEY and BAPI_OBJCL_SPLITKEY: Condition|https://service.sap.com/sap/support/notes/1083984] to build Objects key with [BAPI_OBJCL_CONCATENATEKEY|http://www.sdn.sap.com/irj/scn/advancedsearch?query=bapi_objcl_concatenatekey]

Regards,

Raymond

Read only

Former Member
0 Likes
9,816

Hello,

Keep in mind that with BAPI_OBJCL_CHANGE you need to populate all entries in the table parameters if you want to change a characteristic because empty enties in that bapi => deleted that characteristic if there is a value assigned to that characteristic.

You may want to call BAPI_OBJCL_GETCLASSES first and add/change entries from the tables-parameters to avoid problems.