05-18-2006 8:22 AM
Hi
I need to distribute employee data from my SAP system. I want to send a Idoc every time a record in PA30 is changed. But know it only sends out a IDoc with the infotype that is changed, I need to distribute all infotype's.
Example: One person is changed in infotype IT0002. I need to send out not only IT0002 but also IT0006 and IT0008.
Is there a way to solve this?
Best Regards,
Morten
05-18-2006 9:25 AM
Hello Morten,
Yes, you can do it. I have done same thing in one of my interface. You need to write code into BADI.
BADI : BDCP_BEFORE_WRITE
Method : FILTER_BDCPV_BEFORE_WRITE
Basic idea is to populate internal table change_pointers with remaining infotype details.
Refer following code for reference....
BADI implemented in order to send customised data as
maintained in the distribution mdoel
METHOD if_ex_bdcp_before_write~filter_bdcpv_before_write.
----
Type Declaration
----
TYPES : BEGIN OF ts_range,
sign TYPE tvarv-sign,
option TYPE tvarv-opti,
low TYPE tvarv-low,
high TYPE tvarv-high,
END OF ts_range.
TYPES : BEGIN OF ts_group,
int_grp TYPE zthr_infty_subty-int_grp,
END OF ts_group.
----
Internal table
----
DATA:
lt_zthr_infty_subty TYPE TABLE OF zthr_infty_subty,
lt_dist_infty_subty TYPE TABLE OF t788u,
lt_groups TYPE TABLE OF ts_group.
DATA:
lt_changed_objects TYPE TABLE OF hrobjinfty.
DATA :
lr_infty TYPE RANGE OF t591s-infty, " Range for infotypes
lr_subty TYPE RANGE OF t591s-subty. " Range for subtypes.
----
Work Areas
----
DATA:
lw_change_pointers TYPE bdcpv,
lw_change_pointers1 TYPE bdcpv,
lw_text(254) TYPE c,
lw_infty TYPE ts_range,
lw_subty TYPE ts_range,
lw_groups TYPE ts_group.
DATA:
lw_zthr_infty_subty TYPE zthr_infty_subty, "Infotype & Subtype
lw_zthr_infty_subty1 TYPE zthr_infty_subty, "Infotype & Subtype
lw_dist_infty_subty TYPE t788u. "Infotypes
DATA:
lw_changed_objects TYPE hrobjinfty,
lw_changed_objects1 TYPE hrobjinfty,
lw_changed_objects2 TYPE hrobjinfty.
----
Local Variables
----
DATA:
lv_tabix TYPE sy-tabix, " Table index
lv_cpident TYPE cpident, " Change pointer no.
lv_pernr TYPE pa0000-pernr, " Employee Number
lv_tabname TYPE dd02t-tabname, " Table Name
lv_abkrs TYPE pa0001-abkrs, " Payroll Area
lv_infty(4) TYPE n. " Infotype Number
----
Local Constants
----
CONSTANTS:
lc_e TYPE t591s-sprsl VALUE 'E',
lc_i TYPE tvarv-sign VALUE 'I',
lc_x TYPE c VALUE 'X',
lc_7 TYPE c VALUE '7',
lc_p TYPE otype VALUE 'P',
lc_zhrmd TYPE edi_mestyp VALUE 'ZHRMD_A',
lc_eq TYPE tvarv-opti VALUE 'EQ',
lc_pa(2) TYPE c VALUE 'PA',
lc_begda TYPE sy-datum VALUE '19000101',
lc_02 TYPE pa0001-abkrs VALUE '02',
lc_1000(4) TYPE n VALUE '1000',
lc_2000(4) TYPE n VALUE '2000'.
************************************************************
Clear all local variables / internal tables / Work Areas
************************************************************
REFRESH : lt_groups,
lr_infty,
lr_subty,
lt_changed_objects.
CLEAR : lv_tabix,
lv_abkrs,
lw_change_pointers,
lw_dist_infty_subty,
lv_tabname,
lw_groups.
Select only otypes and infotypes from distribution model
Read change infotype / subtype data
IF NOT change_pointers[] IS INITIAL.
LOOP AT change_pointers INTO lw_change_pointers.
lw_changed_objects = lw_change_pointers-tabkey.
*********************************************************
Filter CE Employee if Pay-Area not '02' ***
*********************************************************
IF flt_val EQ lc_zhrmd. " Check for CE emploeyee
SELECT abkrs
INTO lv_abkrs
FROM pa0001 UP TO 1 ROWS
WHERE pernr EQ lw_changed_objects-objid
AND endda GE sy-datum
AND begda LE sy-datum
AND abkrs EQ lc_02.
ENDSELECT.
IF sy-subrc EQ 0.
APPEND lw_changed_objects TO lt_changed_objects.
ELSE.
DELETE change_pointers.
ENDIF.
ELSE.
APPEND lw_changed_objects TO lt_changed_objects.
ENDIF. " IF flt_val EQ lc_zhrmd.
ENDLOOP. " LOOP AT change_pointers INTO lw_change_pointers.
lv_cpident = lw_change_pointers-cpident.
ENDIF. "IF NOT change_pointers[] IS INITIAL.
**************************************************************
Select only otypes and infotypes from distribution model**
Select corresponding infotypes / subtypes from table **
ZTHR_INFTY_SUBTY to create change pointers **
**************************************************************
CALL FUNCTION 'RH_DISTRIBUTED_INFOTYPES'
EXPORTING
message_type = flt_val
check_model = lc_x
TABLES
distributed_infty_subty = lt_dist_infty_subty.
IF NOT lt_dist_infty_subty[] IS INITIAL.
Read table ZTHR_INFTY_SUBTY
SELECT mandt " Client
mestyp " Message Type
infty " Infotype
subty " Info Subtype
int_grp " Change pointer group
INTO TABLE lt_zthr_infty_subty
FROM zthr_infty_subty AS a
FOR ALL ENTRIES IN lt_dist_infty_subty
WHERE mestyp EQ flt_val
AND infty EQ lt_dist_infty_subty-infty.
IF sy-subrc EQ 0.
CLEAR : lw_changed_objects.
LOOP AT lt_changed_objects INTO lw_changed_objects.
MOVE : lw_changed_objects TO lw_changed_objects2.
AT NEW objid.
Read all groups belongs to infotype.
CLEAR : lw_groups.
REFRESH: lt_groups.
LOOP AT lt_zthr_infty_subty INTO lw_zthr_infty_subty
WHERE infty = lw_changed_objects2-infty
AND subty = lw_changed_objects2-subty.
lw_groups = lw_zthr_infty_subty-int_grp.
APPEND lw_groups TO lt_groups.
ENDLOOP. " LOOP AT lt_zthr_infty_subty INTO ....
Do not create change pointer if infotype not maintained in
table 'ZTHR_INFTY_SUBTY'.
IF sy-subrc NE 0.
DELETE change_pointers WHERE
tabkey+12(4) = lw_changed_objects2-infty
AND tabkey+16(4) = lw_changed_objects2-subty.
ENDIF. " IF sy-subrc NE 0.
Read all infotypes belongs to all above groups.
LOOP AT lt_groups INTO lw_groups.
LOOP AT lt_zthr_infty_subty INTO lw_zthr_infty_subty
WHERE int_grp EQ lw_groups-int_grp.
Check if change pointer already present
READ TABLE lt_changed_objects INTO lw_changed_objects1
WITH KEY infty = lw_zthr_infty_subty-infty
subty = lw_zthr_infty_subty-subty.
IF sy-subrc NE 0.
Check if data exist for infotype / subtype
IF lw_changed_objects-otype EQ lc_p.
CONCATENATE : lc_pa lw_zthr_infty_subty-infty
INTO lv_tabname.
SELECT SINGLE pernr
INTO lv_pernr
FROM (lv_tabname)
WHERE subty EQ lw_zthr_infty_subty-subty
AND pernr EQ lw_changed_objects2-objid.
IF sy-subrc EQ 0. " Change pointer for employee
Create change pointer for infotype / subtype combination
ADD 1 TO lv_cpident.
lw_change_pointers-cpident = lv_cpident.
lw_change_pointers-tabkey+12(4) = lw_zthr_infty_subty-infty.
lw_change_pointers-tabkey+16(4) = lw_zthr_infty_subty-subty.
lw_change_pointers-tabkey+20(8) = lc_begda.
APPEND lw_change_pointers TO change_pointers.
ENDIF. " IF sy-subrc EQ 0.
ELSE.
Create change pointer for Org Data
ADD 1 TO lv_cpident.
lw_change_pointers-cpident = lv_cpident.
lw_change_pointers-tabkey+12(4) = lw_zthr_infty_subty-infty.
lw_change_pointers-tabkey+16(4) = lw_zthr_infty_subty-subty.
lw_change_pointers-tabkey+20(8) = lc_begda.
APPEND lw_change_pointers TO change_pointers.
ENDIF. " IF lw_changed_objects-objtyp EQ lc_p.
ENDIF. " IF sy-sybrc NE 0.
ENDLOOP. " LOOP AT lt_zthr_infty_subty INTO..
ENDLOOP. " LOOP AT lt_groups INTO lw_groups.
ENDAT. " AT NEW objid.
ENDLOOP. " LOOP AT lt_changed_objects INTO lw_changed_objects.
ENDIF. " IF sy-subrc EQ 0.
ENDIF. " IF NOT lt_dist_infty_subty[] IS INITIAL.
ENDMETHOD.
But make sure you maintained remaining infotypes in distribution model. I have created table zthr_infty_subty twhere I am keeping track of all infotype and subtype for which I have to send a data.. You can hardcode values in u r program if you want / if you know the all infotype for which you have to send data.
if you still have any doubt / issues let me know your email id will mail you badi-code.
Cheers,
Nilesh
05-18-2006 10:11 AM
Hello Nilesh
Thanks, this is a good help for me.
Can I also set a filter in this BADI? I don't want to send out employees that have left the company. Field STAT2 in IT0000 = 0
Or is it possible to make souch a filter in BD64?
Morten
05-18-2006 11:03 AM
Yes Morten.
But you need to query table PA0000 with objid( nothing but PERNR) Delete record for infotype '0000' from internal table "change_pointer" if stat2<> 3 (inactive).
Cheers,
Nilesh