You are on page 1of 15

Organización y

Sistemas de Información

Mejoras de Rendimiento en ABAP

MEJORAS DE RENDIMIENTO
ABAP

Documento: ABAP performance Autor: Xavier Montolío


Creado: 30/04/aa Modificado: 30/04/aa Página 1 de 14
Toda la información amparada por el presente documento se considera propiedad intelectual de Burberry (Spain), S.A. y como tal no puede ser copiada o puesta a disposición de
personas distintas a quien se determine, salvo aprobación expresa de la dirección de la empresa.
Organización y
Sistemas de Información

Mejoras de Rendimiento en ABAP

Índice

1.-Tratamiento de tablas internas...................................................................................................................3


1.1.- READ TABLE (HASH)....................................................................................................................3
1.2.- READ TABLE … TRANSPORTING fields / NO FIELDS.............................................................3
1.3.- Copias de tablas internas y eliminación de duplicados.....................................................................3
1.4.- Tratamiento masivo de tablas internas. LOOP, AT NEW, AT END OF............................................4
1.5.- Evitar COLLECT..............................................................................................................................5
1.6.- INSERT LINES / APPEND LINES / DELETE LINES....................................................................6
1.7.- Modificación de tabla interna con puntero........................................................................................7

2.-Accesos a Base de datos..........................................................................................................................10


2.1.-Evitar SELECT *..............................................................................................................................10
2.2.-Indicar en el WHERE campos de la clave........................................................................................10
2.3.-Evitar SELECT-ENDSELECT.........................................................................................................10
2.4.- No efectuar muchos accesos mediante SELECT SINGLE.............................................................10
2.5.- Desigualdades en WHERE..............................................................................................................13
2.6.- JOIN: Tener en cuenta volúmenes...................................................................................................14

3.-Rutinas FORM........................................................................................................................................15
4.-Módulos de función standards.................................................................................................................15

Documento: ABAP performance Autor: Xavier Montolío


Creado: 30/04/aa Modificado: 30/04/aa Página 2 de 14
Toda la información amparada por el presente documento se considera propiedad intelectual de Burberry (Spain), S.A. y como tal no puede ser copiada o puesta a disposición de
personas distintas a quien se determine, salvo aprobación expresa de la dirección de la empresa.
Organización y
Sistemas de Información

Mejoras de Rendimiento en ABAP

1.-Tratamiento de tablas internas

1.1.- READ TABLE (HASH)

Las tablas internas que deban ser accedidas frecuentemente con READ TABLE, es conveniente definirlas
como tablas HASH, ya que de esta manera el acceso directo a ellas es más rápido. Además, si se necesita
acceder con LOOP-ENDLOOP el rendimiento no se ve penalizado significativamente.

Para definir una tabla interna hash, por ejemplo:

DATA: BEGIN OF ty_resb,


rsnum LIKE resb-rsnum,
aufnr LIKE resb-aufnr,
matnr LIKE resb-matnr,
bdmng LIKE resb-bdmng,
enmng LIKE resb-enmng,
END OF ty_resb.
DATA: it_resb LIKE HASHED TABLE OF ty_resb
WITH UNIQUE KEY rsnum aufnr matnr
WITH HEADER LINE.

READ TABLE it_resb WITH TABLE KEY rsnum = it_aufnr_rsnum-rsnum
aufnr = it_aufnr_rsnum-aufnr
matnr = <f1>-matnr_mp.

1.2.- READ TABLE … TRANSPORTING fields / NO FIELDS

Cuando se realiza un acceso directo a una tabla interna, se mejora el rendimiento si únicamente se
especifican qué campos de la tabla interna se desean obtener, o en caso de simplemente necesitar saber
que exista una entrada, no traer ningún campo con la adición TRANSPORTING NO FIELDS.

Ejemplo: Con la definición del punto anterior sólo necesitamos las cantidades.

READ TABLE it_resb WITH TABLE KEY rsnum = it_aufnr_rsnum-rsnum


aufnr = it_aufnr_rsnum-aufnr
matnr = <f1>-matnr_mp
TRANSPORTING bdmng enmng.

1.3.- Copias de tablas internas y eliminación de duplicados

Ejemplo:
It_vbap_destino[] = it_vbap_fuente[].
DELETE ADJACENT DUPLICATES FROM it_vbap_destino COMPARING werks.

