Application Development and Automation 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: 
Read only

Calculation in Loop at ITAB

Former Member
0 Likes
2,173

hello all,

i have multiple values in ITAB for multiple PERNR, now i have to do calculation of amount on date basis.

but i m confuse that how wud i do.

ITAB :

PERNR LGA01 BET01 BEGDA BETRG ENT_AMT

8430 4004 5004 16.07.2007

8254 4004 5004 19.07.2006

8254 4004 10000 01.04.2008

7145 4004 5004 01.02.2006

7145 4004 10000 01.04.2007

7145 4004 20000 01.04.2008

......

.......

Now i have to calculate ENT_AMT with respect to PERNR and respective date. i have to take difference

first BEGDA to second BEGDA in months and have to multiply it with BET01. and at end of every PERNR, BEGDA must be subtracted by SY_DATUM but when i m doing for first PERNR then its going wrong for second PERNR. i m getting confused. please help me.

regards saurabh.

1 ACCEPTED SOLUTION
Read only

Former Member
0 Likes
1,618

Hi Saurabh,

Check the below code which will work for your requirement.

SORT it_tab BY pernr begda .

LOOP AT it_tab INTO wa_tab.
  w_ind = sy-tabix. "Current entry
  w_ind1 = sy-tabix + 1. "Next entry

  READ TABLE it_tab INTO wa_tab1 INDEX w_ind1. "Read the next value
  IF sy-subrc EQ 0 AND wa_tab-pernr EQ wa_tab1-pernr. "If an entry there and pernr are same
                                                                        "Calculate the difference date diff b/w 2 dates
    CALL FUNCTION 'HR_99S_MONTHS_BETWEEN_DATES'
         EXPORTING
              p_begda  = wa_tab-begda
              p_endda  = wa_tab1-begda
         IMPORTING
              p_months = w_diff.
  ELSE."If there is no entry or pernr are not same calculate the difference date diff b/w date and sy-datum
                                                                                CALL FUNCTION 'HR_99S_MONTHS_BETWEEN_DATES'
         EXPORTING
              p_begda  = wa_tab-begda
              p_endda  = sy-datum
         IMPORTING
              p_months = w_diff.


  ENDIF.

  wa_tab-ent_amt = wa_tab-bet01 * w_diff. "Multyplly with the difference

  MODIFY it_tab FROM wa_tab INDEX w_ind TRANSPORTING ent_amt. "Modify the current entry
  CLEAR: wa_tab1, w_diff.
ENDLOOP.

I/P:

7145 4004          5.004,00  01.02.2006 
7145 4004         10.000,00  01.04.2007
7145 4004         20.000,00  01.04.2008
8254 4004          5.000,00  19.07.2006
8254 4004         10.000,00  01.04.2008 
8430 4004          5.004,00  16.07.2007

O/P:

7145 4004          5.004,00  01.02.2006         70.056,00
7145 4004         10.000,00  01.04.2007        120.000,00
7145 4004         20.000,00  01.04.2008        200.000,00
8254 4004          5.000,00  19.07.2006        100.000,00
8254 4004         10.000,00  01.04.2008        100.000,00
8430 4004          5.004,00  16.07.2007         90.072,00

Hope this helps you.

Regards,

Manoj Kumar P

11 REPLIES 11
Read only

Former Member
0 Likes
1,618

Hi,

If u want to sum based on PERNR and DATE, then declare another internal table with fields PERNR DATE and ENT_AMT, now move the corresponding fields of ITAB data to this table, and LOOP this table and sum.

Eg:

DATA : begin of itab1 occurs 0.

pernr

date

ent_amt

end of

LOOP at itab.

move-corresponding itab to itab1.

endloop.

SORT itab1 by pernr date.

loop at itab1.

XXXXX = XXXXX + itab1-emt_amt.

at end of date.

clear XXXXX.

endat.

Hope it helps!!

Regards,

Pavan

Read only

Former Member
0 Likes
1,618

Hi Saurabh,

Could you explain your scenario with any sample entries?

Regards,

Manoj Kumar P

Read only

0 Likes
1,618

hello all,

thanx for reply,

