Thursday, December 22, 2011

Delimiting Infotype PA0016

Will be updated soon

Play Music/Video from ABAP

Will be updated soon ..
Any Suggestions would be highly appreciated.

Send SMS thru ABAP program

Will be updated soon

Get ZL entries using FM 'HR_TIME_RESULTS_GET'

*&---------------------------------------------------------------------*

*& Report ZTEST_ZL_ENTRIES

*&---------------------------------------------------------------------*

REPORT ZTEST_ZL_ENTRIES MESSAGE-ID zz.

TABLES : pa0001 , t549a , t549q .*--Types declaration

TYPES: BEGIN OF t_t569v,
abkrs TYPE t569v-abkrs, "Payroll Area

pabrj TYPE t569v-pabrj, "Accounting year

pabrp TYPE t569v-pabrp, "Accounting period

END OF t_t569v.*--For PA0001

TYPES: BEGIN OF ty_0001,

pernr TYPE pa0001-pernr,

begda TYPE pa0001-begda,

werks TYPE pa0001-werks,

END OF ty_0001.*--Final internal table

TYPES: BEGIN OF ty_final,

PERNR TYPE PA0000-PERNR,

reg_hour(8) TYPE c,

ot_hour(8) TYPE c,

END OF ty_final.


*--Internal table and work area declarations

DATA : it_0001 TYPE STANDARD TABLE OF ty_0001,

wa_0001 TYPE ty_0001,

it_final TYPE STANDARD TABLE OF ty_final,

wa_final TYPE ty_final,

it_zl type standard table of pc2bf,

wa_zl type pc2bf,

wa_t569v TYPE t_t569v.
*--Global variables declarationDATA : gv_lines TYPE i,

gv_pabrj TYPE t569v-pabrj, "Accounting year

gv_pabrp TYPE t569v-pabrp, "Accounting period

gv_iperm TYPE pc261-iperm. "Period parameters
*--Constants declaration

CONSTANTS: gc_vwsaz TYPE t569v-vwsaz VALUE 01.
*--Payroll period selections

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.

SELECTION-SCREEN BEGIN OF LINE.

SELECTION-SCREEN COMMENT 01(20) text-002.

SELECT-OPTIONS: s_abkrs FOR pa0001-abkrs NO INTERVALS

NO-EXTENSION OBLIGATORY.

SELECTION-SCREEN POSITION 32.

SELECTION-SCREEN COMMENT 34(05) text-007 MODIF ID dtg.

SELECTION-SCREEN POSITION 40.

PARAMETERS: p_begda TYPE sy-datum MODIF ID dtg.

SELECTION-SCREEN COMMENT 52(03) text-006 MODIF ID dtg.

SELECTION-SCREEN POSITION 57.

PARAMETERS: p_endda TYPE sy-datum MODIF ID dtg.

SELECTION-SCREEN END OF LINE.
*-- Current period

SELECTION-SCREEN BEGIN OF LINE .

PARAMETERS: rb_timr9 TYPE qppnp-timr9 RADIOBUTTON GROUP grp1.

SELECTION-SCREEN COMMENT 04(20) text-003 FOR FIELD rb_timr9.

SELECTION-SCREEN POSITION 25.

PARAMETERS: p_dispp TYPE qppnp-pabrp MODIF ID cpi,

p_dispj TYPE qppnp-pabrj MODIF ID cpi.

SELECTION-SCREEN END OF LINE.


*-- Other period


SELECTION-SCREEN BEGIN OF LINE.

PARAMETERS: rb_timra TYPE qppnp-timra RADIOBUTTON GROUP grp1.

SELECTION-SCREEN COMMENT 04(20) text-004 FOR FIELD rb_timra.

SELECTION-SCREEN POSITION 25.

PARAMETERS: p_pabrp TYPE qppnp-pabrp,

p_pabrj TYPE qppnp-pabrj.

SELECTION-SCREEN END OF LINE.

SELECTION-SCREEN END OF BLOCK b1.
*--Personnel area , number , file

SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE text-005.

PARAMETERS: p_werks TYPE pa0001-werks.