Para copiar tablas internas es muy eficiente t1[] = t2[]. No hace falta que las dos tablas tengan la misma
definición y ni siquiera la misma longitud. Si la tabla interna de destino es más corta, simplemete la
trunca. Esto nos permite, como se ve en el ejemplo, saber cuántos centros diferentes hay en las posiciones
de pedido de la tabla interna.

Documento: ABAP performance Autor: Xavier Montolío


Creado: 30/04/aa Modificado: 30/04/aa Página 3 de 14
Toda la información amparada por el presente documento se considera propiedad intelectual de Burberry (Spain), S.A. y como tal no puede ser copiada o puesta a disposición de
personas distintas a quien se determine, salvo aprobación expresa de la dirección de la empresa.
Organización y
Sistemas de Información

Mejoras de Rendimiento en ABAP

1.4.- Tratamiento masivo de tablas internas. LOOP, AT NEW, AT END OF.

Si una tabla interna tiene una cierta estructura por la cual se repite el mismo valor para un determinado
campo, podemos agrupar las operaciones que utilizan ese campo como parámetro con el fin de reducir el
número de veces que se realizan esas operaciones. Para ello es necesario que los campos por los cuales se
quiere agrupar estén definidos al principio de la estructura y ordenar la tabla por estos campos.
IMPORTANTE: No funciona con LOOP – WHERE.

Ejemplo: Comprobar que dados una tabla interna de productos acabados, que existe la familia modelo en
la tabla ZMODELO para la temporada del parámetro de selección.

DATA: i_relacion LIKE TABLE OF zmm02 WITH HEADER LINE.


DATA: i_relacion_aux LIKE TABLE OF i_relacion WITH HEADER LINE.
DATA: it_zmodelo LIKE HASHED TABLE OF zmodelo
WITH UNIQUE KEY famcon modelo
WITH HEADER LINE.
DATA: BEGIN OF t_fam_mod OCCURS 0,
famcon LIKE zmodelo-famcon,
modelo LIKE zmodelo-modelo,
END OF t_fam_mod.
DATA: lin TYPE i.
DATA: x_found(1) TYPE c.
…..
Se obtienen las relaciones en i_relacion
…..
SELECT famcon modelo
FROM zmodelo
INTO CORRESPONDING FIELDS OF TABLE it_zmodelo
WHERE ztemp = p_temp.

SORT i_relacion BY matnr_pa.


LOOP AT i_relacion.
AT NEW matnr_pa.
READ TABLE it_zmodelo
WITH TABLE KEY famcon = i_relacion-matnr_pa(3)
modelo = i_relacion-matnr_pa+3(3)
TRANSPORTING NEW FIELDS.
IF sy-subrc = 0.
x_found = 'X'.
ELSE.
x_found = ' '.
ENDIF.
ENDAT.
IF x_found = 'X'.
APPEND i_relacion TO i_relacion2.
ENDIF.
ENDLOOP.
i_relacion[] = i_relacion2[].

Documento: ABAP performance Autor: Xavier Montolío


Creado: 30/04/aa Modificado: 30/04/aa Página 4 de 14
Toda la información amparada por el presente documento se considera propiedad intelectual de Burberry (Spain), S.A. y como tal no puede ser copiada o puesta a disposición de
personas distintas a quien se determine, salvo aprobación expresa de la dirección de la empresa.
Organización y
Sistemas de Información

Mejoras de Rendimiento en ABAP

1.5.- Evitar COLLECT

Para acumular los campos númericos de una tabla interna, a efectos de rendimiento es preferible no
utilizar la instrucción COLLECT, ya que es bastante ineficiente. En lugar de ello se propone crear una
nueva tabla interna y utilizar la ténica anterior, es decir ordenar los campos clave, y recorrer la tabla para
ir acumulando cantidades para al final de recorrer una clave, crear una nueva entrada en la nueva tabla.

Ejemplo:
DATA: it_consumo LIKE zmm02 OCCURS 0 WITH HEADER LINE.

DATA: wa_consumo LIKE it_consumo.


DATA: x_menge LIKE it_consumo-menge.
SORT it_consumo BY matnr_pa matnr_mp.
CLEAR x_menge.
LOOP AT it_consumo.
MOVE-CORRESPONDING it_consumo TO wa_consumo.
x_menge = x_menge + wa_consumo-menge.
AT END OF matnr_mp.
it_ex_pamp-matnr_pa = wa_consumo-matnr_pa.
it_ex_pamp-matnr_mp = wa_consumo-matnr_mp.
it_ex_pamp-menge = x_menge.
it_ex_pamp-meins = wa_consumo-meins.
APPEND it_ex_pamp.
CLEAR x_menge.
ENDAT.
ENDLOOP.