Suppose i have the following values in itab, then when i apply the loop on that then it will go for first PERNR - 8430, bcose of single entry of PERNR it must subtract the date 16.07.2007 from SY-DATUM

and then get the value in month after that month value shud multiply with BET01 and then update it

in ENT_AMT field in same row.

after that when we go for second time loop then it will get two value of PERNR-8254, now for first row of this PERNR it will subtract the date like (01.04.2008 - 19.07.2006) and get the value in month then multiply month value with 5000 and update it ENT_AMT in first row of PERNR-8254. now for second row of this PERNR it will subtract the date 01.04.2008 from SY-DATUM and get the value in month and multiply it with 10000 and update it in ENT_AMT.

Now continue the same process for next pernr.

ITAB :

PERNR LGA01 BET01 BEGDA BETRG ENT_AMT

8430 4004 5004 16.07.2007

8254 4004 5000 19.07.2006

8254 4004 10000 01.04.2008

7145 4004 5004 01.02.2006

7145 4004 10000 01.04.2007

7145 4004 20000 01.04.2008

......

.......

can anyone please help me that how wud i do?

regards saurabh.

Edited by: saurabh srivastava on Jan 16, 2009 7:00 AM

Edited by: saurabh srivastava on Jan 16, 2009 7:12 AM

Read only

0 Likes
1,618

Hi,

can u show ur code.

This may help us.

Thanks.

Read only

0 Likes
1,618

Hi

in the Loop, use the event.. at end of pernr, and then in that subtract the value. Wirte like this in the loop:

at end of pernr.
subtract.

" here give the field name which you want to subtract.
multiply.

"here give the field names which you want to multiply.
endat.

Vishwa.

Read only

SuhaSaha
Product and Topic Expert
Product and Topic Expert
0 Likes
1,618

Hello Saurabh,

Nice requirement )


SORT itab BY pernr begda ASCENDING.

LOOP AT itab ASSIGNING <fs>.
  v_index = sy-index + 1.
  READ TABLE itab INTO wa INDEX v_index.
  IF sy-subrc = 0.
    IF wa-pernr = <fs>-pernr.
      CALL FUNCTION 'MONTHS_BETWEEN_TWO_DATES'
        EXPORTING
          i_datum_bis = wa-begda
          i_datum_von = <fs>-begda
        IMPORTING
          e_monate    = v_months.
      IF sy-subrc = 0.
        <fs>-ent_amt = <fs>-bet01 * v_months.
        CLEAR v_months.
      ENDIF.

    ELSE.
      CALL FUNCTION 'MONTHS_BETWEEN_TWO_DATES'
        EXPORTING
          i_datum_bis = sy-datum
          i_datum_von = <fs>-begda
        IMPORTING
          e_monate    = v_months.
      IF sy-subrc = 0.
        <fs>-ent_amt = <fs>-bet01 * v_months.
        CLEAR v_months.
      ENDIF.

    ENDIF.
  ELSE. "For the last record of the internal table
    CALL FUNCTION 'MONTHS_BETWEEN_TWO_DATES'
      EXPORTING
        i_datum_bis = sy-datum
        i_datum_von = <fs>-begda
      IMPORTING
        e_monate    = v_months.
    IF sy-subrc = 0.
      <fs>-ent_amt = <fs>-bet01 * v_months.
      CLEAR v_months.
    ENDIF.
  ENDIF.
ENDLOOP.

Try this code.

BR,

Suhas

Read only

0 Likes
1,618

hi rajkumar,

i m sending u the codes plz. see and help us.

TABLES : pa0000,
         pa0015 ,   "HR Master Record: Infotype 0015 (Additional Payments)
         pa0589,
         pa0001 .   "HR Master Record: Infotype 0001 (Org. Assignment)

DATA : BEGIN OF itab OCCURS 0 ,
       pernr LIKE pa0000-pernr ,                       "Personel no.
       lga01 LIKE pa0589-lga01,
       bet01 LIKE pa0589-bet01,
       begda LIKE pa0589-begda ,                       "Lta start date

       lgart LIKE pa0015-lgart,                        "SUBTYPE OF INFOTYPE
       endda LIKE pa0015-endda ,                       "LTA Taken Date
       betrg LIKE pa0015-betrg,                        "LTA Amount
       zuord LIKE pa0015-zuord,                        "Assignment number
