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

Read Table and loop next value

Former Member
0 Likes
863

Hi experts,

I need to display the value of my IT_HIRED then display the value of IT_LEAVE into their corresponding PERNR.

Help Please

Thanks.


This must be the output.

PERNR |HIRED DATE | LEAVE DATE

100001 | 01/01/2013 | 02/03/2013

100001 | 01/25/2014 | 05/05/2014

100001 | 01/25/2014 |

But my code shows only the first value from my IT_LEAVE and it does not read the next value.

Here is the code.


SELECT PERNR PERSK BEGDA

      INTO CORRESPONDING FIELDS OF TABLE IT_PA0001

      FROM PA0001

      WHERE ( PERSK = 'C1' OR PERSK = 'C2'

           OR PERSK = 'D1' OR PERSK = 'D2'

           OR PERSK = 'E1' OR PERSK = 'E2'

           OR PERSK = 'F1' OR PERSK = 'F2'

           OR PERSK = 'G1' OR PERSK = 'G2' ).


    "  IF HIRING IS INITIAL AND SEPERATE IS INITIAL.

    SELECT PERNR BEGDA ENDDA MASSN MASSG

      FROM PA0000

      INTO CORRESPONDING FIELDS OF TABLE IT_PA0000

      FOR ALL ENTRIES IN IT_PA0001

      WHERE PERNR = IT_PA0001-PERNR

      AND ( MASSN = 'E3' OR MASSN = 'D0' OR MASSN = 'E1' OR MASSN = 'E2' OR MASSN = 'D9' )

      AND BEGDA BETWEEN HIRING-LOW AND HIRING-HIGH.

    "AND ENDDA BETWEEN SEPERATE-LOW AND SEPERATE-HIGH.

    "ENDIF.

    IF SY-SUBRC EQ 0.

      LOOP AT IT_PA0000 INTO WA_PA0000.

        "IT_REPORT-PERNUM = WA_PA0000-PERNR.

        IF WA_PA0000-MASSN = 'D0' OR WA_PA0000-MASSN = 'E3'.

          SELECT PERNR BEGDA ENDDA MASSN MASSG                       "<----------IT FOR HIRING DATE

            INTO IT_HIRE

            FROM PA0000

            WHERE  PERNR = WA_PA0000-PERNR

            AND BEGDA = WA_PA0000-BEGDA.

            IT_REPORT-DATEHIRED = GV_BEGDA.


            APPEND IT_HIRE.

            CLEAR IT_HIRE.


          ENDSELECT.


        ELSEIF WA_PA0000-MASSN = 'D9' OR WA_PA0000-MASSN = 'E1' OR WA_PA0000-MASSN = 'E2'.

          SELECT PERNR BEGDA ENDDA MASSN MASSG                          "<----------IT  FOR LEAVING DATE

           INTO IT_LEAVE

           FROM PA0000

           WHERE  PERNR = WA_PA0000-PERNR

           AND BEGDA = WA_PA0000-BEGDA.

            IT_REPORT-DATEHIRED = GV_BEGDA.


            APPEND IT_LEAVE.

            CLEAR IT_LEAVE.

          ENDSELECT.

        ENDIF.

      ENDLOOP.

    ENDIF.


    LOOP AT IT_HIRE INTO WA_HIRE.

      IT_REPORT-PERNUM = WA_HIRE-PERNR.

      IT_REPORT-DATEHIRED = WA_HIRE-BEGDA.


      READ TABLE IT_LEAVE WITH KEY PERNR = WA_HIRE-PERNR.

        IF SY-SUBRC = 0.

            IT_REPORT-DATESEP = IT_LEAVE-BEGDA.

        ENDIF.


      APPEND IT_REPORT.

      CLEAR IT_REPORT.


    ENDLOOP.

  ENDIF.

Strange,Content Seems Duplicated - Please refer to the Original.

http://scn.sap.com/message/14229029


Please Ignore, Looks like a technical glitch where the content is replicated at two places!


Message was edited by: Venkat Gowrishankar

Message was edited by: Venkat Gowrishankar

1 ACCEPTED SOLUTION
Read only

Former Member
0 Likes
804