Documento: ABAP performance Autor: Xavier Montolío


Creado: 30/04/aa Modificado: 30/04/aa Página 5 de 14
Toda la información amparada por el presente documento se considera propiedad intelectual de Burberry (Spain), S.A. y como tal no puede ser copiada o puesta a disposición de
personas distintas a quien se determine, salvo aprobación expresa de la dirección de la empresa.
Organización y
Sistemas de Información

Mejoras de Rendimiento en ABAP

1.6.- INSERT LINES / APPEND LINES / DELETE LINES

Cuando se puedan efectuar tratamientos masivos de tablas internas siempre es más eficiente que efectuar
un tratamiento secuencial (LOOP).

Ejemplo1: Borrar líneas que no cumplen desigualdades.

Sólo queremos CHARG >= ‘5555500000’ y CHARG < ‘5555599999’.

SORT it_vbap BY charg.


LOOP AT it_vbap WHERE CHARG >= ‘5555500000’.
EXIT.
ENDLOOP.
IND1 = SY-TABIX.

LOOP AT it_vbap WHERE CHARG >= ‘5555599999’.


EXIT.
ENDLOOP.
IND2 = SY-TABIX - 1.

IF IND1 NE 0.
IF IND2 <= 0.
DESCRIBE TABLE it_vbap LINES IND2.
ENDIF.
APPEND LINES OF it_vbap FROM ind1 TO ind2 TO it_vbap_aux.
ENDIF.
It_vbap[] = It_vbap_aux[].

Documento: ABAP performance Autor: Xavier Montolío


Creado: 30/04/aa Modificado: 30/04/aa Página 6 de 14
Toda la información amparada por el presente documento se considera propiedad intelectual de Burberry (Spain), S.A. y como tal no puede ser copiada o puesta a disposición de
personas distintas a quien se determine, salvo aprobación expresa de la dirección de la empresa.
Organización y
Sistemas de Información

Mejoras de Rendimiento en ABAP

1.7.- Modificación de tabla interna con puntero.

Para modificar un campo en una tabla interna, es mucho más eficiente asignar cada iteración a un puntero,
de manera que al modificar el puntero también modificamos el contenido de la tabla interna. Esto es más
rápido que hacer un LOOP donde en cada iteración hacemos un MODIFY.

Ejemplo 1: Conseguir códigos de material a partir tablas ZMODELO, ZRELCOL, ZTALLAS.

SELECT r~clase m~famcon m~modelo


r~codigo r~serie r~color1 r~posic r~color2
t~talla2
FROM ( zmodelo as m INNER JOIN zrelcol as r
ON m~modelo = r~modelo )
INNER JOIN ztallas as t
ON m~tallaje = t~tallaje
INTO CORRESPONDING FIELDS OF TABLE it_zmodelo_zrelcol
WHERE m~ztemp = p_tempo
AND m~famcon IN s_fam
AND r~temporada = p_tempo
AND t~famcon = space.
CHECK sy-subrc = 0.

SORT it_zmodelo_zrelcol BY clase.


LOOP AT it_zmodelo_zrelcol ASSIGNING <f_zmodelo_zrelcol>.
<f_zmodelo_zrelcol>-matnr_pa(3) = <f_zmodelo_zrelcol>-famcon.
<f_zmodelo_zrelcol>-matnr_pa+3(3) = <f_zmodelo_zrelcol>-modelo.
<f_zmodelo_zrelcol>-matnr_pa+6(1) = <f_zmodelo_zrelcol>-codigo.
<f_zmodelo_zrelcol>-matnr_pa+7(5) = <f_zmodelo_zrelcol>-serie.
<f_zmodelo_zrelcol>-matnr_pa+12(4) = <f_zmodelo_zrelcol>-color1.
<f_zmodelo_zrelcol>-matnr_pa+16(2) = <f_zmodelo_zrelcol>-talla1.
ENDLOOP.

Documento: ABAP performance Autor: Xavier Montolío


