Buen día.
Tengo un reporte ALV, en problema está en que toma mucho tiempo para realizar el reporte (donde toma más tiempo, es en la lectura de la MSEG: 10 millones y sigue en aumento), qué me recomendarían para mejorar. Les pongo el código. Les agradezco de antemano.
concatenate P_GJAHR '.' P_MONAT '.' '01' into v_fecha3.
data: data type DATE8,
data2 type DATE8,
sigo(1) type c.
sigo = 's'.
while sigo eq 's'.
replace '.' with '' into v_fecha3.
if sy-subrc ne 0.
sigo = 'n'.
endif.
endwhile.
condense v_fecha3 NO-GAPS.
data = v_fecha3. "Fecha actual
CALL FUNCTION 'ADD_TIME_TO_DATE'
EXPORTING
i_idate = data
i_time = '-1' "Número de meses a sumar
i_iprkz = '2'
I_RDMHD = '-' " Aquí se le indica el signo + o -
IMPORTING
o_idate = v_fecha "Fecha mes anterior
EXCEPTIONS
invalid_period = 1
invalid_round_up_rule = 2
internal_error = 3
OTHERS = 4.
CALL FUNCTION 'ADD_TIME_TO_DATE'
EXPORTING
i_idate = data
i_time = '1' "Número de meses a sumar
i_iprkz = '2'
I_RDMHD = '-' " Aquí se le indica el signo + o -
IMPORTING
o_idate = v_fecha2 " Fecha mes posterior
EXCEPTIONS
invalid_period = 1
invalid_round_up_rule = 2
internal_error = 3
OTHERS = 4.
* Acá tengo que leer 2 veces la mseg para sacar el consumo, del mes actual y el mes anterior, xq no
*encontraba como discriminarlos después, haciendo una sola lectura de los 2 meses.
*La MSEG tiene 10 millones de registros y la MARA 20000
SELECT MARA~MATNR DMBTR INTO TABLE GTI_CONSUMO
FROM ( MARA INNER JOIN MSEG ON MARA~MATNR = MSEG~MATNR INNER JOIN MKPF ON MSEG~MBLNR = MKPF~MBLNR
AND MSEG~MJAHR = MKPF~MJAHR )
WHERE MARA~MATNR in S_MATNR
AND MATKL LIKE J
AND BUDAT >= v_fecha AND BUDAT < data
AND WERKS = 'CD01'
AND LGORT = '1001'
AND ( BWART = '641' OR BWART = '251' ).
"AND ( BWART = '561' OR BWART = '901' ).
SORT GTI_CONSUMO BY MATNR.
LOOP AT GTI_CONSUMO into WA_CONSUMO.
move-CORRESPONDING WA_CONSUMO to GTI_CONSUMO2.
collect GTI_CONSUMO2.
ENDLOOP.
SELECT MARA~MATNR DMBTR INTO TABLE GTI_CONSUMO3
FROM ( MARA INNER JOIN MSEG ON MARA~MATNR = MSEG~MATNR INNER JOIN MKPF ON MSEG~MBLNR = MKPF~MBLNR
AND MSEG~MJAHR = MKPF~MJAHR )
WHERE MARA~MATNR in S_MATNR
AND MATKL LIKE J
AND BUDAT >= data AND BUDAT < v_fecha2
AND WERKS = 'CD01'
AND LGORT = '1001'
AND ( BWART = '641' OR BWART = '251' ).
"AND ( BWART = '561' OR BWART = '901' ).
SORT GTI_CONSUMO3 BY MATNR.
CLEAR WA_CONSUMO.
LOOP AT GTI_CONSUMO3 into WA_CONSUMO.
move-CORRESPONDING WA_CONSUMO to GTI_CONSUMO4.
collect GTI_CONSUMO4.
ENDLOOP.
Tengo un reporte ALV, en problema está en que toma mucho tiempo para realizar el reporte (donde toma más tiempo, es en la lectura de la MSEG: 10 millones y sigue en aumento), qué me recomendarían para mejorar. Les pongo el código. Les agradezco de antemano.
concatenate P_GJAHR '.' P_MONAT '.' '01' into v_fecha3.
data: data type DATE8,
data2 type DATE8,
sigo(1) type c.
sigo = 's'.
while sigo eq 's'.
replace '.' with '' into v_fecha3.
if sy-subrc ne 0.
sigo = 'n'.
endif.
endwhile.
condense v_fecha3 NO-GAPS.
data = v_fecha3. "Fecha actual
CALL FUNCTION 'ADD_TIME_TO_DATE'
EXPORTING
i_idate = data
i_time = '-1' "Número de meses a sumar
i_iprkz = '2'
I_RDMHD = '-' " Aquí se le indica el signo + o -
IMPORTING
o_idate = v_fecha "Fecha mes anterior
EXCEPTIONS
invalid_period = 1
invalid_round_up_rule = 2
internal_error = 3
OTHERS = 4.
CALL FUNCTION 'ADD_TIME_TO_DATE'
EXPORTING
i_idate = data
i_time = '1' "Número de meses a sumar
i_iprkz = '2'
I_RDMHD = '-' " Aquí se le indica el signo + o -
IMPORTING
o_idate = v_fecha2 " Fecha mes posterior
EXCEPTIONS
invalid_period = 1
invalid_round_up_rule = 2
internal_error = 3
OTHERS = 4.
* Acá tengo que leer 2 veces la mseg para sacar el consumo, del mes actual y el mes anterior, xq no
*encontraba como discriminarlos después, haciendo una sola lectura de los 2 meses.
*La MSEG tiene 10 millones de registros y la MARA 20000
SELECT MARA~MATNR DMBTR INTO TABLE GTI_CONSUMO
FROM ( MARA INNER JOIN MSEG ON MARA~MATNR = MSEG~MATNR INNER JOIN MKPF ON MSEG~MBLNR = MKPF~MBLNR
AND MSEG~MJAHR = MKPF~MJAHR )
WHERE MARA~MATNR in S_MATNR
AND MATKL LIKE J
AND BUDAT >= v_fecha AND BUDAT < data
AND WERKS = 'CD01'
AND LGORT = '1001'
AND ( BWART = '641' OR BWART = '251' ).
"AND ( BWART = '561' OR BWART = '901' ).
SORT GTI_CONSUMO BY MATNR.
LOOP AT GTI_CONSUMO into WA_CONSUMO.
move-CORRESPONDING WA_CONSUMO to GTI_CONSUMO2.
collect GTI_CONSUMO2.
ENDLOOP.
SELECT MARA~MATNR DMBTR INTO TABLE GTI_CONSUMO3
FROM ( MARA INNER JOIN MSEG ON MARA~MATNR = MSEG~MATNR INNER JOIN MKPF ON MSEG~MBLNR = MKPF~MBLNR
AND MSEG~MJAHR = MKPF~MJAHR )
WHERE MARA~MATNR in S_MATNR
AND MATKL LIKE J
AND BUDAT >= data AND BUDAT < v_fecha2
AND WERKS = 'CD01'
AND LGORT = '1001'
AND ( BWART = '641' OR BWART = '251' ).
"AND ( BWART = '561' OR BWART = '901' ).
SORT GTI_CONSUMO3 BY MATNR.
CLEAR WA_CONSUMO.
LOOP AT GTI_CONSUMO3 into WA_CONSUMO.
move-CORRESPONDING WA_CONSUMO to GTI_CONSUMO4.
collect GTI_CONSUMO4.
ENDLOOP.
Comentario