Академический Документы
Профессиональный Документы
Культура Документы
302056063.doc
Versin n.:
00.06
Fecha versin:
03/10/2013
Preparado por:
Fecha de preparacin:
06/09/2011
Revisado por:
AC&A
Fecha de revisin:
14/12/2011
Estado de aprobacin:
APROBADO
Fecha de aprobacin:
14/12/2011
Fecha de
la versin
Realizada por
Descripcin
27/11/2011
00.03
30/11/2011
00.04
14/12/2011
00.01
06/09/2011
00.02
- Usuarios OSS
- Nomenclatura de objetos
00.05
14/12/2011
20.00
14/12/2011
AC&A
00.06
03/10/2013
INDICE
1
ESTNDARES DE DESARROLLO......................................................................................7
2.1
METODOLOGA DE DESARROLLO......................................................................................7
2.1.1
2.1.2
2.1.3
2.1.4
2.1.5
ESTILO DE PROGRAMACIN.......................................................................................... 17
3.1
3.2
3.2.1
3.3
3.3.1
3.3.2
Uso de comentarios..............................................................................................23
3.3.3
3.3.4
claves
3.3.5
3.3.7
3.4
3.4.1
3.4.2
Declaracin globales............................................................................................26
3.4.3
Declaracin locales..............................................................................................28
3.5
3.5.1
Nomenclatura....................................................................................................... 30
3.5.2
Aspecto................................................................................................................. 30
3.6
3.6.1
Nomenclatura....................................................................................................... 31
3.6.2
3.7
MDULOS DE FUNCIN................................................................................................. 32
3.7.1
Nomenclatura....................................................................................................... 33
3.7.2
Parmetros........................................................................................................... 33
3.7.3
Programacin....................................................................................................... 33
3.8
LITERALES EN PROGRAMAS........................................................................................... 34
3.9
EXCEPCIONES.............................................................................................................. 35
NORMAS DE DESARROLLO............................................................................................ 36
4.1
4.2
LIMPIAR VARIABLES....................................................................................................... 36
4.3
VARIABLES GLOBALES................................................................................................... 36
4.4
TABLAS INTERNAS......................................................................................................... 36
4.5
LIBERAR MEMORIA........................................................................................................ 37
CONCEPTOS IMPORTANTES........................................................................................... 39
6.1
6.2
RENDIMIENTO................................................................................................................... 43
7.1
RECOMENDACIONES GENERALES...................................................................................43
7.1.1
7.1.2
Clculo y procesos............................................................................................... 43
7.2
MEJORAS EN LA PROGRAMACIN...................................................................................44
7.2.1
7.2.2
El WHERE en SELECT........................................................................................ 48
7.2.3
7.2.4
7.2.6
Llamadas a subrutina...........................................................................................56
7.2.7
Comparacin de caracteres..................................................................................57
7.2.8
Sentencias IF o CASE.......................................................................................... 57
7.2.9
7.2.10
Tratamiento de FIELD-SYMBOLS........................................................................58
7.2.11
7.3
7.3.1
7.3.2
7.3.3
ndices de BD....................................................................................................... 60
7.3.4
7.3.5
7.4
PROCESAMIENTO EN PARALELO.....................................................................................67
7.4.1
Prerrequisitos....................................................................................................... 67
7.4.2
7.4.3
7.4.4
Mensajes y excepciones.......................................................................................68
7.4.5
Autorizaciones...................................................................................................... 69
8.2
8.3
8.4
8.5
SELECTS EN LOOPS................................................................................................... 71
8.6
MODIFICACIN EN LOOPS.............................................................................................. 71
8.7
LOOPS ANIDADOS......................................................................................................... 71
8.8
8.9
8.10
8.11
SENTENCIAS CRTICAS.................................................................................................. 72
8.12
8.13
8.14
8.15
VERIFICACIN DE SINTAXIS............................................................................................ 73
8.16
8.16.1
Interfases PERFORM/FORM...............................................................................73
Pgina 4 de 84
8.16.2
8.16.3
8.16.4
8.16.5
8.16.6
Autorizaciones...................................................................................................... 75
8.16.7
Status-PF incorrectos........................................................................................... 76
8.16.8
8.16.9
8.16.10
Verificar textos.................................................................................................. 76
8.16.11
Operaciones en campos..................................................................................76
8.16.12
Propiedades de campos...................................................................................77
8.16.13
Verificar plurilingismo.....................................................................................77
8.16.14
Verificaciones de paquetes..............................................................................77
8.16.15
Sentencias superfluas......................................................................................77
8.16.16
Sentencias peligrosas......................................................................................78
8.16.17
8.16.18
Sentencias obsoleta......................................................................................... 78
10
11
Pgina 5 de 84
El objetivo del presente documento es describir las normas, buenas prcticas, nomenclatura para hacer
los desarrollos tcnicos a medida de forma homognea y ptima.
El presente documento se entregar a cada integrante del equipo tcnico de implantacin.
Pgina 6 de 84
Estndares de desarrollo
2.1
Metodologa de desarrollo
En esta metodologa, se presentan una relacin de puntos que permitirn unificar el modo de trabajo para
los desarrollos a medida que se creen durante el proyecto. Adems de la homogeneizacin, los objetivos
que se pretenden son:
Establecer las pautas que permitan el desarrollo de calidad, buscando la eficiencia, rendimiento y
optimizacin.
Poner en marcha un procedimiento de control de calidad de los programas, antes de que estos
nuevos desarrollos sean transferidos a los entornos productivos.
2.1.1
Se necesitan establecer una serie de pautas que hagan que los programas, y cualquier desarrollo en
general, sea lo ms comprensible y homogneo posible, de manera que todos los integrantes del equipo
desarrollen con un estilo comn.
Como norma general, hay que hacer lo posible por escribir un cdigo fuente fcil de leer, claro y conciso.
Para ello, ser suficiente con seguir las recomendaciones que se detallan a continuacin.
2.1.1.1
El cdigo lo estructuraremos en estos cuatro grandes bloques, que adems deben seguir el orden que se
indica:
1.
2.
3.
Proceso principal.
4.
Subrutinas y mdulos.
2.1.1.2
La cabecera de los programas debe estar documentada conforme se indica en las plantillas de
codificacin ABAP:
Existe una plantilla de codificacin ABAP para Nexus02, ver documento NEXUS02-E0-ABAP00-GGPlantilla Programa ABAP-VF.01.txt
Existe una plantilla de codificacin ABAP para NEXUS03, ver documento NEXUS03-R0-ABAP00-GGPlantilla Programa ABAP-VF.01.txt.
Pgina 7 de 84
2.1.1.3
Introduccin de comentarios
Utilizar la plantilla de codificacin de programas ABAP como ejemplo para los comentarios.
Los comentarios o documentacin se deben poner siempre por encima de las instrucciones.
En la plantilla de codificacin ABAP estn definidos todos los tipos de sentencias que se tiene
que documentar/explicar, para que el cdigo sea ms legible.
Pgina 8 de 84
Describir la funcionalidad de cada una de las partes del cdigo con el objetivo de facilitar la
comprensin del mismo, principalmente, para el desarrollador que deba incluir en el futuro
modificaciones. Los comentarios deben ser claros y concisos, utilizando los trminos estndar de
SAP.
Eliminar partes del cdigo que no se quiere que estn activas en una versin del documento.
Son parte fundamental del entendimiento del cdigo por lo que habr que utilizarlos.
Los comentarios han de ser lo ms concisos posible, y orientados a mejorar la comprensin del
desarrollo.
No deben incluir nombres propios, ni comentarios graciosos o jocosos; hay que tener en cuenta
que los desarrollos se los queda el cliente.
No enmarcar los comentarios dentro de marcos hechos con caracteres muy vistosos o cargantes
a la vista; buscamos crear un cdigo fuente claro y agradable a la vista.
Con una (comilla doble) cuando se aade un comentario a continuacin del cdigo en una
lnea.
2.1.1.4
Modificaciones de programas
Al realizar modificaciones de programas que ya estn en productivo, en la mayora de los casos, estos
cambios debern estar soportados por versiones de diseos tcnicos. Slo se contemplan excepciones
en caso de tener que generar versiones intermedias de desarrollos para subida a entornos, en los que
estn contenidas unas modificaciones debidas a unos diseos y otras no. En este caso, se indicar
claramente qu modificaciones contiene la versin y cules excluye.
Ej.: En un desarrollo se ha generado una ltima versin en la que se est desarrollando una ampliacin
funcional aprobada por la Consejera y que se encuentra documentada en una versin del Diseo
Funcional. En paralelo y antes de completar este desarrollo/pruebas de aceptacin, se identifica una
incidencia en Produccin que hace necesario subir de forma inmediata una correccin de este desarrollo.
En este caso, se creara una nueva versin del desarrollo, en la que se incluyeran las correcciones para
Produccin, pero se extrajeran los cambios de la versin anterior de la ampliacin.
Pgina 9 de 84
2.1.1.4.1
En la cabecera
Se indicar en el apartado de HISTORIAL, para cada una de las versiones del desarrollo, el cdigo de la
modificacin, la referencia a su motivo/contenido del cambio (diseo tcnico con la versin del
documento), su autor (usuario SAP) y fecha de realizacin.
El cdigo de la modificacin, tendr el siguiente formato:
CCCCPPNN
CCCC Equipo de desarrollo del implantador que ha realizado la modificacin. Podrn existir diferentes
equipos que desarrollen por: mantenimiento, evolutivos de programas pertenecientes al proyecto actual
correspondiente a educacin u otros proyectos a futuro que puedan implementarse dentro del sistema.
EIP1
Equipo de implantacin 1
EMT1
Equipo de mantenimiento 1
Cambio de versin
CO
LI
MF
AF
Ampliacin funcional
NN Se trata de un nmero secuencial que ser asignado a cada modificacin y que se utilizar en
todos los objetos que deban modificarse en conjunto.
*---------------------------------------------------------------------------------------------------------*
Pgina 10 de 84
2.1.1.4.2
Enmarcando cada uno de los fragmentos de cdigo modificados, se incluirn los comentarios:
* Inicio modificacin CCCCPPNN USUARIO SAP DD/MM/AA
* Fin modificacin CCCCPPNN USUARIO SAP DD/MM/AA
Dejar la ltima versin correcta y la versin inmediatamente anterior comentada. Aunque dejara siempre
los literales de * inicio de modificacin CCCCPPNN y * fin de modificacin CCCCPPNN de todas las
modificaciones que hubieran existido en el cdigo para mantener la coherencia con el historial de cambio
de la cabecera del programa.
De esta forma, puede resultar muy difcil de mantener si surge un cambio de funcionalidad radical
respecto a lo que esta planteado en el programa. Se puede producir una difcil lectura y actualizacin del
cdigo. En estos casos, en la cabecera se indicar el documento donde surge el cambio de funcionalidad
y se permitir no aadir los comentarios de * inicio de modificacin y * fin de modificacion en el resto del
cdigo.
2.1.1.4.3
Debe utilizarse la transaccin SNOTE, lo cual facilita el control de SAP en futuros cambios de versin y/o
instalacin de parches, el propio SAP interpretar mediante la utilizacin de esta transaccin, que es la
implementacin de una nota OSS.
En caso de que la nota deba ser implementada manualmente, ser enmarcado cada uno de los
fragmentos de cdigo modificados, y se incluirn los comentarios:
* Inicio aplicacin nota OSS n nnnnn CCCCPPNN USUARIO SAP DD/MM/AA
* Fin aplicacin nota OSS n nnnnn CCCCPPNN USUARIO SAP DD/MM/AA
Dentro del bloque no se borrarn, en ningn caso, las sentencias de la versin original: se
comentarn con un asterisco (*) en la primera columna.
Las lneas que se eliminan se marcarn al final de la lnea con el comentario nnnnn - - - >
Las lneas que se aaden se marcarn al final de la lnea con el comentario nnnnn < - - -
Pgina 11 de 84
2.1.1.5
Es necesario reflejar en comentarios dentro del cdigo fuente aquellos puntos en los que no es posible
cumplir la normativa de codificacin ABAP. Si adems la lnea en la que se produce el incumplimiento
reporta un error/warning en Code Inspector ser necesario utilizar el pragma (#EC) correspondiente.
El programador debe redactar la justificacin por la que no puede seguir la normativa. Esto se puede
realizar de dos formas:
Cuando una excepcin se aplica en varios puntos del cdigo no ser necesario repetir la lnea en
el bloque de cabecera utilizando la misma etiqueta identificativa en los diferentes enmarcados de
cdigo.
Pgina 12 de 84
* Se busca el expediente
* administrativo en la tabla EKKO
* para la sociedad seleccionada
* PRAGMA: No se dispone de datos para los campos
* PRAGMA: clave de EKKO
SELECT SINGLE /IECI/EXP_ADM INTO L_EXP "#EC CI_NOFIELD
FROM EKKO
WHERE /IECI/EXP_ADM = P_EXP AND
BUKRS = G_S_VALORES-BUKRS.
Pgina 13 de 84
Ahora si se usa de forma reiterada un pragma con una misma justificacin se podr hacer referencia a la
marca declarada en la seccin EXCEPCIONES A LA NORMATIVA de la cabecera:
*-------------------------------------------------------------------------------------- *
**
* EXCEPCIONES A LA NORMATIVA *
**
* FECHA DESCRIPCION AUTOR MARCA CODIGO *
* ------- ----------------------------------- -------- ------------ ------------ *
* No se dispone de ningn campo clave GR01E01 *
* de esta tabla. * * No se dispone de datos para los campos GR01E02 *
* clave de EKKO *
**
*-------------------------------------------------------------------------------------- *
* PRAGMA: GR01E01
SELECT * INTO CORRESPONDING FIELDS OF TABLE L_T_MOAD "#EC CI_NOFIELD
FROM ZFFIAA_T_MOAD
WHERE COD <> SPACE.
* PRAGMA: GR01E02
SELECT SINGLE /IECI/EXP_ADM INTO L_EXP "#EC CI_NOFIELD
FROM EKKO
WHERE /IECI/EXP_ADM = P_EXP AND
BUKRS = G_S_VALORES-BUKRS.
2.1.2
Los sangrados se han de hacer de manera que resalten siempre las palabras clave, as como las
opciones de cada una.
Pgina 14 de 84
2.1.3
Alinear verticalmente las opciones de palabras clave, los parmetros de un FORM o PERFORM,
las declaraciones de datos, etc.; de manera que el cdigo tenga un cierto orden vertical.
Usar siempre la funcin PRETTY PRINTER con la opcin de resaltar palabras clave en creacin de
desarrollos. Esta funcionalidad del editor de ABAP, es muy til y se puede usarla con asiduidad. No utilizar
en el caso de modificaciones sobre desarrollos.
2.1.4
Forma correcta:
DATA: g_contador TYPE 1,
g_fecha TYPE datos.
g_fecha= sy-datos.
DO.
ADD 1 TO g_contador.
ADD 1 TO g_fecha.
IF g_contador > 10.
EXIT.
ENDIF.
IF g_fecha > 20110101
EXIT.
ENDIF.
WRITE: / g_contador. g_fecha.
ULINE.
ENDDO
Pgina 15 de 84
2.1.5
Si no usamos lneas en blanco entre grupos de sentencias, apelmazamos el cdigo y por lo tanto lo
hacemos difcil de leer.
Tambin se pueden utilizar los comentarios como modo de separacin. No olvidemos que su uso est
recomendado.
Pgina 16 de 84
Estilo de programacin
3.1
El nombre de un objeto debe darnos informacin acerca de a qu clase de desarrollo o mdulo pertenece,
cul es su cometido, su tipo, etc.
La clase de desarrollo debe especificar el mdulo de SAP al que hace referencia, siendo
recomendable indicar tambin el submdulo. Este conocimiento vendr reflejado en la
especificacin funcional correspondiente.
Los nombres de los objetos que se vayan a crear, han de comenzar con el mismo nombre que la
clase de desarrollo a la que pertenecen, a no ser que el responsable tcnico diga lo contrario, o
imposibilidades de longitud de nombres lo impidan.
Hay que respetar las normas de nomenclatura de SAP, pero intentando que se adapten al punto
anterior.
Utilizar los guiones bajos _ para los nombres de los objetos. Aportan claridad. No extenderse
gratuitamente.
Ante cualquier duda, ser el responsable tcnico del proyecto quien marque las pautas a seguir.
El nombre del objeto lo establecer el responsable que realice el diseo tcnico conceptual
(DO06).
Slo se registrarn los nombre tcnicos de objetos que el responsable del documento considere
relevantes para el desarrollo y que el programador debe respetar, con el fin de evitar la posible
duplicidad de nombres entre distintos documentos. Se consideran relevantes los indicados en la
tabla posterior.
Los nombres de objetos que el responsable tcnico no considere relevantes, quedarn a criterio
del programador, siguiendo las normas de codificacin y no ser necesario su registro.
Como norma general, en caso de objetos compuestos por otros objetos, solo se registrar el
nombre del objeto principal y no de sus componentes. Por ejemplo, en el caso de un module pool
solo se registrar el module pool principal y no sus includes debido a que se forman a partir del
nombre del programa principal.
Los objetos que gener automticamente el sistema quedarn excluidos del registro y de la
normativa de nomenclatura, al igual que los objetos importados desde otros sistemas (parches,
rdenes de transporte, fusin de sistemas).
Se crear una aplicacin propia para el registro de los objetos que residira en el sistema ERP de
desarrollo. La aplicacin tendr las siguientes caractersticas:
El responsable tcnico introducir el tipo de objeto y el nombre del mismo. Durante la grabacin
del registro, se chequear la nomenclatura del objeto de acuerdo con las reglas de nombres
permitidos y tambin, realizar el chequeo de la longitud del nombre del objeto por tipo de objeto.
El nombre ser dado por el responsable tcnico y no ser la aplicacin quin lo proponga. Pero
si se verificar que el nombre sea univoco.
3.2
ZPAAAATxxxxxxxxxxxxxxxxxxxx
Z- Para todos los objetos.
P- Identificador del Proyecto: F - Nexus02, R - Nexus03.
AAAA Funcionalidad (mdulo SAP). Ver el Anexo1 y Anexo2 de este documento
T Tipo de programa:
W workflow.
R report.
I Interface.
C - Conversin de datos.
E User Exit.
D BADI.
P BAPI.
F Formulario.
x Texto libre
3.2.1
OBJETO
BASE DE
DATOS
LGICA
BATCH Y
BATCH INPUT
Long.
Max.
12
Nomenclatura
Comentarios
NO
XXX
ZPAAAAexxxxxx
Reserva
cdigo
NO
Pgina 18 de 84
OBJETO
CLASE DE
DESARROLLO
TRANSACCIO
NES
OBJETO DE
Long.
Max.
Nomenclatura
Comentarios
Reserva
cdigo
30
ZPAAAAxxxxxxxxxxx..xxxx
20
ZPAAAAxxxxxxxxxxxxxxx
S
Para nombrar los
objetos de bloqueo se
usa normalmente los
primeros dos
caracteres EZ o EY.
NO
16
EZPAAAAxxxxxx.xxxx
30
ZPAAAAxxxxxx.xxxxx
NO
30
ZPAAAAxxxxxxxxx
NO
ZPxx
NO
MATCHCODE
ID
0-9
NO
ESTRUCTURA
DICCIONARIO
30
ZPAAAAxxxxxxxxxxx
NO
REA DE
MENSAJES
20
ZPAAAAxxxxx.xxxxx
000-999
40
ZPAAATxxxxx..xxxxxxx
BLOQUEO
DOMINIO
ELEMENTO
DE DATOS
MATCHCODE
OBJETOS
NMERO DE
MENSAJE
NO
PROGRAMA
EJECUTABLE
(Para
ejecutables
on-line)
PROGRAMA
MODULE
POOL
(Se llama a
travs de una
transaccin)
40
SAPMZPAAAAxxxxxx..xxxxx
Includes del modulo:
MZPAAAAxxx.xxxxTOP Datos global
MZPAAAAxxx.xxxxONN Modulo
PBO
MZPAAAAxxx.xxxxINN Modulo PAI
MZPAAAAxxx.xxxxFNN - Subrutinas
Solo se
reservar el
cdigo para el
module pool
principal, no
para los
includes del
modulo
Pgina 19 de 84
OBJETO
Long.
Max.
PROGRAMAS
DE INFOTIPOS
MP9NNN00
GRUPO
FUNCIN
26
ZPAAAAxxxxxx..xxxxx
NO
MDULO DE
FUNCIONES
30
Z_PAAAAxxxxx..xxxxx
NO
16
ZPAAAAxxxxxxxxx
SI
10
ZPxxxxxxxx
NO
10
ZPxxxxxxxx
NO
Zxx
NO
NOMBRES DE
TIPO
30
ZPAAAAxxxxxx.xxxxxxxxxxx
NO
SAPSCRIPTS/
SMARTFORMS
16 / 30
TABLA
TRANSPAREN
Nomenclatura
Comentarios
Reserva
cdigo
TE
TABLAS
POOL
TABLAS
CLSTER
NDICES DE
TABLAS
ZPAAAAxxxxxxxxxxxx
PROYECTOS
DE
AMPLIACIN
ZPAAAAxxx
ZPAAAAxxxxx
NO
Xxx
NO
Xxx
NO
OBJETO DE
AUTORIZACI
N
TTULO
BARRA
SPA/GPA
PARMETRO
VARIANTES
10
14
NO
Pgina 20 de 84
OBJETO
Long.
Max.
Nomenclatura
Comentarios
Reserva
cdigo
ESTRUCTURA
S APPEND
30
ZPAAAAxxxxxxxxx (Nombre de la
tabla que contiene la estructura
APPEND)
NO
NOMBRES DE
LOS CAMPOS
DE
ESTRUCTURA
S APPEND
30
ZZPxxxxxx.xxxx
NO
10
Pendiente
NO
30
Pendiente
NO
PERFIL DE
AUTORIZACI
N
ROL DE
AUTORIZACI
N
VISTAS
(VIEWS)
AYUDA DE
BSQUEDA
HELP VISTAS
(VIEWS)
16
ZPAAAAxxxxxxxxxxxxxxxxxxxxxx
NO
16
NO
10
TIPOS DE
DISPOSITIVOS
IMPRESIN
ZPWXXXXXX
ZPIxxxxx
ZPFxxxxx
FORMATO DE
PGINA DE
IMPRESIN
30
TIPO DE
OBJETO
WORKFLOW
ZPAAAAVVxxxxxxxxx
Los valores de la VV, sern los
siguientes:
V_ -> Vista BBDD
VA -> Vista de actualizacion
VS -> Vista de supresin
VH -> Vista de ayuda
NO
NO
NO
Pgina 21 de 84
OBJETO
AMPLIACIN
PARA
INFOTI
POS
Long.
Max.
Nomenclatura
Comentarios
Reserva
cdigo
NO
ZPNNNN00
EXCEPCIONES A
LA NORMA:
GENERACIN
CLASE
AUTOMTIC
A POR
SAP DEL
NOMBRE
EN LAS
SIGUIENTE
S CLASES
DE
IMPLEMENT
ACIN:
ZPCLAAAAXXXXXXXX
SI
BADI:
ZCL_IM_P
AAAAXXX.
..XXXX
EXCEPCIN:
ZCX_PAA
AAXXXXXX
X
INTERFASE
ZPIFAAAAXXXXXXXX
SI
GRUPO TIPOS
ZPXXX
NO
3.3
Hay que hacer lo posible por escribir un cdigo fuente fcil de leer, claro y conciso. Para ello, se han de
seguir las siguientes pautas:
3.3.1
3.
Proceso
4.
Subrutinas y mdulos
3.3.2
USO DE COMENTARIOS
Los comentarios han de ser lo ms concisos posibles, y orientados a mejorar la compresin del
desarrollo
No deben incluir nombres propios, ni comentarios graciosos o jocosos; hay que tener en cuenta
que los desarrollos se los queda el cliente
No enmarcar los comentarios dentro de marcos hechos con caracteres muy vistosos o cargantes
a la vista; buscamos crear un cdigo fuente claro y agradable a la vista.
Pgina 23 de 84
3.3.3
Esta herramienta del editor de ABAP, es muy til y se usar con asiduidad.
3.3.4
Pgina 24 de 84
3.3.5
Si no se usan lneas en blanco entre grupos de sentencias, apelmazamos el cdigo y por tanto, se hace
difcil de leer.
3.3.6
LIMI
TACI
N
DEL
N
DE
(MODULARIZACIN)
Muchas lneas de cdigo dentro de una rutina, evento hace que un programa se vuelve muy complejo,
difcil de seguir y entender. Para evitar esto, hay que intentar cumplir siempre estos puntos:
Cada bloque de proceso (Evento de programa, FORM, mtodo de una clase, mdulo de
funcin) no deber tener tantas lneas de cdigo que haga difcil su lectura y comprensin.
Cada bloque de proceso tendr un mximo de lneas, que se pueden establecer en base a lo
siguiente:
3.4
Esta limitacin implica el uso de la modularizacin del cdigo, prctica que hay que llevar a cabo
continuamente, as como aprovechar esta modularizacin para reutilizar cdigo ya escrito.
Las sentencias declarativas, se han de ejecutar todas juntas y al principio de cada programa, subrutina,
evento, etc., de manera que no existan declaraciones entre sentencias ejecutables.
Las declaraciones seguirn este orden:
1.
Tipos
2.
3.
Tablas internas
4.
5.
Variables
6.
Constantes
Dentro de los programas; los tipos de datos, variables y constantes, pueden ser globales y locales.
Pgina 25 de 84
3.4.1
Como norma general, todos la declaraciones globales empezarn por G_ y todas las
declaraciones locales empezarn por L_.
Comenzaran por:
Declaraciones
SO_
PG_
G_
L_
R_
GD_
SL_
G_O_
L_O_
G_CL_
L_CL_
SELECT-OPTIONS
PARAMETERS
Variables globales
Variables locales
Rango
Campos de Dynpro
Datos estticos
Objeto global
Objeto local
Clase Global
Clase local
3.4.2
3.4.2.1
DECLARACIN GLOBALES
Tipos
Como norma general han de comenzar siempre con GTYPE_, para indicar que son globales al
programa.
Si lo que se est declarando es un tipo de tabla interna, entonces dependiendo del tipo de tabla interna,
ha de comenzar siempre por:
3.4.2.2
TIPO DE TABLA
NOMENCLATURA
STANDARD
GTYPE_T_
SORTED
GTYPE_TS_
HASHED
GTYPE_TH_
Como normal general han de comenzar siempre con G_, para indicar que son globales al programa.
Si lo que se esta declarando es una tabla interna, entonces dependiendo del tipo de tabla interna ha de
comenzar siempre por:
TIPO DE TABLA
NOMENCLATURA
STANDARD
G_T_
SORTED
G_TS_
HASHED
G_TH_
RANGES
G_R_
Las variables que se utilicen como work areas de las tablas internas se han de identificar con las letras
WA seguido del nombre de la tabla interna de la que son work area:
Pgina 26 de 84
NOMENCLATURA
G_T_TAB1
G_WA_T_TAB1
G_TS_TAB2
G_WA_TS_TAB2
G_TH_TAB3
G_WA_TH_TAB3
G_R_RANGGO1
G_WA_R_RANGO1
Si lo que se est declarando es una constante, entonces esta ha de comenzar por GC_.
De esta manera, desde cualquier punto del programa sabremos que estamos usando una variable global.
*&------------------------------------------------------*
*&
Report ZPTAAANNNNNxxxxx
*&------------------------------------------------------*
*
text
*-------------------------------------------------------*
REPORT ZPTAAANNNNNxxxxx .
* 1. Tipos Globales
*-----------------TYPES: BEGIN OF gtype_persona,
pernr
TYPE pernr_d,
nombre
TYPE pad_vorna,
apellido_1
TYPE pad_nachn,
apellido_2
TYPE pad_nach2,
END OF gtype_persona,
gtype_contador
TYPE i.
Pgina 27 de 84
3.4.3
3.4.3.1
DECLARACIN LOCALES
Tipos
Como norma general han de comenzar siempre con la letra LTYPE_, para indicar que son locales a una
subrutina, mtodo
Si lo que se est declarando es un tipo de tabla interna, entonces, dependiendo del tipo de tabla interna
ha de comenzar siempre por:
3.4.3.2
TIPO DE TABLA
NOMENCLATURA
STANDARD
LTYPE_T_
SORTED
LTYPE_TS_
HASHED
LTYPE_TH_
Como norma general han de comenzar siempre con L_, para indicar que son para indicar que son
locales a una subrutina, mtodo
Si lo que se est declarando es una tabla interna, entonces dependiendo del tipo de tabla interna ha de
comenzar siempre por:
TIPO DE TABLA
NOMENCLATURA
STANDARD
L_T_
SORTED
L_TS_
HASHED
L_TH_
Las variables que utilicemos como work area de las tablas internas se han de identificar con las letras
WA seguido del nombre de la tabla interna de la que son work area:
NOMBRE DE TABLA
NOMENCLATURA
G/L_T_TAB1
L_WA_T_TAB1
G/L_TS_TAB2
L_WA_TS_TAB2
G/L_TH_TAB3
L_WA_TH_TAB3
Si lo que se est declarando es una constante, entonces sta ha de comenzar por LC_.
Pgina 28 de 84
*&---------------------------------------------------------------------*
*&
Form Rutina
*&---------------------------------------------------------------------*
*
text
*----------------------------------------------------------------------*
FORM rutina.
* 1. Tipos locales
*----------------TYPES: BEGIN OF ltype_direccion,
direccion
TYPE pad_stras,
poblacion
TYPE pad_ort01,
codigo_postal
TYPE pstlz_hr,
END OF ltype_direccion,
ltype_flag
TYPE c.
3.4.3.3
* 6. Constantes locales
*---------------------CONSTANTS: lc_respuesta_si TYPE c VALUE 'S',
lc_respuesta_no TYPE c VALUE 'N'.
ENDFORM.
" Rutina
D
a
t
o
s estticos
Los datos definidos como estticos con la sentencia STATICS slo se declaran dentro de las subrutinas,
por la tanto son datos locales.
Los nombres de estos datos comenzarn siempre por SL_, adaptndose el resto del nombre a las
normas anteriores.
Pgina 29 de 84
3.5
Las pantallas de seleccin, y los dynpros en general, se han de hacer lo ms agradables posibles de cara
al usuario final, sin perder nunca de vista que hay que adaptarse al aspecto estndar de SAP, de manera
que el usuario no perciba diferencia alguna entre las pantallas desarrolladas y las del estndar.
3.5.1
3.5.2
NOMENCLATURA
PARAMETERS.
o
SELECT-OPTIONS.
o
Campos de Dynpro.
o
Los campos de los dynpros han de ser globales (restriccin del sistema).
Siempre que se pueda, han de hacer referencia a campos del diccionario de datos, para
que adopten sus caractersticas. Para esto, se han de llamar igual que en el Diccionario.
Pero hay otros campos que no hacen referencia al diccionario; en estos casos como los
campos son globales, debern comenzar siempre por GD_ para indicar que son
campos globales y de Dynpro.
ASPECTO
Alinear verticalmente los campos de la pantalla de manera que los campos de texto queden
debajo de campos de texto, los campos de entrada debajo de campos de entrada, etc
Usar iconos representativos que aporten algo de color, sobre todo en los pulsadores.
Iconos
Alineacin
Vertical de
campos
del mismo
tipo
Alineacin
Vertical de
campos del
mismo tipo
Iconos
Ttulos
Marcos
Ttulos
Marcos
Pgina 30 de 84
3.6
Siempre que sea posible se ha de indicar el tipo de parmetro en la interfase del FORM.
3.6.1
NOMENCLATURA
3.6.2
A travs de TABLES pasaremos a la subrutina las tablas internas (de tipo estndar) que son de
entrada/salida.
Los parmetros USING sern los parmetros de entrada al FORM (se puede usar el aadido
VALUE.
*&---------------------------------------------------------------------*
*&
Form subrutina
*&---------------------------------------------------------------------*
*
text
*----------------------------------------------------------------------*
FORM subrutina TABLES pt_paises
STRUCTURE t005
USING pts_persona
TYPE
gtype_ts_persona
p_marcado
TYPE
c
CHANGING p_contador
TYPE
i
p_salir
TYPE
flag.
DATA: l_wa_ts_persona TYPE
gtype_persona.
ENDFORM.
" subrutina
3.7
Cl
ases e interfaces
El nombre de las clases ha de seguir la siguiente norma: ZPCLAAAAxxxxxxx.
Pgina 31 de 84
BADI
o
Excepcin
o
3.7.1
ZCL_IM_PAAAAxxx...xxxx
ZCX_PAAAAxxxxxxx
PARMETROS
3.8
Mdulos de funcin
3.8.1
NOMENCLATURA
El nombre de los mdulos de funciones ha de seguir las mismas normas que el resto de objetos; ha de
comenzar por el nombre de la clase de desarrollo a la que pertenecen. Pero en este caso, si la clase de
desarrollo comienza por Z o por Y, puede ser que el sistema de un mensaje diciendo que se incurre en
el rea de nombres de SAP. Por ello nombraremos a los mdulos de funcin con la clase de desarrollo
pero separando la Z o la Y del resto del nombre con un guin bajo: Z_
Clase de Desarrollo
: ZPAAAAxxxxxxxxxxx..xxxx
Mdulo de funciones
: Z_PAAAAxxxxx..xxxxx
3.8.2
PARMETROS
IMPORT
: Comenzarn por I_
EXPORT
: Comenzarn por E_
TABLES
: Comenzarn por T_
Pgina 32 de 84
3.8.3
PROGRAMACIN
ENDFUNCTION.
3.9
Literales en programas
No utilizar textos literales en programas, en vez de ello se han de usar los elementos de texto del
programa.
SAP es un sistema multi-lenguaje, esto quiere decir que todos los textos del sistema son susceptibles de
poder traducirse a cualquiera de los idiomas soportados. Si en los programas se escriben textos de forma
literal, ya no es posible el proceso de traduccin.
Esto es especialmente preocupante en clientes, como las administraciones pblicas que pueden tener
dos idiomas oficiales.
Pgina 33 de 84
3.10
E
xcepciones
Cuando se usan mdulos de funciones o eventos, siempre se han de recoger las excepciones, aunque no
se traten con posterioridad.
En los mdulos de funcin, basta con quitar los comentarios del bloque EXCEPTIONS, de otro modo si el
mdulo de funcin devuelve una excepcin y este bloque est comentado se produce un DUMP.
Pgina 34 de 84
4
4.1
Normas de desarrollo
Controlar cdigo de retorno (sy-subrc)
MUY IMPORTANTE: Verificar siempre el cdigo de retorno (SY-SUBRC) en las sentencias que lo
devuelvan. En especial en los accesos a base de datos y manejo de tablas internas.
4.2
Limpiar variables
Antes de usar una variable hay que asegurarse que no tiene contenido, de esta manera nos
aseguraremos de no usar valores incorrectos.
Esto es especialmente importante dentro de bucles, en acceso a base de datos y en la bsqueda de
datos en tablas internas, as como en el uso de variables globales.
4.3
V
ariables globales
MUY IMPORTANTE: Minimizar el uso de variables globales.
Las variables globales hacen muy difcil de leer el cdigo fuente, a la vez que pueden proporcionar errores
insospechados si se usan en distintas partes del programa.
Como norma, siempre que sea posible, no se han de usar variables globales, siempre han de ser locales
a las subrutinas (FORMs, eventos) en las que se usan, y se han de pasar por parmetro a otras
subrutinas.
4.4
Tablas internas
Hay que evitar declarar las tablas internas con lneas de cabecera; en vez de ello se han de utilizar reas
de trabajo (work areas)
SAP, poco a poco, est eliminando las tablas internas con lneas de cabecera. De hecho, en la
programacin orientada a objetos ya no se permite.
Pgina 35 de 84
4.5
Liberar memoria
Pgina 36 de 84
Pgina 37 de 84
6
6.1
Conceptos importantes
Clases de desarrollo / Paquetes
Es muy importante tener en cuenta que una Clase de Desarrollo o Paquete sirve para organizar los
objetos, de manera que luego resulte fcil identificarlos para algn fin posterior (p.e. el transporte de todo
un mdulo a otro sistema)
Sentido de
Utilizacin
de Objetos
A121
1
Nivel 3
A121
B111
A12
B11
Nivel 2
A11
Nivel 1
Nivel 0
A1
B1
C1
Esta gestin no es tan rgida en los sistemas cliente como en los sistemas centrales, ya que en los
sistemas centrales es dnde se mantienen aplicaciones multi-cliente, y stas deben de organizarse de
manera que su desarrollo y traspaso a otros sistemas no de problemas.
En los sistemas centrales, siempre que sea posible, seguiremos las siguientes normas:
Los objetos pertenecientes a una clase de desarrollo, slo pueden utilizar o hacer referencia a objetos de
la propia clases de desarrollo, de clases de niveles inferiores (pero dentro de su propia jerarqua), o del
estndar de SAP.
De esta manera conseguiremos clases o paquetes estancos, o relacionados con otros de nivel inferior,
pero que son conocidos.
Pgina 38 de 84
6.2
Para poder hacer esto en un sistema SAP, deberemos construir las aplicaciones de manera que
estn divididas en dos partes lgicas, que se han de ejecutar de forma secuencial:
1.
2.
Actualizacin de datos.
o En esta parte ya no se emiten mensajes ni se solicitan acciones al usuario. Eso ya se
debi de haber hecho en la fase anterior.
o En esta parte solo se realiza la actualizacin de datos en base de datos y se termina
la aplicacin.
o En caso se fallo en la actualizacin de los datos, se ejecutarn los mecanismos de
rollback adecuados (Sentencia ROLLBACK WORK, mensajes tipo A o X, etc) y se
terminar la aplicacin.
Una transaccin termina correctamente siempre que no se haya emitido ningn mensaje de
cancelacin que produzca rollback (mensajes de Tipo A o X).
Hay que tener en cuenta que si una transaccin termina correctamente, automticamente el
sistema ejecuta un Commit Work, con todo lo que ello conlleva (actualizacin de los datos,
ejecucin de funciones in update-task, perform on commit, etc).
Si una transaccin no termina bien, se ejecutarn los mecanismos de rollback y los datos no
sern actualizados en base de datos.
Pgina 39 de 84
Servidores
de
Aplicacin
Servidor
de Base
de datos
SAPGUI
DISPACHER
Los sistemas SAP usan arquitecturas Cliente/Servidor, en concreto un sistema SAP tpico bsicamente tiene esta estructura:
SERVIDOR DE APLICACIN
Usuario 1 Peticin 1
Usuario 1 Peticin 2
Usuario 2 Peticin 1
Proceso Trabajo 1
Proceso Trabajo 2
Proceso Trabajo 3
DB Link 3 (roto)
Usuario n Peticin n
Proceso Trabajo n
DB Link n
Los usuarios a travs del SAPGUI, realizan peticiones al servidor de aplicacin, y ste a su vez, al servidor de base de datos (si es necesario).
De forma simplificada, un Servidor de Aplicacin est formado por un elemento llamado DISPACHER y otros llamados Procesos de Trabajo (work process).
El Dispacher recibe las peticiones de los usuarios, y las distribuye entre los procesos de trabajo que estn libres, los cuales realizan dichas acciones.
Pgina 40 de 84
Cada vez que un proceso de trabajo necesita conectarse con el servidor de base de datos, bien
para acceder a datos de tablas o bien para actualizarlos, se crea un enlace de base de datos
(DB Link).
Y cada vez que un work process se queda libre, se rompe este enlace, y cada vez que se rompe
un enlace de base de datos, se ejecuta un Commit Work. Con ello las actualizaciones hechas
por el work process se hacen firmes en base de datos.
De lo anterior se deduce, que si entre dos sentencias de actualizacin de base de datos (que las est
ejecutando un solo work process), se muestra al usuario una pantalla (dynpro), un mensaje, o cualquier
otro elemento que haga que un work process quede libre, las actualizaciones hechas hasta ese momento
(por ese work process) se harn firmes en base de datos, pues al romperse el DB Link, la base de datos
ejecuta el correspondiente Commit Work.
Esto nos lleva a lo expuesto al principio de este punto. Mientras que se realicen interacciones con el
usuario no se han de hacer actualizaciones en base de datos.
Como norma: en los programas y sobre todo el los de tipo Modul Pool, se han de realizar primero todas
las verificaciones necesarias sobre los datos, indicando al usuario que corrija lo que tenga que corregir, y
una vez que todos los datos son coherentes y ya no es necesaria la interaccin con el usuario (se han
superado todas las validaciones) se puede proceder a actualizar dichos datos. Pero siempre teniendo en
cuenta lo anterior: todas las actualizaciones se han de llevar a cabo juntas y al final del proceso,
para que las realice un solo work process, a travs de un mismo enlace de base de datos (DB
Link).
Pgina 41 de 84
Rendimiento
7.1
Recomendaciones generales
7.1.1
Al utilizar la instruccin SELECT sobre una tabla de Base de Datos, se ha de evaluar con qu
campos se va a especificar la clusula WHERE.
Como norma general, siempre que sea posible se ha de acceder a la tabla con la mayor cantidad
de campos clave posibles. En caso de no ser as se ha de investigar la existencia de algn ndice que se
adapte a la seleccin, y en caso de no existir se ha de sopesar si es conveniente su creacin.
Tanto en el caso de acceso por campos clave como por campos de ndices, se han de cumplir una serie
de normas:
-
Al escribir los campos en la clusula WHERE, se han de escribir en el mismo orden que los campos
de la clave o del ndice (en versiones anteriores a la 4.0) para obligar a algunas bases de datos a
usar un ndice en concreto.
En caso de accesos con todos los campos clave o del ndice se ha de usar siempre SELECT
SINGLE.
La utilizacin de sentencias con EXEC-SQL (SQL nativo) en tablas grandes puede mejorar el
rendimiento respecto al SELECT de ABAP (Open SQL). Principalmente para tablas que no residen en
buffer y contra las que se realicen muchos accesos o en las que presumiblemente el acceso sea
secuencial, o sea, que no se utilice un ndice. En caso de dudas, siempre conviene realizar un pequeo
programa sobre el que se realice un anlisis de rendimiento comparativo entre SELECT de ABAP y el
EXEC-SQL. Como recordatorio, las instrucciones que se realizan con EXEC-SQL no acuden al buffer
intermedio de SAP.
7.1.2
-
CLCULO Y PROCESOS
SUSTITUIR POR
Pgina 42 de 84
Para asignar el contenido de una tabla interna a otra con igual estructura, es mejor usar la forma
ITAB1[] = ITAB2[].
SENTENCIAS
SUSTITUIR POR
LOOP AT ITAB2.
ITAB1 = ITAB2.
ITAB1[] = ITAB2[],
APPEND ITAB1.
ENDLOOP.
La ejecucin de programas que realicen CALL TRANSACTION de forma masiva debe estar limitada
cuando se procesen de forma on-line. Este tipo de operaciones consumen mucho tiempo.
La ejecucin de sesiones de Batch-Input deben evitarse en concurrencia con el on-line.
Al codificar bucles, disearlos de forma que las condiciones que ms frecuentemente sean
verdaderas ocupen los niveles exteriores del bucle.
En muchas ocasiones para resolver operaciones de condicin (tipo IF) es posible utilizar tanto una
evaluacin IF como una evaluacin CASE. La instruccin CASE es deseable por dos motivos: es
ms fcilmente legible, y en los casos en los que el nmero de IFs a evaluar sea superior a 5 es
ms eficiente.
Para expresiones o evaluaciones lgicas que incluyan el operador AND, situar la condicin que ms
frecuentemente sea falsa en primer lugar
Para expresiones o evaluaciones lgicas que incluyan el operador OR, situar la condicin que ms
frecuentemente sea verdadera en primer lugar.
Limitar el uso de la sentencia ASSIGN, y en general de los FIELD-SYMBOLS. Su uso genera mayor
carga en el sistema y puede afectar negativamente tanto a los tiempos como a legibilidad del
programa.
7.2
Mejoras en la programacin
Muchas de las recomendaciones que vamos a enumerar estn localizables en el sistema mediante:
Herramientas Workbench ABAP Test Anlisis Tmpo. Ejecucin Tips & Tricks
Tambin existen herramientas en el sistema que nos pueden ayudar en momentos de duda a elegir entre
un algoritmo u otro ms adecuado. Es importante conocer este tipo de herramienta, y usarlas.
7.2.1
7.2.1.1
-
SUSTITUIR POR
Pgina 43 de 84
= DD01L-
= DD01L- LANGU.
ENDSELECT.
AND DDLANGUAGE = SY-LANGU.
AND AS4VERS
AS4VERS
ENDSELECT.
ENDSELECT.
Tambin se pueden recuperar los datos en un solo paso en tablas internas, y sustituir uno o ms de los
SELECT anidados por LOOPs - ENDLOOPs, ya que es ms eficiente recuperar los datos necesitados
de una sola vez que en varias.
SENTENCIAS
SUSTITUIR POR
LOOP AT T_DD01L.
WHERE DOMNAME
AND AS4VERS
= T_DD01L-DOMNAME
= T_DD01L-AS4VERS
Adems se pueden usar otras tcnicas, como la variante FOR ALL ENTRIES de la sentencia
SELECT. Usando esta variante, algunos sistemas de base de datos dividen la seleccin en varias partes
ms sencillas, recombinando ms tarde los resultados como si se hubiesen realizado en un solo paso.
Se ha de evitar a toda costa usar el aadido CLIENT SPECIFIED sin indicar el campo MANDT en la
clusula WHERE.
Esto hace que el optimizador de base de datos no sea capaz de escoger ningn ndice, con lo cual
los accesos a las tablas van a ser siempre secuenciales.
Pgina 44 de 84
SENTENCIAS
-
Evitar
las
SUSTITUIR POR
SELECT ... CLIENT SPECIFIED
Evitar los chequeos de datos dentro de las sentencias SELECT ... ENDSELECT.
Es mejor dejar que la base de datos evale las condiciones sobre la tabla.
SENTENCIAS
SELECT ...
CHECK <condicin>
ENDSELECT
SUSTITUIR POR
SELECT ....
WHERE <condicin>
ENDSELECT
De esta forma la base de datos puede utilizar ndices en los casos en los que es posible, adems, la
utilizacin de la red es menor al haber menos seleccin de datos.
Pgina 45 de 84
Evitar acceder a las tablas por campos que no sean clave o no estn incluidos en algn ndice.
Hay que tener cuidado con las SELECT que se hacen sobre tablas que crecen constantemente (BSEG,
VBAK, etc). Si no tienen una clusula WHERE apropiada (por campos clave o ndice) se ha de replantear
el proceso.
SENTENCIAS
SUSTITUIR POR
ENDSELECT
Es mejor recuperar los datos en una tabla interna y posteriormente ordenarla, o bien recuperarlos
directamente en una tabla de tipo SORTED TABLE con lo cual el sistema la ordena inmediatamente a
medida que la carga.
Si se necesita hacer algn tipo de clculo sobre los datos recuperados, del tipo MIN, MAX, AVG, COUNT,
etc es mejor dejar que lo haga la base de datos en vez de programarlo.
Pgina 46 de 84
7.2.2
EL WHERE EN SELECT
Las clusulas WHERE complejas son malas para el optimizador de la base de datos
En una clusula WHERE, el operador lgico NOT no esta soportado por los indices.
SENTENCIAS
SUSTITUIR POR
FROM ...
FROM ...
ENDSELECT.
ENDSELECT.
Siempre que se desee usar un ndice, se ha de especificar dentro del WHERE, los campos del ndice
(o una parte de ellos) concatenados con ANDs.
En general especificando los N primeros campos del ndice (en el mismo orden en el que estn
definidos el ndice) aumenta el rendimiento de forma considerable
7.2.3
-
SUSTITUIR POR
LOOP AT TAB.
INSERT INTO <tabla> VALUES TAB.
INSERT <tabla> FROM TABLE itab.
ENDLOOP.
Pgina 47 de 84
SUSTITUIR POR
7.2.4
No programar las sentencias para truncar strings, sino utilizar la instruccin SPLIT.
Para averiguar la longitud de un campo, utilizar la funcin que el sistema proporciona al efecto.
Long_campo = STRLEN(campo)
7.2.5
Es muy importante familiarizarse con el uso de los nuevos tipos de tablas internas, sobre todo con
las tablas SORTED y HASHED. Estos nuevos tipos de tablas aumentan de forma considerable el
rendimiento en las bsquedas de datos almacenados en ellas.
A partir de la release 3.0 de SAP, el algoritmo de la instruccin COLLECT ha sido mejorado. Por
tanto, se recomienda usar COLLECT, si es necesario, frente a cualquier otro cdigo que se
programe a tal efecto.
SUSTITUIR POR
SUSTITUIR POR
SUSTITUIR POR
LOOP AT TAB.
LOOP AT TAB WHERE K = KVAL.
CHECK TAB-K = KVAL.
.....
.....
ENDLOOP.
ENDLOOP.
SUSTITUIR POR
...
ENDIF.
BINARY SEARCH.
IF SY-SUBRC = 0.
READ TABLE TAB INDEX TAB_INDEX-INDX.
...
ENDIF.
Pgina 49 de 84
SUSTITUIR POR
...
...
APPEND itab
...
...
APPEND itab
...
...
APPEND itab
SORT itab BY campo1.
Lo que se ha de hacer siempre es llenar la tabla y seguidamente ordenarla por los campos que se
desean.
SENTENCIAS
REFRESH TAB_DEST.
LOOP AT TAB_SRC.
READ TABLE TAB_DEST WTTH KEY K= ....
INSERT TAB_SRC INTO TAB_DEST INDEX SYINDEX.
SUSTITUIR POR
REFRESH TAB_DEST.
LOOP AT TAB_SRC.
APPEND TAB_SRC TO TAB_DEST.
ENDLOOP.
SORT TAB_DEST BY K
ENDLOOP.
Llenar la tabla
Ordenar la tabla
SUSTITUIR POR
REFRESH TAB_DEST.
Pgina 50 de 84
LOOP AT TAB_SRC
APPEND TAB_SRC TO TAB_DEST.
ENDLOOP
SORT TAB_DEST BY K.
DELETE ADJACENT DUPLICATES
ENDIF.
FROM TAB_DEST.
ENDLOOP.
APPEND
wa TO
tab.
INSERT
wa INTO tab.
COLLECT
wa INTO tab.
MODIFY
LOOP AT
SUSTITUIR POR
TAB = TAB_WA.
APPEND TAB_WA TO TAB.
APPEND TAB.
SUSTITUIR POR
REFRESH TAB_DEST.
LOOP AT TAB_SRC INTO TAB_DEST.
TAB_DEST[ ] = TAB_SRC[ ]
APPEND TAB_DEST.
ENDLOOP.
SUSTITUIR POR
IF TAB1[ ] = TAB2 [ ]
....
ENDIF
ENDIF.
ENDLOOP.
ENDIF.
IF TAB_DIFFERENT = SPACE.
" ...
ENDIF.
Para ordenar tablas internas, especificar los campos sobre los que debe verificarse la ordenacin.
SENTENCIAS
SORT ITAB.
SUSTITUIR POR
Para cargar en una tabla interna el resultado de una seleccin de una tabla transparente de SAP sin
chequeos adicionales.
Es ms ptimo llenar de una sola vez la tabla interna, que ir aadiendo fila a fila.
SENTENCIAS
SUSTITUIR POR
SELECT * FROM dbtable
MOVE ...
WHERE ...
Pgina 52 de 84
SUSTITUIR POR
LOOP AT ITAB.
C_LINEAS = C_LINEAS + 1.
DESCRIBE TABLE ITAB LINES C_LINEAS.
ENDLOOP.
Bucles anidados
Se han de evitar recorridos secuenciales y plantearse accesos por ndice en la segunda tabla o
tablas ms interna del bucle. En general, los anidamientos de cualquier tipo de bucles son poco
eficientes. Por ejemplo, suponiendo: tablas ordenadas, TAB2 contiene slo entradas que existen en
TAB1.
SENTENCIAS
SUSTITUIR POR
I2 = 1.
LOOP AT TAB1.
LOOP AT TAB2 FROM I2.
LOOP AT TAB1.
IF TAB2-K <> TAB1-K.
LOOP AT TAB2 WHERE K = TAB1-K.
I2 = SY-TABIX.
...
EXIT.
ENDLOOP.
ENDIF.
ENDLOOP.
" ...
ENDLOOP.
ENDLOOP.
Si TAB2 no contuviese slo entradas de TAB1, el algoritmo sera mas complicado, pero an as se
mejorara el rendimiento.
SUSTITUIR POR
Pgina 53 de 84
LOOP AT TAB_SRC.
APPEND TAB_SRC TO TAB_DEST.
ENDLOOP.
Borrado de lneas
Utilizar accesos por ndice para transferir trabajo al kernel: DELETE itab FROM
SENTENCIAS
SUSTITUIR POR
LOOP AT TAB_SRC.
APPEND TAB_SRC TO TAB_DEST.
ENDLOOP.
SUSTITUIR POR
ENDLOOP
SUSTITUIR POR
WA-DATE = SY-DATUM.
LOOP AT TAB.
TAB-DATE = SY-DATUM.
MODIFY TAB.
LOOP AT TAB.
MODIFY TAB FROM WA
TRANSPORTING DATE.
Pgina 54 de 84
7.2.6
-
LLAMADAS A SUBRUTINA
SUSTITUIR POR
FORM UP2 USING REPEAT TYPE I
DIMID.
DIMID
.....
.....
ENDFORM.
ENDFORM.
LIKE T006-DIMID.
SUSTITUIR POR
I1 = 5
CASE I1.
PERFORM I1 OF
WHEN 1. PERFORM PV1.
PV1
WHEN 2. PERFORM PV2.
PV2
WHEN 3. PERFORM PV3.
PV3
WHEN 4. PERFORM PV4.
PV4
WHEN 5. PERFORM PV5.
PV5
WHEN 6. PERFORM PV6.
PV6
WHEN 7. PERFORM PV7.
PV7
WHEN 8. PERFORM PV8.
PV8.
ENDCASE.
7.2.7
-
COMPARACIN DE CARACTERES
Cuando hay tipos de carcter de por medio, es mucho ms rpido las comparaciones entre tipos
carcter que entre carcter y otros tipos.
SENTENCIAS
DATA: C1A VALUE 7.
SUSTITUIR POR
DATA: C1A VALUE 7.
Pgina 55 de 84
IF 1 = C1A.
IF '1' = C1A.
ENDIF.
ENDIF.
7.2.8
-
SENTENCIAS IF O CASE
SUSTITUIR POR
CASE C1A.
IF
7.2.9
-
SUSTITUIR POR
I1 = 0.
I1 = 0.
DO.
WHILE C1A = SPACE.
IF C1A NE SPACE. EXIT. ENDIF.
ADD 1 TO I1.
ADD 1 TO I1.
IF I1 GT 10. C1A = 'X'. ENDIF.
IF I1 GT 10. C1A = 'X'. ENDIF.
ENDWHILE.
ENDDO.
Pgina 56 de 84
Definir tipo en los field-symbols: Si se especifica el tipo del field-symbol, el compilador puede mejorar
el rendimiento del programa
SENTENCIAS
FIELD-SYMBOLS: <I>.
SUSTITUIR POR
FIELD-SYMBOLS: <F>TYPE I.
Si los contenidos de las variables van a ser numricas, se han de definir de tipo I o P, pero no de tipo
C.
Utilizar variables de tipo I, no de tipo P, para campos que almacenan valores enteros, como pueden
ser ndices de bucle. Se evitarn los tiempos de conversin.
SENTENCIAS
DATA: IP TYPE P.
DATA: IP TYPE I.
DO 5 TIMES.
DO 5 TIMES.
IP = SY-INDEX * 2.
IP = SY-INDEX * 2.
ENDDO.
SUSTITUIR POR
ENDDO.
SUSTITUIR POR
CONSTANTS: PI TYPE F
FLOAT TYPE F.
VALUE '3.1415926535897932'.
DATA: FLOAT TYPE F.
FLOAT = '3.1415926535897932'.
FLOAT = PI.
En clculos aritmticos no mezclar tipos a no ser que sea absolutamente necesario, de esta forma se
evitan conversaciones innecesarias de tipos.
SENTENCIAS
DATA: F1 TYPE I VALUE 2,
F3 TYPE F.
F3 TYPE F.
F3 = F1 * F2.
SUSTITUIR POR
F3 = F1 * F2.
SUSTITUIR POR
DATA:
Pgina 57 de 84
P2
P3
TYPE P.
Se han de usar literales numricos o constantes de tipo numrico en vez de cadenas de caracteres
cuando se estn tratando tipos I o P.
SENTENCIAS
7.3
7.3.1
SUSTITUIR POR
SY-SUBRC = 0.
CASE SY-SUBRC.
CASE SY-SUBRC.
WHEN '1'.
WHEN 1.
WHEN '2'.
WHEN 2.
WHEN '3'.
WHEN 3.
WHEN '4'.
WHEN 4.
ENDCASE.
ENDCASE.
Las instrucciones CALL DIALOG, CALL TRANSACTION y SUBMIT, se utilizan para hacer
llamadas desde un programa a otro programa o transaccin. Para el usuario es deseable que este
proceso sea reversible, es decir, que el usuario pueda repetir la secuencia de pantallas en orden inverso.
Para ello, la secuencia de llamadas se almacena en una pila. Si se alcanza el nmero mximo de
llamadas internas, no se pueden hacer ms llamadas.
El nmero mximo de llamadas internas es 9 y no puede cambiarse.
En el desarrollo de programas hay que asegurarse de que esta situacin no pueda darse.
7.3.2
Siempre que se ejecuta una operacin de actualizacin de la base de datos con sentencias
UPDATE, INSERT, etc., se produce un submit interno a un programa que es el que se encarga de realizar
las actualizaciones en la base de datos.
En las operaciones de actualizacin de registros ya existentes en la base de datos, es
conveniente comprobar que la actualizacin es necesaria para no provocar los submits innecesariamente.
Pgina 58 de 84
WHERE
bukrs = 0200.
7.3.3
7.3.3.1
NDICES DE BD
Consideraciones generales
La existencia de ndices adecuados para ciertas tablas es un prerrequisito esencial para el buen
rendimiento de un sistema SAP R/3. El estndar de SAP contiene los ndices necesarios para el
desarrollo normal de las aplicaciones estndar. Pero an as, puede surgir la necesidad de crear algunos
ndices, esta necesidad puede depender de:
-
Desarrollos propios.
En los programas batch y el reporting on-line, de las variantes utilizadas por los reports.
Pgina 59 de 84
Para mantener los ndices, la base de datos necesita: espacio en disco, memoria y CPU. Por
ello, el rendimiento global del sistema puede verse severamente impactado por la creacin de ndices
inadecuados, es decir, demasiados ndices, ndices no usados, etc.
La necesidad de creacin de nuevos ndices se puede determinar por varios mtodos:
-
Las trazas SQL comprueban la eficiencia de los ndices individuales con la funcin EXPLAIN.
Estadsticas de transacciones. Con ellas podemos identificar los programas que consumen ms
tiempo de ejecucin y mayor tiempo de base de datos, con lo que podemos comprobar la eficiencia
de los accesos a la base de datos.
Los diferentes monitores de base de datos ofrecen gran nmero de funcionalidades para comprobar la
eficiencia en los accesos a la base de datos.
En este punto es importante colaborar con el administrador del sistema, l es quin mejor puede
interpretar la informacin que proporcionan estos monitores y las herramientas de gestin de Base de
Datos.
7.3.3.2
Optimizador de BD
En las bases de datos hay un elemento llamado Optimizador, que es el que determina cmo se
van a realizar los accesos a las tablas. La misin de este elemento es la de optimizar en lo posible estos
accesos, de manera que sean lo menos costosos posibles. Para ello ha de evaluar muchos parmetros,
como la cantidad de entradas de la tabla, los ndices definidos, el tipo de tabla, etc.
Bsicamente hay dos tipos de optimizadores:
-
Basados en reglas. Se basan en el uso de una serie de reglas fijas, ms o menos complejas, que
intentan descubrir cual es la mejor forma de acceder a los datos. Se usan en versiones anteriores la
versin 4.0.
Por ejemplo:
Puede haber una regla que le diga al Optimizador que seleccione para el acceso a una
tabla, el ndice que tenga ms campos coincidentes con la clusula WHERE del SELECT.
Basados en costes. Estos hacen un clculo aproximativo de lo costoso que resulta el acceso a los
datos para cada posible estrategia de acceso (lo costoso que resulta usar cada ndice, usando una
combinacin de varios, acceso secuencial, etc.) Al final, la estrategia menos costosa es la que se
usa. Se usan a partir de la versin 4.0.
Para que el optimizador sea capaz de calcular los costes de acceso a los datos, necesita conocer
una serie de datos estadsticos sobre diversos aspectos de las tablas y de los ndices de la base de
datos, como pueden ser:
o
7.3.3.3
-
Conceptos:
o
Campos selectores, son aquellos que tienen una gran variedad de valores distintos. P.e.:
Nmero de documento, nmero de cliente, NIF
Campos no selectores, son aquellos con pocos valores distintos. P.e.: Sociedad, mandante,
sector
Pgina 60 de 84
Los campos del ndice han de reducir de forma significativa el conjunto de resultados seleccionados por
la sentencia SQL. El objetivo es que lo registros seleccionados no superen el 5% de la cantidad total de
registros de la tabla, en caso de superarla el optimizador basado en costes de Oracle puede elegir no
usar el ndice y realizar un acceso secuencial completo a la tabla.
-
Cada campo aadido requiere operaciones adicionales para adaptar el ndice cuando el valor
cambia.
La cantidad de datos almacenados y ledos aumenta. Esto hace que decrezca la eficiencia del
ndice y que decrezca tambin la posibilidad de que el optimizador lo use.
Se han de poner los campos selectivos al principio de los campos del ndice.
7.3.4
7.3.4.1
R/3 usa varios tipos de memorias intermedias (Buffers) que son locales al Servidor de Aplicacin
y que tienen como misin principal almacenar datos en tiempo de ejecucin. Entre estos tipos de Buffers
hay uno destinado a almacenar datos de tablas.
Hay que recordar que los procesos en R/3 se ejecutan en el Servidor de Aplicacin, por lo tanto,
si conseguimos almacenar en estos Buffers datos de tablas que se leen a menudo, evitaremos accesos a
la base de datos, lo que har que aumente el rendimiento del sistema, ya que los accesos a estos Buffers
son muy rpidos.
R/3 gestiona los Buffers de manera que los cambios realizados en las tablas que residen en
memoria intermedia, se repliquen tanto en la Base de Datos como el propio Buffer. Esta gestin no es del
todo eficiente en entornos con ms de un Servidor de Aplicacin, pues los cambios realizados en uno no
se replican en los dems hasta pasado un tiempo (generalmente entorno a 1 minuto). Por lo tanto, en
memoria intermedia, slo deben residir tablas que son casi exclusivamente de lectura, y que desde los
puntos de vista de los procesos y de las aplicaciones, no sea traumtico este espacio de tiempo, en el
que no hay sincronizacin de datos entre servidores de aplicacin.
Tpicamente, podrn ser tablas de parametrizacin, o de datos maestros con muy pocas
modificaciones.
Cuando se realizan desarrollos con este tipo de tablas, se han de evitar las sentencias de ABAP
que hacen que se ignoren los buffers, y se acceda directamente a la base de datosUna relacin de estas
sentencia se explica ms adelante.
7.3.4.2
Grabacin en MI
Como no todas las tablas son iguales, en cuanto a tamao y uso, es lgico pensar que la forma en la que
el sistema debe almacenar los datos en los buffers, tambin variar en funcin de los datos que contiene
cada tabla.La grabacin en memoria intermedia se gestiona desde las Opciones Tcnicas de las Tablas
(Transaccin SE13)
Pgina 61 de 84
Hay tres estados en los que pueden estar las tablas respecto a la memoria intermedia:
-
Cuando se marca una tabla para que se grabe en memoria intermedia, se ha de indicar una forma de
grabacin. La forma de grabacin va a depender de la cantidad de entradas de la tabla y de la naturaleza
de los datos. Hay que tener siempre en mente, que al marcar una tabla para que se grabe en buffer, los
datos van a ocupar memoria del Servidor de Aplicacin, por lo que, si grabamos en buffer una tabla muy
grande, incidiremos en el rendimiento, e incluso podramos colapsar el Servidor.
Para evitar esto, es por lo que existe la forma de grabacin en memoria intermedia. Hay tres formas de
grabacin:
-
En tablas con un alcance de hasta 30 KB. Si se accede frecuentemente a una tabla para
lectura, puede sobrepasarse tambin este valor
En tablas mayores en las que se producen accesos de cantidad. Sin embargo, si se formula
para estos accesos de cantidad una condicin WHERE muy selectiva mediante un ndice de
base de datos, podr ser ms interesante renunciar al almacenamiento completo en
memoria intermedia.
En tablas en las que prevalecen los accesos a datos que no existen. Como la tabla se
encuentra completa en la memoria intermedia, se puede decidir muy rpidamente si existe
un registro de una entrada clave.
Cuando se marca esta opcin, lo que se va grabando en memoria intermedia son registros
individuales de la tabla. Estos registros se van pasando al buffer a medida que los procesos los van
seleccionando.
Si se accede a un registro que todava no se ha almacenado en memoria intermedia por medio
de SELECT SINGLE, se acceder a la base de datos a fin de cargar un registro. Si la tabla no contiene
ningn registro de la clave introducida ('No record found'), se marcar este registro en la memoria
intermedia como no existente. Puede evitarse un nuevo acceso a la base de datos, intentando acceder de
nuevo a este registro.
Pgina 62 de 84
En caso de grandes tablas a las que frecuentemente se accede por registros (por medio de
SELECT SINGLE...). El alcance de los registros a los que se accede debe estar entre 100 y
200 KB.
La modificacin de un registro, que esta en el buffer, hace que se marque como invlido y se volver a
cargar en memoria intermedia la prxima vez que se le trate.
Un mbito genrico est formado por un nmero dado de campos clave menor que la cantidad
total de estos campos, y expresado desde el primero al ltimo. Es decir, si tenemos una tabla cuya clave
son cinco campos, un mbito genrico es el que forma el primero, o los dos primeros, o los tres primeros,
o incluso los 4 primeros, pero no los cinco campos clave, porque sino, nos estaramos refiriendo a un
registro sencillo de la tabla y no a un mbito dentro de ella. Por lo tanto, cuando se marca esta forma de
grabacin, se han de indicar la cantidad de campos que van a forma el mbito genrico.
Cuando los procesos empiecen a seleccionar registros de las tablas, lo que se va a cargar en el
buffer, son los registros que tienen los mismos datos dentro del mbito definido.
Por ejemplo: Supongamos que tenemos una tabla con 4 campos clave (Mandante, Sociedad,
Centro y Material), y que tiene macada esta opcin de grabacin en memoria intermedia, y para la cual se
ha definido el mbito como los 3 primeros campos de la clave. Si se hace un SELECT SINGLE por
Mandante = 777, Sociedad = 1001, Centro = 0001 y Material = 1000000001, en memoria intermedia
se van a cargar todos los registros de la tabla que cumplan que Mandante = 777, Sociedad = 1001,
Centro = 0001.
Cundo se ha de elegir esta forma de grabacin?
o
Debe seleccionarse el mbito genrico de claves, de tal forma que los mbitos genricos no
sean demasiado pequeos, a fin de que no se creen demasiados mbitos genricos. Si
existen muy pocos registros por mbito genrico, resultar ms eficiente almacenar
totalmente la tabla en la memoria intermedia.
Las tablas de idioma son un ejemplo del empleo oportuno del almacenamiento genrico en
la memoria intermedia (con el campo clave del idioma como mbito clave genrico).
La modificacin de un registro del mbito, hace que se marque todo el mbito como invlido, y se volver
a cargar en memoria intermedia, la prxima vez que se acceda a los datos de ese mbito.
Pgina 63 de 84
Este tipo de sentencias, se han de evitar cuando se usan con tablas que residen de alguna forma
en memoria intermedia, a fin de optimizar el rendimiento. Sin embargo hay que tener en cuenta que
puede haber excepciones, debidas a el tiempo necesario de resincronizacin entre servidores de
aplicacin. Por lo tanto, si necesitamos asegurarnos de acceder a los datos ms recientemente
actualizados en estas tablas deberemos usar este tipo de sentencias.
- SELECT ... BYPASSING BUFFER
- SELECT ... FOR UPDATE
- Cualquier funcin agregada (COUNT, MAX, MIN, SUM, AVG) de la sentencia SELECT.
- SELECT DISTINCT...
- Clusulas WHERE con IS NULL.
- SELECT... ORDER BY ... (Menos por la clave primria)
- Cualquier sentencia en SQL Nativo (EXEC SQL ... END EXEC).
Si una tabla se graba en memoria intermedia con, forma de grabacin por registro sencillo,
sentencias que no accedan a un registro de forma unvoca (SELECT SINGLE) no acceden al buffer y van
directamente a base de datos.
Si una tabla se graba en memoria intermedia, con forma de grabacin por mbito genrico,
sentencias que no especifiquen de forma unvoca ese mbito genrico, no acceden al buffer y
seleccionan los datos directamente de la
7.3.5
7.3.5.1
Asignacin de memoria
El uso de memoria por las tablas internas en ABAP/4 depende de varios factores: El requisito
bsico corresponde al producto de la anchura del registro por el nmero de lneas en la tabla. La memoria
se asigna en bloques de 8Kb o 16Kb. La localizacin y la forma en la que se asigna el primer bloque de
memoria depende del sistema y la versin de ste, de la siguiente manera:
-
En sistemas en los que las tablas internas se almacenan en el rea de paginacin de SAP, es decir,
en sistemas con versiones 2.1/2.2, y en sistemas con versin 3.0/3.1, en los que el parmetro de la
instancia ABAP/use_paging est activo (nunca en sistemas en versin 4.0).
En estos sistemas el primer bloque de memoria asignado a una tabla interna se almacena en el
rea de roll con tamao:
Anchura de registro x Valor OCCURS
Las siguientes lneas se almacenan en bloques de 8Kb en el rea de paginacin. En estos
sistemas, un valor OCCURS de 0, provoca que la tabla se almacene completamente en el rea de
paginacin.En estos sistemas, el valor OCCURS sirve para determinar cuntas entradas de la
tabla se van a guardar en la memoria principal.
En sistemas que utilizan el nuevos sistemas de gestin de memoria SAP, es decir, en sistemas en
versin 3.0/3.1 en los que el parmetro de la instancia ABAP/use_paging no est activo y siempre en
sistemas en versin 4.0.
En estos sistemas, todas las entradas de tabla se almacenan en el rea de roll. El parmetro
OCCURS slo tiene efecto cuando:
Anchura de registro x valor OCCURS < 8Kb
Pgina 64 de 84
7.3.5.2
Se crea un ndice para realizar las siguientes operaciones sobre tablas internas:
-
Al insertar una lnea antes que otra ya existente con la instruccin (INSERT).
El ndice de la tabla se crea en el rea de roll. Son necesarios 4 bits por cada registro del ndice, y es
necesaria una entrada en el ndice por cada entrada en la tabla. SAP asigna memoria para la creacin
del ndice de forma que inicialmente quepan a priori ms entradas de las necesarias.
Debido a que el ndice no puede particionarse, cuando son necesarios ms registros en el ndice de los
estimados, es necesario reubicar completamente el ndice, esto puede hacerse:
-
Durante la ordenacin es necesario asignar memoria adicional, aunque esta se libera al terminar el
proceso de ordenacin.
Cuando se borra una lnea con DELETE itab, la entrada slo se borra de forma lgica y por tanto la
memoria ocupada por el registro no se libera, sino que se retiene internamente para ser ocupada por
nuevas entradas.
Cuando se borra una tabla interna con REFRESH itab, se liberan fsicamente todos los bloques de
memoria utilizados por la tabla excepto el inicial y el ndice (si existe).
Cuando se libera una tabla con FREE itab, se liberan fsicamente todos los bloques de memoria
incluyendo el inicial y el espacio ocupado por el ndice.
7.3.5.3
Cuando se ejecuta una instruccin SORT sobre una tabla interna o un FIELD-GROUP, se crea
un ndice para la tabla, ya que nunca se ordena fsicamente la tabla, sino que slo se produce la
ordenacin del ndice. Por lo tanto, cuando se ordenan tablas muy grandes, puede requerirse un gran
volumen de memoria adicional para crear el ndice. Este problema se incrementa cuando la tabla o el
FIELD-GROUP se ordena por una secuencia de campos diferente al de la definicin.
En general este mtodo tiene un mejor rendimiento durante la ordenacin fsica de la tabla, pero
tiene un peor rendimiento en los recorridos de la tabla, ya que en el caso de grandes tablas, puede
provocarse paginacin.Para evitar esto, en caso de necesitar hacer varios recorridos, es a veces mejor
almacenar la tabla una vez ordenada e inmediatamente volver a leerla con las sentencias
EXPORT/IMPORT o TRANSFER/READ DATASET. Este mtodo implica que la tabla quedar fsicamente
ordenada.
Pgina 65 de 84
7.4
Procesamiento en paralelo
A veces resulta muy conveniente poder partir un proceso en varios ms sencillos y que se
ejecuten a la vez, de manera que el rendimiento aumenta de forma considerabe.A partir de versin 3.0A,
SAP R/3 permite la divisin de determinadas tareas de forma que todas estas divisiones pueden
procesarse en paralelo.
La gestin de procesamiento paralelo es una funcionalidad que debe ser utilizada con mucha
prudencia, siempre tras un detenido anlisis y tras la consulta con el equipo de soporte ABAP/4 del
proyecto.
Aunque a priori, este mtodo de procesamiento puede inicialmente parecer una gran ventaja,
debe utilizarse siempre con mucho cuidado, ya que puede llevar a graves deterioros en el rendimiento
global del sistema. Esto es debido a que el procesamiento asncrono de los datos en las distintas tareas
ejecutadas, puede provocar graves inconsistencias en el sistema, debido a que las tareas deben
ejecutarse sin referencia a otros datos que estn siendo procesados en paralelo por otro proceso, y las
tareas ejecutadas no pueden ser dependientes de los resultados de otros procesos paralelos
concurrentes.
Algunos programas, especialmente los reports, en sistemas con un gran volumen de datos se
ejecutan en batch por la noche, y tendrn una duracin de varias horas, pudiendo llegar a ser difcil su
terminacin durante la ventana batch. Estos reports de larga duracin pueden implementarse utilizando
tcnicas de procesamiento paralelo, que permite la divisin del trabajo en varios procesos de trabajo y
recoger sus resultados.
El procesamiento on-line tambin soporta el procesamiento paralelo de programas.
7.4.1
-
PRERREQUISITOS
Unidades de trabajo independientes: La tarea debe ejecutarse sin referencia a otros datos que estn
siendo procesados en paralelo por otro proceso, y las tareas ejecutadas no pueden ser dependientes
de los resultados de otros procesos paralelos concurrentes.
Por ejemplo, el procesamiento paralelo, no es adecuado para datos que deben ser procesados
secuencialmente o para datos en los que un registro depende del procesamiento de otro. Por definicin,
no hay ninguna garanta de que los datos se procesen en un orden determinado ni de que un resultado
particular est disponible en un punto dado del procesamiento.
-
Prerrequisitos
o
El mdulo de funcin llamado debe estar definido con Apoyo Remote Function Call.
El mdulo de funcin llamado no puede contener ninguna llamada a funcin con destino
BACK.
No puede usarse CALL FUNCTION STARTING NEW TASK DESTINATION IN GROUP para
llamar a programas externos.
En llamadas entre sistemas SAP, ambos deben tener versin 3.0A o superior.
Para poder procesar tareas de jobs paralelos, al menos un servidor del grupo de servidores
definidos desde la transaccin RZ12 debe tener al menos 3 procesos de trabajo de dilogo.
7.4.2
Pgina 66 de 84
La palabra clave CALL FUNCION <funcin> STARTING NEW TASK <nombre de tarea> con el
argumento DESTINATION IN GROUP:
Con esta instruccin se indica al sistema SAP que procese el mdulo de funcin indicado en
paralelo. Normalmente se indica esta llamada en un bucle en el que dividimos el trabajo a realizar en
paquetes para el procesamiento paralelo. A la funcin le pasamos los datos que queremos procesar en
forma de parmetros y tablas internas (EXPORT y TABLES). La instruccin implementa el procesamiento
paralelo ejecutando llamadas RFC asncronas a los servidores disponibles en el grupo de servidores
especificado para procesamiento paralelo. Notar que las llamadas RFC ejecutados con CALL
TRANSACTION se ejecutan en procesos de trabajo de dilogo. El lmite de tiempo para ejecucin on-line
(300 segundos) se aplica tambin para las llamadas RFC.
-
Opcional. Debe ser llamado inmediatamente despus de CALL FUNCTION... para obtener el
nombre del servidor en el que correr la tarea.
-
La instruccin WAIT.
Es necesaria si se quiere esperar a que terminen todas las llamadas asncronas ejecutadas con
CALL TRANSACTION.
-
La instruccin RECEIVE.
Obtiene los resultados del procesamiento de una funcin asncrona RFC. Se obtiene el IMPORT
y TABLES de la funcin junto con las EXCEPTIONS.
7.4.3
El sistema de procesamiento paralelo est diseado de modo que elimina la posibilidad de que
un job paralelo pueda utilizar todos los recursos del sistema SAP R/3 y causar problemas de rendimiento
en otros jobs o usuarios. Adicionalmente, se puede optimizar los recursos a travs de los grupos de
servidores RFC. En el contexto de procesamiento paralelo, un grupo especifica un conjunto de servidores
de aplicacin SAP R/3 que pueden utilizarse para ejecutar un programa paralelo en particular. Por
defecto, el grupo comprende todos los servidores de aplicacin. Pero se pueden crear grupos ms
restringidos desde la transaccin RZ12, o bien: Herramientas -> Gestin -> Gestin -> Red -> Destinos
RFC -> RFC -> Grupos RFC.
El grupo de servidores debe indicarse en las llamadas a las funciones SPBT_INITIALIZE (si se
usa), y en la llamada CALL FUNCTION STARTING NEW TASK.
7.4.4
MENSAJES Y EXCEPCIONES
Pgina 67 de 84
7.4.5
AUTORIZACIONES
Pgina 68 de 84
Como norma general, cada programador de la factora ser responsable de entregar el cdigo a
su responsable tcnico habiendo pasado los controles especificados de la calidad del Cdigo Fuente.
Para ello SAP nos proporciona la herramienta Code Inspector.
El coordinador tcnico dar de alta la Variante de Verificacin DEFAULT para todos los usuarios
desarrolladores asignados al proyecto como copia de la global pero aadiendo parmetros necesarios
propuestos por el proyecto.
El Code Inspector facilita un log muy completo de los errores que hay en el cdigo y de su
rendimiento a nivel de sistema. La clasificacin de este tipo de errores es:
-
Error Este tipo de errores, implican un problema grave de rendimiento, problemas con el acceso a
tablas (por tamao, ndices), seguridad, verificacin de sintaxis/generacin (puede realizar
llamadas dinmicas) y de superficies. Este tipo de errores, deben ser solucionados en el sistema,
antes de su transporte al entorno de calidad.
Advertencia Se debern corregir siempre que sea posible. En los casos en los que esto no sea
posible, se deber especificar, en el diseo tcnico del programa, el motivo de los mensajes.
8.1
Este chequeo examina la condicin WHERE de las sentencias SELECT para accesos a tablas no
cacheadas, de acuerdo a los siguientes criterios (los JOINS no se procesan):
-
8.2
Este chequeo examina la condicin WHERE de las sentencias UPDATE y DELETE de acuerdo a
los siguientes criterios:
-
8.3
El cache de tablas en el servidor de aplicacin optimiza las lecturas de tablas de la base de datos. Este
chequeo verfica la existencia de sentencias SELECT que puentean dicho cacheo:
-
Uso de JOIN
Uso de subqueries
Pgina 69 de 84
Select DISTINCT
Group by
Order by
8.4
8.5
SELECTS en loops
SELECT... ENDSELECT.
LOOP... ENDLOOP.
DO... ENDDO.
WHILE... ENDWHILE.
PROVIDE... ENDPROVIDE.
8.6
Modificacin en loops
SELECT... ENDSELECT.
LOOP... ENDLOOP.
DO... ENDDO.
WHILE... ENDWHILE.
PROVIDE... ENDPROVIDE.
8.7
Loops anidados
DO ... ENDDO.
8.8
Pgina 70 de 84
8.9
Busca parmetros no utilizados en rutinas, funciones, etc. o parmetros tipo tabla que por su
tamao pueden llegar a ser no eficientes
SYSTEM-CALL ...
EDITOR-CALL ...
ROLLBACK WORK.
%_HINTS ...
IMPORT DYNPRO
EXPORT/DELETE DYNPRO
IMPORT NAMETAB
EXPORT NAMETAB
Pgina 71 de 84
Test de si el programa que contiene la definicin FORM existe y de que no contiene errores de
sintaxis
Verificacin de si las excepciones que pueden producirse mediante PERFORM llamado externo o
CALL FUNCTION en una definicin FORM, aparecen en la clusula RAISING de FORM.
Pgina 72 de 84
Test de si los parmetros tienen la categora correcta (IMPORT, EXPORT, TABLES, EXCEPTION)
Test de si para cada EXCEPTION existe un comando RAISE y si para cada comando RAISE aparece
una EXCEPTION.
Test de si todos los parmetros SUBMIT indicados mediante WITH estn definidos en el report.
Pgina 73 de 84
El campo Dynpro no tiene nombre en la lista de campos (el campo dynpro es una mscara de
edicin o un campo de palabra clave que no slo tiene carcteres especiales).
En la lgica de proceso existen referencias a un campo que no est definido en la lista de campos.
Descripcin parte
Lmite superior
HEAD
DATA
DATV
LITL
COMP
INCL
Si se supera el 90 por ciento del lmite superior, saldr un mensaje. A partir del 95 por ciento
aparece una advertencia y a partir del 98 se visualiza como un error el hecho de haber llegado al lmite.
A muy tardar, a partir del lmite de errores, debe transferirse el resto de coding a mdulos de
funcin o a una rutina FORM externa. Por lo general resulta preferible reservar un 10 por ciento por lmite
superior en cada programa, puesto que siempre se debe contar con que el cliente realizar
modificaciones.
8.16.6 AUTORIZACIONES
Este test verifica si el objeto de autorizacin especificado se encuentra en la tabla TOBJ y si los
mbitos de autorizacin se han especificados correctamente.
Pgina 74 de 84
Verifica si la cantidad de parmetros transferidos con WITH coincide con la cantidad de parmetros
formales en el mensaje o en el texto explicativo correspondiente.
8.16.10VERIFICAR TEXTOS
Test de strings:
-
8.16.11OPERACIONES EN CAMPOS
Activar el test CURRENCY/UNIDAD: Verifica si en una sentencia WRITE
-
se ha introducido un campo con el tipo DDIC CURR (importe de la moneda) sin el apndice
CURRENCY (==> WRITE CURRENCY) o
un campo con el tipo DDIC QUAN (indicacin de cantidad) sin el apndice unidad (==> WRITE UNIT)
Pgina 75 de 84
8.16.12PROPIEDADES DE CAMPOS
-
Campos no utilizados
Campos no ledos
Los resultados se visualizan a modo de resumen siempre que no est activada la primera funcin
adicional. Haciendo doble clic se puede pasar desde ah a la(s) descripcin(ones) de errores y a la(s)
posicin(ones) correspondiente(s) de cdigo fuente.
8.16.13VERIFICAR PLURILINGISMO
Verifica si las sentencias TRANSLATE-.. TO UPPER/LOWER CASE trabajan en el entorno de idioma
correcto.
Se visualizan las sentencias TRANSLATE... TO UPPER/LOWER CASE que trabajan con campos de tabla
sin llamar poco antes el SET LOCALE LANGUAGE.
Existen dos casos distintos:
-
En la misma tabla que contiene el campo con el que trabaja TRANSLATE existe un campo de idioma.
En los casos aqu visualizados aparecen los datos procesados en una tabla que contiene un campo
de idioma (en clave o seccin de datos). Es muy probable que con ste se pueda configurar el
entorno de idioma correcto antes de ejecutar la sentencia TRANSLATE.
La tabla tratada no contiene ningn campo de idioma. En el caso de que la tabla actual no contenga
ningn campo de idioma, la correccin tarda ms en realizarse. Se puede determinar el idioma a
partir de datos cercanos, o bien debe introducirse posteriormente un campo de idioma que habr que
completar con valores.
8.16.14VERIFICACIONES DE PAQUETES
Para todos los programas referidos de forma externa de un programa ABAP as como para las
definiciones de Dictionary ABAP referidas se verifica lo siguiente:
-
8.16.15SENTENCIAS SUPERFLUAS
-
El programa contiene un flujo de control dependiente de usuario. (Si se utiliza en una condicin SYUNAME)
Sentencias trace, por ejemplo, para el anlisis de tiempo de ejecucin (SET RUN TIME..) o el
comando SYNTAX-TRACE ON.
Tras EXIT, RETURN, STOP, RAISE o SUBMIT.. AND RETURN existen otras sentencias.
Pgina 76 de 84
8.16.16SENTENCIAS PELIGROSAS
-
Campos no utilizados
Campos no ledos
Los resultados se visualizan a modo de resumen siempre que no est activada la primera funcin
adicional. Haciendo doble clic se puede pasar desde ah a la(s) descripcin(ones) de errores y a la(s)
posicin(ones) correspondiente(s) de cdigo fuente.
8.16.18SENTENCIAS OBSOLETA
En este punto se indican sentencias obsoletas incluidas en el cdigo fuente.
Pgina 77 de 84
EP
MC
CG
TE
CO
EG
EI
TR
OE
AF
EG
SB
RF
CF
CD
OP
OC
CC
CN
DESCRIPCIN
BPC_
Elaboracin Presupuestaria
EAPS
Modificaciones de Crdito
FIGL
Contabilidad General
COCA
Contabilidad Analtica
EAPS
Ejecucin Gastos
EAPS
Ejecucin Ingresos
FITR
Tesorera
FIGL
Extrapresupuestaria
FIAA
Activos Fijos
EAPS / PS__
Proyectos
Subvenciones (El cdigo a utilizar depender
del mdulo donde se localice el desarrollo
EAPS / BPC_ / BCS_ / GM__ correspondiente)
IM__
FI__ / FITR
CFM_
Operaciones financieras
FI__ / EAPS
Operaciones comerciales
FI__ / EAPS
LOGSTICA
MM
LA
PM
FT
Maestro de Materiales
MM__ / WM__
PM__
Mantenimiento
SD__
Facturacin a terceros
RC
PR
RL
CM
BI__ / RMS_
Registro de Contratos
Procedimientos de Contratacin
BP__
MM__
EXPEDIENTES DE CONTRATACIN
Pgina 78 de 84
DESCRIPCIN
OM
OM01
OM
OM
OM
OM
OM
OM
PA
PA
PA
PA
OM02
OM03
OM04
OM05
OM06
OM07
Sistema de Informacin
PA01
Incorporaciones/Extinciones
PA02
Situaciones administrativas
PA03
Gestin de absentismos
PA04
Reconocimientos
PA
PA
PA
PA
PS
RE
PY
PY
PA05
PA06
PA07
PA08
PS__
Seleccin y Provisin
REG1
Registro de Personal
PY02
Conceptos Nmina
PY03
IRPF
PY
PY
PY
PY
PY
PY
PY
GP
GP
GP
GP
PS
PS
PS
PS
PY04
PY05
PY06
PY07
Seguridad Social
PY08
No Implantados
PY09
Centros Concertados
PY10
GP01
GP02
GP03
GP04
PS01
Seleccin de personal.
PS02
Concurso de Traslados
PS03
PS04
LB
Cobertura interina.
Bolsas de Empleo.
LB01
Pgina 79 de 84
PS
PS
PT
PT
PD
PD
PE
PE
AS
EH
EH
PS05
PS06
PT01
Gestin de turnos
PT02
PD01
PD02
PE01
Formacin
PE02
AS01
Accin Social
EHS1
Prevencin de riesgos
EHS2
Pgina 80 de 84
*--------------------------------------------------------------------------------------------------*
*
*
* ID_PROGRAMA: ZPAAAATxxxxxxxxxxxxxx..xxxx
*
*
* TIPO DE PROGRAMA:
*
*
*
* DESCRIPCIN:
*
*
*
*
*
*
*
* AUTOR: USUARIO SAP Y NOMBRE Y APELLIDOS
*
*
*
* FECHA DE CREACIN: dd/mm/aaaa
*
*
*
*--------------------------------------------------------------------------------------------------*
* CHEQUEOS DE AUTORIZACIN
*
*
*
* Objetos de autorizacin campos ABAP
*
*
*
*
*
*
*
*--------------------------------------------------------------------------------------------------*
*
*
* HISTORIAL DE CAMBIOS
*
*
*
* FECHA
DESCRIPCION
AUTOR MARCA CODIGO S.Desk *
* ----------------- ------------------------- -------------- ------------------------ ---------- *
* dd/mm/aaaa
usuario
*
*
*
*
*
*
*
* dd/mm/aaaa
usuario
*
* ...
...
*
*--------------------------------------------------------------------------------------------------*
Pgina 81 de 84
* PUBLIC SECTION.
* METHODS
*
*
*ENDCLASS.
"lcl_application DEFINITION
*-----------------------------------------------------------------------*
*
CLASS lcl_application IMPLEMENTATION
*-----------------------------------------------------------------------*
*CLASS lcl_application IMPLEMENTATION.
* METHOD handle_item_double_click.
*
* ENDMETHOD.
*ENDCLASS.
"handle_item_double_click
"lcl_application IMPLEMENTATION
Pgina 82 de 84
*******************************************************************
*
*
*
CODIGO DE PROGRAMA
*
*
*
*******************************************************************
**** PANTALLA DE SELECCION ****
*SELECTION-SCREEN BEGIN OF BLOCK seleccion WITH FRAME TITLE text-001.
*
"XXXXXX
"XXXXXX
"XXXXXX
"XXXXXX
Pgina 83 de 84
***********************************************************************
*
*
*
RUTINAS
*
*
*
***********************************************************************
*&--------------------------------------------------------------------*
*&
Form mostrar_listado
*
*&--------------------------------------------------------------------*
*&
Salida por pantalla de los datos seleccionados
*
*&--------------------------------------------------------------------*
*& --> p_ta_listado
Tabla con los datos a mostrar
*
*& --> pe_nombre_table Nombre de la tabla para catalogo de campos *
*---------------------------------------------------------------------*
*FORM mostrar_listado TABLES p_ta_listado USING pe_nombre_tabla.
*ENDFORM.
" mostrar_listado
Pgina 84 de 84