Creado: 30/04/aa Modificado: 30/04/aa Página 7 de 14
Toda la información amparada por el presente documento se considera propiedad intelectual de Burberry (Spain), S.A. y como tal no puede ser copiada o puesta a disposición de
personas distintas a quien se determine, salvo aprobación expresa de la dirección de la empresa.
Organización y
Sistemas de Información

Mejoras de Rendimiento en ABAP

Ejemplo 2: Determinar el número de entrega a partir del lote y la temporada. Luego es mucho más rápido
acceder a la VBAP con la entrega que con material y lote.

FIELD-SYMBOLS: <f_s> LIKE i_zdata.

IF ( p_tempo-low(2) = 'OI' ) AND ( p_tempo-high(2) = 'PV' ).


l_otono = p_tempo-low.
l_primavera = p_tempo-high.
ELSEIF ( p_tempo-low(2) = 'OI' ) AND ( p_tempo-high(2) = '' ).
l_otono = p_tempo-low.
ELSEIF ( p_tempo-low(2) = 'PV' ) AND ( p_tempo-high(2) = '' ).
l_primavera = p_tempo-low.
ENDIF.

LOOP AT i_zdata ASSIGNING <f_s>.


IF <f_s>-werks+2(2) = 'OI'.
IF NOT l_otono IS INITIAL.
<f_s>-tempo = l_otono.
IF <f_s>-charg NE 'STOCK'.
<f_s>-vbeln(4) = '5555'.
<f_s>-vbeln+4(6) = <f_s>-charg(6).
ENDIF.
ELSE.
CLEAR: <f_s>-tempo.
ENDIF.
ELSEIF <f_s>-werks+2(2) = 'PV'.
IF NOT l_primavera IS INITIAL.
<f_s>-tempo = l_primavera.
IF <f_s>-charg NE 'STOCK'.
<f_s>-vbeln(4) = '0000'.
<f_s>-vbeln+4(6) = <f_s>-charg(6).
ENDIF.
ELSE.
CLEAR: <f_s>-tempo.
ENDIF.
ENDIF.
ENDLOOP.

Documento: ABAP performance Autor: Xavier Montolío


Creado: 30/04/aa Modificado: 30/04/aa Página 8 de 14
Toda la información amparada por el presente documento se considera propiedad intelectual de Burberry (Spain), S.A. y como tal no puede ser copiada o puesta a disposición de
personas distintas a quien se determine, salvo aprobación expresa de la dirección de la empresa.
Organización y
Sistemas de Información

Mejoras de Rendimiento en ABAP

Ejemplo3: Ejemplo del apartado 1.4 pero con puntero.

DATA: BEGIN OF i_relacion OCCURS 0.


INCLUDE STRUCTURE zmm02.
DATA: BORRAR (1) TYPE C,
END OF i_relacion.
DATA: i_relacion_aux LIKE TABLE OF i_relacion WITH HEADER LINE.
DATA: it_zmodelo LIKE HASHED TABLE OF zmodelo
WITH UNIQUE KEY famcon modelo
WITH HEADER LINE.
DATA: BEGIN OF t_fam_mod OCCURS 0,
famcon LIKE zmodelo-famcon,
modelo LIKE zmodelo-modelo,
END OF t_fam_mod.
DATA: lin TYPE i.
DATA: x_found(1) TYPE c.
FIELD-SYMBOLS: <F> LIKE I_RELACION.
…..
Se obtienen las relaciones en i_relacion
…..
SELECT famcon modelo
FROM zmodelo
INTO CORRESPONDING FIELDS OF TABLE it_zmodelo
WHERE ztemp = p_temp.

t_fam_mod[] = i_relacion[].
SORT t_fam_mod.
DELETE ADJACENT DUPLICATES FROM t_fam_mod.
DESCRIBE TABLE t_fam_mod LINES lin.
IF lin = 0.
REFRESH i_relacion.
ELSE.
SORT i_relacion BY matnr_pa.
LOOP AT i_relacion ASSIGNING <F>.
AT NEW matnr_pa.
READ TABLE it_zmodelo
WITH TABLE KEY famcon = <F>-matnr_pa(3)
modelo = <F>-matnr_pa+3(3).
IF sy-subrc = 0.
x_found = 'X'.
ELSE.
x_found = ' '.
ENDIF.
ENDAT.
IF x_found = 'X'.
<F>-borrar = ‘ ‘.
ELSE.
<F>-borrar = ‘X‘.
ENDIF.
ENDLOOP.
DELETE i_relacion WHERE borrar = ‘X’.
ENDIF.

