Share |

ABAP Program to retrieve and display sickpay(SSP, SMP etc) with SAP


Example of how to submit sickpay value program and retrieve results. The program below retrieves all SSP/SMP sickness pay and displays results as a simple report.



********************************************************
* Report:  ZCALL_SXPVALUE                              *
*                                                      *
* Sickness history report.                             *
* Calls second program 'ZP_GET_SXP_ABSENCE_DATA' to    *
* retrieve sickness absence data from clustor tables it*
* memory area.                                         *
*                                                      *
********************************************************
REPORT ZCALL_SXPVALUE
      LINE-SIZE 120 NO STANDARD PAGE HEADING.

TABLES: t554s, pernr.  " pcl1, pcl2.

infotypes: 0001,                       "Organisational assignment
           2001.                       "Absences

DATA:   ssp_weeks TYPE p DECIMALS 2 VALUE 0.

DATA: gd_begda(10) TYPE c,
      gd_endda(10) TYPE c.

DATA: ld_orgtxt LIKE t527x-orgtx.

DATA: name(30).

DATA: BEGIN OF itab OCCURS 0,
      pernr LIKE p0002-pernr,
      perid LIKE p0002-perid,
      name  LIKE name,
      END OF itab.
TYPES: BEGIN OF t_report,
   sxp(3)  TYPE c,
   name    TYPE name,          "30
   pernr   TYPE pernr-pernr,   "8
   awart   TYPE p2001-awart,   "4
   begda   TYPE p2001-begda,   "10
   endda   TYPE p2001-endda,   "10
   wkspaid TYPE p DECIMALS 2,  "10
   amtpaid TYPE p DECIMALS 2,  "10
  END OF t_report.
DATA: it_report TYPE STANDARD TABLE OF t_report INITIAL SIZE 0,
      wa_report TYPE t_report.

DATA: moabw LIKE t001p-moabw.

DATA: printheader TYPE i VALUE 1,
      gd_success  TYPE i.

* SMP/SSP absence data
DATA BEGIN OF it_msa OCCURS 0.
        INCLUDE STRUCTURE pc27j.
DATA END OF it_msa.
DATA BEGIN OF msa OCCURS 0.
        INCLUDE STRUCTURE pc27j.
DATA END OF msa.

*Temp data store for pernrs who have absences
TYPES: BEGIN OF t_pa2001,
  pernr TYPE pa2001-pernr,
 END OF t_pa2001.
DATA: it_pa2001 TYPE STANDARD TABLE OF t_pa2001 INITIAL SIZE 0,
      wa_pa2001 TYPE t_pa2001.

DATA: gd_memid(30)   TYPE c,
      gd_date        TYPE sy-datum,
      gd_zebra       TYPE i,
      gd_storamt     LIKE wa_report-amtpaid,
      gd_storwks     LIKE wa_report-wkspaid,
      gd_storbeg     LIKE wa_report-begda,
      gd_storend     LIKE wa_report-endda,
      gd_storawart   LIKE wa_report-awart,
      gd_count(6)    TYPE n,
      gd_outtext(70) TYPE c.


* Select screen declaration.
* ----------------------------
SELECTION-SCREEN BEGIN OF BLOCK atypes WITH FRAME TITLE text-t01.
SELECT-OPTIONS: so_ssp FOR p2001-awart,
                so_smp FOR p2001-awart,
                so_sap FOR p2001-awart,
                so_spp FOR p2001-awart.
SELECTION-SCREEN END OF BLOCK atypes.


************************************************************************
*INITIALIZATION.
INITIALIZATION.
  PERFORM initialize_awart_selection.


************************************************************************
*STAR-OF-SELECTION
START-OF-SELECTION.

* Only retrieves employees who have an absence
  IF pnppernr IS INITIAL.
    SELECT pernr
      INTO TABLE it_pa2001
      FROM pa2001
     WHERE ( ( begda GE pn-begda AND
               begda LE pn-endda ) OR
             ( endda GE pn-begda AND
               endda LE pn-endda ) OR
             ( begda LE pn-begda AND
               endda GT pn-endda ) ).

    LOOP AT it_pa2001 INTO wa_pa2001.
      pnppernr-low = wa_pa2001-pernr.
      pnppernr-sign = 'I'.
      pnppernr-option = 'EQ'.
      APPEND pnppernr.
    ENDLOOP.
  ENDIF.

