Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
www.bizpartner.biz
Solo puseIntroduccin
1.1 El sistema SAP R/3
SAP es un sistema ERP (Enterprise Resource Planning).
SAP es un sistema de informacin que gestiona de manera integrada, "on-line", todas las reas
funcionales de la empresa. El Sistema SAP se basa en el concepto de combinar todas las actividades de
negocio y los procesos tcnicos de una empresa en una solucin informtica simple, integrada, robusta y
fiable.
El sistema SAP R/3 tiene un conjunto de normas estndares en el rea de software de negocios. El
sistema SAP R/3 ofrece soluciones estndares para las necesidades enteras de informacin de una
compaa. El sistema SAP R/3 consiste en funciones integradas en las siguientes reas:
Fig. 1.01
El sistema R/3 opera utilizando el principio cliente / servidor aplicado a varios niveles. Es altamente modular y se
aplica fundamentalmente por medio del software, de forma que los modos de iteracin entre los diversos clientes y
servidores puedan ser controlados.
R/3 = Real Time (Tiempo Real) / 3 capas.
Lima-Per
Pgina 1 de 172
Sistema
SAP
TCP/IP
Panorama de un Sistema SAP
Aplicacin
(SAP)
1 . . .x
QAS
DEV
PRD
TCP/IP
Base de
datos
1
RPT
1.2 ABAP/4
Advanced Business Aplication Programming 4th
Generation
ABAP/4 es un lenguaje de programacin de 4a.
Generacin (4GL) orientado a cliente servidor tal como
su definicin especifica, al desarrollo de aplicaciones de
negocios. Todos los mdulos disponibles en SAP han
sido programados en este lenguaje de programacin.
Adems
podemos Fig. Fig.
1.02 1.03 escribir nuevas
aplicaciones en ABAP/4
c
o
m
o
complemento a las ya existentes o como apoyo a la
configuracin del sistema.
1.2.1 Caractersticas
El sistema R/3 tiene una arquitectura de software modular que permite trabajar con todas las
caractersticas de un software orientado a cliente servidor.
El sistema R/3 permite presentaciones, aplicaciones y almacenamiento de datos para diferentes
computadoras. Esta es la base que permite la escalabilidad de el sistema R/3
El nivel mas bajo es el nivel de base de datos. Los datos son manejados con la ayuda de un sistema de
administracin de base de datos relacionales (RDBMS). Adems de los datos maestros y datos de
transaccin, programas y los meta datos que describe el Sistema R/3 son almacenados y administrados
aqu.
Los programas ABAP corren en el nivel de aplicacin, las aplicaciones proporcionadas por SAP y las
creadas. Los programas ABAP trabajan con los datos llamados desde la base de datos y los nuevos
datos almacenados.
El tercer nivel es el nivel de presentacin (SAPGUI). Este nivel contiene la interfase del usuario que
permite el acceso del usuario a la aplicacin, ingresando nuevos datos y recibiendo el resultado de un
proceso determinado.
La distribucin tcnica del software es independiente de la ubicacin fsica del hardware. Las aplicaciones
y los niveles de presentacin de los componentes pueden ser divididos entre cualquier nmero de
componentes. La distribucin horizontal de componentes de base de datos, sin embargo depende del tipo
de base de datos instalado.
Lima-Per
Pgina 2 de 172
Fig. 1.04
En este programa, podemos acceder a las mquinas mediante el Logon o cambiar sus propiedades
tcnicas, as como crear o borrar entradas.
A partir de aqu y pulsando sobre el Logon accederemos a SAP.
En la pantalla de la figura 1.02 podemos ver como es exactamente la primera pantalla de SAP.
El acceso a SAP est compuesto por cuatro campos claves de entrada:
1. Mandate (Client)
Identifica claramente con que tipo de informacin vamos a trabajar.
2. Usuario (User)
El usuario con el cul vamos a acceder
3. Clave (Password)
Palabra Clave relacionada con el usuario
4. Idioma (Language)
Con que idioma queremos acceder a SAP
Fig. 1.05
Lima-Per
Pgina 3 de 172
Con los datos correctos accedemos a SAP. Para este curso trabajamos con el SAP System Data WebAS
6.20. La primera pantalla que nos aparece se muestra en la Figura 1.06, en ella podemos apreciar:
1. Barra de men.
2. Herramientas estndar.
3. Barra de Titulo.
4. Herramientas de la aplicacin.
5. Barra de estado.
6. Lnea de comandos.
7. Area de navegacion.
Fig. 1.06
Lima-Per
Pgina 4 de 172
Fig. 1.07
1.4.2 Transaccin
Las Transacciones son mtodos abreviados de llamar a los programas o en el caso de los Modul Pool, son la nica
forma de llamarlos. Adems estas se utilizan para hacer de intermediario entre los mens y los programas. Pueden
ser introducidas directamente en la lnea de comandos /n o /o siempre que se quiera ejecutar en el mismo modo o en
otro modo. P.ej. /nse38 llama a la transaccin se38 (editor ABAP) dentro del mismo modo.
Lima-Per
Pgina 5 de 172
Verificar
Activar
Ejecutar
Referencia de utilizacin
Anlisis de entorno
Manual online
Borrar
Copiar
Renombrar
Debugging
Variantes
Lima-Per
Pgina 6 de 172
Fig. 1.08
El campo de nombre de programa admite el carcter asterisco (*) para bsqueda, se activa con la tecla de funcin
F4. En SAP solo se permite nombres de programas de usuario que inicien con las letra Y y Z.
Sub objetos:
1.
Cdigo Fuente.
2.
Variante. Cuando en un programa queremos que se introduzcan valores predeterminados y no nuevos del
usuario, se utilizarn variantes. Las variantes tendrn los valores que se pueden introducir.
3.
4.
5.
Elementos de texto. Son textos que podemos incluir en el programa de una forma abreviada.
Objeto Siguiente/Anterior
Visualizar/Modificar
Activo / Inactivo
Otro objeto
Verificar
Activar
Verifica-Ejecuta
Referencia de utilizacin
Visualizar lista de objetos
Visualizar ventana de navegacin
Imagen completa on/off
Ayuda para
Fijar/borrar breakpoint
Patron
Pretty Printer
Lima-Per
Pgina 7 de 172
Fig. 1.09
Verificar.
Adems de poder verificar de una forma rpida, podemos hacer que nuestro editor sea capaz de encontrar variables
que no se utilizan, cadenas fijas, break-points, etc. Esta forma es muy til para cuando queramos eliminar los
Warnings de compilacin.
Activar
Activa el programa. Es la versin activa del programa la que utiliza el sistema.
Verifica-Ejecuta
Ejecuta el cdigo actual para verificar su funcionamiento.
Referencia de utilizacin
Se usa para saber desde donde se llama o desde donde se utiliza lo que estamos apuntando (texto seleccionado).
Visualizar ventana de navegacin
La pila no es ms que un sitio de almacenamiento para nuestra navegacin, es decir, cuando hacemos doble-click en
un perform y nos lleva a la lnea donde est descrito la situacin donde estbamos antes queda almacenada en la pila.
Por lo tanto estamos hablando de una pila LIFO (Last In First Out).
Ayuda para
Muestra documento de ayuda para la sentencia que estamos apuntando (texto seleccionado).
Fijar/borrar breakpoint
Fija un punto de parada al momento de ejecutar el cdigo. Solo se utiliza si la versin esta activa.
Patrn
Nos permiten insertar cdigo fuente de una forma genrica pero adaptada a nuestras necesidades. Por ejemplo, si
queremos incluir una funcin a nuestro programa utilizaremos el patrn para que sea el propio editor quin nos
incluya la mascara de la misma. Este patrn se pueden modificar e incluso crear de nuevos.
Pretty-Printer
Lima-Per
Pgina 8 de 172
Una vez que nuestro programa est terminado, utilizaremos esta opcin para que nos lo deje ms "bonito" en su
estructura. Esta opcin nos identar las sentencias y nos pondr comentarios en los procedimientos para poder
documentarlos.
Veamos los botones del rea de edicin:
1.
Cortar/Copiar/Pegar
2.
Deshacer/Rehacer
3.
Buscar/continuar busqueda
4.
Up/DownLoad
Lima-Per
Pgina 9 de 172
Fig. 1.10
Titulo
2.
Tipo
Por ahora debe bastar con decir que vamos a crear un programa ejecutable. As que con estos datos le damos
Grabar.
Fig. 1.11
A continuacin nos lleva a la ventana para crear una entrada en el catalogo de objetos.
Aqu el dato ms importante es la Clase de desarrollo.
Lima-Per
Pgina 10 de 172
Por el momento tambin debe bastar con decir que si grabamos como objeto local no nos pedir ms datos.
Un objeto local solo podr utilizarse en el mbito de desarrollo, para poder pasarlo a control de calidad o produccin
es posible luego modificar este punto.
Fig. 1.11
Hecho esto ingresamos al Editor ABAP en un programa nuevo. Por defecto aparece la lnea de programa REPORT.
La sentencia mas elemental es la de escritura WRITE. Ingresando la sentencia WRITE debe quedar as:
REPORT ZBC_EJERCICIO1.
WRITE 'HOLA MUNDO'.
Lima-Per
Pgina 11 de 172
TIPOS DE DATOS
Carcter
Carcter (C)
Numeric carcter (N)
Date (D).
Temporal
Simples
Hexadecimal
Numrico
Time (T).
Estucturas
Complejos
Tablas internas
STRING
XSTRING
Valor inicial:
Longitud de campo inicial: 1 byte.
Longitud de campo valido: 1 65535 bytes
Valor inicial: 0 0
CARCTER NUMERICO ( N )
Lima-Per
Pgina 12 de 172
2
3
4
DATE ( D )
1
2
3
4
TIME ( T )
1
2
3
4
Valor inicial: 0
Longitud de campo inicial: 4 bytes
Longitud de campo valido: 4 bytes
Valor inicial: 0.
Los valores se encuentran en el rango: -2**31 a 2**31-1
Los valores resultantes de operaciones aritmticas (ej. Fracciones) son redondeados, no truncados.
Valor inicial: 0
Longitud de campo inicial: 8 bytes
Longitud de campo valido: 8 bytes
Los valores se encuentran en el rango: 1x10**-307 a 1x10**308
La exactitud aproximada es de 15 decimales (depende del floating point aritmethic del hardware).
Para efectos de aproximacin con decimales es mejor utilizar el tipo de dato P.
Puede utilizar P cuando necesita cubrir rangos muy amplios y no se requiere precisin en el
redondeo.
1
2
3
4
5
Valor inicial: 0
Longitud de campo inicial: 8 bytes
Longitud de campo valido: 1-16 bytes
Permite trabajar con decimales.
Es necesario tener el atributo del programa como Fixed point arithmetic, de lo contrario ser tratado
como entero.
NUMERO EMPAQUETADO ( P )
Lima-Per
Pgina 13 de 172
Se utiliza TYPE para referirse a un tipo de datos predefinido, a un tipo local o a un tipo que se encuentra en el
diccionario ABAP.
Para ser compatibles con versiones anteriores se utiliza LIKE para referirse a tablas de base de datos y a estructuras
flat en el diccionario ABAP. Sin embargo es posible utilizar TYPE en las nuevas versiones.
Ejemplo X.1 Uso de TYPE.
TYPES: edad TYPE i,
estatura TYPE p DECIMALS 2,
codigo(3) TYPE c.
Se define el tipo de dato edad, que es del tipo predefinido I.
Se define el tipo de dato estatura, que es del tipo predefinido P con dos decimales.
Se define el tipo de dato codigo, que es del tipo predefinido C con una longitud de 3.
Lima-Per
Pgina 14 de 172
..............
END OF <estructura>.
Ejemplo X.2 Estructuras complejas.
TYPES: valor_spfli TYPE spfli,
nombre_cliente(20) TYPE c,
BEGIN OF direccion,
nombre
TYPE nombre_cliente,
calle(30) TYPE c,
ciudad
TYPE valor_spfli-cityfrom,
END OF direccion,
pueblo TYPE direccion-ciudad.
Se define el tipo valor_spfli del mismo tipo que spfli (que es una tabla Standard).
Se define el tipo nombre_cliente de tipo C de ancho 20.
Se define la estructura direccion, con cuatro componentes: direccion, nombre, calle y ciudad. Donde
nombre es del tipo nombre_cliente (que ha sido declarado previamente), Calle es de tipo C con ancho de
30 y ciudad es del mismo tipo del campo cityfrom de la tabla spfli (referenciado por el tipo valor_spfli).
Ejemplo X.2 Estructuras complejas.
TYPES: BEGIN OF estructura1,
col1 TYPE i,
BEGIN OF estructura2,
col1 TYPE i,
col2 TYPE i,
END OF estructura2,
END OF estructura1.
TYPES mi_tipo TYPE estructura1-estructura2-col2.
Lima-Per
Pgina 15 de 172
END OF listin.
Declaracin de datos
La sentencia DATA permite realizar la declaracin de datos.
DATA <campo> [ (<longitud>)] <tipo> [ <valor> ] [ <decimales> ]
Variante utilizada para declarar variables. El nombre de la variable <campo> no debe tener ms de 30 caracteres. Se
puede utilizar cualquier carcter a excepcin de: "+", ".", ",", ":", "(" y ")".
Adems el nombre no puede estar slo compuesto de dgitos numricos, ni coincidir con los objetos de datos
predefinidos, ni con las palabras reservadas. Veamos algunas recomendaciones:
Utilizar nombres significativos, que no requieran el uso de comentarios.
No utilizar el "guin" ya que podramos confundir la variable con un field-string.
Utilizar el "gui bajo" para nombres especiales.
No utilizar los caracteres especiales. Utilizar siempre una letra como primer carcter del nombre.
Con la opcin <tipo> se especifica el tipo de variable.
Con la opcin <decimales> se puede especificar el nmero de decimales para los campos de tipo P. El formato es el
siguiente: DECIMALS <num>, siendo <num> el nmero de dgitos despus del punto decimal. El nmero mximo
de decimales es de 14.
OPERADOR 1
OPERACION
ADD
Adicin
SUBSTRACT
Sustraccin
MULTIPLY
Multiplicacin
DIVIDE
Divisin
DIV
Divisin entera
MOV
**
Potenciacin
Lima-Per
Pgina 16 de 172
OPERACIN
SENTENCIA
SENTENCIA
Adicin
Sustraccin
Multiplicacin
Divisin
Divisin entera
Residuo de divisin
Potenciacin
Operadores relacionales
OPERADOR
OPERADOR 1
OPERADOR 2
OPERACION
EQ
<>
NE
<
LT
Menor que
<=
LE
>
GT
Mayor que
>=
GE
Igual a
><
Diferente
Lima-Per
Pgina 17 de 172
Tipos lgicos
OPERADOR
OPERACION
AND
OR
NOT
NEGACION
RESULTADO
ABS
VALOR ABSOLUTO
SIGN
SIGNO
CEIL
FLOOR
TRUNC
ENTERO
FRAC
FRACCION
RESULTADO
FUNCIONES TRIGONOMETRICAS
FUNCIONES HIPERBOLICAS
EXP
LOG
LOG10
SQRT
RAIZ CUADRADA
Lima-Per
Pgina 18 de 172
Write
Saca datos por pantalla.
TIPO
LONGITUD DE SALIDA
POSICIONAMIENTO
Justificado a la izquierda
Justificado a la izquierda
22
Justificado a la derecha
11
Justificado a la derecha
Justificado a la izquierda
Justificado a la derecha
Justificado a la izquierda
Justificado a la izquierda
Si el campos es del tipo P y tiene posiciones decimales, la longitud de salida se incrementa en 1. Con los tipos de
datos D, el formato interno del campo difiere del formato de salida. Para campos de tipo D, el sistema lee el formato
de salida especificado en el registro maestro de usuario.
Lima-Per
Pgina 19 de 172
Lima-Per
Pgina 20 de 172
evento AT LINE-SELECTION.
DD/MM/YY
MM/DD/YY
DD/MM/YYYY
MM/DD/YYYY
DDMMYY
MMDDYY
YYMMDD
El separador se define en
El separador se define en
El separador se define en
El separador se define en
Sin separadores.
Sin separadores.
Sin separadores.
el
el
el
el
registro
registro
registro
registro
maestro
maestro
maestro
maestro
de usuario.
de usuario.
de usuario.
de usuario.
DECIMALS <decimales>
EXPONENT <exponente>
ROUND <r>
CURRENCY <moneda>
UNIT <unidad>
Parameters
Si queremos dar la posibilidad al usuario de introducir valores en variables en la pantalla de seleccin, debemos
definir dichas variables con la sentencia PARAMETERS.
PARAMETERS <parmetro> [ (<longitud)>].
[ TYPE <tipo> | LIKE <campo> ]
[ DECIMALS <decimales> ] [ DEFAULT <valor> ]
[ MEMORY ID <memoria>] [ MODIF ID <grupo> ]
[ MATCHCODE OBJECT <objeto> ] [ AS MATCHCODE STRUCTURE]
[ NO-DISPLAY ] [ LOWER CASE ] [ OBLIGATORY ] [ FOR TABLE <tabla> ]
[ AS CHECKBOX ] [ RADIOBUTTON GROUP <grupo> ]
[ VALUE-REQUEST ] [ HELP REQUEST ].
Cuando el usuario arranque el programa aparece una pantalla de seleccin con el parmetro <parmetro>, con
longitud la especificada en <longitud>, o la longitud por defecto del campo si la clusula no se define.
Por defecto la descripcin que aparece a la izquierda del campo es el nombre del campo.
Lima-Per
Pgina 21 de 172
El objeto parcial de programa Elementos de texto, la opcin Textos de seleccin nos permite asociar al parmetro un
texto significativo.
Otra posibilidad es la utilizacin de la sentencia SELECTION-SCREEN como veremos en el apartado
correspondiente a esta sentencia.
Se puede utilizar los parmetros de seleccin, por ejemplo, para que el usuario limite los valores desde y hasta para
una posterior lectura de la base de datos. Si las condiciones de seleccin son ms complejas que indicar un valor
desde y hasta, es preferible utilizar la sentencia SELECT-OPTIONS.
DEFAULT -> <valor> puede ser un literal o el nombre de un campo. Si especificamos el nombre de un campo el
valor por defecto en el parmetro ser el valor del campo en el momento de presentar la pantalla de seleccin.
Recordemos que el evento INITIALIZATION se ejecuta antes de la presentacin de la pantalla de seleccin, en l se
puede actualizar el valor del campo especificado. El usuario puede modificar el valor que aparece por defecto.
LOWER-CASE -> El sistema no convierte el valor del parmetro a maysculas, es decir, respeta la entrada del
usuario, sea con caracteres en maysculas y/o minsculas. Si definimos el tipo de parmetro con la opcin LIKE y
referenciamos un campo del diccionario de datos, la clusula LOWER CASE no se puede utilizar.
OBLIGATORY -> Obliga a introducir un valor al usuario en el parmetro. Para significar el hecho de la
obligatoriedad, el sistema presenta el campo con el signo de interrogacin (?).
Ejemplo 2.1 Uso de WRITE.
REPORT ZT.
WRITE 'Trabajando con ABAP.
REPORT ZT.
WRITE ' Trabajando ' &
' con ' &
'ABAP'.
Lima-Per
Pgina 22 de 172
REPORT 1.
DATA NUMERITO TYPE P DECIMALS 2.
NUMERITO = 3 / 4.
WRITE: / 'VALOR: ', NUMERITO.
Lima-Per
Pgina 23 de 172
Lima-Per
Pgina 24 de 172
REPORT 1.
data f1(4) type n value 1234.
data f2(6) type n value 123456.
data f3(8) type n value 12345678.
data f4(10) type n value 1234567890.
write f1.
write / f4.
write / '1234567890123456789'.
write / f2.
write / f3.
write / f4.
write / f1.
Lima-Per
Pgina 25 de 172
Lima-Per
Pgina 26 de 172
write / f2.
f2 = f2 + 2000.
write / f2.
Ejemplo 2.20 Una tienda ofrece un descuento del 15% sobre el total de la compra y un cliente
desea saber cuanto deber pagar finalmente por su compra.
REPORT ZPROBLEMA_01.
PARAMETERS: total TYPE P DECIMALS 3 DEFAULT ''.
total = total * ( 85 / 100 ).
WRITE: / La cantidad a pagar con el 15% de descuento es :, total.
Lima-Per
Pgina 27 de 172
Ejemplo 2.21 Un vendedor recibe un sueldo base ms un 10% extra por comisin de sus ventas, el
vendedor desea saber cuanto dinero obtendr por concepto de comisiones por las tres ventas que
realiza en el mes y el total que recibir en el mes tomando en cuenta su sueldo base y comisiones.
REPORT ZPROBLEMA_02.
PARAMETERS: sueldo TYPE P DECIMALS 2 DEFAULT ''.
DATA: primer TYPE P DECIMALS 2,
segundo TYPE P DECIMALS 2,
tercer TYPE P DECIMALS 2.
primer = sueldo * ( 10 / 100 ).
sueldo = sueldo + primer.
segundo = sueldo * ( 10 / 100 ).
sueldo = sueldo + segundo.
tercer = sueldo * ( 10 / 100 ).
sueldo = sueldo + tercer.
SKIP.
write: / 'El primer mes recibira de comision
:', primer,
/ 'El segundo mes recibira de comision
:', segundo,
/ 'El tercer mes recibira de comision
:', tercer,
/ 'El monto acumulado al terminar los 3 meses es :', sueldo.
Lima-Per
Pgina 28 de 172
REPORT ZPROCESO_16 .
DATA NUMERO TYPE P DECIMALS 2 VALUE '-12345678.89'.
WRITE '1234567890123456789012345678901234567890123456'.
WRITE: / 'El numero', NUMERO,'Es empaquetado'.
01
E
02
l
03
04
n
05
u
06
m
07
e
08
r
09
o
10
11
12
13
14
1
15
2
16
.
17
3
18
4
19
5
20
.
21
6
22
7
23
8
24
,
25
8
26
9
27
-
28
29
E
30
s
31
32
e
33
m
34
p
35
a
36
q
37
u
38
e
39
t
40
a
41
d
42
o
01
E
02
l
03
04
n
05
u
06
m
07
e
08
r
09
o
10
11
1
12
2
13
.
14
3
15
4
16
5
17
.
18
6
19
7
20
8
21
,
22
8
23
9
24
-
25
26
27
28
29
E
30
s
31
32
e
33
m
34
p
35
a
36
q
37
u
38
e
39
t
40
a
41
d
42
o
REPORT ZPROCESO_16 .
DATA NUMERO TYPE P DECIMALS 2 VALUE '8.89'.
Lima-Per
Pgina 29 de 172
WRITE '1234567890123456789012345678901234567890123456'.
WRITE: / 'El numero', NUMERO,'Es empaquetado'.
01
E
02
l
03
04
n
05
u
06
m
07
e
08
r
09
o
10
11
12
13
14
15
16
17
18
19
20
21
22
23
8
24
,
25
8
26
9
27
28
29
E
30
s
31
32
e
33
m
34
p
35
a
36
q
37
u
38
e
39
t
40
a
41
d
42
o
REPORT ZPROCESO_16 .
DATA NUMERO TYPE P DECIMALS 2 VALUE '5'.
WRITE '1234567890123456789012345678901234567890123456'.
WRITE: / 'El numero', NUMERO,'Es empaquetado'.
01
E
02
l
03
04
n
05
u
06
m
07
e
08
r
09
o
10
11
12
13
14
15
16
17
18
19
20
21
22
23
5
24
,
25
0
26
0
27
28
29
E
30
s
31
32
e
33
m
34
p
35
a
36
q
37
u
38
e
39
t
40
a
41
d
42
o
REPORT ZPROCESO_16 .
WRITE '1234567890123456789012345678901234567890123456'.
WRITE /5(40) 'Eliminando registros'.
Lima-Per
Pgina 30 de 172
01
02
03
04
05
E
06
l
07
i
08
m
09
i
10
n
11
a
12
n
13
d
14
o
15
16
r
17
e
18
g
19
i
20
s
21
t
22
r
23
o
24
s
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
18
g
19
i
20
s
REPORT ZPROCESO_16 .
WRITE '1234567890123456789012345678901234567890123456'.
WRITE /5(14) 'Eliminando registros'.
01
02
03
04
05
E
06
l
07
i
08
m
09
i
10
n
11
a
12
n
13
d
14
o
15
16
r
17
e
REPORT ZPROCESO_16 .
WRITE '1234567890123456789012345678901234567890123456'.
WRITE /5(30) 'Eliminando registros' right-justified.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
E
16
l
17
i
18
m
19
i
20
n
21
a
22
n
23
d
24
o
25
26
r
27
e
28
g
29
i
30
s
31
t
32
r
33
o
34
s
35
36
37
38
39
40
Lima-Per
Pgina 31 de 172
REPORT ZPROCESO_16 .
DATA PALABRA(10) VALUE 'PERUANO'.
WRITE '1234567890123456789012345678901234567890123456'.
WRITE: / 'El texto que va a ser sobreescrito'.
write at 7(5) PALABRA.
01
E
02
l
03
04
t
05
e
06
x
07
P
08
E
09
R
10
U
11
A
12
e
13
14
v
15
a
16
17
a
18
19
s
20
e
21
r
22
23
s
24
o
25
b
26
r
27
e
28
e
29
s
30
c
31
r
32
i
33
t
34
o
35
36
37
38
39
40
REPORT ZPROCESO_16 .
DATA PALABRA(10) VALUE 'PERUANO'.
WRITE '1234567890123456789012345678901234567890123456'.
WRITE: / 'El texto que va a ser sobreescrito'.
write at 7(19) PALABRA.
01
E
02
l
03
04
t
05
e
06
x
07
P
08
E
09
R
10
U
11
A
12
N
13
O
14
15
16
17
18
19
20
21
22
23
24
25
26
r
27
e
28
e
29
s
30
c
31
r
32
i
33
t
34
o
35
36
37
38
39
40
Escribir un programa que muestre la divisin de dos nmeros enteros en un nmero real con 3
decimales:
a) Que la ultima posicin del decimal sea la posicin 13.
b) Que el primer lugar entero aparezca en la posicin 8.
REPORT
ZCAPITULO_14_05
DATA: A TYPE I,
B TYPE I,
N TYPE P DECIMALS 3.
Lima-Per
Pgina 32 de 172
A = 2.
B = 13.
N = A / B.
* Parte a.
WRITE '01234567890123456789'.
WRITE /(14) N.
* Parte b.
WRITE /8 N LEFT-JUSTIFIED.
ULINE /(<offset>)(<Iong>).
Para saltar una o varias lneas utilizaremos SKIP.
SKIP <n>.
Por defecto el salto ser de una nica lnea.
report ZPROBLEMA_04.
SKIP TO LINE 3.
ULINE AT 2(1).
WRITE 4 '-'.
WRITE 6 '--'.
WRITE 9 '---'.
ULINE AT 12(4).
SKIP TO LINE 1.
POSITION 18.
WRITE '|'.
Lima-Per
Pgina 33 de 172
SKIP TO LINE 3.
DO 4 TIMES.
NEW-LINE.
POSITION 18.
WRITE '|'.
ENDDO.
report ZPROBLEMA_04.
WRITE
WRITE
WRITE
'
|'.
/'-------'.
/'
|'.
SKIP TO LINE 1.
DO 3 TIMES.
WRITE 12 sy-vline.
NEW-LINE.
Lima-Per
Pgina 34 de 172
ENDDO.
SKIP TO LINE 2.
ULINE AT 12(1).
Include
Report ZEEE.
INCLUDE <symbol>.
INCLUDE <icon>.
WRITE: / 'Phone Symbol:', SYM_PHONE AS SYMBOL.
SKIP.
WRITE: / 'Alarm Icon: ', icon_alarm AS ICON.
Report ZEEE.
DATA: flag1(1) TYPE c VALUE ' ',
flag2(1) TYPE c VALUE 'X',
flag3(5) TYPE c VALUE 'Xenon'.
WRITE: / 'Flag 1 ', flag1 AS CHECKBOX,
/ 'Flag 2 ', flag2 AS CHECKBOX,
/ 'Flag 3 ', flag3 AS CHECKBOX.
Under
REPORT ZEEE.
DATA: h1(10) TYPE c VALUE ' Number',
h2(10) TYPE c VALUE ' Square',
h3(10) TYPE c VALUE ' Cube',
n1 TYPE i, n2 TYPE i, n3 TYPE i,x TYPE i.
TOP-OF-PAGE.
x = sy-colno + 8. POSITION x. WRITE h1.
x = sy-colno + 8. POSITION x. WRITE h2.
x = sy-colno + 8. POSITION x. WRITE h3.
x = sy-colno + 16. POSITION x. WRITE sy-pagno.
ULINE.
START-OF-SELECTION.
Lima-Per
Pgina 35 de 172
DO 10 TIMES.
n1 = sy-index. n2 = sy-index ** 2. n3 = sy-index ** 3.
NEW-LINE.
WRITE: n1 UNDER h1,
n2 UNDER h2,
n3 UNDER h3.
ENDDO.
COLORES
The options COLOR, INTENSIFIED, and INVERSE of the FORMAT statement influence the colors of the output list.
To set colors in the program, use:
Syntax
FORMAT COLOR <n> [ON] INTENSIFIED [ON|OFF] INVERSE [ON|OFF].
To set colors at runtime, use:
Syntax
FORMAT COLOR = <c> INTENSIFIED = <int> INVERSE = <inv>.
These formatting options do not apply to horizontal lines created by ULINE. They have the following functions:
COLOR sets the color of the line background. If, in addition, INVERSE ON is set, the system changes the
foreground color instead of the background color.
For <n> you can set either a color number or a color specification. Instead of color number 0, however, you
must use OFF. If you set the color numbers at runtime, all values of <c> that are less than zero or greater
than seven, lead to undefined results. The following table summarizes the different possibilities:
<n>
OFF or COL_BACKGROUND
<c>
Color
Intended for
depends on GUI
background
or COL_HEADING
gray-blue
headers
or COL_NORMAL
light gray
list bodies
or COL_TOTAL
yellow
totals
or COL_KEY
blue-green
key columns
Lima-Per
Pgina 36 de 172
or COL_POSITIVE
green
or COL_NEGATIVE
red
or COL_GROUP
violet
Control levels
Lima-Per
Pgina 37 de 172
Lima-Per
Pgina 38 de 172
Todos los valores posibles solo para los campos XDEZP y DATFM. Porque existen ms
registros:
If the country key you specified does not exist, the system sets SY-SUBRC to 4 and formats for all
subsequent WRITE statements the decimal characters as period '.' and date specifications as
MM/DD/YY.
REPORT ZH_CADENAS1.
write sy-datum.
DATA: FECHA TYPE D.
FECHA = SY-DATUM.
write / fecha.
XDEZP
US X
FORMATO
XXX.XXX,XX
Otro
XXX,XXX.XX
DATFM
FORMATO
DD.MM.AAAA
MM/DD/AAAA
AAAA.MM.DD
AAAA/MM/DD
Se muestra todos los pases con valores diferentes de 1 en DATFM, todos los dems tienen e
valor de 1. La lista esta ordenada ascendentemente:
Lima-Per
Pgina 39 de 172
EJEMPLO
REPORT demo_list_set_country LINE-SIZE 40.
DATA: num TYPE p DECIMALS 3 VALUE '123456.789'.
ULINE.
WRITE: / 'INITIAL:'.
WRITE: / num, sy-datum.
ULINE.
SET COUNTRY 'US'.
WRITE: / 'US, SY-SUBRC:', sy-subrc.
WRITE: / num, sy-datum.
ULINE.
SET COUNTRY 'GB'.
WRITE: / 'GB, SY-SUBRC:', sy-subrc.
WRITE: / num, sy-datum.
ULINE.
SET COUNTRY 'DE'.
WRITE: / 'DE, SY-SUBRC:', sy-subrc.
WRITE: / num, sy-datum.
ULINE.
SET COUNTRY 'XYZ'.
WRITE: / 'XYZ, SY-SUBRC:', sy-subrc.
WRITE: / num, sy-datum.
ULINE.
SET COUNTRY space.
WRITE: / 'SPACE, SY-SUBRC:', sy-subrc.
WRITE: / num, sy-datum.
ULINE.
Lima-Per
Pgina 40 de 172
Estructuras de control
En ABAP, como en todos los lenguajes estructurados, disponemos de una serie de instrucciones para subdividir el
programa en bloques lgicos; se ejecutarn cuando se cumpla una cierta condicin.
ENDIF.
IF <Cond.>.
ELSE.
ENDIF.
IF <Cond.>.
ELSEIF.
ELSEIF.
ELSE.
ENDIF.
Lima-Per
Pgina 41 de 172
IF <f1> IS INITAL.
WHEN <valor2>.
WHEN OTHERS.
ENDCASE.
Por ltimo, existe la instruccin condicional:
ON CHANGE OF ... ENDON
que permitir la ejecucin de un bloque de instrucciones, si se ha producido un cambio de valor de un cierto campo
durante el acceso a base de datos o una tabla interna.
Cmo procesar una tabla interna o un acceso a base de datos, ya lo veremos ms adelante.
ON CHANGE OF <campo>.
ENDON.
3.3 Bucles
Para realizar procesos repetitivos, utilizaremos DO y WHILE.
3.3.1 Do
Permite ejecutar un bloque de instrucciones tantas veces como se especifique.
DO <n> TIMES.
ENDDO.
En la variable del sistema SY-INDEX tendremos un contador del nmero de repeticiones.
Es posible anidar sentencias DO. En ese caso, el SY-INDEX har referencia al bucle en proceso.
3.3.2 While
Permite ejecutar un bloque de instrucciones mientras se cumpla una condicin.
WHILE <cond>.
ENDWHILE.
Lima-Per
Pgina 42 de 172
3.4.2 Exit
Dentro de un bucle saldr del bucle y fuera de un bucle saldr del programa.
Si la instruccin EXIT est dentro de varios bucles anidados, nicamente saldr del bucle en proceso.
3.4.3 Stop
Con STOP finalizaremos
END-OF-SELECTION.
el
report
(programa)
en
ejecucin,
pero
antes
ejecutaremos
el
3.4.4 Leave
Con LEAVE finalizaremos el report (programa) en ejecucin, sin ejecutar el evento END-OF-SELECTION.
Ejemplo 3.1 Se necesita un sistema para un supermercado, en el cual si el monto de la compra del
cliente es mayor de $5000 se le har un descuento del 30%, si es menor o igual a $5000 pero mayor
que $3000 ser del 20%, si no rebasa los $3000 pero si los $1000 la rebaja efectiva es del 10% y en
caso de que no rebase los $1000 no tendr beneficio.
REPORT ZPROBLEMA_03.
PARAMETERS: Cantidad TYPE P DECIMALS 3 DEFAULT ''.
DATA: Monto_aux TYPE P DECIMALS 3.
Monto_aux = Cantidad.
IF Cantidad GT 5000.
Cantidad = Cantidad * ( 70 / 100 ).
WRITE: / 'El Monto de Compra es :', Monto_aux,
/ 'El Monto a Pagar es :', Cantidad.
ELSE.
IF ( Cantidad GT 3000 ) AND ( Cantidad LE 5000 ).
Cantidad = Cantidad * ( 80 / 100 ).
WRITE: / 'El Monto de Compra es :', Monto_aux,
/ 'El Monto a Pagar es :', Cantidad.
ELSE.
IF ( Cantidad GT 1000 ) AND ( Cantidad LE 3000 ).
Cantidad = Cantidad * ( 90 / 100 ).
Lima-Per
Pgina 43 de 172
evento
Ejemplo 3.2 Necesitamos saber si una persona es joven o vieja basndonos en su edad. Joven
es aquella menor de 45 aos.
REPORT ZPROBLEMA_04.
PARAMETERS: Edad TYPE I DEFAULT ''.
IF Edad GE 45.
WRITE: / 'Usted es considerada una persona Vieja'.
ELSE.
WRITE: / ' Usted es considerada una persona Joven'.
ENDIF.
Lima-Per
Pgina 44 de 172
REPORT Z_PROB1.
PARAMETERS: Numero TYPE I DEFAULT ''.
DATA: S TYPE I.
*****************************
**Inicializando Sumador 'S'**
*****************************
S = 0.
WHILE SY-INDEX LE 8.
S = S + Numero ** ( SY-INDEX - 1 ).
ENDWHILE.
WRITE: 'La suma de las potencias de', Numero, 'es:', S.
Ejemplo 3.4 Determinar los nmeros divisibles por 3 y por 7 entre un rango de valores que son
entrados por el usuario.
REPORT ZEJEMPLO3_4 .
PARAMETERS: INICIO TYPE I DEFAULT 0,
FINAL TYPE I DEFAULT 0.
DATA: RES1 TYPE I,
RES2 TYPE I,
I TYPE I VALUE 5,
J TYPE I VALUE 5.
WHILE INICIO <= FINAL.
RES1 = INICIO MOD 7.
RES2 = INICIO MOD 3.
IF RES1 = 0.
I = I + 1.
SKIP TO LINE I.
WRITE INICIO.
ENDIF.
IF RES2 = 0.
J = J + 1.
SKIP TO LINE J.
WRITE AT 40 INICIO.
ENDIF.
INICIO = INICIO + 1.
ENDWHILE.
Lima-Per
Pgina 45 de 172
SKIP TO LINE 3.
WRITE 'DIVISIBLES POR 7' COLOR COL_HEADING.
POSITION 40.
WRITE 'DIVISIBLES POR 3' COLOR COL_HEADING.
ULINE.
...
...
...
...
ENDDO
ENDWHILE
ENDLOOP
ENDSELECT
REPORT ZEJ5
DATA NUMERO TYPE I.
CLEAR NUMERO.
DO 2 TIMES.
CHECK NOT NUMERO IS INITIAL.
WRITE: / 'El cursor esta en la linea', (2) NUMERO.
ENDDO.
Lima-Per
Pgina 46 de 172
WRITE: / 'FUERA'.
REPORT ZEJ5.
DATA NUMERO TYPE I.
NUMERO = 7.
CHECK NOT NUMERO IS INITIAL.
WRITE: / 'CONTINUA'.
REPORT ZEJ5.
DATA NUMERO TYPE I.
CLEAR NUMERO.
No muestra nada
Cadenas de caracteres
4.1 Concatenate
Se utiliza para concatenar varios campos alfanumricos en uso solo.
CONCATENATE <c1> ... <cn> INTO <campo> [ SEPARATED BY <s> ].
Esta sentencia concatena los campos campos <c1> ... <cn> en el campo <campo>.
Los espacios en blanco se ignoran durante la operacin.
Con la clusula SEPARATED BY se puede especificar un campo alfanumrico (el
campo <s>) que ser utilizado como separador entre los campos <c1> ... <cn>.
Si el resultado de la concatenacin entra en el campo <campo>, entonces
SY-SUBRC = 0, si por el contrario, es necesario el truncamiento, entonces
SY-SUBRC = 4.
REPORT Z_DGCC47.
DATA: C1(10) VALUE 'Dav',
Lima-Per
Pgina 47 de 172
4.2 Condense
Para borrar espacios en blanco superfluos en campos alfanumricos.
CONDENSE <campo> [ NO-GAPS ].
Borra cualquier secuencia de espacios en blanco, dejando slo uno que exista
entre palabras existentes en <campo>. Los espacios en blanco por la izquierda
tambin desaparecen.
4.3 Split
Divide un campo alfanumrico en varios campos, gracias a algn separador.
SPLIT <campo> AT <delimitador> INTO <c1> ... <cn>.
Esta sentencia utiliza el campo indicado en <delimitador> para separar los campos <c1> ... <cn> el contenido del
campo <campo>. Si no hay especificado los suficientes campos para poder separar todo el contenido del campo
<campo>, sobre el ltimo se rellena el resto del campo <campo>. Si todos los campos destino son lo suficientemente
grandes como para almacenar las partes de <campo>, SY-SUBRC vale 0. En caso contrario SY-SUBRC vale 4.
REPORT ZH_CADENAS2 .
DATA: PAISES(50)
VALUE 'Per, Chile, Bolivia, Brasil',
CAD1(30),
CAD2(30),
CAD3(30),
SEPARADOR(2) VALUE ','.
SPLIT PAISES AT SEPARADOR INTO CAD1 CAD2.
WRITE CAD1.
WRITE / CAD2.
Lima-Per
Pgina 48 de 172
4.4 Shift
Se utiliza para desplazar el contenido de un campo alfanumrico.
Disponemos de distintas variantes en funcin del modo de desplazamiento.
SHIFT <campo> [ BY <n> PLACES ] [ { LEFT | RIGHT | CIRCULAR } ].
Desplaza el contenido del campo <campo> <n> posiciones.El significado de las clusulas es el siguiente:
BY -> Si se omite, el desplazamiento es de una posicin. Si <n> es cero o negativo no se realiza ningn
desplazamiento. Si <n> excede de la longitud del campo <campo>, el desplazamiento se rellena con
espacios en blanco. <n> puede ser una variable.
LEFT -> el desplazamiento se realiza hacia la izquierda, con relleno de espacios en blanco por la derecha.
RIGHT -> El desplazamiento se realiza hacia la derecha, con relleno de espacios en blanco por la
izquierda.
CIRCULAR -> El desplazamiento se realiza haca la izquierda. Los caracteres que desaparecen por la
izquierda aparecen por la derecha.
REPORT ZFSDF.
*CAMBIAR A T(8), QUESUCEDE?
Lima-Per
Pgina 49 de 172
REPORT ZH_CADENAS2 .
DATA PALABRA(10) TYPE C.
PALABRA = 'ABCDEFGH'.
WRITE PALABRA.
SHIFT PALABRA.
WRITE / PALABRA.
SHIFT PALABRA.
WRITE / PALABRA.
Lima-Per
Pgina 50 de 172
STRING = T.
SHIFT STRING BY 6 PLACES CIRCULAR.
WRITE / STRING.
abcdefghij
bcdefghij
defghij
abcdefg
ghijabcdef
4.5 Replace
Reemplaza cierta parte de un string por otro string.
REPLACE <string1> WITH <string2> INTO <campo> [ LENGTH <longitud> ].
El sistema busca en el campo <campo> la primera ocurrencia del string
<string1> para sustituirla por el string <string2>.
Con la clusula LENGTH slo se sustituir los caracteres indicados en
<longitud>. Si no se especifica la clusula LENGTH la sustituicin del string
<string1> ser completa.
Si el string <string1> se encuentra en el campo <campo> es sustituido por
<string2> y la variable del sistema SY-SUBRC toma el valor 0. En caso
contrario, no se reemplaza nada y SY-SUBRC toma el valor 4. <string1>,
<string2> y <longitud> pueden ser variables.
REPORT ZH_CADENAS2 .
DATA: CADENA(8) value 'ABCDEFGH',
CAD1(4) VALUE 'WXYZ',
CAD3(4) VALUE 'DEFG',
CAD2(4) VALUE '1234'.
WRITE: 'INICIAL: ',CADENA.
REPLACE CAD1 WITH CAD2 INTO CADENA.
WRITE: / SY-SUBRC, CADENA.
REPLACE CAD3 WITH CAD2 INTO CADENA.
WRITE: / SY-SUBRC, CADENA.
*QUE VALOR NOS RETORNA: SY-SUBRC?.
REPORT Z_DGCC49 .
DATA: T(10) VALUE 'abcdefghij',
STRING LIKE T,
STR1(4) VALUE 'cdef',
STR2(4) VALUE 'klmn',
STR3(2) VALUE 'kl',
STR4(6) VALUE 'klmnop',
LEN TYPE I VALUE 2.
STRING = T.
WRITE STRING.
REPLACE STR1 WITH STR2 INTO STRING.
WRITE / STRING.
Lima-Per
abcdefghij
abklmnghij
abklmnefgh
Pgina 51 de 172
STRING = T.
REPLACE STR1 WITH STR2 INTO STRING LENGTH LEN.
WRITE / STRING.
abklghij
abklmnopgh
STRING = T.
REPLACE STR1 WITH STR3 INTO STRING.
WRITE / STRING.
STRING = T.
REPLACE STR1 WITH STR4 INTO STRING.
WRITE / STRING.
4.6 Translate
Se utiliza para convertir caracteres de mayscula a minscula o viceversa, o para realizar sustituciones de caracteres
a travs de ciertas reglas.
TRANSLATE <campo> TO { UPPER | LOWE } CASE.
Con la opcin UPPER, las letras minsculas de <campo> se convierten en maysculas. Y con la opcin LOWER las
letras maysculas se convierten en minsculas.
Para utilizar reglas de conversin se utiliza la siguiente sintaxis.
TRANSLATE <campo> USING <regla>.
Esta sentencia reemplaza todos los caracteres de <campo> que cumplan la regla de sustitucin <regla>. La regla de
sustitucin contiene pares de letras, la primera de ellas indica el carcter a sustituir, la segunda indica el carcter de
sustitucin. <regla> puede ser una variable.
REPORT ZFSDF.
DATA: TEMPORAL(10) VALUE 'AbCdEfGAIJ',
CADENA LIKE TEMPORAL,
REGLA(20) VALUE
'A1b2C3D4E5f6G7H8I9j0'.
CADENA = TEMPORAL.
WRITE / CADENA.
TRANSLATE CADENA TO UPPER CASE.
WRITE / CADENA.
CADENA = TEMPORAL.
TRANSLATE CADENA USING REGLA.
WRITE / CADENA.
4.7 Overlay
Se utiliza para sobrescribir un campo alfanumrico con otro campo.
OVERLAY <campo1> WITH <campo2> [ ONLY <string> ].
Lima-Per
Pgina 52 de 172
Esta sentencia sobrescribe todas las posiciones del campo <campo1> que
contengan las letras de <string> con el contenido del campo <campo2>. <campo2>
permanece sin cambios.
Si omitimos la clusula ONLY, slo las posiciones con espacios
sobrescritas. Si al menos una posicin del campo <campo1>
SY-SUBRC ser 0. En caso contrario ser 4. Si <campo1> es
longitud que <campo2>, slo los caracteres correspondientes a
<campo2> podrn ser actualizados en <campo1>.
en blanco sern
es sustituida,
superior a la
la longitud de
REPORT ZH_CADENAS2 .
DATA: CAD1(30) VALUE 'LI A S C
TAL E
RU',
CAD2(30) VALUE 'X M E
API
D PEHG'.
WRITE: 'CAD1: ', CAD1.
WRITE: / 'CAD2: ', CAD2.
OVERLAY CAD1 WITH CAD2.
WRITE: / ' *** OVERLAY CAD1 WITH CAD2 ***'.
WRITE: / 'CAD1: ', CAD1.
WRITE: / 'CAD2: ', CAD2.
REPORT Z_DGCC48 .
DATA: T(10) VALUE 'A C E G I ',
STRING LIKE T,
L(10) VALUE '1234567890',
S(2) VALUE 'AI'.
STRING = T.
WRITE STRING.
OVERLAY STRING WITH L.
WRITE / STRING.
STRING = T.
OVERLAY STRING WITH L ONLY S.
WRITE / STRING.
Lima-Per
Pgina 53 de 172
ACEGI
A2C4E6G8I0
1CEG9
4.8 Search
Se utiliza para buscar una cadena de caracteres en un campo alfanmerico.
SEARCH string FROM string _buscar [OPCIONES].
Esta sentencia busca en el campo <string> la secuenca de caracteres <string_buscar>.
Si se encuentra, la variable del sistema SY-SUBRC vale 0 y SY-FDPOS toma el valor del offset del string
encontrado. En caso contrario, SY-SUBRC vale 4. El string <str> puede contener caracteres con cierto significado
particular.
REPORT
ZH_CADENAS2
REPORT EJEMPLO.
DATA STRING(30) VALUE 'David Carballido Cordova.'.
WRITE: / 'Searched', 'SY-SUBRC', 'SY-FDPOS'.
ULINE /1(26).
SEARCH STRING FOR 'x'.
WRITE: / 'x', SY-SUBRC UNDER 'SY-SUBRC',SY-FDPOS UNDER 'SY-FDPOS'.
SEARCH STRING FOR 'lli'.
WRITE: / 'lli', SY-SUBRC UNDER 'SY-SUBRC',SY-FDPOS UNDER 'SY-FDPOS'.
Lima-Per
Pgina 54 de 172
REPORT ZPROCESO_16 .
DATA: text TYPE string.
text = 'La sede de San Miguel queda en la avenida La Marina'.
WRITE:/ 'Search in:', '"La sede de San Miguel queda en la avenida La Marina"'.
************************************************************************
"Si la busqueda es exitosa entonces sy-subcr = 0 y sy-fdpos = posicion.*
"En caso contrario sy-subcr = 4.*
************************************************************************
SKIP.
SEARCH text FOR 'queda '. "Busqueda exacta, espacios blancos al final de s2 son ignorados.*
WRITE: / 'SEARCH text FOR "queda "'.
WRITE: / 'sy-subcr:', sy-subrc, / 'sy-fdpos:', sy-fdpos.
ULINE.
SEARCH text FOR '.sede .'. "Busqueda que toma en cuenta los blancos que hay al final de s2.*
WRITE: / 'SEARCH text FOR ".sede ."'.
WRITE: / 'sy-subcr:', sy-subrc, / 'sy-fdpos:', sy-fdpos.
ULINE.
SEARCH text FOR 'mar*'.
"Busca la cadena que comience con s2.*
WRITE: / 'SEARCH text FOR "mar*"'.
WRITE: / 'sy-subcr:', sy-subrc, / 'sy-fdpos:', sy-fdpos.
ULINE.
SEARCH text FOR '*gue'.
"Busca la cadena que termine con s2.*
WRITE: / 'SEARCH text FOR "*gue"'.
WRITE: / 'sy-subcr:', sy-subrc, / 'sy-fdpos:', sy-fdpos.
ULINE.
Lima-Per
Pgina 55 de 172
negacin de la anterior.
Lima-Per
Pgina 56 de 172
negacin de la anterior.
<f1> NP <f2>
report ztx1003.
* operator: co
write / '''AABB'' co ''AB'''.
if 'AABB' co 'AB'.
write 'True'.
else. write 'False'.
endif.
write / '''ABCD'' co ''ABC'''.
if 'ABCD' co 'ABC'.
write 'True'.
else.
write 'False'. endif.
* operator: cn
write / '''AABB'' cn ''AB'''.
if 'AABB' cn 'AB'.
write 'True'.
else.
write 'False'.
endif.
write / '''ABCD'' cn ''ABC'''.
if 'ABCD' cn 'ABC'.
write 'True'. else. write 'False'. endif.
* operator: ca
write / '''AXCZ'' ca ''AB'''.
if 'AXCZ' ca 'AB'.
write 'True'. else. write 'False'. endif.
write / '''ABCD'' ca ''XYZ'''.
if 'ABCD' ca 'XYZ'.
write 'True'. else. write 'False'. endif.
* operator: na
write / '''AXCZ'' na ''ABC'''.
if 'AXCZ' na 'ABC'.
write 'True'. else. write 'False'. endif.
write / '''ABCD'' na ''XYZ'''.
if 'ABCD' na 'XYZ'.
write 'True'. else. write 'False'. endif.
report ztx1004.
* operator: co
write / '''AABB'' co ''AB'''.
if 'AABB' co 'AB'.
write 'True'. else. write 'False'. endif.
Lima-Per
Pgina 57 de 172
report ztx1001.
data: begin of s1,
x value 'X',
y value 'Y',
z value 'Z',
Lima-Per
Pgina 58 de 172
end of s1,
begin of s2,
x value 'X',
z value 'Z',
end of s2.
if s1-x = s2-x.
write: / s1-x, '=', s2-x.
else.
write: / s1-x, '<>', s2-x.
endif.
if s1-x between s2-x and s2-z.
write: / s1-X, 'ESTA ENTRE', s2-x, 'and', s2-z.
else.
write: / s1-X, 'NO ESTA ENTRE', s2-x, 'and', s2-z.
endif.
if s1 = s2.
"COMPARANDO CAMPOS CADENA BYTE POR BYTE
write: / 's1 = s2'.
else.
write: / 's1 <> s2'.
endif.
if 0 = ' '.
write: / '0 = '' '''.
else.
write: / '0 <> '' '''.
endif.
report ztx1009.
data: f1,
begin of s,
c1 value 'A',
c2 value 'B',
c3 value 'C',
c4 value 'D',
c5 value 'E',
c6 value 'F',
end of s.
write / ''.
do 6 times varying f1 from s-c1 next s-c2.
write f1.
enddo.
write / ''.
do 3 times varying f1 from s-c1 next s-c3.
write f1.
enddo.
Lima-Per
Pgina 59 de 172
report ztx1006.
write: / 'HOLA'.
exit.
write: / 'AQUI'.
Ejemplo 4.1 Disear un programa que permita leer dos cadenas: cad[50] y cad2[20], luego
imprimir la cadena concatenada.
REPORT ZPROBLEMA_01.
PARAMETERS: cad1(50) TYPE c DEFAULT '',
cad2(20) TYPE c DEFAULT ''.
DATA linea TYPE string.
CONCATENATE cad1 cad2 INTO linea.
WRITE / linea.
* SI SE QUIERE UN ESPACIO ENTRE LAS CADENAS, SE PUEDE AGREGAR
* DE LA SIGUIENTE MANERA:
* CONCATENATE CAD1 CAD2 INTO LINEA SEPARATED BY SPACE.
Lima-Per
Pgina 60 de 172
Ejemplo 4.2 Disear un programa que permita leer dos cadenas de diferente longitud, luego las dos
cadenas mostrarlo en forma concatenada, convertirlo a maysculas, mostrar en forma invertida y
finalmente mostrarlo en su estado de origen (al estado en que se realiz la conversin a
maysculas).
REPORT ZPROBLEMA_02.
PARAMETERS: cad1(50) TYPE c DEFAULT '',
cad2(20) TYPE c DEFAULT ''.
DATA linea TYPE string.
CONCATENATE cad1 cad2 INTO linea.
TRANSLATE linea TO UPPER CASE.
DATA len TYPE i.
len = STRLEN( linea ).
WRITE: / 'La longitud de la cadena es: ', len.
SKIP.
WRITE: / 'La concatenacin en Maysculas es: ', linea.
DATA: cont TYPE i VALUE 0,
linea1 TYPE string.
DO len TIMES.
CONCATENATE linea+cont(1) linea1 INTO linea1.
Lima-Per
Pgina 61 de 172
cont = cont + 1.
ENDDO.
SKIP.
WRITE: / 'La cadena invertida en maysculas es: ', linea1.
DATA: count TYPE i VALUE 0,
linea2 TYPE string.
DO len TIMES.
CONCATENATE linea1+count(1) linea2 INTO linea2.
count = count + 1.
ENDDO.
SKIP.
WRITE / 'Uso de la sentencia DO para mostrar la cadena'.
WRITE: / 'en su estado original: ', linea2.
Ejemplo 4.3 Disear un programa que permita leer una cadena cad1 de longitud mxima 50 y
crear una cad2[50], luego:
Copiar informacin de cad1 en cad2.
Imprimir a partir del tercer carcter y hasta el final, los caracteres de cad2.
Imprimir solo los 3 primeros caracteres de cad2.
ZPROBLEMA_04
PARAMETERS: cad1(50) TYPE c DEFAULT ''.
DATA cad2(50) TYPE c.
TRANSLATE cad1 TO LOWER CASE.
WRITE: / 'La cadena ingresada fue: ', cad1.
SKIP.
MOVE cad1 TO cad2.
TRANSLATE cad2 TO LOWER CASE.
WRITE: / 'La cadena 2 es: ', cad2.
SKIP.
Lima-Per
Pgina 62 de 172
Lima-Per
Pgina 63 de 172
Nombre de Variable
Descripcin
SY-INDEX
SY-PAGNO
SY-TABIX
SY-TFILL
SY-TLOPC
Utilizacin interna
SY-TMAXL
SY-TOCCU
SY-TTABC
SY-TSTIS
Utilizacin interna
SY-TTABI
SY-DBCNT
SY-FDPOS
SY-COLNO
SY-LINCT
SY-LINNO
SY-LINSZ
SY-PAGCT
SY-MACOL
SY-MAROW
Lima-Per
Pgina 64 de 172
SY-TLENG
SY-SFOFF
Utilizacin interna
SY-WILLI
SY-LILLI
SY-SUBRC
SY-FLENG
SY-CUCOL
SY-CUROW
SY-LSIND
SY-LISTI
SY-STEPL
SY-TPAGI
SY-WINX1
SY-WINY1
SY-WINX2
SY-WINY2
SY-WINCO
Nombre de Variable
Descripcin
SY-WINRO
SY-WINDI
SY-SROWS
Lneas en la pantalla
SY-SCOLS
Columnas en la pantalla
SY-LOOPC
SY-FOLEN
Lima-Per
Pgina 65 de 172
SY-FODEC
SY-TZONE
SY-DAYST
SY-FTYPE
SY-APPLI
Aplicaciones SAP
SY-FDAYW
SY-CCURS
SY-CCURT
SY-DEBUG
Utilizacin interna
SY-CTYPE
SY-INPUT
Utilizacin interna
SY-LANGU
SY-MODNO
SY-BATCH
SY-BINPT
SY-CALLD
SY-DYNNR
SY-DYNGR
SY-NEWPA
Utilizacin interna
SY-PRI40
Utilizacin interna
7SY-RSTRT
Utilizacin interna
SY-WTITL
SY-CPAGE
SY-DBNAM
Lima-Per
Pgina 66 de 172
SY-MANDT
SY-PREFX
SY-FMKEY
SY-PEXPI
SY-PRINI
Utilizacin interna
SY-PRIMM
Nombre de Variable
Descripcin
SY-PRREL
SY-PLAYO
Utilizacin interna
SY-PRBIG
SY-PLAYP
Utilizacin interna
SY-PRNEW
SY-PRLOG
Utilizacin interna
SY-PDEST
SY-PLIST
SY-PAUTH
Utilizacin interna
SY-PRDSN
SY-PNWPA
Utilizacin interna
SY-CALLR
SY-REPI2
Utilizacin interna
SY-RTITL
SY-PRREC
IMPRIMIR: Destinatario
SY-PRTXT
SY-PRABT
Lima-Per
Pgina 67 de 172
SY-LPASS
Utilizacin interna
SY-NRPAG
Utilizacin interna
SY-PAART
IMPRESION: Edicin
SY-PRCOP
SY-BATZS
SY-BSPLD
SY-BREP4
SY-BATZO
SY-BATZD
SY-BATZW
SY-BATZM
SY-CTABL
SY-DBSYS
SY-DCSYS
SY-MACDB
SY-SYSID
SY-OPSYS
SY-PFKEY
SY-SAPRL
Nombre de Variable
Descripcin
SY-TCODE
SY-UCOMM
SY-CFWAE
Utilizacin interna
SY-CHWAE
Utilizacin interna
Lima-Per
Pgina 68 de 172
SY-SPONO
SY-SPONR
SY-WAERS
SY-CDATE
SY-DATUM
SY-SLSET
Nombre de SELECTON-SETS
SY-SUBTY
SY-SUBCS
SY-GROUP
INTERNO: Concatenacin
SY-FFILE
SY-UZEIT
SYSTEM: Hora
SY-DSNAM
SY-REPID
SY-TABID
Utilizacin interna
SY-TFDSN
SY-UNAME
SY-LSTAT
SY-ABCDE
SY-MARKY
SY-SFNAM
Sin utilizar
SY-TNAME
SY-MSGLI
SYTITLE
SY-ENTRY
Utilizacin interna
SY-LISEL
Lima-Per
Pgina 69 de 172
SY-ULINE
SY-XCODE
Cdigo OK ampliado
SY-CPROG
SY-XPROG
SY-XFORM
SY-LDBPG
SY-TVAR0
Nombre de Variable
Descripcin
SY-TVAR1
SY-TVAR2
SY-TVAR3
SY-TVAR4
SY-TVAR5
SY-TVAR6
SY-TVAR7
SY-TVAR8
SY-TVAR9
SY-MSGID
ID de mensaje
SY-MSGTY
SY-MSGNO
SY-MSGV1
Variable en mensaje
SY-MSGV2
Variable en mensaje
SY-MSGV3
Variable en mensaje
Lima-Per
Pgina 70 de 172
SY-MSGV4
Variable en mensaje
SY-ONCOM
SY-VLINE
SY-WINSL
SY-STACO
SY-STARO
SY-DATAR
SY-HOST
Nombre de la mquina
SY-LOCDB
SY-LOCOP
SY-DATLO
SY-TIMLO
SY-TSTLO
SY-ZONLO
SY-DATUT
SY-TIMUT
SY-TSTUT
Lima-Per
Pgina 71 de 172
Tablas internas
5.1 Registros
Declaramos registros de la siguiente manera:
DATA: BEGIN OF <registro>,
....
END OF <registro>.
Se utiliza la sentencia DATA y ser marca el principio y el final de la agrupacin con las clusulas BEGIN OF y END
OF.
Existe una variante para declarar tablas internas
DATA <tabla> <tipo> [ WITH HEADER LINE ].
En la opcin <tipo> se puede referenciar un tipo de dato de tabla interna con la clusula TYPE o una tabla interna
con la clusula LIKE. El objeto de dato <tabla> ser creado con la misma estructura que la referenciada en <tipo>.
Si utilizamos la clusula WITH HEADER LINE la tabla interna se crea con el rea de trabajo <tabla>. El rea de
trabajo y la tabla interna tienen el mismo nombre. En funcin de la sentencia que estemos utilizando, el sistema sabe
si queremos emplear el rea de trabajo o la tabla.
Si utilizamos la clusula WITH HEADER LINE la tabla se crea con el rea de trabajo <tabla>.
DATA: BEGIN OF <tabla> OCCURS <n>,
....
END OF <tabla>.
Con la sentencia anterior definimos la tabla interna <tabla>. Los componentes de la lnea de la
tabla interna se definen entre las clusula BEGIN OF y END OF.
Esta sentencia siempre crea un rea de trabajo. <n> tiene el mismo significado que el visto
anteriormente.
Ejemplo X.2 Tabla interna.
TYPES: BEGIN OF ESTRUCTURA,
COLUMNA1 TYPE I,
COLUMNA2 TYPE I,
COLUMNA3 TYPE I,
Lima-Per
Pgina 72 de 172
END OF LINE.
DATA: TABLITA TABLE OF ESTRUCTURA WITH HEADER LINE.
Lima-Per
Pgina 73 de 172
Dentro del LOOP, la variable SY-TABIX contiene el ndice de la entrada que est procesando en ese momento.
Tambin es posible hacer un:
LOOP AT<intab> FROM <inicio> TO <fin>.
ENDLOOP.
Donde <inicio> y <fin> son ndices de la tabla interna.
.ENDSELECT.
.
Lima-Per
Pgina 74 de 172
Tambien se puede usar la variable interna SY-TFILL, pero tendr efecto solo cuando se invoque despus
de haber realizado un loop a la tabla interna.
Lima-Per
Pgina 75 de 172
Lima-Per
Pgina 76 de 172
<tabla1> y <tabla2> son las reas de trabajo de las tablas internas. Si una tabla interna tiene rea de trabajo, rea y
tabla tienen el mismo nombre, para poder distinguirlos se utilizan los corchetes ( [ ] ).
Con los corchetes ser el contenido de la tabla interna el que se copiar, en lugar del rea de trabajo.
La sentencia MOVE copia el contenido de la primera tabla interna (o rea de trabajo) especificada sobre la segunda
tabla interna ( o rea de trabajo). Las tablas utilizadas pueden tener como componentes a su vez tablas internas. El
contenido de <tabla2> se sobrescribe.
OBSERVACION
MANEJO DE MOVE CON [] SE MUEVEN TODOS. EJEMPLO
REPORT
ZTABLAS09_ANIBAL .
Lima-Per
Pgina 77 de 172
Variante:
Que sucede cuando el ancho de uno de los campos de la tabla destino es menor qe el campo
origen correspondiente? Funciona?
REPORT
ZTABLAS09_ANIBAL .
Lima-Per
Pgina 78 de 172
ULINE.
LOOP AT TABLA2.
WRITE: / TABLA2-PRIMER_CAMPO, TABLA2-SEGUNDO_CAMPO,
TABLA2-TERCER_CAMPO.
ENDLOOP.
ZTABLAS09_ANIBAL .
Lima-Per
Pgina 79 de 172
ULINE.
LOOP AT TABLA2.
WRITE: / TABLA2-PRIMER_CAMPO, TABLA2-SEGUNDO_CAMPO,
TABLA2-TERCER_CAMPO, TABLA2-CUARTO_CAMPO.
ENDLOOP.
El campo destino queda vacio. Siempre y cuando los otros campos tengan el mismo
ancho en las dos tablas.
Cuando existe un campo demas en la tabla destino, y los anchos no son los mismos.
Puede generar error.
REPORT
ZTABLAS09_ANIBAL .
Lima-Per
Pgina 80 de 172
LOOP AT TABLA1.
WRITE: / TABLA1-PRIMER_CAMPO, TABLA1-SEGUNDO_CAMPO,
TABLA1-TERCER_CAMPO.
ENDLOOP.
ULINE.
LOOP AT TABLA2.
*
WRITE: / TABLA2-PRIMER_CAMPO, TABLA2-SEGUNDO_CAMPO,
*
TABLA2-TERCER_CAMPO, TABLA2-CUARTO_CAMPO.
WRITE: / TABLA2-CUARTO_CAMPO.
ENDLOOP.
El campo vacio se llena con los valores sobrantes del campo anterior (siempre que
el ancho sea mas angosto que su equivalente en la tabla origen).
Equivalentes
<var2> = <var1>.
MOVE <F1> TO <f2>.
MOVE <F2> TO <f3>.
MOVE <F3> TO <f4>.
Ejemplo:
DATA: VARI(15) VALUE 'RIVERLAND BCN.',
VAR2(15) VALUE 'HOLA'.
MOVE VARI+10(4) TO VAR2+5(4).
WRITE VAR2.
Resultado:
HOLA BCN.
VAR1
R I V E R L A N D
B C N .
VAR2
H O L A
MOVE VAR1+10(4) TO VAR2+5(4).
VAR2
Lima-Per
Pgina 81 de 172
H O L A
B C N .
MOVE-CORRESPONDING
Se utiliza para copiar los datos de un componente field-string sobre otro componente field-string.
Sintaxis:
Asigna el contenido de los componentes del registro <string1> sobre los componentes del
registro <string2> que se llamen igual. Por cada para de nombres coincidentes el sistema ejecuta
una sentencia MOVE, adems realiza todos los tipo de conversin necesarios de forma separada.
Ejemplo:
DATA: BEGIN OF ADDRESS,
FIRSTNAME(20) VALUE 'Fred',
SURNAME(20) VALUE 'Flintstone',
INITIALS(4) VALUE 'FF',
STREET(20) VALUE 'Cave Avenue,
NUMBER TYPE I VALUE '11'.
POSTCODE TYPE N VALUE '98765'.
CITY(20) VALUE 'Bedrock',
END OF ADDRESS.
DATA: BEGIN OF NAME,
SURNAME(20),
FIRSTNAME(20),
INITIALS(4),
TITLE(10) VALUE 'Mister',
END OF NAME.
MOVE-CORRESPONDING ADDRESS TO NAME.
5.3.2 Clear
Con la sentencia CLEAR se puede inicializar, o la lnea de cabecera de la tabla, o el contenido de la tabla.
CLEAR <campo>.
Esta sentencia inicia el contenido del objeto de datos <campo> a sus valores iniciales por defecto. Se puede
distinguir entre los siguientes casos:
Tipos de datos elementales. El sistema inicia el valor del campo <campo> a su valor por defecto, no el valor inicial
asignado con la sentencia DATA, con la clusula VALUE. las constantes no se pueden iniciar.
En una tabla interna se inicia el rea de trabajo de la tabla interna, y no su contenido.
Lima-Per
Pgina 82 de 172
5.3.3 Refresh
Se utiliza para inicializar una tabla, con o sin lnea de cabecera.
REFRESH <tabla>.
Despus de procesar el sistema esta sentencia, la tabla interna no contiene ninguna lnea.
5.3.4 Free
Se utiliza para liberar el espacio de memoria que se reserva despus de utilizar las sentencias REFRESH o CLEAR.
FREE <tabla>.
Ejemplo X.2 Uso de WRITE.
REPORT EJEMPLO.
DATA: BEGIN OF EL_REGISTRO,
COLUMNA1,
COLUMNA2,
END OF EL_REGISTRO.
DATA INDICE_TABLA LIKE TABLE OF EL_REGISTRO.
EL_REGISTRO-COLUMNA1 = 'A'.
EL_REGISTRO-COLUMNA2 = 'B'.
APPEND EL_REGISTRO TO INDICE_TABLA.
REFRESH INDICE_TABLA.
IF INDICE_TABLA IS INITIAL.
Lima-Per
Pgina 83 de 172
Lima-Per
Pgina 84 de 172
Lima-Per
Pgina 85 de 172
5.5 Ordenamiento
Para ordenar una tabla interna utilizamos SORT.
SORT <intab>.
Esta instruccin realiza una ordenacin por la estructura de la tabla sin tener en cuenta los campos P,I,F.
Para ordenar por el campo(s) que necesitemos (sea del tipo que sea):
SORT <intab> BY <campo1> .... <campo n>.
Si no se indica lo contrario, la ordenacin por defecto es ascendente.
Con la clusula BY los campos se ordenarn de acuerdo con los componentes especificados <campo1> ...
<campon>.
Para ordenar descendentemente se escribe DESCENDING.
Lima-Per
Pgina 86 de 172
APPEND
Aade un registro a una tabla interna con los valores que tengamos en el rea de trabajo. Aade registros al final de
una tabla interna.
APPEND <intab>.
DATA: BEGIN OF TABLA OCCURS 10,
COLUMNA1 TYPE C,
COLUMNA2 TYPE I,
END OF TABLA.
APPEND INITIAL LINE TO TABLA.
DO 3 TIMES.
TABLA-COLUMNA1 = SY-INDEX.
TABLA-COLUMNA2 = SY-INDEX ** 2.
APPEND TABLA.
ENDDO.
LOOP AT TABLA.
WRITE:/ TABLA-COLUMNA1, TABLA-COLUMNA2.
ENDLOOP.
O
1
4
9
1
2
3
COLLECT
Aade o suma la lnea de cabecera de una tabla interna comparando los campos de tipo carcter. Sumar todos los
campos de tipo P, F, I.
El collect funciona no con un campo "clave", pero debes tener la precaucion de:
Poner todos los campos "clave" los primeros de la tabla interna, p ej: el n de factura, la fecha, etc y los
ultimos campos de la tabla interna sera los campos a sumarizar.
Hacer un sort de la tabla interna antes de recorrerla y hacer el collect. debes ordenar los registros de la tabla
interna con el mismo patron que quieras que luego te sumarize los campos. p ej:
sort itab by n_factura fecha ....
El problema de esta instruccin es que es bastante lenta. Se puede sustituir por las instrucciones READ e
INSERT o MODIFY.
Podemos llenar una tabla interna con el contenido de una tabla de base de datos. Siempre que la tabla interna tenga
la misma estructura que la tabla de base de datos.
SELECT * FROM <tab> INTO TABLE <tabint>.
Lima-Per
Pgina 87 de 172
Se debe usar solo la declaracin COLLECT si se desea crear tablas sumarizadas. Si se usa otras declaraciones para
insertar entradas a la tabla, se podra tener entradas duplicadas.
REPORT EJEMPLO.
DATA: BEGIN OF TABLA OCCURS 10,
COL1(3) TYPE C,
COL2(2) TYPE N,
COL3
TYPE I,
END OF TABLA.
TABLA-COL1 = 'abc'.
TABLA-COL2 = '12'.
TABLA-COL3 = 3.
COLLECT TABLA.
TABLA-COL1 = 'def'.
TABLA-COL2 = '34'.
TABLA-COL3 = 5.
COLLECT TABLA.
TABLA-COL1 = 'abc'.
TABLA-COL2 = '12'.
TABLA-COL3 = 7.
COLLECT TABLA.
LOOP AT TABLA.
WRITE:/ TABLA-COL1,
TABLA-COL2,
TABLA-COL3.
ENDLOOP.
abc
def
12
34
10
5
REPORT EJEMPLO.
TYPES: BEGIN OF COMPANY,
NAME(20) TYPE C,
SALES TYPE I,
END OF COMPANY.
DATA: COMP TYPE COMPANY OCCURS 10 WITH HEADER LINE.
* Ingresamos valores al rea de trabajo y luego a la tabla interna.
COMP-NAME = 'Tiger'. COMP-SALES = 20. COLLECT COMP.
COMP-NAME = 'Duck'. COMP-SALES = 30. COLLECT COMP.
COMP-NAME = 'Tiger'. COMP-SALES = 60. COLLECT COMP.
LOOP AT COMP.
WRITE:/ COMP-NAME, COMP-SALES.
ENDLOOP.
Lima-Per
Pgina 88 de 172
Tiger
Duck
80.
30.
REPORT ZASD.
TABLES: SPFLI.
TYPES: BEGIN OF Z_SPFLI,
COUNTRYFR LIKE SPFLI-COUNTRYFR,
FLTIME LIKE SPFLI-FLTIME,
END OF Z_SPFLI.
DATA: TABLITA TYPE TABLE OF Z_SPFLI WITH HEADER LINE.
SELECT COUNTRYFR FLTIME Into TABLITA From SPFLI.
****
Append TABLITA.
COLLECT TABLITA.
ENDSELECT.
LOOP AT TABLITA.
Lima-Per
Pgina 89 de 172
ENDLOOP.
REPORT ZASD.
TABLES: SPFLI.
TYPES: BEGIN OF Z_SPFLI,
COUNTRYFR LIKE SPFLI-COUNTRYFR,
CITYFROM LIKE SPFLI-CITYFROM,
FLTIME LIKE SPFLI-FLTIME,
END OF Z_SPFLI.
DATA: TABLITA TYPE TABLE OF Z_SPFLI WITH HEADER
LINE.
SELECT COUNTRYFR CITYFROM FLTIME Into TABLITA
From SPFLI.
*
Append TABLITA.
COLLECT TABLITA.
ENDSELECT.
LOOP AT TABLITA.
WRITE : /21 TABLITA-COUNTRYFR,
35 TABLITA-CITYFROM,
51 TABLITA-FLTIME.
ENDLOOP.
REPORT ZASD.
TABLES: SPFLI.
TYPES: BEGIN OF Z_SPFLI,
COUNTRYFR LIKE SPFLI-COUNTRYFR,
CITYFROM LIKE SPFLI-CITYFROM,
FLTIME LIKE SPFLI-FLTIME,
AIRPFROM LIKE SPFLI-AIRPFROM,
END OF Z_SPFLI.
DATA: TABLITA TYPE TABLE OF Z_SPFLI WITH HEADER LINE.
Lima-Per
Pgina 90 de 172
REPORT ZASD.
TABLES: SPFLI.
TYPES: BEGIN OF Z_SPFLI,
COUNTRYFR LIKE SPFLI-COUNTRYFR,
FLTIME LIKE SPFLI-FLTIME,
END OF Z_SPFLI.
DATA: TABLITA TYPE TABLE OF Z_SPFLI WITH HEADER LINE.
SELECT COUNTRYFR FLTIME Into TABLITA From SPFLI.
****
Append TABLITA.
COLLECT TABLITA.
ENDSELECT.
LOOP AT TABLITA.
WRITE : /21 TABLITA-COUNTRYFR,
51 TABLITA-FLTIME.
ENDLOOP.
REPORT ZASD.
TABLES: SPFLI.
TYPES: BEGIN OF Z_SPFLI,
COUNTRYFR LIKE SPFLI-COUNTRYFR,
Lima-Per
Pgina 91 de 172
*****COLLECT TABLITA.
ENDSELECT.
LOOP AT TABLITA.
WRITE : /21 TABLITA-COUNTRYFR,
51 TABLITA-FLTIME.
ENDLOOP.
REPORT ZASD.
TABLES: SPFLI.
TYPES: BEGIN OF Z_SPFLI,
COUNTRYFR LIKE
SPFLI-COUNTRYFR,
CITYFROM LIKE SPFLI-CITYFROM,
FLTIME LIKE SPFLI-FLTIME,
END OF Z_SPFLI.
DATA: TABLITA TYPE TABLE OF Z_SPFLI WITH
AHORA CON OTRO
HEADER LINE.
CAMPO MAS:
COUNTRYFR
SELECT COUNTRYFR CITYFROM FLTIME Into
CITYFROM
TABLITA From SPFLI.
FLTIME
* APPEND TABLITA.
COLLECT TABLITA.
ENDSELECT.
Lima-Per
Pgina 92 de 172
LOOP AT TABLITA.
WRITE : /21 TABLITA-COUNTRYFR,
35 TABLITA-CITYFROM,
51 TABLITA-FLTIME.
ENDLOOP.
Report ZASD.
TABLES: SPFLI.
TYPES: BEGIN OF Z_SPFLI,
CARRID LIKE SPFLI-COUNTRYFR,
COUNTRYFR LIKE SPFLI-COUNTRYFR,
FLTIME LIKE SPFLI-FLTIME,
CITYFROM LIKE SPFLI-CITYFROM,
END OF Z_SPFLI.
DATA: TABLITA TYPE TABLE OF Z_SPFLI WITH HEADER LINE.
SELECT CARRID COUNTRYFR FLTIME CITYFROM Into TABLITA From SPFLI.
*APPEND TABLITA.
COLLECT TABLITA.
ENDSELECT.
LOOP AT TABLITA.
WRITE : /21 TABLITA-CARRID,
35 TABLITA-COUNTRYFR,
51 TABLITA-FLTIME,
71 TABLITA-CITYFROM.
ENDLOOP.
Lima-Per
Pgina 93 de 172
PROGRAMA:
REPORT
ZEJTABLASINTERNAS
ZEJTABLASINTERNAS.
Lima-Per
Pgina 94 de 172
COLUMNA1 TYPE C,
COLUMNA2 TYPE I,
END OF TABLA.
DO 3 TIMES.
TABLA-COLUMNA1 = SY-INDEX.
TABLA-COLUMNA2 = SY-INDEX ** 2.
APPEND TABLA.
ENDDO.
LOOP AT TABLA.
WRITE: / TABLA-COLUMNA1, TABLA-COLUMNA2.
ENDLOOP.
MENSAJE DE ERROR:
TABLITA is not an internal table the OCCURS n specification is missing.
EXPLICACION Y SOLUCION:
TABLITA ya no es una tabla, solo es una estructura.
Se necesita un dato tipo tabla TABLITA1 que se enlace a la estructura TABLITA, mediante:
DATA TABLITA1 LIKE TABLE OF TABLITA.
Adems APPEND sufre una modificacin, se debe agregar la estructura a la
tabla, mediante:
APPEND TABLITA TO TABLITA1.
El loop se hace a la tabla dentro de la estructura, mediante:
LOOP AT TABLITA1 INTO TABLITA.
REPORT
ZEJTABLASINTERNAS.
Lima-Per
Pgina 95 de 172
Para ello, en primer lugar rellenaremos la lnea de cabecera con la clave de bsqueda y luego haremos el READ.
El resultado de la bsqueda lo tendremos en SY-SUBRC.
Insercin de registros
Se utiliza INSERT para insertar lneas en una tabla interna antes de una posicin determinada.
INSERT <tabla> [ INDEX <ndice> ].
INDEX , inserta una lnea antes de la posicin indicada en <ndice> y la nueva tiene el ndice <ndice>.
Si se produce algn error al insertar la lnea la variable SY-SUBRC valdr 4, en caso contrario valdr 0.
Si la sentencia se utiliza sin la clusula INDEX slo se podr utilizar en un LOOP .. ENDLOOP. El sistema insertara
la lnea antes de la lnea tratada en el bucle.
INSERT LINES OF <tabla1> [ FROM <n1> ] [ TO <n2> ] INTO <tabla2> [ INDEX <ndice> ]
Si no se especifican las clusulas FROM <n1> y TO <n2> la tabla <tabla1> se inserta entera sobre la tabla <tabla2>.
Especificando estas clusulas se puede indicar la primera y la ltima lnea que se va insertar. <n1> y <n2> son ndice
de la tabla interna.
Si especificamos la clusula INDEX <ndice>, la lnea se insertar antes de la lnea con el ndice <ndice>. Si la
sentencia INSERT se utiliza sin la clusula INDEX slo se podr ser utilizada en un bucle LOOP .. ENDLOOP.
El sistema inserta la lnea tratada en el bucle. Despus de ejecutarse la sentencia la variable del sistema SY-TABIX
tiene el ndice de la ltima lnea aadida. Dependiendo del tamao de la tabla interna que hay que copiar, con este
mtodo el proceso en 20 veces ms rpido que insertarlas lnea a lnea.
La sentencia INSERT puede ser utilizada para insertar una o varias lneas (a partir de una tabla interna) en una tabla
de la base de datos. Si no sabemos si la clave primaria existe, se debe utilizar la sentencia MODIFY. Se puede
utilizar una vista como especificacin de tabla, siempre y cuando la vista haga referencia a una sola tabla.
Lima-Per
Pgina 96 de 172
TABLA-COLUMNA2 = 3.
TABLA-COLUMNA2 = 5.
LOOP AT TABLA.
WRITE:/ TABLA-COLUMNA1, TABLA-COLUMNA2.
ENDLOOP.
B
A
0
5
3
REPORT SS1.
DATA:
BEGIN OF TABLA OCCURS 10,
COLUMNA1 TYPE C,
COLUMNA2 TYPE I,
END OF TABLA.
TABLA-COLUMNA1 = 'A'.
TABLA-COLUMNA2 = 3.
INSERT TABLA INDEX 1.
TABLA-COLUMNA1 = 'B'.
TABLA-COLUMNA2 = 5.
INSERT TABLA INDEX 2.
LOOP AT TABLA.
WRITE: / TABLA-COLUMNA1,
11 TABLA-COLUMNA2.
ENDLOOP.
Lima-Per
Pgina 97 de 172
WRITE:/ CLIENTE-NOMBRE,
CLIENTE-DNI,
CLIENTE-SALDO.
Alfredo Segovia
78345908
7500.
Carlos Rojas
84560937
6500.
Ejemplo de Sum
REPORT EJEMPLO.
DATA: BEGIN OF LINEA,
COL1 TYPE I,
COL2 TYPE I,
END OF LINEA,
TABLA LIKE LINEA OCCURS 10.
DO 3 TIMES.
LINEA-COL1 = SY-INDEX.
LINEA-COL2 = SY-INDEX ** 2.
APPEND LINEA TO TABLA.
ENDDO.
LOOP AT TABLA INTO LINEA.
"Area de trabajo LINEA.
WRITE: / LINEA-COL1, LINEA-COL2.
ENDLOOP.
ULINE.
Lima-Per
Pgina 98 de 172
Ejemplo de Sort
REPORT ZPROCESO_42 .
DATA:
Lima-Per
Pgina 99 de 172
Modificacin de registros
REPORT EJEMPLO.
DATA: BEGIN OF LINE,
COL1 TYPE I,
COL2 TYPE I,
END OF LINE.
Lima-Per
1
20
3
1
400
9
REPORT EJEMPLO.
DATA: BEGIN OF LINEA,
COLUMNA1 TYPE I,
COLUMNA2 TYPE I,
END OF LINEA,
TABLA LIKE LINEA OCCURS 10.
DATA:
LIN TYPE I,
OCC TYPE I.
DO 3 TIMES.
LINEA-COLUMNA1 = SY-INDEX.
LINEA-COLUMNA2 = SY-INDEX ** 2.
APPEND LINEA TO TABLA.
ENDDO.
LOOP AT TABLA INTO LINEA.
WRITE: / SY-TABIX, LINEA-COLUMNA1, LINEA-COLUMNA2.
ENDLOOP.
ULINE.
LINEA-COLUMNA1 = 10.
LINEA-COLU
MNA2 = 10 ** 2.
MODIFY TABLA FROM LINEA INDEX 2.
LOOP AT TABLA INTO LINEA.
Lima-Per
REPORT ZPROCESO_42 .
DATA:
BEGIN OF LINEA,
COLUMNA1 TYPE I,
COLUMNA2 TYPE I,
END OF LINEA,
LIN TYPE I,
OCC TYPE I.
DO 3 TIMES.
TABLA-COLUMNA1 = SY-INDEX.
TABLA-COLUMNA2 = SY-INDEX ** 2.
APPEND TABLA.
ENDDO.
LOOP AT TABLA.
WRITE: / SY-TABIX, TABLA-COLUMNA1, TABLA-COLUMNA2.
ENDLOOP.
ULINE.
TABLA-COLUMNA1 = 10.
TABLA-COLUMNA2 = 10 ** 2.
MODIFY TABLA INDEX 2.
LOOP AT TABLA.
WRITE: / SY-TABIX, TABLA-COLUMNA1, TABLA-COLUMNA2.
ENDLOOP.
Lima-Per
10
Eliminando registros
Para borrar lneas de una tabla interna contamos con la sentencia DELETE. Varios formatos de la sentencia nos
permiten borrar lneas de una forma diferente.
DELETE <tabla>.
El sistema slo puede procesar esta sentencia dentro de un bucle LOOP .. ENDLOOP. La sentencia DELETE borra
la lnea que estemos tratando en el bucle.
DELETE <tabla> INDEX <ndice>.
Con la clusula INDEX, el sistema borra la lnea con el ndice <ndice> en la tabla interna <tabla>. Despus de
borrar la lnea, el ndice de la siguiente lnea es decrementado en 1. Si la operacin es completada, la variable
SY-SUBRC vale 0. Si la lnea con el ndice <ndice> no existe, SY-SUBRC vale 4.
DELETE <TABLA> [ FROM <n1> ] [ TO <n2> ] [ WHERE <condicin> ].
Sentencia utilizada para borrar registros de una tabla de la base de datos. Con esta sentencia se puede borrar una o
varias lneas de una tabla. Slo se pueden borrar lneas de una tabla a travs de una vista si sta slo hace referencia
a una nica tabla.
Se debe indicar al menos una de las tres clusulas.
Si utilizamos la sentencia sin la clusula WHERE, el sistema borrar todas las lneas de la tabla <tabla> cuyo ndice
est comprendido entre <n1> y <n2>.
Si no utilizamos la clusula FROM, el sistema borrar desde la primera lnea.
Si no utilizamos la clusula TO, el sistema borrar hasta la ltima lnea.
Con la clusula WHERE el sistema slo borrar aquellas lnea de la tabla <tabla> que cumplen la condicin
especificada en <condicin>. En <condicin> se puede utilizar cualquier expresin lgica. El primer operando debe
Lima-Per
ser un componente de la estrucutra de lnea de la tabla interna. Si el sistema borra al menos una lnea la variable
SY-SUBRC valdr 0, si no borra ninguna valdr 4.
REPORT EJEMPLO.
DATA: BEGIN OF ARTICULO
ID(4)
DESCRIPTION(30)
PRECIO
END OF ARTICULO.
OCCURS 10,
TYPE C,
TYPE C,
TYPE I,
Lima-Per
SKIP 2.
DELETE ARTICULO INDEX 5.
LOOP AT ARTICULO.
WRITE:/ ARTICULO-ID,
ARTICULO-DESCRIPTION,
ARTICULO-PRECIO.
ENDLOOP.
REPORT EJEMPLO.
DATA: BEGIN OF LINEA_1,
COL1 TYPE I,
COL2 TYPE I,
END OF LINEA_1,
TABLA_1 LIKE LINEA_1 OCCURS 10.
DO 40 TIMES.
LINEA_1-COL1 = SY-INDEX.
LINEA_1-COL2 = SY-INDEX ** 2.
APPEND LINEA_1 TO TABLA_1.
ENDDO.
DELETE TABLA_1 FROM 3 TO 38 WHERE COL2 > 20.
LOOP AT TABLA_1 INTO LINEA_1.
WRITE: / LINEA_1-COL1, LINEA_1-COL2.
ENDLOOP.
REPORT ZPROCESO_40 .
Lima-Per
DATA:
BEGIN OF LINEA,
COLUMNA1 TYPE I,
COLUMNA2 TYPE I,
END OF LINEA,
TABLA LIKE LINEA OCCURS 10.
DO 15 TIMES.
LINEA-COLUMNA1 = SY-INDEX.
LINEA-COLUMNA2 = SY-INDEX ** 2.
APPEND LINEA TO TABLA.
ENDDO.
LOOP AT TABLA INTO LINEA.
WRITE: / SY-TABIX, LINEA-COLUMNA1, LINEA-COLUMNA2.
ENDLOOP.
ULINE.
LOOP AT TABLA INTO LINEA.
IF LINEA-COLUMNA1 < 11.
DELETE TABLA.
ENDIF.
ENDLOOP.
LOOP AT TABLA INTO LINEA.
WRITE: / SY-TABIX, LINEA-COLUMNA1, LINEA-COLUMNA2.
ENDLOOP.
REPORT ZPROCESO_41 .
************************************************************************
* BORRANDO REGISTROS CON:
*
DELETE itab.
*
DELETE itab FROM idx1 TO idx2 [expresion logica].
Lima-Per
************************************************************************
DATA: BEGIN OF LINEA,
COLUMNA1 TYPE I,
COLUMNA2 TYPE I,
END OF LINEA,
TABLA LIKE LINEA OCCURS 10.
DO 5 TIMES.
LINEA-COLUMNA1 = SY-INDEX.
LINEA-COLUMNA2 = SY-INDEX ** 2.
APPEND LINEA TO TABLA.
ENDDO.
LOOP AT TABLA INTO LINEA.
WRITE: / SY-TABIX, LINEA-COLUMNA1, LINEA-COLUMNA2.
ENDLOOP.
ULINE.
SKIP.
DELETE TABLA INDEX: 2, 3, 4.
************************************************************************
* EL INDICE 4 NO SE ENCUENTRA PORQUE LOS INDICES SE CHANCAN EN CADA
* BORRADO Y ESTAN SIEMPRE EN ORDEN.
************************************************************************
WRITE: / 'sy-subrc', SY-SUBRC.
LOOP AT TABLA INTO LINEA.
WRITE: / SY-TABIX, LINEA-COLUMNA1, LINEA-COLUMNA2.
ENDLOOP.
ULINE.
SKIP.
Lima-Per
11
Las sentencias AT permiten controlar el procesamiento de una tabla interna, dentro de un LOOP. Slo se
usan por tanto dentro de bucles LOOP.
Permiten ejecutar condicionalmente un bloque de sentencias, dentro del bucle, segn se cumpla o no una u
otra condicin. Estas son:
ATNEW, AT END OF, AT FIRST, AT LAST.
AT FIRST.
ENDAT.
AT LAST.
ENDAT.
AT NEW <campo>.
ENDAT.
AT END OF <campo>.
ENDAT.
Si utilizamos la instruccin SUM dentro de un AT ... ENDAT, realizar la suma de todos los campos P,I,F de ese
nivel de ruptura ( para el clculo de subtotales ).
Ser necesario que la tabla interna est ordenada en el mismo orden que la utilizacin de los niveles de ruptura.
La utilizacin conjunta de todas estas instrucciones ser:
SORT <intab> BY <c1> <c2>.
LOOP AT <intab>.
AT FIRST
... (SUM) ...
ENDAT.
AT NEW <cl>.
... (SUM)
ENDAT.
AT NEW <c2>.
... (SUM)
ENDAT.
.......... Proceso Normal de la tabla
AT END OF <c2>.
... (SUM) ...
ENDAT.
AT END OF <c1>.
... (SUM) ...
ENDAT.
Lima-Per
AT LAST
(SUM)
ENDAT.
ENDLOOP.
AT <fg> .. ENDAT
Definicin
La sentencia AT <fg> .. ENDAT slo puede ser utilizada dentro de un bucle LOOP .. ENDLOOP
para extractos, e identifica un bloque de proceso. La sentencia se ejecuta cuando se detecta que
cambia algn valor en el field-group.
Sintaxis:
AT <zfg> { WITH <fg1> }.
<bloque-sentencias>
ENDAT.
La setencia AT <fg> se cierra con ENDAT, identificando de esta forma un bloque de proceso.
La clusula WITH se utiliza para indicar que la sentencia AT se debe ejecutar si para el
field-group <fg> le sigue el field-group <fg1>.
Ejemplo 1:
DATA: NAME(30),
SALES TYPE I.
FIELD-GROUPS: HEADER, INFOS.
INSERT: NAME INTO HEADER,
SALES INTO INFOS.
...
LOOP.
AT NEW NAME.
NEW-PAGE.
ENDAT.
...
AT END OF NAME.
WRITE: / NAME, SUM(SALES).
ENDAT.
ENDLOOP.
Lima-Per
Lima-Per
AT END OF .. ENDAT
Definicin
La sentencia AT END OF .. ENDAT slo puede ser utilizada dentro de un bucle LOOP ..
ENDLOOP e identifica un bloque de proceso. La sentencia se ejecuta cuando se detecta que
cambia algn valor para el campo especificado.
Sintaxis:
AT END OF <campo>.
<bloque-sentencias>
ENDAT.
La sentencia AT END OF se cierra con ENDAT, identificando de esta forma un bloque de
proceso. En un bloque AT END OF .. ENDAT el rea de trabajo no se rellena con la lnea actual
de la tabla interna. Todos los campos que no forman parte de la clave estndar de la tabla toman
el valor inicial. Para la condicin de lnea END OF <campo> el sistema sobrescribe todos los
campos de la clave estndar, que se encuentran a la derecha del campo <campo> con asterisco
(*). No se debe utilizar la sentencia AT END OF .. ENDAT en combinacin con la sentencia
LOOP .. ENDLOOP con las clusulas FROM, TO o WHERE.
Ejemplo 1:
DATA: BEGIN OF COMPANIES OCCURS 20,
NAME(30),
PRODUCT(20),
SALES TYPE I,
END OF COMPANIES.
...
LOOP AT COMPANIES.
AT NEW NAME.
NEW-PAGE.
WRITE / COMPANIES-NAME.
ENDAT.
WRITE: / COMPANIES-PRODUCT, COMPANIES-SALES.
AT END OF NAME.
SUM.
WRITE: / COMPANIES-NAME, COMPANIES-SALES.
ENDAT.
ENDLOOP.
Lima-Per
AT FIRST .. ENDAT
Definicin
La sentencia AT FIRST .. ENDAT slo puede ser utilizada dentro de un bucle LOOP ..
ENDLOOP e identifica un bloque de proceso. La sentencia se ejecuta con el primer valor o
primer registro de la sentencia LOOP .. ENDLOOP.
Sintaxis:
AT FIRST.
<bloque-sentencias>
ENDAT.
La sentencia AT FIRST se cierra con ENDAT, identificando de esta forma un bloque de proceso.
En un bloque AT FIRST .. ENDAT el rea de trabajo no se rellena con la lnea actual de la tabla
interna. Todos los campos que no forman parte de la clave estndar de la tabla toman el valor
inicial. Para la condicin de lnea FIRST el sistema sobrescribe todos los campos de la clave
estndar, que se encuentran a la derecha del campo <campo> con asterisco (*). No se debe
utilizar la sentencia AT FIRST .. ENDAT en combinacin con la sentencia LOOP .. ENDLOOP
con las clusulas FROM, TO o WHERE.
Ejemplo 1:
DATA: BEGIN OF COMPANIES OCCURS 20,
NAME(30),
PRODUCT(20),
SALES TYPE I,
END OF COMPANIES.
...
LOOP AT COMPANIES.
AT FIRST.
NEW-PAGE.
WRITE / COMPANIES-BUKRS.
ENDAT.
Lima-Per
Lima-Per
AT LAST .. ENDAT
Definicin
La sentencia AT LAST .. ENDAT slo puede ser utilizada dentro de un bucle LOOP ..
ENDLOOP e identifica un bloque de proceso. La sentencia se ejecuta con el ltimo valor o
ltimo registro de la sentencia LOOP .. ENDLOOP.
Sintaxis:
AT LAST.
<bloque-sentencias>
ENDAT.
La sentencia AT LAST se cierra con ENDAT, identificando de esta forma un bloque de proceso.
En un bloque AT LAST .. ENDAT el rea de trabajo no se rellena con la lnea actual de la tabla
interna. Todos los campos que no forman parte de la clave estndar de la tabla toman el valor
inicial. Para la condicin de lnea LAST el sistema sobrescribe todos los campos de la clave
estndar, que se encuentran a la derecha del campo <campo> con asterisco (*). No se debe
utilizar la sentencia AT LAST .. ENDAT en combinacin con la sentencia LOOP .. ENDLOOP
con las clusulas FROM, TO o WHERE.
Ejemplo 1:
DATA: BEGIN OF COMPANIES OCCURS 20,
NAME(30),
PRODUCT(20),
SALES TYPE I,
END OF COMPANIES.
...
LOOP AT COMPANIES.
AT NEW NAME.
NEW-PAGE.
ENDAT.
WRITE: / COMPANIES-PRODUCT, COMPANIES-SALES.
AT LAST.
SUM.
WRITE: / COMPANIES-NAME, COMPANIES-SALES.
ENDAT.
ENDLOOP.
Lima-Per
AT NEW .. ENDAT
Definicin
La sentencia AT NEW .. ENDAT slo puede ser utilizada dentro de un bucle LOOP ..
ENDLOOP e identifica un bloque de proceso. La sentencia se ejecuta cuando se detecta que para
el campo especificado se va a producir un nuevo valor
Sintaxis:
AT NEW <campo>.
<bloque-sentencias>
ENDAT.
La sentencia AT NEW se cierra con ENDAT, identificando de esta forma un bloque de proceso.
En un bloque AT .. ENDAT el rea de trabajo no se rellena con la lnea actual de la tabla
interna. Todos los campos que no forman parte de la clave estndar de la tabla toman el valor
inicial. Para la condicin de lnea NEW el sistema sobrescribe todos los campos de la clave
estndar, que se encuentran a la derecha del campo <campo> con asterisco (*). No se debe
utilizar la sentencia AT .. ENDAT en combinacin con la sentencia LOOP .. ENDLOOP con las
clusulas FROM, TO o WHERE.
Ejemplo 1:
DATA: BEGIN OF COMPANIES OCCURS 20,
NAME(30),
PRODUCT(20),
SALES TYPE I,
END OF COMPANIES.
...
LOOP AT COMPANIES.
AT NEW NAME.
NEW-PAGE.
WRITE / COMPANIES-NAME.
ENDAT.
WRITE: / COMPANIES-PRODUCT, COMPANIES-SALES.
ENDLOOP.
Lima-Per
MANEJO DE AT NEW
REPORT ZEJ4
.
DATA: BEGIN OF EST_TABLITA OCCURS 10,
CARRID like SFLIGHT-CARRID,
CONNID like SFLIGHT-CONNID,
FLDATE like SFLIGHT-FLDATE,
SEATSMAX like SFLIGHT-SEATSMAX,
SEATSOCC like SFLIGHT-SEATSOCC,
SEATSOCC_B like SFLIGHT-SEATSOCC_B,
SEATSOCC_F like SFLIGHT-SEATSOCC_F,
SEATSMAX_B like SFLIGHT-SEATSMAX_B,
SEATSMAX_F like SFLIGHT-SEATSMAX_F,
PRICE like SFLIGHT-PRICE,
END OF EST_TABLITA.
Select CARRID CONNID FLDATE SEATSMAX SEATSOCC SEATSMAX_B SEATSOCC_B
SEATSMAX_F SEATSOCC_F PRICE
into TABLE EST_TABLITA from SFLIGHT.
WRITE: 'CARRID
SETSOCC
FLDATE'.
LOOP AT EST_TABLITA.
AT NEW CARRID.
WRITE: / EST_TABLITA-CARRID,
07 EST_TABLITA-SEATSOCC,
21 EST_TABLITA-FLDATE.
ENDAT.
ENDLOOP.
Muestra solo un valor de CARRID, de los tantos que pueden
haber. OJO, SOLO UNO.
Dentro del bucle AT NEW .. ENDAT.
Solo se muestra apropiadamente el campo al que se le aplica
AT NEW (CARRID), los dems campos se indeterminan
(SETSOCC y FLDATE).
REPORT ZEJ4
.
DATA: BEGIN OF EST_TABLITA OCCURS 10,
CARRID like SFLIGHT-CARRID,
CONNID like SFLIGHT-CONNID,
FLDATE like SFLIGHT-FLDATE,
SEATSMAX like SFLIGHT-SEATSMAX,
SEATSOCC like SFLIGHT-SEATSOCC,
SEATSOCC_B like SFLIGHT-SEATSOCC_B,
SEATSOCC_F like SFLIGHT-SEATSOCC_F,
SEATSMAX_B like SFLIGHT-SEATSMAX_B,
SEATSMAX_F like SFLIGHT-SEATSMAX_F,
PRICE like SFLIGHT-PRICE,
END OF EST_TABLITA.
Lima-Per
Lima-Per
FLDATE'.
ENDAT.
ENDLOOP.
WRITE: / EST_TABLITA-CONNID,
07 EST_TABLITA-SEATSOCC,
21 EST_TABLITA-FLDATE.
Lima-Per
WHEN 'LH'.
WRITE:/ 'INGRESO A: LH'.
WHEN 'DL'.
WRITE:/ 'INGRESO A: DL'.
WHEN OTHERS.
WRITE:/ 'OTRO INGRESO'.
ENDCASE.
ENDAT.
WRITE: / EST_TABLITA-CARRID,
11 EST_TABLITA-SEATSOCC.
ENDLOOP.
ETC.
Lima-Per
At line-selection
Para permitir al usuario seleccionar una lnea de un listado y realizar alguna accin, se puede escribir un bloque de
proceso en el programa para el evento AT LINE-SELECTION.
Sintaxis:
AT LINE-SELECTION..
<bloque-de-proceso>
Este evento define un bloque de proceso que se activa cuando seleccionamos una lnea del informe. Este evento se
utiliza en los informes interactivos cuando generan salidas secundarias.
El usuario podr activar este evento a travs de las siguientes acciones:
1. En el men "edicin", se elige la opcin "seleccionar" o presionando la tecla de funcin F2.
2. Realizando un doble-click sobre la lnea o un solo click sobre un hotspot (ver las opciones sentencia
WRITE).
Despus de posicionar el cursor sobre una lnea y realizar alguna de las acciones anteriores, el evento AT
LINE-SELECTION se activa.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
REPORT ZANI23
WRITE 'MENU' COLOR COL_HEADING.
ULINE /(4).
WRITE / 'Confirmacion OT'.
WRITE / 'Alistar MP'.
WRITE / 'Chequear OP'.
WRITE / 'Recibo Muelles'.
WRITE / 'Liberar Operario'.
AT LINE-SELECTION.
CASE SY-LISEL.
WHEN 'Confirmacion OT'.
WRITE 'Aparece el mensaje:
WHEN 'Alistar MP'.
WRITE 'Aparece el mensaje:
WHEN 'Chequear OP'.
WRITE 'Aparece el mensaje:
WHEN 'Recibo Muelles'.
WRITE 'Aparece el mensaje:
WHEN 'Liberar Operario'.
WRITE 'Aparece el mensaje:
ENDCASE.
Lima-Per
Confirmacion OT'.
Alistar MP'.
Chequear OP'.
Recibo Muelles'.
Liberar Operario'.
SY-LISEL
Tecla F2
HOTSPOT ON.
HIDE
1
2
3
4
5
6
7
8
9
10
11
REPORT ZEJ4
DATA NUMERO TYPE I.
DO 7 TIMES.
WRITE: / 'Linea', (2) SY-INDEX.
NUMERO = SY-INDEX.
ENDDO.
AT LINE-SELECTION.
WRITE: / 'El cursor esta en la linea', (2) NUMERO.
EJERCICIO.
Acondicione el programa anterior (el de muelles) con la utilizacin de HIDE.
Join de tablas
JOIN DE DOS TABLAS
REPORT ZANI2 .
TABLES: SCARR, SPFLI, SFLIGHT.
TYPES: BEGIN OF EST_JUNTOS,
Lima-Per
Lima-Per
Selection-screen
*Programa que hace uso de los SELECTION-SCREEN.
REPORT ZBCSELECTIONSCREENS.
SELECTION-SCREEN BEGIN OF SCREEN 500
AS WINDOW TITLE text-011.
PARAMETERS p_input(16) TYPE C.
SELECTION-SCREEN : SKIP,
BEGIN OF BLOCK b1
WITH FRAME TITLE text-020.
PARAMETERS: check1 AS CHECKBOX,
check2 AS CHECKBOX,
check3 AS CHECKBOX.
Lima-Per
Nos dira que no existe el objeto, y preguntara si deseamos crearlo, aceptamos y nos
mostrara una pantalla (de no haber guardado el programa antes preguntara si deseamos
guardarlo, aceptamos).
Lima-Per
y activamos
Lima-Per
Select-options
Trabajando con la tabla SPFLI.
Escoger el cdigo de aerolnea (o cdigos de aerolneas), de un listado de los cdigos de
aerolneas.
Y mostrar la siguiente informacin referente al cdigo de aerolnea (o cdigos de aerolneas):
1. Cdigo de aerolnea
2. Numero de conexin de vuelo
3. Ciudad de partida.
4. Ciudad de destino.
Programa:
Lima-Per
REPORT ZEJ3.
TABLES: SPFLI.
TYPES: BEGIN OF EST_SPFLI,
CARRID LIKE SPFLI-CARRID,
CONNID LIKE SPFLI-CONNID,
CITYFROM LIKE SPFLI-CITYFROM,
CITYTO LIKE SPFLI-CITYTO,
END OF EST_SPFLI.
DATA: TABLITA TYPE TABLE OF EST_SPFLI WITH HEADER LINE.
SELECT-OPTIONS: S_CARRID FOR SPFLI-CARRID.
START-OF-SELECTION.
SELECT SPFLI~CARRID SPFLI~CONNID SPFLI~CITYFROM SPFLI~CITYTO
INTO TABLE TABLITA FROM SPFLI
WHERE SPFLI~CARRID IN S_CARRID.
WRITE : /01
31
61
91
'Codigo
'Numero
'Ciudad
'Ciudad
de
de
de
de
aerolinea',
conexion de vuelo',
partida',
destino'.
LOOP AT TABLITA.
WRITE : / TABLITA-CARRID UNDER 'Codigo de aerolinea',
TABLITA-CONNID UNDER 'Numero de conexion de vuelo',
(20) TABLITA-CITYFROM UNDER 'Ciudad de partida' RIGHT-JUSTIFIED,
TABLITA-CITYTO UNDER 'Ciudad de destino' CENTERED.
ENDLOOP.
Lista con los cdigos de las aerolneas, mediante el uso de select-options. Para poder ser
seleccionado por el usuario.
Lima-Per
Investigue si el listado de los cdigos de las aerolneas tienen relacin directa con la tabla SPFLI.
Lima-Per
Lima-Per
Lima-Per
Lima-Per
Lima-Per
APPEND TABLA1.
TABLA1-PRIMER_CAMPO = 'PRIMER DATO3'.
TABLA1-SEGUNDO_CAMPO = 'SEGUNDO DATO3'.
TABLA1-TERCER_CAMPO = 'TERCER DATO3'.
APPEND TABLA1.
MOVE TABLA1[] TO TABLA2[].
LOOP AT TABLA1.
WRITE: / TABLA1-PRIMER_CAMPO, TABLA1-SEGUNDO_CAMPO.
ENDLOOP.
ULINE.
LOOP AT TABLA2.
WRITE: / TABLA2-PRIMER_CAMPO, TABLA2-SEGUNDO_CAMPO.
ENDLOOP.
REPORT ZMOVECORR1
TABLES: SFLIGHT.
DATA: W_SFLIGHT TYPE SFLIGHT.
START-OF-SELECTION.
SELECT SINGLE * FROM SFLIGHT INTO CORRESPONDING FIELDS OF W_SFLIGHT
WHERE CARRID = 'AZ'.
*LOOP AT W_SFLIGHT. // NO MUESTRA NADA CON LOOP
IF sy-subrc = 0.
WRITE: / W_SFLIGHT-CARRID COLOR COL_KEY,
W_SFLIGHT-CONNID,
W_SFLIGHT-FLDATE.
ENDIF.
*ENDLOOP.
Lima-Per
Move-corresponding
MOVE-CORRESPONDING EN UNA TABLA INTERNA
REPORT ZTABLAS03_ANIBAL
TABLES SFLIGHT.
Lima-Per
REPORT
ZMOVECORR
TABLES: SFLIGHT.
TYPES: BEGIN OF EST_FLIGHT,
CARRID LIKE SFLIGHT-CARRID ,
CONNID
LIKE SFLIGHT-CONNID,
Lima-Per
FLDATE
LIKE SFLIGHT-FLDATE,
SEATSMAX LIKE SFLIGHT-SEATSMAX,
SEATSOCC LIKE SFLIGHT-SEATSOCC,
PRICE LIKE SFLIGHT-PRICE,
END OF EST_FLIGHT.
DATA: w_sFLIGHT TYPE TABLE OF EST_FLIGHT WITH HEADER LINE.
SELECT SINGLE * FROM SFLIGHT INTO CORRESPONDING FIELDS OF W_SFLIGHT
WHERE CARRID = 'AZ'.
*WHERE SEATSOCC = 262 AND CARRID = 'LH'. //PARA SER MAS PRECISOS
IF sy-subrc = 0.
WRITE: / W_SFLIGHT-CARRID COLOR COL_KEY,
W_SFLIGHT-CONNID,
W_SFLIGHT-FLDATE.
ENDIF.
Lima-Per
W_SFLIGHT-FLDATE.
WRITE '***********'
.
WRITE: / K_SFLIGHT-CARRID COLOR COL_KEY,
K_SFLIGHT-CONNID,
K_SFLIGHT-FLDATE,
K_SFLIGHT-SEATSMAX.
ENDIF.
Lima-Per
ETC.
REPORT ZMOVECORR
TABLES: SFLIGHT.
NO HAY MAS
Lima-Per
Lima-Per
Lima-Per
ENDIF.
WRITE: / 'TABLA K: USO DE APPEND'.
LOOP AT K_SFLIGHT.
WRITE: / SY-TABIX,
K_SFLIGHT-CARRID,
K_SFLIGHT-CONNID,
K_SFLIGHT-SEATSOCC,
K_SFLIGHT-PRICE.
ENDLOOP.
WRITE: / 'TABLA Z: USO DE COLLECT'.
LOOP AT Z_SFLIGHT.
WRITE: / SY-TABIX,
Z_SFLIGHT-CARRID,
Z_SFLIGHT-CONNID,
Z_SFLIGHT-SEATSOCC,
Z_SFLIGHT-PRICE.
ENDLOOP.
EJERCICIO DE MODIFY
Para trabajar con la tabla SFLIGHT.
Seleccionar un carrid.
Lima-Per
"ID_AEREOLINEA
"NUMERO_AEREOLINEA
"FECHA_VUELO
"NUMERO_ASIENTOS_MAXIMO
"NUMERO_ASIENTOS_OCUPADOS
"PORCENTAGE_ASIENTOS_OCUPADOS
Lima-Per
DATA: WA_FLIGHT
IT_FLIGHT
TYPE FLIGHT,
TYPE I_FLIGHT.
FROM
SFLIGHT
SY-SUBRC = 0.
'ID_AEREOLINEA',
'NUMERO_AEREOLINEA',
'FECHA_VUELO',
'NUMERO_ASIENTOS_OCUPADOS',
'NUMERO_ASIENTOS_MAXIMO',
'PORCENTAGE_ASIENTOS_OCUPADOS'.
Mdulos
Form-Perform
Nos permite realizar una llamada a una subrutina. Se puede realizar llamadas a subrutinas desde un subrutina,
incluso es posible que una subrutina se llame as misma (llamada recursiva).
Sintaxis:
PERFORM <subrutina> [ TABLES <parmetros_actuales> ]
[ USING <parmetro_actuales> ]
[ CHANGING <parmetro_actuales> ].
TABLES -> Los parmetros definidos con esta clusula slo pueden ser tablas internas, con o sin lnea de cabecera.
Lima-Per
USING -> Los parmetros definidos con esta clusula pueden ser de cualquier tipo de dato, incluidas las tablas
internas. Se suelen utilizar como parmetros de entrada a la subrutina.
CHANGING -> Los parmetros definidos con esta clusula pueden ser de cualquier tipo de dato, incluidas las
tablas internas. Se suelen utilizar como parmetro de salida de la subrutina.
EJEMPLOS
Elaborar un programa mediante el uso de las sentencias FORM y PERFORM para que
nos arroje el resultado de la suma de 2 nmeros.
REPORT ZPROBLEMA_01.
DATA: NUM1 TYPE I,
NUM2 TYPE I,
SUM TYPE I.
NUM1 = 2. NUM2 = 4.
PERFORM SUMA USING NUM1 NUM2 CHANGING SUM.
NUM1 = 7. NUM2 = 11.
PERFORM SUMA USING NUM1 NUM2 CHANGING SUM.
FORM SUMA USING ADD_NUM1 ADD_NUM2 CHANGING ADD_SUM.
ADD_SUM = ADD_NUM1 + ADD_NUM2.
PERFORM PRESENTAR USING ADD_NUM1 ADD_NUM2 ADD_SUM.
ENDFORM.
FORM PRESENTAR USING OUT_NUM1 OUT_NUM2 OUT_SUM.
WRITE: / 'Suma de', OUT_NUM1, 'y', OUT_NUM2, 'es', OUT_SUM.
ENDFORM.
Elaborar un programa mediante el uso de las sentencias FORM y PERFORM para que nos arroje como
resultado el cuadrado de la suma de 2 nmeros.
REPORT ZPROBLEMA_02.
DATA: NUM1 TYPE I,
NUM2 TYPE I,
SUM TYPE I.
NUM1 = 5. NUM2 = 7.
PERFORM SUMA USING NUM1 NUM2 CHANGING SUM.
WRITE: / 'El cuadrado de la suma de los numeros', NUM1, 'y', NUM2, 'es', SUM.
FORM SUMA USING A B CHANGING C.
C = A + B.
PERFORM CUADRADO USING C.
ENDFORM.
FORM CUADRADO USING X.
X = X ** 2.
Lima-Per
ENDFORM.
REPORT CC.
DO 2 TIMES.
PERFORM SY-INDEX OF SUB1 SUB2.
ENDDO.
FORM SUB1.
WRITE / 'Subroutine 1'.
ENDFORM.
FORM SUB2.
WRITE / 'Subroutine 2'.
ENDFORM.
Lima-Per
REPORT CC.
DATA: NUM1 TYPE I,
NUM2 TYPE I,
SUM TYPE I.
NUM1 = 2. NUM2 = 4.
PERFORM ADDIT USING NUM1 NUM2 CHANGING SUM.
NUM1 = 7. NUM2 = 11.
PERFORM ADDIT USING NUM1 NUM2 CHANGING SUM.
FORM ADDIT
USING ADD_NUM1
ADD_NUM2
CHANGING ADD_SUM.
ADD_SUM = ADD_NUM1 + ADD_NUM2.
PERFORM OUT USING ADD_NUM1 ADD_NUM2 ADD_SUM.
ENDFORM.
FORM OUT
USING OUT_NUM1
OUT_NUM2
OUT_SUM.
WRITE: / 'Sum of', OUT_NUM1, 'and', OUT_NUM2, 'is', OUT_SUM.
ENDFORM.
REPORT CC.
DATA: NUM TYPE I VALUE 5,
FAC TYPE I VALUE 0.
PERFORM FACT USING NUM CHANGING FAC.
WRITE: / 'Factorial of', NUM, 'is', FAC.
Lima-Per
FORM FACT
USING VALUE(F_NUM)
CHANGING F_FACT.
F_FACT = 1.
WHILE F_NUM GE 1.
F_FACT = F_FACT * F_NUM.
F_NUM = F_NUM - 1.
ENDWHILE.
ENDFORM.
REPORT CC.
DATA: OP1 TYPE I, OP2 TYPE I, RES TYPE I.
OP1 = 3.
OP2 = 4.
PERFORM MULTIP USING OP1 OP2 CHANGING RES.
WRITE: / 'After subroutine:',
/ 'RES=' UNDER 'RES=', RES.
FORM MULTIP
USING VALUE(O1)
VALUE(O2)
CHANGING VALUE(R).
R = O1 * O2.
WRITE: / 'Inside subroutine:',
/ 'R=', R, 'RES=', RES.
ENDFORM.
REPORT CC.
TYPES: BEGIN OF LINE,
NAME(10) TYPE C,
AGE(2) TYPE N,
COUNTRY(3) TYPE C,
END OF LINE.
DATA WHO TYPE LINE.
WHO-NAME = 'Karl'. WHO-AGE = '10'. WHO-COUNTRY = 'D'.
PERFORM COMPONENTS CHANGING WHO.
WRITE: / WHO-NAME, WHO-AGE, WHO-COUNTRY.
Lima-Per
REPORT CC.
DATA: BEGIN OF LINE,
COL1 TYPE I,
COL2 TYPE I,
END OF LINE.
DATA ITAB LIKE STANDARD TABLE OF LINE.
PERFORM FILL CHANGING ITAB.
PERFORM OUT USING ITAB.
FORM FILL CHANGING F_ITAB LIKE ITAB.
DATA F_LINE LIKE LINE OF F_ITAB.
DO 3 TIMES.
F_LINE-COL1 = SY-INDEX.
F_LINE-COL2 = SY-INDEX ** 2.
APPEND F_LINE TO F_ITAB.
ENDDO.
ENDFORM.
FORM OUT USING VALUE(F_ITAB) LIKE ITAB.
DATA F_LINE LIKE LINE OF F_ITAB.
LOOP AT F_ITAB INTO F_LINE.
WRITE: / F_LINE-COL1, F_LINE-COL2.
ENDLOOP.
ENDFORM.
REPORT CC.
DATA: BEGIN OF LINE,
COL1 TYPE I,
COL2 TYPE I,
END OF LINE.
DATA ITAB LIKE STANDARD TABLE OF LINE.
Lima-Per
Lima-Per
REPORT
Lima-Per
NUM1 = 2. NUM2 = 4.
PERFORM ADDIT USING NUM1 NUM2 SUM.
NUM1 = 7. NUM2 = 11.
PERFORM ADDIT USING NUM1 NUM2 SUM.
*FORM ADDIT USING ADD_NUM1 ADD_NUM2 CHANGING ADD_SUM.
FORM ADDIT USING ADD_NUM1 ADD_NUM2 ADD_SUM.
ADD_SUM = ADD_NUM1 + ADD_NUM2.
PERFORM OUT USING ADD_NUM1 ADD_NUM2 ADD_SUM.
ENDFORM.
FORM OUT USING OUT_NUM1 OUT_NUM2 OUT_SUM.
WRITE: / 'Sum of', OUT_NUM1, 'and', OUT_NUM2, 'is', OUT_SUM.
ENDFORM.
REPORT
REPORT
Lima-Per
WHILE F_NUM GE 1.
F_FACT = F_FACT * F_NUM.
F_NUM = F_NUM - 1.
ENDWHILE.
ENDFORM.
REPORT
Lima-Per
Funciones
1.
OBJETIVO
Mostrar el manejo de funciones mediante ejercicios.
2.
Lima-Per
El nombre del grupo de funcin personalizado debe empezar con Z. Crearemos el grupo de funcin:
ZANIBAL3.
Clic en Schem.
Presionamos el botn Local Objeto, con lo que tenemos el grupo de funcin creado.
Como confirmacin en la barra de status aparece el mensaje: Function Group ZANIBAL3 created.
3.
Se coloca el nombre del mdulo de funcin (se antepone la letra Z), luego pulsar Create.
Luego se coloca el nombre del grupo de funcin (Function Group) ZANIBAL3 y se escribe un texto
explicativo.
Lima-Per
En la paleta Import van todos los parmetros que sern pasados por valor (si desea activar esta
opcin haga un check en Pass Value) desde el Editor de Abap para su procesamiento, no es
necesario especificar su tipo.
En la paleta Export van todos los parmetros que sern devueltos por valor (si desea activar esta
opcin haga un check en Pass Value) hacia el Editor de Abap, no es necesario especificar su tipo.
Luego
en la paleta Source code se especificar el cdigo fuente de que realizar la funcin.
Luego en la paleta Source code se especificar el cdigo fuente de que realizar la funcin.
Lima-Per
Para finalizar,
hay
que
guardarlo y activarlo.
En el editor de Abap el cdigo ser el siguiente.
DATA: LINEA1 TYPE STRING VALUE 'Montenegro',
LINEA2 TYPE STRING.
CALL FUNCTION 'ZFUNCION_STRING'
EXPORTING
TEXT1 = LINEA1
IMPORTING
TEXT2 = LINEA2.
WRITE: / 'La cadena original es:', LINEA1,
/ 'La cadena invertida es:', LINEA2.
Lima-Per
Cuando se muestra la funcin desde FUNCTION BUILDER no muestra nada el valor de CADENARES.
Llamndolo desde un reporte creado mediante la transaccin SE38.
El resultado final de CADENARES solo se muestra cuando se corre desde el programa principal.
5. TERCER EJEMPLO DE FUNCION
Crearemos una funcin al que definimos datos previamente.
Aqu podemos probar desde FUNCTION BUILDER.
Lima-Per
Mostrndonos:
FUNCION: WS_DOWNLOAD
To write data from an internal table to the presentation server without using a user dialog, use the function
module WS_DOWNLOAD. The most important parameters are listed below. For more information, refer
to the function module documentation in the Function Builder (Transaction
SE37).
Important Import Parameters
Lima-Per
Parameter
Function
BIN_FILESIZE
CODEPAGE
FILENAME
FILETYPE
MODE
Use the FILETYPE parameter to specify the transfer mode. Possible values:
BIN
Binary files: You must specify the file length. The internal table must consist of a single column with data
type X.
ASC
ASCII files:
DAT
Excel files: The columns are separated using tabs. The lines are separated with line breaks.
WK1
Excel and Lotus files: The files are saved in a WK1 spreadsheet.
t-a = 'b'.
t-z = 'b12'.
APPEND t.
t-a = 'b1'.
t-z = 'gg2'.
APPEND t.
t-a = 'b2'.
t-z = 'rr2'.
APPEND t.
t-a = 'b3'.
t-z = '342'.
APPEND t.
CALL FUNCTION 'WS_DOWNLOAD'
EXPORTING
filename
= 'C:\prueba_hoy.txt'
filetype
= 'ASC'
TABLES
data_tab
= t.
Lima-Per
WS_DOWNLOAD
6.
OBJETIVO
Lograr que el alumno realice la descarga de datos desde una tabla que se encuentra en SAP hacia
un archivo de su PC..
7.
PROGRAMA EJEMPLO
REPORT ZANI18
TABLES: SCARR, SPFLI, SFLIGHT.
Lima-Per
= 'C:\prueba_hoy.txt'
filetype
TABLES
data_tab
= 'ASC'
= TABLITA.
WS_UPLOAD
8.
OBJETIVO
Lograr que el alumno realice la descarga de datos desde una tabla que se encuentra en SAP hacia
un archivo de su PC..
9.
PROGRAMA EJEMPLO
Levantando informacin tomando como base la estructura de la tabla estndar WBTABLE. Revise el
funcionamiento de los campos tiempo y hora.
REPORT Z_WS_UPLOAD
TYPES: BEGIN OF Ty_CAMPOS,
FLID
LIKE WBTABLE-FLID,
LVCITY LIKE WBTABLE-LVCITY,
LVTIME LIKE WBTABLE-LVTIME,
REGLR LIKE WBTABLE-REGLR,
CHRTR LIKE WBTABLE-CHRTR,
MOVIE LIKE WBTABLE-MOVIE,
SNACK LIKE WBTABLE-SNACK,
FMEAL LIKE WBTABLE-FMEAL,
ARCITY LIKE WBTABLE-ARCITY,
ARTIME LIKE WBTABLE-ARTIME,
LVDATE LIKE WBTABLE-LVDATE,
ARDATE LIKE WBTABLE-ARDATE,
END OF Ty_CAMPOS.
Lima-Per
t_REGISTRO-FMEAL,
t_REGISTRO-ARCITY,
t_REGISTRO-ARDATE,
t_REGISTRO-ARTIME.
ENDLOOP.
Lima-Per
Batch input
10.
OBJETIVO
Lograr que el alumno realice la carga masiva de datos empleando una transaccin estndar de SAP.
11.
TRANSACCIN STANDAR
Vamos a realizar Batch Input a la transaccin estndar TUTT: Tutorial de Workbench.
12.
Lima-Per
13.
TABLA RELACIONADA
Esta transaccin llena la tabla WBTABLE de estructura:
14.
SHDB
2.
3.
4.
5.
Grabar nueva:
o Crear (F5)
Nombrar la grabacin (Z_TUTT_XX01)
Especificar el cdigo de transaccin (TUTT)
Iniciar grabacin Start recording:
Lima-Per
Back (F3) .
Lima-Per
9. Grabar
15.
Save (Ctrl+S)
PROGRAMA
REPORT Z_AOSB_BATCH1
.
TYPES: BEGIN OF Ty_CAMPOS,
FLID LIKE WBTABLE-FLID,
LVCITY LIKE WBTABLE-LVCITY,
LVDATE LIKE WBTABLE-LVDATE,
LVTIME LIKE WBTABLE-LVTIME,
REGLR LIKE WBTABLE-REGLR,
CHRTR LIKE WBTABLE-CHRTR,
MOVIE LIKE WBTABLE-MOVIE,
SNACK LIKE WBTABLE-SNACK,
FMEAL LIKE WBTABLE-FMEAL,
ARCITY LIKE WBTABLE-ARCITY,
ARDATE LIKE WBTABLE-ARDATE,
ARTIME LIKE WBTABLE-ARTIME,
END OF Ty_CAMPOS.
DATA: ARCHIVO LIKE RLGRAP-FILENAME,
TIPO LIKE RLGRAP-FILETYPE.
DATA: t_REGISTRO TYPE Ty_CAMPOS OCCURS 10 WITH HEADER LINE.
*----------------------Tablas para el Batch Input----------------------*
DATA: T_BDCDATA LIKE BDCDATA OCCURS 0 WITH HEADER LINE.
DATA: T_MESSTAB LIKE BDCMSGCOLL OCCURS 0 WITH HEADER LINE.
*----------------------------------------------------------------------*
* LEER LAYOUT Y CARGARLO EN TABLA INTERNA.
PERFORM LEE_LAYOUT.
* HACER LOOP A LA TABLA INTERNA
LOOP AT t_REGISTRO.
PERFORM TUTT_LLENA_DYNPRO_FIELD USING t_REGISTRO.
ENDLOOP.
CALL TRANSACTION 'TUTT'
USING T_BDCDATA
MODE 'N'
UPDATE 'A'
MESSAGES INTO T_MESSTAB.
*----------------------------------------------------------------------*
FORM BDC_DYNPRO USING PROGRAM DYNPRO.
CLEAR T_BDCDATA.
T_BDCDATA-PROGRAM = PROGRAM.
T_BDCDATA-DYNPRO = DYNPRO.
T_BDCDATA-DYNBEGIN = 'X'.
APPEND T_BDCDATA.
ENDFORM.
*----------------------------------------------------------------------*
FORM BDC_FIELD USING FNAM FVAL.
CLEAR T_BDCDATA.
T_BDCDATA-FNAM = FNAM.
T_BDCDATA-FVAL = FVAL.
APPEND T_BDCDATA.
ENDFORM.
*----------------------------------------------------------------------*
FORM TUTT_LLENA_DYNPRO_FIELD USING AUART.
PERFORM BDC_DYNPRO USING 'TUTPROG' '0100'.
PERFORM BDC_FIELD USING 'BDC_CURSOR' 'WBTABLE-CHRTR'.
PERFORM BDC_FIELD USING 'BDC_OKCODE' '=CREA'.
Lima-Per
16.
ARCHIVO DE CARGA
Se debe generar el archivo de texto: ABC.DAT en base a la tabla estndar WBTABLE:
Debe realizar los ajustes necesarios para que la fecha cargue correctamente.
17.
Lima-Per
EJERCICIOS
A. Realice el Batch Input de tal manera que los campos MOVIE, SNACK y FMEAL no sean levantados.
B. Agregue un reporte al Batch Input.
C. Levante los vuelos que partan de THF y lleguen a CDG.
Rangos
ASPECTOS TEORICOS
Campo
SIGN
OPTION
Lima-Per
Significado
Tipo alfanumrico de longitud 1. Es un flag que se utiliza para indicar si la
condicin es inclusiva o exclusiva. Los valores posibles son I y E.
I: se utiliza para el criterio de inclusin.
E: se utiliza para el criterio de exclusin.
LOW
HIGH
REPORT ZANI31
TABLES : SCARR.
TYPES : BEGIN OF EST_CARR,
CARRID LIKE SCARR-CARRID,
CARRNAME LIKE SCARR-CARRNAME,
END OF EST_CARR.
DATA : T_SCARR TYPE TABLE OF EST_CARR WITH HEADER LINE.
DATA : N(2) TYPE N.
RANGES: R_RANGO FOR SCARR-CARRID.
R_RANGO-SIGN = 'I'.
R_RANGO-OPTION = 'BT'.
R_RANGO-LOW = 'GA'.
R_RANGO-HIGH = 'PQ'.
APPEND R_RANGO.
WRITE:/10 'ITEM
NUMMATERIAL
STOCK DISP'.
Lima-Per
Formato de reportes
TOP-OF-PAGE
Define un bloque de proceso que se activa cuando el sistema detecta que vamos a comenzar a escribir en la pgina
actual. Se activa en cada inicio de pagina por defecto siempre hay uno al iniciar el programa.
NEW-PAGE
Fuerza al sistema a crear una nueva pgina
REPORT ZPROG2
WRITE 'CABECERA DEL INFORME'.
REPORT ZPROG2.
TOP-OF-PAGE.
WRITE 'CABECERA DEL INFORME'.
No muestra nada.
REPORT ZPROG2.
WRITE 'ANTES DE CABECERA'.
TOP-OF-PAGE.
WRITE 'CABECERA DEL INFORME'.
REPORT ZPROG2.
WRITE 'ANTES DE CABECERA'.
NEW-PAGE.
TOP-OF-PAGE.
WRITE '***** CABECERA DEL INFORME - DESPUES DE TOP-OF-PAGE ******'.
REPORT
Lima-Per
ZPROG2.
REPORT ZPROG2.
WRITE 'PRIMERA LINEA - SECUENCIA NORMAL'.
NEW-PAGE.
WRITE 'SEGUNDA LINEA - SECUENCIA NORMAL'.
TOP-OF-PAGE.
WRITE '***** CABECERA DEL INFORME - DESPUES DE TOP-OF-PAGE ******'.
WRITE / '***** SEGUNDA LINEA DESPUES DE TOP-OF-PAGE ******'.
REPORT ZPROG2.
WRITE 'PRIMERA LINEA - SECUENCIA NORMAL'.
NEW-PAGE.
WRITE / 'SEGUNDA LINEA - SECUENCIA NORMAL'.
TOP-OF-PAGE.
WRITE '***** CABECERA DEL INFORME - DESPUES DE TOP-OF-PAGE ******'.
WRITE / '***** SEGUNDA LINEA DESPUES DE TOP-OF-PAGE ******'.
REPORT ZPROG2.
WRITE 'PRIMERA LINEA - SECUENCIA NORMAL'.
NEW-PAGE.
WRITE 'SEGUNDA LINEA - SECUENCIA NORMAL'.
NEW-PAGE.
TOP-OF-PAGE.
WRITE '***** CABECERA DEL INFORME - DESPUES DE TOP-OF-PAGE ******'.
WRITE / '***** SEGUNDA LINEA DESPUES DE TOP-OF-PAGE ******'.
Lima-Per
REPORT ZPROG2.
WRITE 'PRIMERA LINEA - SECUENCIA NORMAL'.
NEW-PAGE.
WRITE 'SEGUNDA LINEA - SECUENCIA NORMAL'.
NEW-PAGE.
WRITE 'TERCERA LINEA - SECUENCIA NORMAL'.
TOP-OF-PAGE.
WRITE '***** CABECERA DEL INFORME - DESPUES DE TOP-OF-PAGE ******'.
WRITE / '***** SEGUNDA LINEA DESPUES DE TOP-OF-PAGE ******'.
Lima-Per
REPORT demo_list_page_heading.
TOP-OF-PAGE.
WRITE: sy-title, 40 'Page', sy-pagno.
ULINE.
WRITE: / 'SAP AG', 29 'Walldorf, ',sy-datum,
/ 'Neurottstr. 16', / '69190 Walldorf/Baden'.
ULINE.
START-OF-SELECTION.
DO 5 TIMES.
WRITE / sy-index.
ENDDO.
Lima-Per
Lima-Per
REPORT sapmztst.
SKIP 5.
WRITE '*****'.
REPORT sapmztst.
SET BLANK LINES OFF.
DO 25 TIMES.
WRITE / ' '.
ENDDO.
WRITE '*****'.
REPORT sapmztst.
SET BLANK LINES ON.
DO 5 TIMES.
WRITE / ' '.
ENDDO.
WRITE '*****'.
REPORT sapmztst.
DO 5 TIMES.
WRITE / ' '.
ENDDO.
WRITE '*****'.
Lima-Per
SKIP.
DO 6 TIMES.
WRITE / sy-index.
ENDDO.
Lima-Per
ULINE AT /(27).
END-OF-PAGE.
ULINE.
WRITE: /30 'Page', sy-pagno.
START-OF-SELECTION.
DO 6 TIMES.
WRITE / sy-index.
ENDDO.
NEW-PAGE
REPORT demo_list_new_page LINE-SIZE 40.
TOP-OF-PAGE.
WRITE: 'TOP-OF-PAGE', sy-pagno.
ULINE AT /(17).
START-OF-SELECTION.
DO 2 TIMES.
WRITE / 'Loop:'.
DO 3 TIMES.
WRITE / sy-index.
ENDDO.
NEW-PAGE.
ENDDO.
Lima-Per
Lima-Per
Lima-Per
Lima-Per
ENDDO.
WRITE: / 'Next Loop:'.
NEW-PAGE LINE-COUNT 6.
DO 6 TIMES.
WRITE / sy-index.
ENDDO.
Lima-Per
????
REPORT demo_list_new_page_line_c_2 NO STANDARD PAGE HEADING
LINE-SIZE 40 LINE-COUNT
0(2).
TOP-OF-PAGE.
WRITE: 'Top of Page', sy-pagno,
'SY-SROWS:', sy-srows.
ULINE.
END-OF-PAGE.
ULINE.
WRITE: 'End of Page', sy-pagno.
START-OF-SELECTION.
NEW-PAGE LINE-COUNT SY-SROWS.
DO 100 TIMES.
WRITE / sy-index.
ENDDO.
Lima-Per
Lima-Per
Lima-Per
ULINE.
WRITE: 'End of Page', sy-pagno.
START-OF-SELECTION.
DO 100 TIMES.
DO 4 TIMES.
WRITE / sy-index.
ENDDO.
ENDDO.
Lima-Per
Scrolling by Columns
To scroll a list horizontally by columns, the SCROLL statement offers several options. A column
in this case means one character of the list line.
Scrolling to Specific Columns
To scroll to specific columns, use the TO COLUMN option of the SCROLL statement:
Syntax
SCROLL LIST TO COLUMN <col> [INDEX <idx>].
Lima-Per
Lima-Per
Scrolling by Columns
To scroll a list horizontally by columns, the SCROLL statement offers several options. A column
in this case means one character of the list line.
Scrolling to Specific Columns
To scroll to specific columns, use the TO COLUMN option of the SCROLL statement:
Syntax
SCROLL LIST TO COLUMN <col> [INDEX <idx>].
REPORT demo_list_scroll_4 NO STANDARD PAGE HEADING LINE-SIZE
200.
TOP-OF-PAGE.
WRITE: AT 161 'Top of Page', sy-pagno,
'SY-SCOLS:', sy-scols.
ULINE.
START-OF-SELECTION.
DO 200 TIMES.
WRITE sy-index.
ENDDO.
SCROLL LIST TO COLUMN 178.
Lima-Per
Lima-Per
Lima-Per
WRITE 'in'.
write_frame 'ABAP'.
WRITE 'output lists.'.
LINE-COUNT 6
6
LINE-COUNT 6(2)
4
2
Operaciones con corresponding
REPORT
ZDAS3Y
DATA: BEGIN OF
USA TYPE P
FRG TYPE P
AUT TYPE P
END OF RATE.
.
RATE,
VALUE '0.6667',
VALUE '1.0',
VALUE '7.0',
Lima-Per
REPORT ZDAS3Y
DATA: BEGIN OF RATE,
USA TYPE P VALUE '0.6667',
FRG TYPE P VALUE '1.0',
AUT TYPE P VALUE '7.0',
END OF RATE.
DATA: BEGIN OF MONEY,
USA TYPE I VALUE 100,
FRG TYPE I VALUE 200,
AUT TYPE I VALUE 300,
END OF MONEY.
MULTIPLY-CORRESPONDING MONEY BY RATE.
WRITE / RATE-USA.
WRITE / RATE-FRG.
WRITE / RATE-AUT.
WRITE / '***********'.
WRITE / MONEY-USA.
WRITE / MONEY-FRG.
WRITE / MONEY-AUT.
REPORT ZDAS3Y
DATA: BEGIN OF RATE,
USA TYPE P VALUE '20',
Lima-Per
REPORT ZDAS3Y
DATA: BEGIN OF
USA TYPE P
FRG TYPE P
AUT TYPE P
END OF RATE.
DATA: BEGIN OF
USA TYPE P
FRG TYPE P
AUT TYPE P
END OF MONEY.
RATE,
VALUE '20',
VALUE '15',
VALUE '70',
MONEY,
DECIMALS 2 VALUE 100,
DECIMALS 2 VALUE 200,
DECIMALS 2 VALUE 300,
Lima-Per
REPORT DAS.
DATA: BEGIN OF DIRECCION,
NOMBRE(20) VALUE 'Carlos',
APELLIDO(20) VALUE 'Salcedo',
INICIALES(4) VALUE 'CS',
CALLE(20) VALUE 'Los Pinos 235',
NUMERO TYPE I VALUE '11',
CODIGOPOSTAL TYPE N VALUE '9',
CIUDAD(20) VALUE 'Lima',
END OF DIRECCION.
DATA: BEGIN OF DATOS,
APELLIDO(20) VALUE 'Gallardo',
NOMBRE(20),
INICIALES(4),
TITULO(10) VALUE 'Ingeniero',
END OF DATOS.
Sql
INSERT
REPORT ZDSA
TABLES SPFLI.
DATA WA TYPE SPFLI.
WA-CARRID = 'LH'.
WA-CITYFROM = 'WASHINGTON'.
Lima-Per
UPDATE
TABLES SPFLI.
DATA WA TYPE SPFLI.
MOVE 'AA' TO WA-CARRID.
MOVE '0064' TO WA-CONNID.
MOVE 'WASHINGTON' TO WA-CITYFROM.
UPDATE SPFLI FROM WA.
DELETE
TABLES SPFLI.
DATA: BEGIN OF WA,
CARRID TYPE SPFLI-CARRID,
CONNID TYPE SPFLI-CONNID,
END OF WA.
MOVE 'AA' TO WA-CARRID.
MOVE '0064' TO WA-CONNID.
DELETE SPFLI FROM WA.
MOVE 'LH' TO SPFLI-CARRID.
MOVE '0017' TO SPFLI-CONNID.
DELETE SPFLI.
Ejemplos SQL
REPORT ZDSA
DATA: CARRID TYPE SFLIGHT-CARRID,
MINIMUM TYPE P DECIMALS 2,
MAXIMUM TYPE P DECIMALS 2.
SELECT CARRID MIN( PRICE ) MAX( PRICE )
INTO (CARRID, MINIMUM, MAXIMUM)
FROM SFLIGHT
GROUP BY CARRID.
WRITE: / CARRID, MINIMUM, MAXIMUM.
ENDSELECT.
Lima-Per
REPORT
ZDSA
.
DATA WA TYPE SFLIGHT.
SELECT CONNID
INTO WA-CONNID
FROM SFLIGHT
WHERE CARRID = 'LH'
GROUP BY CONNID
HAVING SUM( SEATSOCC ) > 300.
WRITE: / WA-CARRID, WA-CONNID.
ENDSELECT.
REPORT ZDSA
DATA: BEGIN OF WA,
CARRID TYPE SFLIGHT-CARRID,
CONNID TYPE SFLIGHT-CONNID,
MIN TYPE I,
END OF WA.
SELECT CARRID CONNID MIN( SEATSOCC ) AS MIN
INTO CORRESPONDING FIELDS OF WA
FROM SFLIGHT
GROUP BY CARRID CONNID
ORDER BY CARRID MIN DESCENDING.
WRITE: / WA-CARRID, WA-CONNID, WA-MIN.
Lima-Per
ENDSELECT.
Alv
Pasos:
1.
2.
3.
4.
REPORT z_alv_grid .
TABLES: zsflight.
Lima-Per
*------------------------------------------------------------------* G L O B A L
I N T E R N A L
T A B L E S
*------------------------------------------------------------------DATA: gi_sflight TYPE STANDARD TABLE OF sflight.
*------------------------------------------------------------------* G L O B A L
D A T A
*------------------------------------------------------------------DATA: ok_code LIKE sy-ucomm,
g_wa_sflight LIKE sflight.
* Declare reference variables to the ALV grid and the container
DATA:
go_grid
TYPE REF TO cl_gui_alv_grid,
go_custom_container TYPE REF TO cl_gui_custom_container.
*------------------------------------------------------------------* S T A R T - O F - S E L E C T I O N.
*------------------------------------------------------------------START-OF-SELECTION.
SET SCREEN '100'.
*&-----------------------------------------------------------------*&
Module USER_COMMAND_0100 INPUT
*&-----------------------------------------------------------------MODULE user_command_0100 INPUT.
CASE ok_code.
WHEN 'EXIT'.
LEAVE TO SCREEN 0.
ENDCASE.
ENDMODULE.
" USER_COMMAND_0100 INPUT
*&-----------------------------------------------------------------*&
Module STATUS_0100 OUTPUT
*&-----------------------------------------------------------------MODULE status_0100 OUTPUT.
* Create objects
IF go_custom_container IS INITIAL.
CREATE OBJECT go_custom_container
EXPORTING container_name = 'ALV_CONTAINER'.
CREATE OBJECT go_grid
EXPORTING
i_parent = go_custom_container.
PERFORM load_data_into_grid.
Lima-Per
ENDIF.
ENDMODULE.
" STATUS_0100 OUTPUT
*&-----------------------------------------------------------------*&
Form load_data_into_grid
*&-----------------------------------------------------------------FORM load_data_into_grid.
* Read data from table SFLIGHT
SELECT *
FROM zsflight
INTO TABLE gi_sflight.
* Load data into the grid and display them
CALL METHOD go_grid->set_table_for_first_display
EXPORTING i_structure_name = 'SFLIGHT'
CHANGING it_outtab
= gi_sflight.
ENDFORM.
" load_data_into_grid
Lima-Per