IF SY-SUBRC EQ 0.

      LOOP AT IT_PA0000 INTO WA_PA0000.

        "IT_REPORT-PERNUM = WA_PA0000-PERNR.

        IF WA_PA0000-MASSN = 'D0' OR WA_PA0000-MASSN = 'E3'.

          SELECT PERNR BEGDA ENDDA MASSN MASSG                       "<----------IT FOR HIRING DATE

            INTO IT_HIRE

            FROM PA0000

            WHERE  PERNR = WA_PA0000-PERNR

            AND BEGDA = WA_PA0000-BEGDA.

                           it_hire-pernr = wa_pa0000-penr.

                          it_hire-begda = wa_pa0000-begda.

                          it_hire-endda = wa_pa0000-endda.

                          it_hire-massn= wa_pa0000-massn.

                          it_hire-massc = wa_pa0000-massc.

                           

            IT_REPORT-DATEHIRED = GV_BEGDA.


            APPEND IT_HIRE.

            CLEAR IT_HIRE.

      

          ENDSELECT.


        ELSEIF WA_PA0000-MASSN = 'D9' OR WA_PA0000-MASSN = 'E1' OR WA_PA0000-MASSN = 'E2'.

          SELECT PERNR BEGDA ENDDA MASSN MASSG                          "<----------IT  FOR LEAVING DATE

           INTO IT_LEAVE

           FROM PA0000

           WHERE  PERNR = WA_PA0000-PERNR

           AND BEGDA = WA_PA0000-BEGDA.

            IT_REPORT-DATEHIRED = GV_BEGDA.

Do it similarly here as above

        it_leave-pernr = wa_pa0001-pernr.

etc...

            APPEND IT_LEAVE.

            CLEAR IT_LEAVE.

          ENDSELECT.

        ENDIF.

* Clear work area - Important.

                      clear wa_pa0000     


      ENDLOOP.

Also clear the work area in this last loop too.

  LOOP AT IT_HIRE INTO WA_HIRE.

      IT_REPORT-PERNUM = WA_HIRE-PERNR.

      IT_REPORT-DATEHIRED = WA_HIRE-BEGDA.


      READ TABLE IT_LEAVE WITH KEY PERNR = WA_HIRE-PERNR.

        IF SY-SUBRC = 0.

            IT_REPORT-DATESEP = IT_LEAVE-BEGDA.

        ENDIF.


      APPEND IT_REPORT.

      CLEAR IT_REPORT.

    clear wa_hire.

ENDLOOP.


6 REPLIES 6
Read only

Former Member
0 Likes
804

Hi Jepoy,

Instead of READ TABLE IT_LEAVE WITH KEY PERNR = WA_HIRE-PERNR.

use "loop at IT_LEAVE where PERNR = WA_HIRE-PERNR "

thanks & regards,

akshay

Read only

Former Member
0 Likes
804

Hi Jepoy,

replace the "READ TABLE IT_LEAVE" with "LOOP AT IT_LEAVE".

The Read is only once done for every "LOOP AT IT_HIRE".

Bye,

Andi

Read only

Former Member
0 Likes
804

Hey,

There are few points which you need to work on.

1- Check through debugging, if you are getting sufficient data in your internal tables or not?

2- Bring below SELECT out of loop, and use FOR ALL ENTRIES option

          SELECT PERNR BEGDA ENDDA MASSN MASSG                         

           INTO IT_LEAVE

           FROM PA0000

           WHERE  PERNR = WA_PA0000-PERNR

           AND BEGDA = WA_PA0000-BEGDA.

            IT_REPORT-DATEHIRED = GV_BEGDA.

Write it like below:

          SELECT PERNR BEGDA ENDDA MASSN MASSG                         

           INTO IT_LEAVE

           FROM PA0000

           FOR ALL ENTRIES IN IT_PA0000

           WHERE  PERNR = IT_PA0000-PERNR

           AND BEGDA = IT_PA0000-BEGDA.

            IT_REPORT-DATEHIRED = GV_BEGDA.

Now read this table inside loop.

3- Loop on the master table of PERNR and read the internal tables to get the values of HIRED DATE and LEAVE DATE.

Hope it helps!

Read only

Former Member
0 Likes
805