GET pernr.
  ADD 1 TO gd_count.
  CONCATENATE 'Processing personnel data'(m10) gd_count INTO gd_outtext
            SEPARATED BY ' '.
  PERFORM progress_indicator USING gd_outtext.

  rp_provide_from_last p0001 space pn-begda pn-endda.
  PROVIDE * FROM p2001 BETWEEN pn-begda AND pn-endda.

    CHECK p2001-awart IN so_ssp OR
          p2001-awart IN so_smp OR
          p2001-awart IN so_sap OR
          p2001-awart IN so_spp.

    READ TABLE p2001 INDEX sy-tabix.
    wa_report-pernr = pernr-pernr.
    wa_report-name  = p0001-ename.
    wa_report-awart = p2001-awart.
    wa_report-begda = p2001-begda.
    wa_report-endda = p2001-endda.

*   Retrieve sickness absence data
    perform add_data_to_msa_table using p2001-begda p2001-endda.

    IF p2001-awart IN so_ssp.
      wa_report-sxp = 'SSP'.
      CALL FUNCTION 'HR_GB_FETCH_SSMP_DATA'
           EXPORTING
                persnr                = p2001-pernr
                begda                 = p2001-begda
                endda                 = p2001-endda
                get_ssmp_weeks        = 'x'
           IMPORTING
                ssmp_weeks            = ssp_weeks
           EXCEPTIONS
                failed_imp_cluster_pc = 1
                failed_imp_rgdir      = 2
                failed_read_qdnum     = 3
                division_by_zero      = 4
                OTHERS                = 5.
      wa_report-wkspaid = ssp_weeks.

      gd_date = p2001-begda.
      WHILE gd_date LE p2001-endda.
        LOOP AT it_msa WHERE begda LE gd_date AND endda GE gd_date.
          IF it_msa-wtype = '/SSP'.
            wa_report-amtpaid =  wa_report-amtpaid + it_msa-amoun.
          ENDIF.
          gd_date = gd_date + 1.
          EXIT.
        ENDLOOP.
        IF sy-subrc NE 0.
            gd_date = gd_date + 1.
        ENDIF.
      ENDWHILE.
    ELSEIF p2001-awart IN so_smp.
      wa_report-sxp = 'SMP'.
      gd_date = p2001-begda.
      WHILE gd_date LE p2001-endda.
        LOOP AT it_msa WHERE begda LE gd_date AND endda GE gd_date.
          IF it_msa-wtype = '/MMU' OR it_msa-wtype = '/MML'.
            wa_report-amtpaid  =  wa_report-amtpaid + it_msa-amoun.
*           SMP is paid weekly so each occurance of payment is 1 week
            wa_report-wkspaid =  wa_report-wkspaid + 1.
          ENDIF.
          gd_date = gd_date + 1.
          EXIT.
        ENDLOOP.
        IF sy-subrc NE 0.
            gd_date = gd_date + 1.
        ENDIF.
      ENDWHILE.
    ELSEIF p2001-awart IN so_sap.
      wa_report-sxp = 'SAP'.
      gd_date = p2001-begda.
      WHILE gd_date LE p2001-endda.
        LOOP AT it_msa WHERE begda LE gd_date AND endda GE gd_date.
          IF it_msa-wtype = '/GGP'.
            wa_report-amtpaid  =  wa_report-amtpaid + it_msa-amoun.
*           SAP is paid weekly so each occurance of payment is 1 week
            wa_report-wkspaid =  wa_report-wkspaid + 1.
          ENDIF.
          gd_date = gd_date + 1.
          EXIT.
        ENDLOOP.
        IF sy-subrc NE 0.
            gd_date = gd_date + 1.
        ENDIF.
      ENDWHILE.
    ELSEIF p2001-awart IN so_spp.  "in so_spp
      wa_report-sxp = 'SPP'.
      gd_date = p2001-begda.
      WHILE gd_date LE p2001-endda.
        LOOP AT it_msa WHERE begda LE gd_date AND endda GE gd_date.
          IF it_msa-wtype = '/PPP'.
            wa_report-amtpaid  =  wa_report-amtpaid + it_msa-amoun.
