If you have a scnerio that you want to call BD10 , so that you could create idocs for only those materials which are changed alongwith full details and same for customer master(BD12). Then below code can help you fasten the build process.
- A class is created with 2 methods , first is to read the change pointers and the other method is to update the BDCP2 Process indicator , so that same records are not processed again with BD10 or BD12.
- A custom program is created to call these 2 methods with input field as message type.
You can later on alter this program according to your needs.
- Below is the code for class:
class ZCL_O2C_I_007_CHANGE_POINTER definition
public
final
create public .
public section.
types:
begin of ty_material_range,
sign type ddsign,
option type ddoption,
low type char18,
high type char18,
end of ty_material_range .
types:
tt_range type table of ty_material_range with default key .
class-methods READ_CHANGE_POINTERS
importing
!I_MESTYP type EDI_MESTYP
returning
value(R_VALUE) type TT_RANGE .
class-methods CHANGE_POINTER_STATUS
importing
!I_MESTYP type EDI_MESTYP
!I_KEYS type BDIMARAKEY_TAB optional
!I_KUNNR_KEYS type ZO2C_I_007_KUNNRKEY optional .
protected section.
private section.
ENDCLASS.
CLASS ZCL_O2C_I_007_CHANGE_POINTER IMPLEMENTATION.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Static Public Method ZCL_O2C_I_007_CHANGE_POINTER=>CHANGE_POINTER_STATUS
* +-------------------------------------------------------------------------------------------------+
* | [--->] I_MESTYP TYPE EDI_MESTYP
* | [--->] I_KEYS TYPE BDIMARAKEY_TAB(optional)
* | [--->] I_KUNNR_KEYS TYPE ZO2C_I_007_KUNNRKEY(optional)
* ZO2C_I_007_KUNNRKEY This is custom table type for structure BDIKNA1KEY
* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD change_pointer_status.
CONSTANTS:
lc_matmas type char6 VALUE 'MATMAS',
lc_kunnr type char6 VALUE 'DEBMAS'
.
DATA: change_pointers TYPE TABLE OF bdcp WITH DEFAULT KEY,
change_pointer_ids TYPE TABLE OF bdicpident WITH DEFAULT KEY
.
CHECK i_mestyp IS NOT INITIAL.
CALL FUNCTION 'CHANGE_POINTERS_READ'
EXPORTING
message_type = i_mestyp
TABLES
change_pointers = change_pointers.
IF i_mestyp = lc_matmas.
LOOP AT i_keys REFERENCE INTO DATA(key).
LOOP AT change_pointers REFERENCE INTO DATA(cp)
WHERE cdobjid = key->matnr.
change_pointer_ids = VALUE #( BASE change_pointer_ids ( cpident = cp->cpident ) ).
ENDLOOP.
ENDLOOP.
ELSEIF i_mestyp = lc_kunnr.
LOOP AT I_KUNNR_KEYS REFERENCE INTO DATA(key2).
LOOP AT change_pointers REFERENCE INTO DATA(cp2)
WHERE cdobjid = key2->kunnr.
change_pointer_ids = VALUE #( BASE change_pointer_ids ( cpident = cp2->cpident ) ).
ENDLOOP.
ENDLOOP.
ENDIF.
CALL FUNCTION 'CHANGE_POINTERS_STATUS_WRITE'
EXPORTING
message_type = i_mestyp
TABLES
change_pointers_idents = change_pointer_ids.
ENDMETHOD.
* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Static Public Method ZCL_O2C_I_007_CHANGE_POINTER=>READ_CHANGE_POINTERS
* +-------------------------------------------------------------------------------------------------+
* | [--->] I_MESTYP TYPE EDI_MESTYP
* | [<-()] R_VALUE TYPE TT_RANGE
* +--------------------------------------------------------------------------------------</SIGNATURE>
METHOD read_change_pointers.
DATA change_pointers TYPE TABLE OF bdcp WITH DEFAULT KEY.
CALL FUNCTION 'CHANGE_POINTERS_READ'
EXPORTING
message_type = i_mestyp
TABLES
change_pointers = change_pointers.
IF lines( change_pointers ) IS NOT INITIAL.
r_value = VALUE #( FOR cp IN change_pointers
( sign = 'I' option = 'EQ' low = cp-cdobjid ) ).
DELETE ADJACENT DUPLICATES FROM r_value.
ENDIF.
ENDMETHOD.
ENDCLASS.
2) Code for custom program(All the messages are hardcoded , so you need to convert them to text symbols)
REPORT zo2c_i_007_change_pointer_updt.
INCLUDE zo2c_i_007_cp_updt_gd. "Global declrations
INCLUDE zo2c_i_007_cp_updt_sel. "Selection screens
START-OF-SELECTION.
"Read change pointers
CALL METHOD zcl_o2c_i_007_change_pointer=>read_change_pointers
EXPORTING
i_mestyp = p_msg
RECEIVING
r_value = lt_range.
"
IF lt_range IS INITIAL.
MESSAGE 'No change pointer found !' TYPE 'E'.
ELSEIF p_msg EQ 'MATMAS' AND lt_range IS NOT INITIAL.
"Call BD10
SUBMIT rbdsemat
WITH matsel IN lt_range
WITH sendall = abap_true
EXPORTING LIST TO MEMORY
AND RETURN.
"Build keys table
LOOP AT lt_range ASSIGNING FIELD-SYMBOL(<fs_matnr>).
ls_mat_keys-matnr = <fs_matnr>-low.
APPEND ls_mat_keys TO lt_mat_keys.
CLEAR ls_mat_keys.
ENDLOOP.
"Update the status in BDCP2
CALL METHOD zcl_o2c_i_007_change_pointer=>change_pointer_status
EXPORTING
i_mestyp = p_msg
i_keys = lt_mat_keys.
ELSEIF p_msg EQ 'DEBMAS' AND lt_range IS NOT INITIAL.
* call BD12
SUBMIT rbdsedeb WITH selkunnr IN lt_range
WITH mestyp = 'DEBMAS'
EXPORTING LIST TO MEMORY
AND RETURN.
"Build keys table
LOOP AT lt_range ASSIGNING FIELD-SYMBOL(<fs_kunnr>).
ls_kun_keys-kunnr = <fs_kunnr>-low.
APPEND ls_kun_keys TO lt_kun_keys.
CLEAR ls_kun_keys.
ENDLOOP.
"Update the status in BDCP2
CALL METHOD zcl_o2c_i_007_change_pointer=>change_pointer_status
EXPORTING
i_mestyp = p_msg
I_KUNNR_KEYS = lt_kun_keys.
ELSEIF lt_range IS NOT INITIAL.
MESSAGE 'Message type not supported !' TYPE 'E'.
ENDIF.
3) All the includes code:
i) Include ZO2C_I_007_CP_UPDT_GD
*&---------------------------------------------------------------------*
*& Include ZO2C_I_007_CP_UPDT_GD
*&---------------------------------------------------------------------*
TYPES:
BEGIN OF ty_material_range,
sign TYPE ddsign,
option TYPE ddoption,
low TYPE char18,
high TYPE char18,
END OF ty_material_range .
* TYPES:
* tt_range TYPE TABLE OF ty_material_range WITH DEFAULT KEY .
DATA: lt_range TYPE STANDARD TABLE OF ty_material_range WITH DEFAULT KEY,
lt_mat_keys TYPE bdimarakey_tab,
ls_mat_keys TYPE bdimarakey,
lt_kun_keys TYPE STANDARD TABLE OF bdikna1key,
ls_kun_keys TYPE bdikna1key
.
ii) ZO2C_I_007_CP_UPDT_SEL
SELECTION-SCREEN BEGIN OF BLOCK b1.
PARAMETERS : P_MSG TYPE EDI_MESTYP OBLIGATORY.
SELECTION-SCREEN : END OF BLOCK b1.
The above code is for BD10 and BD12 and if you don’t need any one of them , you can remove the code.
Please let me know in case of any questions.
Subscribe
Login
Please login to comment
0 Comments