SELECT-OPTIONS : s_pernr FOR pa0001-pernr.

SELECTION-SCREEN END OF BLOCK b2.*-----------------------------------------------------------------------

* A T S E L E C T I O N S C R E E N O U T P U T

*-----------------------------------------------------------------------

AT SELECTION-SCREEN OUTPUT.
*-- Display valid period parameters

PERFORM display_periods.*-----------------------------------------------------------------------

* A T S E L E C T I O N S C R E E N

*-----------------------------------------------------------------------

AT SELECTION-SCREEN.
*-- Validate control recordPERFORM validate_abkrs.
*-- Validate periods

PERFORM validate_periods.
*-- Get dates from periods

PERFORM get_dates.
*-----------------------------------------------------------------------

* START OF SELECTION

*-----------------------------------------------------------------------

START-OF-SELECTION.
*-- Get initial data for the selection screen parameters

PERFORM get_data.
*--Populate final data

PERFORM fill_final.


*-----------------------------------------------------------------------

* END OF SELECTION

*-----------------------------------------------------------------------


END-OF-SELECTION.


*--Write log as to how many records are downloaded


PERFORM write_log.



*&---------------------------------------------------------------------*

*& Form display_periods

*&---------------------------------------------------------------------*

* Display valid period parameters

*----------------------------------------------------------------------*

FORM display_periods.

LOOP AT SCREEN.

CASE screen-group1.

WHEN 'CPI'.

*-- If current period, display current period information

IF rb_timr9 = 'X'.

screen-input = '0'.

screen-output ='1'.

screen-invisible = '0'.

ELSE.

screen-input = '0'.

screen-output ='0'.

screen-invisible = '1'.

ENDIF.

MODIFY SCREEN.


*-- If other period is selected, display other period info

WHEN 'DTG'.

IF p_begda IS INITIAL.

screen-input = '0'.

screen-output ='0'.

screen-invisible = '1'.

ELSE.

screen-input = '0'.

screen-output ='1'.

screen-invisible = '0'.

ENDIF.

MODIFY SCREEN.

ENDCASE.

ENDLOOP.

ENDFORM. " display_periods

*&---------------------------------------------------------------------*

*& Form validate_periods

*&---------------------------------------------------------------------*

* Validate periods

*----------------------------------------------------------------------*

FORM validate_periods.

*-- If current period is selected retrieve information from control

* record

IF rb_timr9 = 'X'.

IF NOT p_pabrp IS INITIAL OR

NOT p_pabrj IS INITIAL .

MESSAGE e000 WITH

'Other period value not allowed with Current Period'.

ENDIF.

gv_pabrp = wa_t569v-pabrp.

p_dispp = gv_pabrp.

gv_pabrj = wa_t569v-pabrj.

p_dispj = gv_pabrj.

ELSE.

*-- If other period is selected, validate required parameters

CLEAR: p_dispp,

p_dispj.

IF p_pabrp EQ 0 .

SET CURSOR FIELD 'P_PABRP' .

MESSAGE e000 WITH 'Invalid Accounting Month'.

ELSEIF p_pabrj EQ 0 .

SET CURSOR FIELD 'P_PABRJ'.

MESSAGE e000 WITH 'Invalid Accounting Year'.

ELSE.

gv_pabrp = p_pabrp.

gv_pabrj = p_pabrj.

ENDIF.

ENDIF.

ENDFORM. " validate_periods

*&---------------------------------------------------------------------*

*& Form validate_abkrs

*&---------------------------------------------------------------------*

* Validate control record

*----------------------------------------------------------------------*


FORM validate_abkrs.


DATA : gv_subrc type sy-subrc.

*-- Check the control record

LOOP AT s_abkrs.

SELECT SINGLE abkrs

pabrj

pabrp

FROM t569v

INTO wa_t569v

WHERE abkrs = s_abkrs-low AND

vwsaz = gc_vwsaz.

gv_subrc = sy-subrc.

ENDLOOP.

IF gv_subrc <> 0.

MESSAGE e000 WITH 'Control Record Not Found'.

ENDIF.

ENDFORM. " validate_abkrs

*&---------------------------------------------------------------------*