*           SPP is paid weekly so each occurance of payment is 1 week
            wa_report-wkspaid =  wa_report-wkspaid + 1.
          ENDIF.
          gd_date = gd_date + 1.
          EXIT.
        ENDLOOP.
        IF sy-subrc NE 0.
            gd_date = gd_date + 1.
        ENDIF.
      ENDWHILE.
    ENDIF.
    IF wa_report-wkspaid GT 0.
      APPEND wa_report TO it_report.
    ENDIF.
    CLEAR: wa_report.
  ENDPROVIDE.


************************************************************************
*END-OF-SELECTION.
END-OF-SELECTION.
  gd_zebra = 1.

  SORT it_report BY pernr.
  LOOP AT it_report INTO wa_report.
    AT NEW pernr.
      IF sy-tabix NE 1.
        WRITE:/ sy-vline,
            (08) ' ',   sy-vline,
            (30) ' ',   sy-vline,
            (07) ' ',   sy-vline,
            (10) ' ',   sy-vline,
            (10) ' ',   sy-vline,
            (10) ' ',   sy-vline,
            (10) ' ',   sy-vline.
      ENDIF.

      IF gd_zebra EQ 1.
        FORMAT COLOR COL_NORMAL INTENSIFIED OFF.
        gd_zebra = 2.
      ELSE.
        FORMAT COLOR COL_NORMAL INTENSIFIED ON.
        gd_zebra = 1.
      ENDIF.
    ENDAT.

    WRITE:/ sy-vline,
        (08) wa_report-pernr,     sy-vline,
        (30) wa_report-name,      sy-vline,
        (07) wa_report-awart,     sy-vline,
        (10) wa_report-begda,     sy-vline,
        (10) wa_report-endda,     sy-vline,
        (10) wa_report-wkspaid,   sy-vline,
        (10) wa_report-amtpaid,   sy-vline.
  ENDLOOP.
  WRITE: sy-uline(107).


************************************************************************
*TOP-OF-PAGE.
TOP-OF-PAGE.
  WRITE:/2 text-001.
  SKIP.
  CONCATENATE pn-begda+6(2) pn-begda+4(2) pn-begda(4)
            INTO gd_begda SEPARATED BY '.'.
  CONCATENATE pn-endda+6(2) pn-endda+4(2) pn-endda(4)
            INTO gd_endda SEPARATED BY '.'.

  WRITE: /02 'Date Selection:  ',
             gd_begda,
             'to',
             gd_endda.

  FORMAT COLOR COL_HEADING INTENSIFIED ON.
  WRITE: sy-uline(107).
  WRITE:/ sy-vline,
        (08) 'Employee', sy-vline,
        (30) 'Name',     sy-vline,
        (07) 'Absence',  sy-vline,
        (10) 'Start',    sy-vline,
        (10) 'End',      sy-vline,
        (10) 'Weeks',    sy-vline,
        (10) 'Amount',   sy-vline.

  WRITE:/ sy-vline,
        (08) 'Number',   sy-vline,
        (30) '    ',     sy-vline,
        (07) 'Type',     sy-vline,
        (10) 'Date',     sy-vline,
        (10) 'Date',     sy-vline,
        (10) 'Paid',     sy-vline,
        (10) 'Paid',     sy-vline.
  WRITE: sy-uline(107).
  FORMAT COLOR COL_NORMAL.


************************************************************************
*END-OF-PAGE.
END-OF-PAGE.


*&---------------------------------------------------------------------*
*&      Form  INITIALIZE_AWART_SELECTION
*&---------------------------------------------------------------------*
FORM initialize_awart_selection.
  so_ssp-sign   = 'I'.
  so_ssp-option = 'EQ'.
  MOVE-CORRESPONDING so_ssp TO so_smp.
  MOVE-CORRESPONDING so_ssp TO so_sap.
  MOVE-CORRESPONDING so_ssp TO so_spp.

