‎2013 Jul 25 10:19 AM
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
‎2013 Jul 25 1:36 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 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.
‎2013 Jul 25 12:59 PM
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
‎2013 Jul 25 1:07 PM
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
‎2013 Jul 25 1:10 PM
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!
‎2013 Jul 25 1:36 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 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.
‎2013 Jul 26 9:38 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
‎2013 Jul 29 3:30 AM
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.