*  *       z_designation LIKE pa0001-z_designation ,       "Designation
       ename LIKE pa0001-ename ,                       "Employee name
       ent_amt type p decimals 2,
       pending TYPE p DECIMALS 2,                      "Pending LTA amount
*       amt type i,
 END OF itab .

DATA : BEGIN OF wa_itab,
       pernr LIKE pa0000-pernr ,                       "Personel no.
       ename LIKE pa0001-ename ,                       "Employee name
       lga01 LIKE pa0589-lga01,
       bet01 LIKE pa0589-bet01,
       begda LIKE pa0589-begda ,                       "Lta start date

       lgart LIKE pa0015-lgart,                        "SUBTYPE OF INFOTYPE
       endda LIKE pa0015-endda ,                       "LTA Taken Date
       betrg LIKE pa0015-betrg,                        "LTA Amount
       zuord LIKE pa0015-zuord,                        "Assignment number

 END OF wa_itab.
DATA : a TYPE d,
       b TYPE d,
       c type i,
       e type i,
      amt type i,
      amt2 type i,
      amt3 type i,
      flag type c,
      flag2 type c.

DATA : cnt TYPE i,
       cnt1 type i.
DATA : v_index TYPE sy-tabix.
**------------------------------  ALV DECLERATION-----------------------------------------------
DATA : w_container TYPE scrfname VALUE 'CL_GRID',
       w_cprog TYPE lvc_s_layo,
       g_repid LIKE sy-repid,
       w_save TYPE c,
       w_exit TYPE c,
       cl_grid TYPE REF TO cl_gui_alv_grid,
       cl_custom_container TYPE REF TO cl_gui_custom_container,
       it_fld_catalog TYPE slis_t_fieldcat_alv,
       wa_fld_catalog TYPE slis_t_fieldcat_alv WITH HEADER LINE ,
       layout TYPE slis_layout_alv,
       col_pos  LIKE sy-cucol ,
       alvfc TYPE slis_t_fieldcat_alv.
***------------------------------------ SELECTION SCREEN

SELECTION-SCREEN : BEGIN OF BLOCK b1 WITH FRAME TITLE text-001 .
SELECT-OPTIONS : pernr FOR pa0000-pernr .
SELECT-OPTIONS : begda FOR pa0589-begda no intervals no-extension.

SELECTION-SCREEN : END OF BLOCK b1 .
**********************************************
PERFORM fill_catalog1 USING:

'PERNR'    'ITAB'    'Personal No.',
'ENAME'    'ITAB'    'Emp Name',
*'Z_DESIGNATION'    'ITAB'    'Designation',
'BEGDA'    'ITAB'    'LTA Assign Date',
'LGA01'    'ITAB'    'Wage Type',
'BET01'    'ITAB'    'Limit Amount',

'ENT_AMT'    'ITAB'    'Entitled amount',
'BETRG'    'ITAB'    'LTA Availed Amount',
'ZUORD'    'ITAB'    'Assignment Number',
'PENDING'  'ITAB'    'Pending LTA Amount'.
***********************************************
at selection-screen.

if begda-low is initial.
begda-low = sy-datum.
endif.

start-of-selection.

SELECT m1~pernr m3~lga01 m3~bet01 m3~begda INTO TABLE itab
                        FROM pa0000 AS m1 INNER JOIN pa0589 AS m3 ON m1~pernr = m3~pernr
                       WHERE m1~pernr IN pernr AND m1~endda = '99991231' AND m1~stat2 = '3'
                       AND m3~lga01 = '4004'. " and m3~begda in begda.
IF sy-subrc <> 0.
  MESSAGE 'Data not found, Please Enter Active Employee Only.' TYPE 'I'.
ENDIF.

SORT itab BY pernr.

flag = 'X'.

flag2 = 'X'.


LOOP AT itab.
*************************************
if flag2 = 'X'.
at new pernr.
cnt1 = sy-tabix.
if cnt1 = 1.
a = itab-begda.
b = begda-low.
e = itab-begda+6(2).
 if e lt 16.
 itab-begda+6(2) = '01'.
 a = itab-begda.
 else.
 itab-begda+4(2) =  itab-begda+4(2) + 1.
 itab-begda+6(2) = '01'.

 a = itab-begda.