* Build SSP absence types table
  so_ssp-low    = '0205'.
  APPEND so_ssp.
  so_ssp-low    = '0206'.
  APPEND so_ssp.
  so_ssp-low    = '0207'.
  APPEND so_ssp.
  so_ssp-low    = '0208'.
  APPEND so_ssp.
  so_ssp-low    = '0210'.
  APPEND so_ssp.
  so_ssp-low    = '0211'.
  APPEND so_ssp.
  so_ssp-low    = '0212'.
  APPEND so_ssp.
  so_ssp-low    = '0220'.
  APPEND so_ssp.
  so_ssp-low    = '0300'.
  APPEND so_ssp.
  so_ssp-low    = '0305'.
  APPEND so_ssp.
  so_ssp-low    = '0320'.
  APPEND so_ssp.

* Build SMP absence types table
  so_smp-low    = '0310'.
  APPEND so_smp.
  so_smp-low    = '0600'.
  APPEND so_smp.
  so_smp-low    = '0601'.
  APPEND so_smp.
  so_smp-low    = '0602'.
  APPEND so_smp.

* Build SAP absence type table
  so_sap-low    = '0325'.
  APPEND so_sap.

* Build SPP absence type table
  so_spp-low    = '0330'.
  APPEND so_spp.
ENDFORM.                    " INITIALIZE_AWART_SELECTION


*&---------------------------------------------------------------------*
*&      Form  PROGRESS_INDICATOR
*&---------------------------------------------------------------------*
*       Displays progress indicator on SAP screen
*----------------------------------------------------------------------*
FORM progress_indicator USING p_text.
  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
      EXPORTING
*         PERCENTAGE = 0
           text       = p_text.
ENDFORM.                    " PROGRESS_INDICATOR


*&---------------------------------------------------------------------*
*&      Form  ADD_DATA_TO_MSA_TABLE
*&---------------------------------------------------------------------*
*       Add additional data to MSA table
*----------------------------------------------------------------------*
FORM add_data_to_msa_table USING p_datefrm p_dateto.
  DATA: seltab    TYPE TABLE OF rsparams,
        seltab_wa LIKE LINE OF seltab.

  refresh it_msa. clear: it_msa.
  REFRESH seltab.
  CLEAR:  seltab_wa.
  seltab_wa-selname = 'PNPBEGDA'.
  seltab_wa-sign    = 'I'.
  seltab_wa-option  = 'EQ'.
  seltab_wa-low = p_datefrm.
  APPEND seltab_wa TO seltab.
  seltab_wa-selname = 'PNPENDDA'.
  seltab_wa-sign    = 'I'.
  seltab_wa-option  = 'EQ'.
  seltab_wa-low = p_dateto.
  APPEND seltab_wa TO seltab.

  seltab_wa-selname = 'PNPPERNR'.
  seltab_wa-low = pernr-pernr.
  APPEND seltab_wa TO seltab.

  CONCATENATE 'ZP151REP' sy-uname sy-uzeit INTO gd_memid.
* Executes program which retrieves sickness absence data
* from clustor tables
  SUBMIT ZSXP_ABSENCE_DATA  WITH SELECTION-TABLE seltab
                   EXPORTING LIST TO MEMORY
                   AND RETURN
                   WITH p_memid = gd_memid.

  IMPORT msa FROM MEMORY ID gd_memid.
  FREE MEMORY ID gd_memid.

  APPEND LINES OF msa TO it_msa.
ENDFORM.                    " ADD_DATA_TO_MSA_TABLE





*Text elements
*----------------------------------------------------------
*  001     SxP Absence History
*  T01     Sickness Absence types


*Selection texts
*----------------------------------------------------------
* SO_SAP          SAP Att./absence types
* SO_SMP          SMP Att./absence types
* SO_SPP          SPP Att./absence types
* SO_SSP          SSP Att./absence types