*& Form get_dates

*&---------------------------------------------------------------------*

* Get dates from periods

*----------------------------------------------------------------------*

FORM get_dates.


*-- Find the period modifier


LOOP AT s_abkrs.

SELECT SINGLE * FROM t549a WHERE abkrs = s_abkrs-low.

IF sy-subrc <> 0.

MESSAGE e000 WITH 'Period modifier does not exist!'.

ENDIF.

ENDLOOP.

*-- Save off period modifier

gv_iperm = t549a-permo.

*-- Determine the dates for the requested period

SELECT SINGLE * FROM t549q WHERE permo = gv_iperm AND

pabrj = gv_pabrj AND

pabrp = gv_pabrp.

IF sy-subrc <> 0.

MESSAGE e505(pg) WITH gv_pabrj gv_pabrp t549a-permo.

ELSE.

MOVE t549q-begda TO p_begda.

MOVE t549q-endda TO p_endda.

ENDIF.

ENDFORM. " get_dates*&---------------------------------------------------------------------*
*& Form get_data

*&---------------------------------------------------------------------*

* Get data from PA0001

*----------------------------------------------------------------------*

FORM get_data .
*--Get data from PA0001

SELECT pernr begda werks

INTO TABLE it_0001

FROM pa0001

WHERE pernr IN s_pernr

AND endda GE p_begda

AND begda LE p_endda

AND werks EQ p_werks

AND abkrs IN s_abkrs.

IF sy-subrc = 0.

SORT it_0001 BY pernr begda DESCENDING.

DELETE ADJACENT DUPLICATES FROM it_0001 COMPARING pernr.

ENDIF.

ENDFORM. " get_data*&---------------------------------------------------------------------*

*& Form fill_final

*&---------------------------------------------------------------------*

* Fill final internal table

*----------------------------------------------------------------------*

FORM fill_final .


CLEAR : it_final[] , wa_final.*--Loop thru PA0001 entries

LOOP AT it_0001 INTO wa_0001.

wa_final-pernr = wa_0001-pernr.
*--Get time results for the pernr and given payroll period and year

CALL FUNCTION 'HR_TIME_RESULTS_GET'

EXPORTING

get_pernr = wa_0001-pernr

get_pabrj = gv_pabrj

get_pabrp = gv_pabrp

get_cltyp = '1'

TABLES

get_zl = it_zl

EXCEPTIONS

no_period_specified = 1

wrong_cluster_version = 2

no_read_authority = 3

cluster_archived = 4

technical_error = 5.
*--Fill Hours for the wage types from ZL structure

LOOP AT it_zl INTO wa_zl.
*--Fill temp dept

CASE wa_zl-lgart.
*--For Regular hours

WHEN '3REG'. " Regular hours

wa_final-reg_hour = wa_final-reg_hour + wa_zl-anzhl.
*--For Overtime hours

WHEN '3OVT'. " Overtime hours

wa_final-ot_hour = wa_final-ot_hour + wa_zl-anzhl.

ENDCASE.

CLEAR : wa_zl.

ENDLOOP.
*--Append final table with the number of hours for the wage types

APPEND wa_final TO it_final.

endloop.

ENDFORM. " fill_final*&---------------------------------------------------------------------*

*& Form write_log

*&---------------------------------------------------------------------*

* Write log

*----------------------------------------------------------------------*

FORM write_log .


IF NOT it_final[] IS INITIAL.

LOOP AT IT_FINAL INTO WA_FINAL.

WRITE :/1 wa_final-pernr,

15 wa_final-reg_hour ,

30 wa_final-OT_hour.

ENDLOOP.

else.

MESSAGE i000(zz) WITH 'No data found for the selection criteria'.

ENDIF.

ENDFORM. " write_log

HR_INFOTYPE_OPERATION in Dynamic action

Will be updated soon

Get work week begin and end dates for a given date

Report zget_wweek_dates.

*Get work week begin and end dates for a given date

tables : pernr , t559a.
infotypes : 0007.

DATA: posid(2).
DATA: pack TYPE p.
DATA: p_wweek LIKE p0007-wweek.
DATA: edatum TYPE d.
DATA: ldatum TYPE d.