endif.
amt = itab-bet01 / 12.
CALL FUNCTION 'MONTHS_BETWEEN_TWO_DATES'
    EXPORTING
      i_datum_bis         = b
      i_datum_von         = a
*     I_KZ_INCL_BIS       = ' '
   IMPORTING
     E_MONATE            = c
            .

       amt = amt * c.
       itab-ent_amt = amt.
    SELECT SUM( betrg ) FROM pa0015 INTO itab-betrg WHERE pernr = itab-pernr AND lgart = '4004' AND begda gt a and begda lt b .

       modify itab index cnt1 transporting betrg ent_amt.
endif.
endat.
clear flag2.
******************************
else.
if flag = 'X'.
  IF sy-tabix = 1.                                       "for first row of first pernr
  cnt = sy-tabix.
    e = itab-begda+6(2).
 if e lt 16.
 itab-begda+6(2) = '01'.
 a = itab-begda.
 else.
 itab-begda+4(2) =  itab-begda+4(2) + 1.
 itab-begda+6(2) = '01'.

 a = itab-begda.
endif.
    amt = itab-bet01 / 12.
    CONTINUE.
** else.
** a = itab-begda.
** amt = itab-bet01 / 12.

  ENDIF.
**************************************************************
  b = itab-begda.                                        "for second row of first pernr
  amt2 = itab-bet01 / 12.
  CALL FUNCTION 'MONTHS_BETWEEN_TWO_DATES'
    EXPORTING
      i_datum_bis         = b
      i_datum_von         = a
*     I_KZ_INCL_BIS       = ' '
   IMPORTING
     E_MONATE            = c
            .

       amt = amt * c.
       itab-ent_amt = amt.
    SELECT SUM( betrg ) FROM pa0015 INTO itab-betrg WHERE pernr = itab-pernr AND lgart = '4004' AND begda gt a and begda lt b .

       modify itab index cnt transporting betrg ent_amt.
     clear flag.
**************for third row of pernr
  else.
 cnt = cnt + 1.
 a = b.
 b = itab-begda.
* amt2 = itab-bet01 / 12.
amt3 = itab-bet01 / 12.

 CALL FUNCTION 'MONTHS_BETWEEN_TWO_DATES'
    EXPORTING
      i_datum_bis         = b
      i_datum_von         = a
*     I_KZ_INCL_BIS       = ' '
   IMPORTING
     E_MONATE            = c
            .

amt3 = amt3 * c.
itab-ent_amt = amt3.
*amt3 = itab-bet01 / 12.
SELECT SUM( betrg ) FROM pa0015 INTO itab-betrg WHERE pernr = itab-pernr AND lgart = '4004' AND begda gt a and begda lt b.
 modify itab index cnt transporting betrg ent_amt.
endif.

***************************for last row of pernr
   at end of pernr.
   cnt = cnt + 1.
   clear sy-tabix.
   clear a.
   clear c.
*   clear amt2.
   clear itab-betrg.
   a = b.

*   amt2 = itab-bet01 / 12.

   CALL FUNCTION 'MONTHS_BETWEEN_TWO_DATES'
    EXPORTING
      i_datum_bis         = begda-low
      i_datum_von         = a
*     I_KZ_INCL_BIS       = ' '
   IMPORTING
     E_MONATE            = c
            .

 amt2 = amt2 * c.
       itab-ent_amt = amt2.
         SELECT SUM( betrg ) FROM pa0015 INTO itab-betrg WHERE pernr = itab-pernr AND lgart = '4004' AND begda gt a and begda lt begda-low.

       modify itab index cnt transporting betrg ent_amt.

endat.
*endat.
endif.
ENDLOOP.


************************************************************************
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
  EXPORTING
    i_callback_program = 'ZLTA_PENDING_TEST'
    is_layout          = layout
    it_fieldcat        = it_fld_catalog
    i_default          = 'X'
    i_save             = 'A'
  TABLES
    t_outtab           = itab
  EXCEPTIONS
    program_error      = 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.