IF SY-SUBRC EQ 0.

      LOOP AT IT_PA0000 INTO WA_PA0000.

        "IT_REPORT-PERNUM = WA_PA0000-PERNR.

        IF WA_PA0000-MASSN = 'D0' OR WA_PA0000-MASSN = 'E3'.

          SELECT PERNR BEGDA ENDDA MASSN MASSG                       "<----------IT FOR HIRING DATE

            INTO IT_HIRE

            FROM PA0000

            WHERE  PERNR = WA_PA0000-PERNR

            AND BEGDA = WA_PA0000-BEGDA.

                           it_hire-pernr = wa_pa0000-penr.

                          it_hire-begda = wa_pa0000-begda.

                          it_hire-endda = wa_pa0000-endda.

                          it_hire-massn= wa_pa0000-massn.

                          it_hire-massc = wa_pa0000-massc.

                           

            IT_REPORT-DATEHIRED = GV_BEGDA.


            APPEND IT_HIRE.

            CLEAR IT_HIRE.

      

          ENDSELECT.


        ELSEIF WA_PA0000-MASSN = 'D9' OR WA_PA0000-MASSN = 'E1' OR WA_PA0000-MASSN = 'E2'.

          SELECT PERNR BEGDA ENDDA MASSN MASSG                          "<----------IT  FOR LEAVING DATE

           INTO IT_LEAVE

           FROM PA0000

           WHERE  PERNR = WA_PA0000-PERNR

           AND BEGDA = WA_PA0000-BEGDA.

            IT_REPORT-DATEHIRED = GV_BEGDA.

Do it similarly here as above

        it_leave-pernr = wa_pa0001-pernr.

etc...

            APPEND IT_LEAVE.

            CLEAR IT_LEAVE.

          ENDSELECT.

        ENDIF.

* Clear work area - Important.

                      clear wa_pa0000     


      ENDLOOP.

Also clear the work area in this last loop too.

  LOOP AT IT_HIRE INTO WA_HIRE.

      IT_REPORT-PERNUM = WA_HIRE-PERNR.

      IT_REPORT-DATEHIRED = WA_HIRE-BEGDA.


      READ TABLE IT_LEAVE WITH KEY PERNR = WA_HIRE-PERNR.

        IF SY-SUBRC = 0.

            IT_REPORT-DATESEP = IT_LEAVE-BEGDA.

        ENDIF.


      APPEND IT_REPORT.

      CLEAR IT_REPORT.

    clear wa_hire.

ENDLOOP.


Read only

Former Member
0 Likes
804

Hi Jepoy,

Loop has to be used for reading the values of internal table IT_LEAVE.

Use parallel cursor technique to improve the performance.

Modifications are done in your coding and are highlighted.

