Ver Mensaje Individual
  #3  
Viejo 07/03/08, 15:47:11
larmadovr larmadovr is offline
Member
 
Fecha de Ingreso: ene 2008
Localización: Monterrey N.L. México
Mensajes: 77
Thumbs up ok, aqui va más performance.

Uno de los principales problemas en los tiempos de un reporte es la cantidad de veces que sea accesa a la BD, y como tu tenías un ciclo el cual contenía select's pues lo hacía lentísimo, pero aquí te mando un ejemplo de tu mismo código pero con otra lógica en el proceso de la información en la cuál primero traemos los datos y después ordenamos de acuerdo a que tu tabla t_datos se poble.

Es más barato trabajar en abap que accesar a la BD.

Espero que baje mucho el tiempo, y para eso puedes entrar a la SE30 y desde ahí ejecutar tu transacción, y mides los tiempos antes y despues de el cambio que aqui anexo:

REPORT ZRFI_ANT_SAL_PROV LINE-SIZE 163 NO STANDARD PAGE HEADING.
TABLES: BKPF,
BSEG,
LFA1.
*----------------------------------------------------------------------*
* Definición de Parámetros y Select-Options *
*----------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK sele WITH FRAME TITLE text-t02.
PARAMETERS: S_BUKRS LIKE BKPF-BUKRS OBLIGATORY default 'AL00',
S_BELNR LIKE BKPF-BELNR default '*',
S_LIFNR LIKE BSEG-LIFNR MATCHCODE object ZSH_001
default '*',
S_BLART LIKE BKPF-BLART default 'PL',
S_GJAHR LIKE BKPF-GJAHR,
S_DATUM LIKE SY-DATUM OBLIGATORY default SY-DATUM.
SELECTION-SCREEN END OF BLOCK sele.
*----------------------------------------------------------------------*
* Definición de Tablas Internas y Estructuras *
*----------------------------------------------------------------------*
DATA: BEGIN OF T_BSEG OCCURS 0,
BUKRS LIKE BSEG-BUKRS,
BELNR LIKE BSEG-BELNR,
MWSKZ LIKE BSEG-MWSKZ,
WRBTR LIKE BSEG-WRBTR,
ZUONR LIKE BSEG-ZUONR,
XOPVW LIKE BSEG-XOPVW,
LIFNR LIKE BSEG-LIFNR,
END OF T_BSEG.

DATA: BEGIN OF T_BKPF_BSIK OCCURS 0,
BELNR LIKE BKPF-BELNR,
BLART LIKE BKPF-BLART,
BLDAT LIKE BKPF-BLDAT,
WAERS LIKE BKPF-WAERS,
ZFDBT LIKE BSIK-ZFBDT,
ZTERM LIKE BSIK-ZTERM,
END OF T_BKPF_BSIK.

DATA: BEGIN OF T_LFA1 OCCURS 0,
LIFNR LIKE LFA1-LIFNR,
NAME1 LIKE LFA1-NAME1,
END OF T_LFA1.

DATA: BEGIN OF T_DATOS OCCURS 0,
BUKRS LIKE BSEG-BUKRS, "COMPANY
ZUONR LIKE BSEG-ZUONR, "ASSIGMENT
XOPVW LIKE BSEG-XOPVW, "DOCUMENTO ABIERO O NO
WRBTR LIKE BSEG-WRBTR, "MONTO REAL EN LA FACTURA
MWSKZ LIKE BSEG-MWSKZ, "APLICACION DE IVA?
LIFNR LIKE BSEG-LIFNR, "PROVEEDOR
BELNR LIKE BSEG-BELNR, "NO. DOCUMENTO GENERADO POR SAP
BLART LIKE BKPF-BLART, "TIPO DE DOCUMENTO
BLDAT LIKE BKPF-BLDAT, "FECHA DE CARGA EN SAP
WAERS LIKE BKPF-WAERS, "TIPO DE MONEDA EN LA FACTURA
ZFBDT LIKE BSIK-ZFBDT, "FECHA EN FACTURA
ZTERM LIKE BSIK-ZTERM, "TERMINOS DE PAGO
NAME1 LIKE LFA1-NAME1, "DESCRIPCION PROVEEDOR
NETDU LIKE BKPF-BLDAT, "FECHA LIMITE DE PAGO
DIASV LIKE BKPF-GJAHR, "DIAS VENCIDOS
SATOT LIKE BSEG-WRBTR, "TOTAL DE DOCUMENTO
END OF T_DATOS.