Documento: ABAP performance Autor: Xavier Montolío


Creado: 30/04/aa Modificado: 30/04/aa Página 9 de 14
Toda la información amparada por el presente documento se considera propiedad intelectual de Burberry (Spain), S.A. y como tal no puede ser copiada o puesta a disposición de
personas distintas a quien se determine, salvo aprobación expresa de la dirección de la empresa.
Organización y
Sistemas de Información

Mejoras de Rendimiento en ABAP

2.-Accesos a Base de datos


2.1.-Evitar SELECT *.

Cuando se efectúa una instrucción de acceso a Base de Datos, independientemente de si se trata de un


SELECT SINGLE, un SELECT – ENDSELECT o un SELECT INTO TABLE, se debe delimitar al
máximo que campos se desean extraer de la tabla, sobretodo si la tabla tiene muchos campos.

2.2.-Indicar en el WHERE campos de la clave.

En la clásula WHERE de una sentencia ABAP SELECT, siempre que fuera posible se deben seguir las
siguientes pautas:
 Si es posible acceder por la clave primaria es lo mejor.
 Si no, intentar acceder por algún índice de base de datos de la tabla. Si no se pudieran indicar todos
los campos de un índice, es importante al menos no saltarse los primeros.
 Utilizar siempre que sea posible el operador de igualdad (=), o como mínimo el operador IN. Se debe
intentar evitar los patrones (*), las negaciones (NOT) y las desigualdades (>,<,…).

2.3.-Evitar SELECT-ENDSELECT.

Utilizar SELECT INTO TABLE para después recorrer las entradas con un LOOP-ENDLOOP.

2.4.- No efectuar muchos accesos mediante SELECT SINGLE.

Siempre que estemos dentro de una iteración (un bucle) que vaya a recorrerse muchas veces, no se debe
utilizar intrucciones SELECT SINGLE, ya que ello implica que cada vez de debe abrir un cursor de base
de datos y que se puede repetir muchas veces el mismo acceso.
Para sustituir un SELECT SINGLE lo que se puede hacer es un SELECT INTO TABLE justo antes de
iniciar el bucle para luego dentro del bucle obtener los datos mediante la instrucción READ TABLE.
Normalmente el select single es dependiente de los datos que se están recorriendo, por tanto para la
lectura inicial de base de datos se utiliza la adición FOR ALL ENTRIES para obtener sólo aquellas
entradas que luego serán accedidas.
Para que los accesos dentro del bucle sean más eficientes, es conveniente definir la tabla interna como
una tabla HASH, de manera que la intrucción de lectura sería:
READ TABLE tabla WITH TABLE KEY clave = valor,
en lugar de
READ TABLE tabla WITH KEY clave = valor.

IMPORTANTE: Cuando se hace un SELECT FOR ALL ENTRIES se deben tener en cuenta los
siguientes aspectos:
 La tabla interna de referencia debe de estar definida como una estructura, es decir, no es válida una
definición del tipo: DATA: it_matnr like table of mara-matnr. En cambio SÍ es válida la siguiente:
DATA: BEGIN OF it_matnr OCCURS 0,
matnr like mara-matnr,
END OF it_matnr.
 La tabla de referencia no debería tener duplicados con la clave de acceso.
Ejemplo:
Si accedemos a la VBAP por MATNR y WERKS, (la tabla de referencia debe tener como
mínimo estos dos campos) antes de hacer el SELECT se deberían borrar los duplicados de la
siguiente manera:

Documento: ABAP performance Autor: Xavier Montolío


Creado: 30/04/aa Modificado: 30/04/aa Página 10 de 14
Toda la información amparada por el presente documento se considera propiedad intelectual de Burberry (Spain), S.A. y como tal no puede ser copiada o puesta a disposición de
personas distintas a quien se determine, salvo aprobación expresa de la dirección de la empresa.
Organización y
Sistemas de Información

Mejoras de Rendimiento en ABAP

DELETE ADJACENT DUPLICATES FROM tabla_interna COMPARING matnr werks.


 Antes de ejecutar la SELECT FOR ALL ENTRIES, se debe comprobar que la tabla de referencia
tiene al menos una entrada, ya que en caso contario considera que son todas las entradas posibles
(como un SELECT-OPTION).
Por ejemplo: DESCRIBE TABLE tabla_referencia LINES LIN.
CHECK LIN > 0.
 No es posible usar funciones de agregación (SUM, MAX,…) en el SELECT cuando se usa la adición