*ENDFORM.
FORM fill_catalog1  USING   p_fieldname TYPE any
                            p_ref_table TYPE any
                            p_scrtext   TYPE any.
  CLEAR : wa_fld_catalog.
  wa_fld_catalog-fieldname  = p_fieldname.
  wa_fld_catalog-tabname    = p_ref_table.
  wa_fld_catalog-seltext_s  = p_scrtext.
  wa_fld_catalog-seltext_m  = p_scrtext.
  wa_fld_catalog-seltext_l  = p_scrtext.
  APPEND wa_fld_catalog TO it_fld_catalog.

ENDFORM.                    " fill_catalog1

regards saurabh.

Edited by: Julius Bussche on Jan 16, 2009 1:34 PM

Read only

Former Member
0 Likes
1,618

hi,

you can try like this.

get pernr.

do calculation here .

end of selection .

Read only

Former Member
0 Likes
1,619

Hi Saurabh,

Check the below code which will work for your requirement.

SORT it_tab BY pernr begda .

LOOP AT it_tab INTO wa_tab.
  w_ind = sy-tabix. "Current entry
  w_ind1 = sy-tabix + 1. "Next entry

  READ TABLE it_tab INTO wa_tab1 INDEX w_ind1. "Read the next value
  IF sy-subrc EQ 0 AND wa_tab-pernr EQ wa_tab1-pernr. "If an entry there and pernr are same
                                                                        "Calculate the difference date diff b/w 2 dates
    CALL FUNCTION 'HR_99S_MONTHS_BETWEEN_DATES'
         EXPORTING
              p_begda  = wa_tab-begda
              p_endda  = wa_tab1-begda
         IMPORTING
              p_months = w_diff.
  ELSE."If there is no entry or pernr are not same calculate the difference date diff b/w date and sy-datum
                                                                                CALL FUNCTION 'HR_99S_MONTHS_BETWEEN_DATES'
         EXPORTING
              p_begda  = wa_tab-begda
              p_endda  = sy-datum
         IMPORTING
              p_months = w_diff.


  ENDIF.

  wa_tab-ent_amt = wa_tab-bet01 * w_diff. "Multyplly with the difference

  MODIFY it_tab FROM wa_tab INDEX w_ind TRANSPORTING ent_amt. "Modify the current entry
  CLEAR: wa_tab1, w_diff.
ENDLOOP.

I/P:

7145 4004          5.004,00  01.02.2006 
7145 4004         10.000,00  01.04.2007
7145 4004         20.000,00  01.04.2008
8254 4004          5.000,00  19.07.2006
8254 4004         10.000,00  01.04.2008 
8430 4004          5.004,00  16.07.2007

O/P:

7145 4004          5.004,00  01.02.2006         70.056,00
7145 4004         10.000,00  01.04.2007        120.000,00
7145 4004         20.000,00  01.04.2008        200.000,00
8254 4004          5.000,00  19.07.2006        100.000,00
8254 4004         10.000,00  01.04.2008        100.000,00
8430 4004          5.004,00  16.07.2007         90.072,00

Hope this helps you.

Regards,

Manoj Kumar P

Read only

0 Likes
1,618

hi manoj,

thanx for reply, that was really nice logic. but now i need to display sum of ENT_AMT for every PERNR or u can say PERNR wise. so please tell that how wud i do?

regards.

saurabh.

Read only

0 Likes
1,618

Hi Saurabh,

Decalre new int table of structure it_tab say its name is it_tab1 and declare a variable w_sum of for ent_amt, then use the below logic after the logic i have mentioned in my last reply.

CLEAR w_sum.
LOOP AT it_tab INTO wa_tab.
  ADD wa_tab-ent_amt TO w_sum.
  AT END OF pernr.
    wa_tab1-pernr = wa_tab-pernr.
    wa_tab1-ent_amt = w_sum.
    CLEAR w_sum.
"New table contains only pernr and ent_amt if you want you can add other fields acco to req
    APPEND wa_tab1 TO it_tab1. 
  ENDAT.
ENDLOOP.

Now the table it_tab1 contains pernr wise sum of ent_amt.

Hope this helps you.

Regards,

Manoj Kumar P

Edited by: Manoj Kumar on Jan 16, 2009 12:22 PM