‎2013 Jul 25 9:23 AM
Hi experts,
I need to display the value of my IT_HIRED then display the value of IT_LEAVE into their corresponding PERNR.
But my code shows only the first value from my IT_LEAVE and it does not read the next value.
Help Please
Thanks.
PERNR |HIRED DATE | LEAVE DATE
100001 | 01/01/2013 | 02/03/2013
100001 | 01/25/2014 | 05/05/2014
100001 | 01/25/2014 |
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.
‎2013 Jul 25 12:07 PM
LOOP AT IT_HIRE INTO WA_HIRE.
IT_REPORT-PERNUM = WA_HIRE-PERNR.
IT_REPORT-DATEHIRED = WA_HIRE-BEGDA.
LOOP AT IT_LEAVE WHERE PERNR = WA_HIRE-PERNR.
IT_REPORT-DATESEP = IT_LEAVE-BEGDA.
APPEND IT_REPORT.
CLEAR IT_REPORT.
ENDLOOP.
ENDLOOP.
read give only one answer (if the condition is true)
regards
fred
‎2013 Jul 25 12:41 PM
LOOP AT IT_HIRE INTO WA_HIRE.
IT_REPORT-PERNUM = WA_HIRE-PERNR.
IT_REPORT-DATEHIRED = WA_HIRE-BEGDA.
CLEAR IT_REPORT-DATESEP.
LOOP AT IT_LEAVE WHERE PERNR = WA_HIRE-PERNR.
IF IT_LEAVE-BEGDA GT IT_REPORT-DATESEP
OR IT_REPORT-DATESEP IS INITIAL.
IT_REPORT-DATESEP = IT_LEAVE-BEGDA.
ENDIF.
ENDLOOP.
APPEND IT_REPORT.
CLEAR IT_REPORT.
ENDLOOP.
this gets the latest date only.. but if you want the earliest date... use LT instead of GT.
‎2013 Jul 25 1:51 PM
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 and leave table 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.
clear it_leave.
ENDLOOP.
Clear it_leave. That is probably the reason why you are not getting the updated leave values.
Message was edited by: Susmitha Susan Thomas
‎2013 Jul 26 5:10 AM
Hi,
Don't use Read statement , use Loop inside loop for 2nd Record.
LOOP AT IT_HIRE INTO WA_HIRE.
IT_REPORT-PERNUM = WA_HIRE-PERNR.
IT_REPORT-DATEHIRED = WA_HIRE-BEGDA.
Loop at IT_LEAVE where PERNR = WA_HIRE-PERNR.
IT_REPORT-DATESEP = IT_LEAVE-BEGDA.
APPEND IT_REPORT.
Endloop.
CLEAR IT_REPORT.
ENDLOOP.
Regards,
Salil Chavan
‎2013 Jul 26 7:57 AM
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