FOR ALL ENTRIES. Esto implica que en la lista de campos que se seleccionan deberían siempre
aparecer todos los campos clave. Esto es importante ya que si no están todos los campos clave
entonces no todas las entradas de la tabla que cumplen las condiciones de selección serán tomandos.
Si se desean agregaciones se debe recorrer la tabla que devuelve el SELECT para crear una nueva
con los campos agregados.

 Se deberían incluir todos los campos clave de la tabla en la cláusula SELECT, con el fin de no perder
entradas, ya que la Base de datos efectúa un SELECT DISTINCT.

Documento: ABAP performance Autor: Xavier Montolío


Creado: 30/04/aa Modificado: 30/04/aa Página 11 de 14
Toda la información amparada por el presente documento se considera propiedad intelectual de Burberry (Spain), S.A. y como tal no puede ser copiada o puesta a disposición de
personas distintas a quien se determine, salvo aprobación expresa de la dirección de la empresa.
Organización y
Sistemas de Información

Mejoras de Rendimiento en ABAP

Ejemplo 1:
REPORT zxmm1.
DATA: i_relacion LIKE TABLE OF zmm02 WITH HEADER LINE.
DATA: i_relacion2 LIKE TABLE OF zmm02 WITH HEADER LINE.
DATA: i_relacion_aux LIKE TABLE OF i_relacion WITH HEADER LINE.
DATA: it_zmodelo LIKE HASHED TABLE OF zmodelo
WITH UNIQUE KEY famcon modelo
WITH HEADER LINE.
DATA: BEGIN OF t_fam_mod OCCURS 0,
famcon LIKE zmodelo-famcon,
modelo LIKE zmodelo-modelo,
END OF t_fam_mod.
DATA: lin TYPE i.
DATA: x_found(1) TYPE c.

TABLES: marc.
PARAMETERS: p_tempo LIKE zmodelo-ztemp.
SELECT-OPTIONS s_matnr FOR marc-matnr.

START-OF-SELECTION.
DATA: matnr_mp LIKE TABLE OF zmm03 WITH HEADER LINE.
SELECT DISTINCT matnr
INTO TABLE matnr_mp
FROM marc
WHERE matnr IN s_matnr.

CALL FUNCTION 'ZREND_RELACION_MP_PA_NEW2_XMM1'


EXPORTING
temporada = p_tempo
centro = 'BPOI'
tipo_material = 'FERT'
TABLES
matnr_mp = matnr_mp
relacion = i_relacion
EXCEPTIONS
temporada_no_existe =1
centro_no_existe =2
no_ha_indicado_materiales = 3
tipo_material_no_existe = 4
error_actualizacion_zmm05 = 5
no_bloqueo_zmm05 =6
color_cero =7
OTHERS = 8.

DATA: BEGIN OF it_fam_mod OCCURS 0,


famcon LIKE zmodelo-famcon,
modelo LIKE zmodelo-famcon,
END OF it_fam_mod.

it_fam_mod[] = i_relacion[].
SORT it_fam_mod BY famcon modelo.
DELETE ADJACENT DUPLICATES FROM it_fam_mod
COMPARING famcon modelo.
DESCRIBE TABLE it_fam_mod LINES lin.
CHECK lin > 0.

SELECT famcon modelo


FROM zmodelo
INTO CORRESPONDING FIELDS OF TABLE it_zmodelo
FOR ALL ENTRIES IN it_fam_mod
WHERE ztemp = p_tempo
Documento: ABAP performance Autor: Xavier Montolío
Creado: 30/04/aa Modificado: 30/04/aa Página 12 de 14
Toda la información amparada por el presente documento se considera propiedad intelectual de Burberry (Spain), S.A. y como tal no puede ser copiada o puesta a disposición de
personas distintas a quien se determine, salvo aprobación expresa de la dirección de la empresa.
Organización y
Sistemas de Información

Mejoras de Rendimiento en ABAP

AND famcon = it_fam_mod-famcon


AND modelo = it_fam_mod-modelo.

SORT i_relacion BY matnr_pa.