DATA: LT_DATOS LIKE LINE OF T_DATOS.
DATA: L_OUT_DATE LIKE SY-DATUM.
DATA: DIFF_D TYPE I.
*----------------------------------------------------------------------*
* Variables *
*----------------------------------------------------------------------*
DATA: CONTADOR TYPE I.
DATA: CONTADOR2 TYPE I.
DATA: CONTADOR3 TYPE I.
DATA: CONTADOR4 TYPE I.
*----------------------------------------------------------------------*
* Evento Iniatialization *
*----------------------------------------------------------------------*
START-OF-SELECTION.
PERFORM OBTENER_DATOS.
PERFORM IMPRIMIR_DATOS.
*----------------------------------------------------------------------*
* Funciones *
*----------------------------------------------------------------------*

*----------------------------------------------------------------------*
* Forms *
*----------------------------------------------------------------------*
* Form OBTENER_DATOS *
*----------------------------------------------------------------------*
Form OBTENER_DATOS.

* 1.- Obtiene informacion de BSEG
SELECT BUKRS BELNR MWSKZ WRBTR ZUONR XOPVW LIFNR
INTO TABLE T_BSEG
FROM BSEG
WHERE BUKRS EQ S_BUKRS
AND BELNR EQ S_BELNR
AND LIFNR EQ S_LIFNR
AND XOPVW EQ 'X'.

* 2.- Obtiene informacion de BKPF y de BSIK basado en BSEG
IF SY-SUBRC EQ 0. " Si hay registros en BSEG

SELECT BKPF~BELNR BKPF~BLART BKPF~BLDAT BKPF~WAERS
BSIK~ZFBDT BSIK~ZTERM
INTO TABLE T_BKPF_BSIK
FROM BKPF
INNER JOIN BSIK
ON BKPF~BUKRS EQ BSIK~BUKRS
AND BKPF~BELNR EQ BSIK~BELNR
AND BKPF~GJAHR EQ BSIK~GJAHR
FOR ALL ENTRIES IN T_BSEG
WHERE BKPF~BUKRS EQ T_BSEG-BUKRS
AND BKPF~BELNR EQ T_BSEG-BELNR
AND BKPF~GJAHR EQ S_GJAHR
AND BKPF~BLART EQ S_BLART.

* 3.- Obtiene información de LFA1 basado en BSEG
SELECT LIFNR NAME1
INTO TABLE T_LFA1
FROM LFA1
FOR ALL ENTRIES IN T_BSEG
WHERE LIFNR EQ T_BSEG-LIFNR.

ENDIF.

*----------------------------------------------------------------------*
* Procesa datos
*----------------------------------------------------------------------*

* Recorre t_bseg para poblar t_datos
LOOP AT T_BSEG.

MOVE: T_BSEG-BUKRS TO T_DATOS-BUKRS,
T_BSEG-ZUONR TO T_DATOS-ZUONR,
T_BSEG-XOPVW TO T_DATOS-XOPVW,
T_BSEG-WRBTR TO T_DATOS-WRBTR,
T_BSEG-MWSKZ TO T_DATOS-MWSKZ,
T_BSEG-LIFNR TO T_DATOS-LIFNR,
T_BSEG-BELNR TO T_DATOS-BELNR,
T_BSEG-WRBTR TO T_DATOS-WRBTR.

* Lee de la tabla T_BKPF_BSIK datos que faltan para t_datos
READ TABLE T_BKPF_BSIK WITH KEY BELNR = T_BSEG-BELNR.
IF SY-SUBRC EQ 0.
MOVE: T_BKPF_BSIK-BLART TO T_DATOS-BLART,
T_BKPF_BSIK-BLDAT TO T_DATOS-BLDAT,
T_BKPF_BSIK-WAERS TO T_DATOS-WAERS,
T_BKPF_BSIK-BLDAT TO T_DATOS-BLDAT,
T_BKPF_BSIK-ZTERM TO T_DATOS-ZTERM.
ENDIF.

* Lee de la tabla T_LFA1 datos que faltan para t_datos
READ TABLE T_LFA1 WITH KEY LIFNR = T_BSEG-LIFNR.
IF SY-SUBRC EQ 0.
MOVE: T_LFA1-NAME1 TO T_DATOS-NAME1.
ENDIF.

APPEND T_DATOS. " Agrega registros compleatados
CLEAR: T_BSEG, T_BKPF_BSIK, T_LFA1. " Limpia cabeceras

ENDLOOP.

