Application Development 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: 

Use change pointers to send complete employee in HRMD_A

Former Member
0 Kudos

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

3 REPLIES 3

Former Member
0 Kudos

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

0 Kudos

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

0 Kudos

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