PARAMETERS : p_date TYPE sy-datum.

start-of-selection.
rp-lowdate-highdate.
rp-def-time-period.
rp-def-boolean.

GET pernr.

*-----getting current workweek
CLEAR p_wweek.
LOOP AT p0007 WHERE begda <= p_date AND endda >= p_date.
p_wweek = p0007-wweek.
EXIT.
ENDLOOP.

IF p_wweek IS NOT INITIAL.
SELECT SINGLE * FROM t559a WHERE wweek EQ p_wweek.

IF t559a-wleng IS INITIAL.
posid = '00'.
ELSE.
pack = ( p_date - t559a-wdate ) MOD t559a-wleng + 1.
UNPACK pack TO posid.
ENDIF.
ELSE.
posid = '00'.
ENDIF.

IF posid = '00'.
ldatum = edatum = high-date.
ELSE.
ldatum = p_date - posid + 1. " Begin date
edatum = p_date - posid + t559a-wleng. " End date
ENDIF.

end-of-selection.

Wednesday, October 12, 2011

Translate first character to Upper case

FUNCTION ZSTRING_TO_INITIALCAPS.
*"----------------------------------------------------------------------
*"*"Local interface:
*" IMPORTING
*" VALUE(INSTRING) TYPE C
*" EXPORTING
*" VALUE(OUTSTRING) TYPE C
*"----------------------------------------------------------------------

constants: c_delimiter(21) value ' .()-{}[]/#1234567890'.

data: v_instring(80) type c,
v_len type i,
v_char type c,
i type i,
j type i.

v_instring = instring.
check not v_instring is initial.

translate v_instring to lower case.
condense v_instring.
* Translate first character to upper case
v_char = v_instring+0(1).
translate v_char to upper case.
v_instring+0(1) = v_char.

v_len = strlen( v_instring ).
v_len = v_len - 1. " Translate next char
i = 1. " Start from 2nd char

while i < v_len.

if v_instring+i(1) CA c_delimiter.
j = i + 1. " Translate next char
v_char = v_instring+j(1).
translate v_char to upper case.
v_instring+j(1) = v_char.
endif.

i = i + 1.

endwhile.

outstring = v_instring.

ENDFUNCTION.

Monday, March 21, 2011

Send Greetings mail on Birthday

REPORT zbirthday MESSAGE-ID zhr.

DATA : BEGIN OF it_pa0002 OCCURS 0,
pernr LIKE pa0002-pernr,
nachn LIKE pa0002-nachn,
vorna LIKE pa0002-vorna,
gbdat like pa0002-gbdat,
END OF it_pa0002.

DATA : BEGIN OF it_pa0000 OCCURS 0,
pernr LIKE pa0000-pernr,
END OF it_pa0000.

START-OF-SELECTION.

SELECT pernr nachn vorna gbdat
FROM pa0002
INTO TABLE it_pa0002
WHERE endda >= sy-datum
AND begda <= sy-datum .

IF sy-subrc = 0.
SORT it_pa0002 BY pernr.
DELETE ADJACENT DUPLICATES FROM it_pa0002 COMPARING pernr.
ELSE.
MESSAGE i000 WITH 'No records exist'.
STOP.
ENDIF.

SELECT pernr FROM pa0000
INTO TABLE it_pa0000
FOR ALL ENTRIES IN it_pa0002
WHERE pernr = it_pa0002-pernr
AND endda >= sy-datum
AND begda <= sy-datum
AND stat2 = '3'.

IF sy-subrc = 0.
SORT it_pa0000 BY pernr.
DELETE ADJACENT DUPLICATES FROM it_pa0000 COMPARING pernr.
ELSE.
MESSAGE i000 WITH 'No records exist'.
STOP.
ENDIF.

*--Send Mail
LOOP AT it_pa0000.

PERFORM send_mail.

ENDLOOP.

END-OF-SELECTION.

*&---------------------------------------------------------------------*
*& Form SEND_MAIL
*&---------------------------------------------------------------------*
* Send Mail
*----------------------------------------------------------------------*
FORM send_mail.