SELECT PERNR PERSK BEGDA

      INTO CORRESPONDING FIELDS OF TABLE IT_PA0001

      FROM PA0001

      WHERE ( PERSK = 'C1' OR PERSK = 'C2'

           OR PERSK = 'D1' OR PERSK = 'D2'

           OR PERSK = 'E1' OR PERSK = 'E2'

           OR PERSK = 'F1' OR PERSK = 'F2'

           OR PERSK = 'G1' OR PERSK = 'G2' ).


    "  IF HIRING IS INITIAL AND SEPERATE IS INITIAL.

    SELECT PERNR BEGDA ENDDA MASSN MASSG

      FROM PA0000

      INTO CORRESPONDING FIELDS OF TABLE IT_PA0000

      FOR ALL ENTRIES IN IT_PA0001

      WHERE PERNR = IT_PA0001-PERNR

      AND ( MASSN = 'E3' OR MASSN = 'D0' OR MASSN = 'E1' OR MASSN = 'E2' OR MASSN = 'D9' )

      AND BEGDA BETWEEN HIRING-LOW AND HIRING-HIGH.

    "AND ENDDA BETWEEN SEPERATE-LOW AND SEPERATE-HIGH.

    "ENDIF.

    IF SY-SUBRC EQ 0.

      LOOP AT IT_PA0000 INTO WA_PA0000.

        "IT_REPORT-PERNUM = WA_PA0000-PERNR.

        IF WA_PA0000-MASSN = 'D0' OR WA_PA0000-MASSN = 'E3'.

          SELECT PERNR BEGDA ENDDA MASSN MASSG                       "<----------IT FOR HIRING DATE

            INTO IT_HIRE

            FROM PA0000

            WHERE  PERNR = WA_PA0000-PERNR

            AND BEGDA = WA_PA0000-BEGDA.

            IT_REPORT-DATEHIRED = GV_BEGDA.


            APPEND IT_HIRE.

            CLEAR IT_HIRE.


          ENDSELECT.


        ELSEIF WA_PA0000-MASSN = 'D9' OR WA_PA0000-MASSN = 'E1' OR WA_PA0000-MASSN = 'E2'.

          SELECT PERNR BEGDA ENDDA MASSN MASSG                          "<----------IT  FOR LEAVING DATE

           INTO IT_LEAVE

           FROM PA0000

           WHERE  PERNR = WA_PA0000-PERNR

           AND BEGDA = WA_PA0000-BEGDA.

            IT_REPORT-DATEHIRED = GV_BEGDA.


            APPEND IT_LEAVE.

            CLEAR IT_LEAVE.

          ENDSELECT.

        ENDIF.

      ENDLOOP.

    ENDIF.

        

          sort:  it_hire by pernr,

                     it_leave by pernr.

    LOOP AT IT_HIRE INTO WA_HIRE.

      IT_REPORT-PERNUM = WA_HIRE-PERNR.

      IT_REPORT-DATEHIRED = WA_HIRE-BEGDA.


      READ TABLE IT_LEAVE WITH KEY PERNR = WA_HIRE-PERNR

               transporting no fields binary search.

        IF SY-SUBRC = 0.

                      loop at it_leave assigning from sy-tabix.

                         if it_leave-pernr = it_hire-pernr.

            IT_REPORT-DATESEP = IT_LEAVE-BEGDA.

            append it_report.

            clear it_report.  

                          else.

                              exit.

                      endloop.


        ENDIF.


      APPEND IT_REPORT.      "No need

     CLEAR IT_REPORT.     "No need


    ENDLOOP.

  ENDIF.

Thanks & Regards,

T. Prasanna Kumar

Read only

Former Member
0 Likes
804

Thank you,  i find your answer very helpful.

this is what i did.

LOOP AT IT_PA0000 INTO WA_PA0000.
"IT_REPORT-PERNUM = WA_PA0000-PERNR.
IF wa_pa0000-pernr NE lv_pernr.
CLEAR di_ctr.
ENDIF.

IF WA_PA0000-MASSN = 'D0' OR WA_PA0000-MASSN = 'E3'.           "<----------FOR IT_HIRING DATE
it_hire
-pernr = wa_pa0000-pernr.
it_hire
-begda = wa_pa0000-begda.
it_hire
-endda = wa_pa0000-endda.
it_hire
-massn = wa_pa0000-massn.
it_hire
-massg = wa_pa0000-massg.
APPEND it_hire. CLEAR it_hire.
IT_REPORT
-PERNUM = WA_pa0000-PERNR.
IT_REPORT
-DATEHIRED = WA_pa0000-BEGDA.
APPEND it_report. CLEAR it_report.

ELSEIF WA_PA0000-MASSN = 'D9' OR WA_PA0000-MASSN = 'E1' OR WA_PA0000-MASSN = 'E2'.         "<----------FOR IT_LEAVING DATE
di_ctr
= di_ctr + 1.
it_leave
-pernr = wa_pa0000-pernr.
it_leave
-count = di_ctr.
it_leave
-begda = wa_pa0000-begda.
it_leave
-endda = wa_pa0000-endda.
it_leave
-massn = wa_pa0000-massn.
it_leave
-massg = wa_pa0000-massg.
APPEND it_leave. CLEAR it_leave.

ENDIF.


lv_pernr
= wa_pa0000-pernr.
ENDLOOP.
ENDIF.

LOOP AT it_report.
ON CHANGE OF it_report-pernum.
CLEAR di_ctr.
ENDON.
di_ctr
= di_ctr + 1.
READ TABLE it_leave WITH KEY pernr = it_report-pernum
count = di_ctr.
IF sy-subrc = 0.
it_report
-datesep = it_leave-begda.
MODIFY it_report.
ENDIF.
ENDLOOP.