**----------------------------------------------------------------------
LOOP AT T_DATOS.
CONTADOR4 = SY-TABIX.
*PERFORM ADD_TIME.
PERFORM DAYS.
*T_DATOS-NETDU = L_OUT_DATE.
T_DATOS-DIASV = DIFF_D.
T_DATOS-SATOT = T_DATOS-WRBTR.
MODIFY T_DATOS INDEX CONTADOR4.
ENDLOOP.
ENDFORM.
*----------------------------------------------------------------------*
* Form IMPRIMIR_DATOS *
*----------------------------------------------------------------------*
FORM IMPRIMIR_DATOS.
WRITE: /5 'REPORTE DE PAGO A PROVEEDORES' COLOR 1 ON.
WRITE: 135 'FECHA ACTUAL : ' INVERSE COLOR 6, SY-DATUM INVERSE COLOR 6,
SY-ULINE.
SKIP 2.
* WRITE: /2 'COMPAÑIA',
* 'PROVEEDOR',
* 'NOMBRE PROVEEDOR',
* 'ASSIGMENT',
* 'NO. DOC',
* 'TIPO DE DOC',
* 'POSTING DATE',
* 'MONTO EN FACT',
* 'MONEDA FACT',
* 'IVA',
* 'FECHA EN FACT',
* 'TERMINOS',
* 'FECHA LIMITE',
* 'DIAS VENCIDOS',
* 'TOTAL DOC'.
LOOP AT T_DATOS.
SORT T_DATOS BY LIFNR.
IF T_DATOS-LIFNR <> '00000'.
MOVE T_DATOS TO LT_DATOS.
*CADA CAMBIO DE PROVEEDOR
*AT NEW LIFNR.
WRITE: /2 LT_DATOS-BUKRS,
8 LT_DATOS-LIFNR,
15 LT_DATOS-NAME1,
/2 LT_DATOS-ZUONR,
LT_DATOS-BELNR,
* LT_DATOS-XOPVW,
LT_DATOS-BLART,
LT_DATOS-BLDAT,
LT_DATOS-WRBTR,
LT_DATOS-WAERS,
LT_DATOS-MWSKZ,
LT_DATOS-ZFBDT,
LT_DATOS-ZTERM,
LT_DATOS-NETDU,
LT_DATOS-DIASV,
LT_DATOS-SATOT INVERSE COLOR 2.
SKIP 1.
*ENDAT.
**AL FINAL DE CADA PROVEEDOR
AT END OF LIFNR.
SUM.
WRITE: /78 'MONTO TOTAL DEL PROVEEDOR:',
104 LT_DATOS-WRBTR COLOR 2 ON.
SKIP 1.
ENDAT.
***AL FINAL DE LOS PROVEEDORES
**AT LAST.
**SUM.
**SKIP 2.
**WRITE: /80 'M O N T O T O T A L A P A G A R:' INVERSE COLOR 6,
**120 ZAV_REPORTE-MONTO INVERSE COLOR 6.
**ENDAT.
ENDIF.
ENDLOOP.
ENDFORM.
*---------------------------------------------------------------------*
* Form de FUNCION PARA AGREGAR LOS TERMINOS O DIAS DE PLAZO ALA FECHA *
* DE FACTURACION *
*---------------------------------------------------------------------*
FORM ADD_TIME.
CALL FUNCTION 'ADD_TIME_TO_DATE'
EXPORTING
I_IDATE = T_DATOS-ZFBDT
I_TIME = T_DATOS-ZTERM
I_IPRKZ = '' " ''=Day, 1=Week, 2=Month ,3 = Year
IMPORTING
O_IDATE = L_OUT_DATE
EXCEPTIONS
INVALID_PERIOD = 01
INVALID_ROUND_UP_RULE = 02
INTERNAL_ERROR = 03 .
ENDFORM.
*---------------------------------------------------------------------*
* Form FUNCION PARA DETERMINAR CUANTOS DIAS LLEVA VENCIDA LA FACTURA *
*---------------------------------------------------------------------*
FORM DAYS.
CALL FUNCTION 'DAYS_BETWEEN_TWO_DATES'
EXPORTING
I_DATUM_BIS = S_DATUM
I_DATUM_VON = T_DATOS-ZFBDT
IMPORTING
E_TAGE = DIFF_D
EXCEPTIONS
DAYS_METOD_NOT_DEFINED = 1
OTHERS = 2.
ENDFORM.
*---------------------------------------------------------------------*


Recibe un cordial saludo.
__________________
I.S.C.T. Luis Armando Valdez Rodríguez
Consultor ABAP
correo:
cel: (045) 5537406023

"La vida premia la acción"
Responder Con Cita