DATA : lit_objpack LIKE sopcklsti1 OCCURS 0 WITH HEADER LINE,
lit_objtxt LIKE solisti1 OCCURS 0 WITH HEADER LINE,
lit_objbin LIKE solisti1 OCCURS 0 WITH HEADER LINE,
lit_reclist LIKE somlreci1 OCCURS 0 WITH HEADER LINE.

DATA : dl_objhead TYPE soli_tab,
dl_doc_chng TYPE sodocchgi1,
dl_lines_bin TYPE i,
dl_lines_txt TYPE i.

clear : it_pa0002.

READ TABLE it_pa0002 WITH KEY pernr = it_pa0000-pernr.
IF it_pa0002-gbdat+4(4) = sy-datum+4(4).

*--Body of the Mail
CONCATENATE 'Dear' it_pa0002-vorna it_pa0002-nachn ',' INTO lit_objtxt
SEPARATED BY space.
APPEND lit_objtxt.

lit_objtxt = ''.
APPEND lit_objtxt.

CONCATENATE 'Wish you a Very Happy Birthday!' '' INTO
lit_objtxt SEPARATED BY space.
APPEND lit_objtxt.

lit_objtxt = ''.
APPEND lit_objtxt.

lit_objtxt = 'Regards,'.
APPEND lit_objtxt.

lit_objtxt = 'HR Team.'.
APPEND lit_objtxt.

DESCRIBE TABLE lit_objtxt LINES dl_lines_txt.

***---Document information.
CONCATENATE 'Birthday' '' INTO dl_doc_chng-obj_name
SEPARATED BY space.

CONCATENATE 'Birthday' ' Greetings' INTO dl_doc_chng-obj_descr
SEPARATED BY space.

dl_doc_chng-sensitivty = 'F'. "Functional object
dl_doc_chng-obj_langu = sy-langu.

lit_objpack-transf_bin = space.
lit_objpack-head_start = 1.
lit_objpack-head_num = 0.
lit_objpack-body_start = 1.
lit_objpack-body_num = dl_lines_txt.
lit_objpack-doc_type = 'RAW'.
APPEND lit_objpack.

*-- E-mail receivers
SELECT SINGLE
usrid_long
FROM pa0105
INTO lit_reclist-receiver
WHERE pernr = it_pa0000-pernr
AND subty = '0010'.
IF sy-subrc = 0.
lit_reclist-rec_type = 'U'.
APPEND lit_reclist.
ENDIF.

*-- Fill in HR or Managers Email ID
* lit_reclist-receiver = ''.
* lit_reclist-copy = 'X'.
* lit_reclist-rec_type = 'U'.
* APPEND lit_reclist.

*--Sending mail.
IF lit_reclist[] IS NOT INITIAL.
CALL FUNCTION 'SO_DOCUMENT_SEND_API1'
EXPORTING
document_data = dl_doc_chng
put_in_outbox = 'X'
commit_work = 'X'
TABLES
packing_list = lit_objpack
contents_txt = lit_objtxt
receivers = lit_reclist
EXCEPTIONS
too_many_receivers = 1
document_not_sent = 2
document_type_not_exist = 3
operation_no_authorization = 4
parameter_error = 5
x_error = 6
enqueue_error = 7
OTHERS = 8.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDIF.

ENDIF.

ENDFORM. " SEND_MAIL

Annual Perk Calculation

Write your coding in user Exit : HRINHRA0 , FM - EXIT_HINCALC0_005 in the
Include ZXPPYINU04.

When Company leased accomodation is given the Annual Perk Calculation was
not calculated according to the clients requirement.
Also the negative diff rent was not shown in deductions.

*&---------------------------------------------------------------------*
*& Include ZXPPYINU04
*&---------------------------------------------------------------------*

DATA : v_amount LIKE pa0581-rtamt,
v_basis TYPE maxbt,
v_diff TYPE maxbt,
v_elig_amount LIKE pa0581-rtamt.

IF NOT _hra[] IS INITIAL.

READ TABLE _hra INDEX 1.

IF sy-subrc = 0 AND _hra-accom = '5'.