LOOP AT i_relacion.
AT NEW matnr_pa.
READ TABLE it_zmodelo
WITH TABLE KEY famcon = i_relacion-matnr_pa(3)
modelo = i_relacion-matnr_pa+3(3).
IF sy-subrc = 0.
x_found = 'X'.
ELSE.
x_found = ' '.
ENDIF.
ENDAT.
IF x_found = 'X'.
APPEND i_relacion TO i_relacion2.
ENDIF.
ENDLOOP.
i_relacion[] = i_relacion2[].

2.5.- Desigualdades en WHERE.

Se deben evitar siempre que sea posible. Si se aprecia que diparan el tiempo de ejecución, se debería
proceder como en el apartado 1.6.

Documento: ABAP performance Autor: Xavier Montolío


Creado: 30/04/aa Modificado: 30/04/aa Página 13 de 14
Toda la información amparada por el presente documento se considera propiedad intelectual de Burberry (Spain), S.A. y como tal no puede ser copiada o puesta a disposición de
personas distintas a quien se determine, salvo aprobación expresa de la dirección de la empresa.
Organización y
Sistemas de Información

Mejoras de Rendimiento en ABAP

2.6.- JOIN: Tener en cuenta volúmenes.

En el primer caso se trae la venta únicamente de determinados materiales.


En el segundo caso se trae toda la venta de una temporada.

Ejemplos:

 Menos de 1000 materiales ->


SELECT vbap~vbeln vbap~posnr vbap~matnr vbap~prodh vbap~zmeng
vbap~umziz vbap~umzin vbap~meins vbap~kwmeng vbap~lprio
vbap~ordenpp vbak~temporada vbak~augru
FROM vbak INNER JOIN vbap
ON vbak~vbeln = vbap~vbeln
APPENDING CORRESPONDING FIELDS OF TABLE it_vbap_all
FOR ALL ENTRIES IN it_ex_pamp_aux
WHERE vbak~temporada = p_tempo
AND vbak~vkorg = p_vkorg
AND vbap~matnr = it_ex_pamp_aux-matnr_pa
AND vbap~werks = p_wer_pa.

 Más de 1000 materiales ->


SELECT vbeln temporada augru
INTO TABLE it_all_vbak
FROM vbak
WHERE temporada IN r_tempo
AND vkorg = p_vkorg.
SELECT vbeln posnr matnr prodh zmeng
umziz umzin meins kwmeng lprio ordenpp
FROM vbap
INTO CORRESPONDING FIELDS OF TABLE it_vbap_all
FOR ALL ENTRIES IN it_all_vbak
WHERE vbeln = it_all_vbak-vbeln.

Documento: ABAP performance Autor: Xavier Montolío


Creado: 30/04/aa Modificado: 30/04/aa Página 14 de 14
Toda la información amparada por el presente documento se considera propiedad intelectual de Burberry (Spain), S.A. y como tal no puede ser copiada o puesta a disposición de
personas distintas a quien se determine, salvo aprobación expresa de la dirección de la empresa.
Organización y
Sistemas de Información

Mejoras de Rendimiento en ABAP

3.-Rutinas FORM
Paso eficiente de parámetros en rutinas:
 Si se trata de tipos de datos complejos, como por ejemplo tablas internas, lo mejor es utilizar
variables de ámbito global, es decir, NO pasar parámetros.
 Si son tipos de datos simples, también se pueden utilizar de forma global o bien definirlos como
parámetros, pero siempre definiendo estáticamente su tipo en la definición de la rutina. Por ejemplo.
FORM buscar_material USING i_matnr LIKE mara-matnr.

4.-Módulos de función standards


Dentro de tratamientos secuenciales masivos, por ejemplo LOOP-ENDLOOP con un número
considerable de entradas, es desaconsejable incluir llamadas a módulos de función standards, ya que
habitualmente estas funciones obtienen mucha más información de la que precisan. Además lo más
probable es que accedan a la información mediante SELECT SINGLE, de manera que se repiten accesos
a BD y además, como hemos visto anteriormente, es mucho más eficiente efectuar antes de iniciar el
LOOP obtener toda la información de una determinada tabla de base de datos para luego accederla con
READ TABLE a tablas HASH.

Documento: ABAP performance Autor: Xavier Montolío


Creado: 30/04/aa Modificado: 30/04/aa Página 15 de 14
Toda la información amparada por el presente documento se considera propiedad intelectual de Burberry (Spain), S.A. y como tal no puede ser copiada o puesta a disposición de
personas distintas a quien se determine, salvo aprobación expresa de la dirección de la empresa.