PDA

Ver la Versión Completa : Performance???


Rodolfo SAP
04/08/09, 17:24:19
Saludos,

Bueno necesito de su experiencia Abap y es que tengo un programa (codigo A) que tenia que ser optimizado performance y lo que hice fue lo siguiente (codigo B) por medio de un ciclo va realizando select por cada registro entonces lo que hice fue hacer un select general, exportar a memoria y luego realizar import y read table. lo de import y export lo hice por que las subrutinas son indepedientes.

CODIGO A

form HR_DIV_PER using p_in
changing p_parm like /ehr/s71_user_exit_parm
p_out.

data: div_per type HRP1008-PERSA,
sobid type HRP1001-SOBID,
otype type c value 'S',
relat type string value '003',
desc_div_per type T500P-NAME1.

sobid = p_in.

do 2 times.

select single persa into div_per
from hrp1008
where objid = sobid and
plvar = '01' and
otype = otype and
begda < sy-datum and
endda > sy-datum.

if sy-subrc = 0.

exit.

else.

do 2 times.

if otype = 'O'.

relat = '008'.

endif.

select single sobid into sobid
from hrp1001
where otype = 'S' and
objid = p_in and
plvar = '01' and
rsign = 'A' and
relat = relat and
begda < sy-datum and
endda > sy-datum.

if sy-subrc = 0.

otype = 'O'.
exit.

else.

relat = '008'.

endif.

enddo.

endif.

enddo.

if relat = '008'.

select single werks into div_per
from pa0001
where pernr = sobid and
begda < sy-datum and
endda > sy-datum.

endif.

select single name1 into desc_div_per
from t500p
where persa = div_per.

if p_parm-prefix eq 1.

p_out = div_per.

elseif p_parm-prefix eq 2.

p_out = desc_div_per.

endif.

endform. " HR_DIV_PER

form HR_REC_TYPE using p_in
changing p_parm like /ehr/s71_user_exit_parm
p_out.

data: stabs type hrp1003-stabs,
objid type hrp1001-objid.

select single stabs from hrp1003
into stabs
where plvar = '01' and
otype = 'S' and
objid = p_in and
begda < sy-datum and
endda > sy-datum.

if sy-subrc = 0 and stabs = 'X'.

p_out = 'A'.

else.

select single objid from hrp1001
into objid
where otype = 'S' and
objid = p_in and
plvar = '01' and
rsign = 'A' and
relat = '012' and
begda < sy-datum and
endda > sy-datum.

if sy-subrc = 0.

p_out = 'M'.

else.

p_out = 'E'.

endif.

endif.

endform. " HR_REC_TYPE

CODIGO B

FORM hr_div_per USING p_in
CHANGING p_parm LIKE /ehr/s71_user_exit_parm
p_out.

DATA: div_per TYPE hrp1008-persa,
sobid TYPE hrp1001-sobid,
otype TYPE c VALUE 'S',
relat TYPE string VALUE '003',
desc_div_per TYPE t500p-name1.

*INICIO Inserta H0000537(RMR) DRDK905694 ...................................... 03.Ago.2009
DATA: tg_hrp1001 LIKE hrp1001 OCCURS 0 WITH HEADER LINE,
tg_hrp1008 LIKE hrp1008 OCCURS 0 WITH HEADER LINE,
tg_pa0001 LIKE pa0001 OCCURS 0 WITH HEADER LINE,
tg_t500p LIKE t500p OCCURS 0 WITH HEADER LINE.
* FIN Inserta H0000537(RMR).................................................. 03.Ago.2009

sobid = p_in.

DO 2 TIMES.

*INICIO Modifica H0000537(RMR) DRDK905694 ...................................... 03.Ago.2009
* SELECT SINGLE persa INTO div_per
* FROM hrp1008
* WHERE objid = sobid AND
* plvar = '01' AND
* otype = otype AND
* begda < sy-datum AND
* endda > sy-datum.

IMPORT tmp_hr1008 TO tg_hrp1008 FROM MEMORY ID 'tg8'.
IF tg_hrp1008 IS INITIAL.
CLEAR tg_hrp1008.
READ TABLE tg_hrp1008 WITH KEY objid = sobid
plvar = '01'
otype = otype.
* FIN Modifica H0000537(RMR) ............................................... 03.Ago.2009