v_amount = _hra-rtamt.
_wgtyp_tab-abart = '*'.
_wgtyp_tab-lgart = '/3RI'. " Rent wage type
_wgtyp_tab-betrg = v_amount. " Rent amount

APPEND _wgtyp_tab.
CLEAR _wgtyp_tab.

*--Get basis amount
LOOP AT _it WHERE lgart = '/115'.
v_basis = v_basis + _it-betrg.
ENDLOOP.

*--Get eligible amount
LOOP AT _it WHERE lgart = '1011'.
v_elig_amount = v_elig_amount + _it-betrg.
ENDLOOP.

*--Get difference amount
* _delgrt_mon = v_elig_amount - v_amount.

*--Get Yearly basis amount
v_basis = v_basis * 12.

*--Get Yearly rent amount
v_amount = v_amount * 12.

v_diff = ( v_basis - v_amount ) * 15 / 100 .

*--Calculate Yearly eligible amount
v_elig_amount = v_elig_amount * 12 .

IF v_diff > v_elig_amount.
_tcprk = v_elig_amount.
ELSE.
_tcprk = v_diff.
ENDIF.

ENDIF.

ENDIF.

Calculate EMI (Equated Monthly Instalments) in Infotype 0045

Write your coding in user Exit : PBAS0001 , FM - EXIT_SAPFP50M_002 in the
Include ZXPADU02.

From Indian payroll view , there was a difference in calculation of EMI
amounts , the amount calculated in system differs from the ones calculated
in EXCEL sheet.
The below coding solves the problem.(Same as EXCEL calculation)

EMI Calculation Courtesy Link


*&---------------------------------------------------------------------*
*& Include ZXPADU02
*&---------------------------------------------------------------------*

DATA : i0045 LIKE p0045.
DATA : v_durn TYPE pea_scrmm.
DATA : p_durn(6) TYPE n,
p_intr TYPE p DECIMALS 5,
p_loan TYPE p DECIMALS 2,
v_emi TYPE p DECIMALS 2,
v_dltyp TYPE dltyp.

CHECK sy-tcode = 'PA30'.

CLEAR : p_durn , v_durn , v_emi , p_loan , p_intr , i0045 , v_dltyp.

CASE: innnn-infty.

WHEN '0045'.

SELECT SINGLE dltyp
FROM t506a
INTO v_dltyp
WHERE dlart EQ innnn-subty.

IF innnn-endda = '99991231'.
MESSAGE e208(00) WITH 'Determine end date'.
EXIT.
ENDIF.

CALL METHOD cl_hr_pnnnn_type_cast=>prelp_to_pnnnn
EXPORTING
prelp = innnn
IMPORTING
pnnnn = i0045.

CALL FUNCTION 'HR_HK_DIFF_BT_2_DATES'
EXPORTING
date1 = i0045-endda
date2 = i0045-tilbg
output_format = '04'
IMPORTING
* YEARS =
months = v_durn
* DAYS =
EXCEPTIONS
invalid_dates_specified = 1
OTHERS = 2
.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

p_durn = v_durn.

*--Interest rate
p_intr = i0045-indin / 1200 .
p_loan = i0045-darbt.

v_emi = ( ( ( 1 + p_intr ) ** p_durn ) - 1 ).

IF v_emi IS NOT INITIAL.
*--Calculate EMI

IF v_dltyp = 'A'.
i0045-anrte = ( p_loan * p_intr ) *
( ( ( 1 + p_intr ) ** p_durn ) /
( ( ( 1 + p_intr ) ** p_durn ) - 1 ) ).
ELSEIF v_dltyp = 'I'.
i0045-tilbt = ( p_loan * p_intr ) *
( ( ( 1 + p_intr ) ** p_durn ) /
( ( ( 1 + p_intr ) ** p_durn ) - 1 ) ).
ENDIF.

ENDIF.

CALL METHOD cl_hr_pnnnn_type_cast=>pnnnn_to_prelp
EXPORTING
pnnnn = i0045
IMPORTING
prelp = innnn.

ENDCASE.

Thursday, February 10, 2011