IF sy-subrc = 0.
*INICIO Inserta H0000537(RMR) DRDK905698 ..................................... 04.Ago.2009
MOVE: tg_hrp1008-persa TO div_per.
* FIN Inserta H0000537(RMR) ................................................ 04.Ago.2009

EXIT.

ELSE.

DO 2 TIMES.

IF otype = 'O'.

relat = '008'.

ENDIF.

*INICIO Modifica H0000537(RMR) DRDK905694 ...................................... 03.Ago.2009
* SELECT SINGLE sobid INTO sobid
* FROM hrp1001
* WHERE otype = 'S' AND
* objid = p_in AND
* plvar = '01' AND
* rsign = 'A' AND
* relat = relat AND
* begda < sy-datum AND
* endda > sy-datum.

IMPORT tmp_hr1001 TO tg_hrp1001 FROM MEMORY ID 'tg1'.
IF tg_hrp1001 IS INITIAL.
CLEAR tg_hrp1001.
READ TABLE tg_hrp1001 WITH KEY otype = 'S'
objid = p_in
plvar = '01'
rsign = 'A'
relat = relat.
* FIN Modifica H0000537(RMR) ............................................... 03.Ago.2009
IF sy-subrc = 0.
*INICIO Inserta H0000537(RMR) DRDK905698 ..................................... 04.Ago.2009
MOVE: tg_hrp1001-sobid TO sobid.
* FIN Inserta H0000537(RMR) ................................................ 04.Ago.2009

otype = 'O'.
EXIT.

ELSE.

relat = '008'.

ENDIF.

ENDIF.

ENDDO.

ENDIF.

ENDIF.

ENDDO.

IF relat = '008'.

*INICIO Modifica H0000537(RMR) DRDK905694 ...................................... 03.Ago.2009
* SELECT SINGLE werks INTO div_per
* FROM pa0001
* WHERE pernr = sobid AND
* begda < sy-datum AND
* endda > sy-datum.

IMPORT tmp_pa0001 TO tg_pa0001 FROM MEMORY ID 'pa1'.
IF tg_pa0001 IS INITIAL.
CLEAR tg_pa0001.
READ TABLE tg_pa0001 WITH KEY pernr = sobid.
IF sy-subrc EQ 0.
MOVE tg_pa0001-werks TO div_per.
ENDIF.
ENDIF.
* FIN Modifica H0000537(RMR) ................................................. 03.Ago.2009
ENDIF.

*INICIO Modifica H0000537(RMR) DRDK905694 ...................................... 03.Ago.2009
* SELECT SINGLE name1 INTO desc_div_per
* FROM t500p
* WHERE persa = div_per.

IMPORT tmp_t500p TO tg_t500p FROM MEMORY ID 't5p'.
IF tg_t500p IS INITIAL.
CLEAR tg_t500p.
READ TABLE tg_t500p WITH KEY persa = div_per.
IF sy-subrc EQ 0.
MOVE tg_t500p-name1 TO desc_div_per.
ENDIF.
ENDIF.
* FIN Modifica H0000537(RMR) ................................................ 03.Ago.2009

IF p_parm-prefix EQ 1.

p_out = div_per.

ELSEIF p_parm-prefix EQ 2.

p_out = desc_div_per.

ENDIF.

ENDFORM. " HR_DIV_PER

FORM hr_rec_type USING p_in
CHANGING p_parm LIKE /ehr/s71_user_exit_parm
p_out.

DATA: stabs TYPE hrp1003-stabs,
objid TYPE hrp1001-objid.

*INICIO Inserta H0000537(RMR) DRDK905694 ...................................... 03.Ago.2009
DATA: vg_statout TYPE c,
vg_statin TYPE c.

DATA: tg_hrp1003 LIKE hrp1003 OCCURS 0 WITH HEADER LINE,
tmp_hr1003 LIKE hrp1003 OCCURS 0 WITH HEADER LINE,
tg_hrp1001 LIKE hrp1001 OCCURS 0 WITH HEADER LINE,
tmp_hr1001 LIKE hrp1001 OCCURS 0 WITH HEADER LINE,
tmp_hr1008 LIKE hrp1008 OCCURS 0 WITH HEADER LINE,
tmp_pa0001 LIKE pa0001 OCCURS 0 WITH HEADER LINE,
tmp_t500p LIKE t500p OCCURS 0 WITH HEADER LINE,
tmp_hr1010 LIKE hrp1010 OCCURS 0 WITH HEADER LINE.

IMPORT vg_statout TO vg_statin FROM MEMORY ID 'sta'.

IF vg_statin IS INITIAL.
SELECT * FROM hrp1003 INTO TABLE tmp_hr1003 WHERE plvar = '01'
AND begda < sy-datum
AND endda > sy-datum.
IF sy-subrc EQ 0.
EXPORT tmp_hr1003 TO MEMORY ID 'tg3'.
ENDIF.

SELECT * FROM hrp1001 INTO TABLE tmp_hr1001 WHERE plvar = '01'
AND begda < sy-datum
AND endda > sy-datum.
IF sy-subrc EQ 0.
EXPORT tmp_hr1001 TO MEMORY ID 'tg1'.
ENDIF.

SELECT * FROM hrp1008 INTO TABLE tmp_hr1008 WHERE plvar = '01'
AND begda < sy-datum
AND endda > sy-datum.
IF sy-subrc EQ 0.
EXPORT tmp_hr1008 TO MEMORY ID 'tg8'.
ENDIF.

SELECT * FROM pa0001 INTO TABLE tmp_pa0001 WHERE begda < sy-datum
AND endda > sy-datum.
IF sy-subrc EQ 0.
EXPORT tmp_pa0001 TO MEMORY ID 'pa1'.
ENDIF.

SELECT * FROM t500p INTO TABLE tmp_t500p.
IF sy-subrc EQ 0.
EXPORT tmp_t500p TO MEMORY ID 't5p'.
ENDIF.


SELECT * FROM hrp1010 INTO TABLE tmp_hr1010 WHERE plvar = '01'
AND otype = 'C'
AND subty = '0004'
AND begda < sy-datum
AND endda > sy-datum.
IF sy-subrc EQ 0.
EXPORT tmp_hr1010 TO MEMORY ID 'tg0'.
ENDIF.

vg_statout = 'X'.
EXPORT vg_statout TO MEMORY ID 'sta'.
ENDIF.
* FIN Inserta H0000537(RMR).................................................. 03.Ago.2009

*INICIO Modifica H0000537(RMR) DRDK905694 ..................................... 03.Ago.2009
* SELECT SINGLE stabs FROM hrp1003
* INTO stabs
* WHERE plvar = '01' AND
* otype = 'S' AND
* objid = p_in AND
* begda < sy-datum AND
* endda > sy-datum.

IMPORT tmp_hr1003 TO tg_hrp1003 FROM MEMORY ID 'tg3'.
IF tg_hrp1003 IS INITIAL.
CLEAR tg_hrp1003.
READ TABLE tg_hrp1003 WITH KEY plvar = '01'
otype = 'S'
objid = p_in.
* FIN Modifica H0000537(RMR) DRDK905694 ..................................... 03.Ago.2009

IF sy-subrc = 0 AND tg_hrp1003-stabs = 'X'.

p_out = 'A'.

ELSE.

*INICIO Modifica H0000537(RMR) DRDK905694 ..................................... 03.Ago.2009
* SELECT SINGLE objid FROM hrp1001
* INTO objid
* WHERE otype = 'S' AND
* objid = p_in AND
* plvar = '01' AND
* rsign = 'A' AND
* relat = '012' AND
* begda < sy-datum AND
* endda > sy-datum.

IMPORT tmp_hr1001 TO tg_hrp1001 FROM MEMORY ID 'tg1'.
IF tg_hrp1001 IS INITIAL.
CLEAR tg_hrp1001.
READ TABLE tg_hrp1001 WITH KEY otype = 'S'
objid = p_in
plvar = '01'
rsign = 'A'
relat = '012'.
* FIN Modifica H0000537(RMR) DRDK905694 ..................................... 03.Ago.2009

IF sy-subrc = 0.

p_out = 'M'.

ELSE.

p_out = 'E'.

ENDIF.

ENDIF.

ENDIF.

ENDIF.

ENDFORM. " HR_REC_TYPE

Bueno eso es todo y lo que necesito saber es si hice BIEN o NO, los pro contra, si hay otras formas mmm pero aclaro estas subrutinas y el programa que las manda llamar es estandar.