Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Sobre el Autor
Alvaro Tejada Galindo se inici en el mundo de la
programacin a los 20 aos. Sus primeros lenguajes
fueron C++ y Visual Basic 6.0 lo cuales aprendi de
manera autodidacta gracias a libros, foros, tutoriales y
cdigos fuente.
A lo largo de los aos, fue agregando nuevos lenguajes a su
coleccin, tales como Java, QBasic, Pascal, Delphi, HTML y
JavaScript.
Fue cuando tena 24 aos, que conoci el mundo del SAP, puesto
que entr a hacer sus prcticas en TSNet Global, en donde trabaj
por espacio de 2 aos, con grandes proyectos en empresas como
Telefnica del Per, Carsa, Minsur, Alicorp y Funsur.
Luego de dejar TSNet Global (Consultora Peruana), se dio un
descanso para continuar estudiando y dedicarse al aprendizaje de
PHP. Luego de esto, trabaj durante 2 aos en la Consultora
ActualiSap (Consultora Chilena), en donde adems de dos exitosos
proyectos de implementacin en Suez Enegy Per y el Aeropuerto
Jorge Chvez, dict un curso interno de IDocs en Santiago de Chile.
Tuvo un breve paso por Servisoft (Consultora Peruana) en el
proyecto de E. Wong. Con Stefanini IT Solutions trabaj para
Alicorp, Exsa, Votorantim Metais y el Banco de Crdito del Per.
Indice
Conociendo el entorno SAP NetWeaver
Introduccin
Ingresando al sistema
Conociendo las transacciones ms importantes
El Men de SAP NetWeaver
Diccionario de Datos
Introduccin
Elementos del Diccionario de Datos
Creando una tabla
Creando un dominio
Creando un elemento de datos
Creando una vista de actualizacin
Creando una ayuda de bsqueda
Creando una estructura
Creando una Vista
Programacin en ABAP
Introduccin
Estructura de un programa ABAP
Declaracin de variables y tablas internas
Seleccin de datos
Lectura de datos en tablas internas
Operadores de comparacin
Operaciones en tablas internas
Copiar tablas internas
Ordenar tablas internas
Estructuras de Control
Trabajando con Cadenas de Texto
Variables de Sistema
Modularizacin de programas
Depuracin de programas
Programas de ejemplo
SapScript
Introduccin
Creando un formulario
Crear una pgina principal
7
7
8
12
21
23
23
23
26
37
38
50
60
65
66
70
70
71
78
83
86
89
98
104
108
110
111
119
121
129
138
159
159
159
161
4
163
166
168
175
182
185
187
187
187
191
196
200
202
210
210
210
213
215
228
235
240
240
246
249
259
272
278
280
280
280
288
290
292
292
292
301
308
313
320
328
5
Introduccin
Qu es la Orientacin a Objetos?
Conceptos bsicos de POO
Como programar en ABAP Objects
Componentes Orientados a Objetos
Crear un ALV Grid OO
Agregar validaciones y eventos
Crear un ALV Tree OO
Agregar validaciones y eventos
Crear un ALV Object Model
Agregar validaciones y eventos
Cargar Imgenes en Dynpros
Leer PDFs
Comprimir (zip) archivos
Crear un Control de Texto
WebDynpro
Introduccin
Creando nuestro primer WebDynpro
BSP
Introduccin
Creando nuestro primer BSP
ABAP y XML
Scripting in a Box
SAPLink
Integracin PHP-NetWeaver
Introduccin
Instalando el SAPRFC
Comunicndonos con NetWeaver
Integracin Ruby-NetWeaver
Introduccin
Instalando el SAP:Rfc
Comunicndonos con NetWeaver
Donde conseguir el SAP NetWeaver Sneak Preview
Bibliografa y agradecimientos
Enlaces Web
328
328
329
335
351
351
365
379
399
409
416
421
430
438
451
458
458
458
489
489
489
501
518
521
525
525
526
527
539
539
540
540
546
547
549
Ingresando al Sistema
Para poder ingresar a NSP, deberemos contar con un usuario y
password, proporcionados por el administrador del sistema.
En nuestro caso, tenemos 2 usuarios que comparten un mismo
password.
10
11
12
13
14
15
16
17
18
19
20
Grabar.
Retroceder una pantalla.
Salir del programa o transaccin.
Cancelar el programa o transaccin.
Imprimir.
Buscar.
Buscar ms.
21
22
Diccionario de Datos
Introduccin
El Diccionario de Datos en NetWeaver, es el repositorio en el cual se
almacenan todas las tablas, elementos de datos, dominios, estructuras,
ayudas de bsqueda.
Vamos a dar un breve repaso de todos los conceptos que intervienen
en el diccionario de datos, as como la manera de crear cada uno de sus
diferentes componentes.
Cabe destacar, que en NetWeaver, todo es manejado por tablas, es
decir, todos los programas, funciones, includes y elementos del
diccionario son almacenados en tablas. Por lo tanto, NetWeaver
cuenta con 63,348 tablas standard...Y eso que hablamos de la versin
Sneak Preview, la versin real del NetWeaver debe tener por lo
menos el doble o triple de tablas.
24
25
Tablas Transparentes
Vistas
Estructuras
Dominios
Elementos de Datos
26
tablas, vamos a trabajar todos los ejemplos del libro, as que es muy
importante que las creen para poder seguir los ejemplos con mayor
facilidad.
Como se habrn dado cuenta, ambas tablas comienzan con el prefijo
Z, puesto que es la nica restriccin que nos da NetWeaver al
momento de crear cualquier elemento o componente.
Para crear nuestra primera tabla, hacemos lo siguiente:
27
Clase de Entrega
Casi en un 99% de las veces, se utiliza la clase de entrega A, as que
es la que vamos a utilizar nosotros. En todo caso, la nica que
podramos utilizar adems de esta, son los tipo C y L.
Tambin debemos escoger el tipo de Mantenimiento que se le va a
dar a la tabla. En nuestro caso, escogeremos la opcin
Display/Maintenance Allowed para poder generar una Vista de
Actualizacin ms adelante.
Cuando grabemos, nos encontraremos con una ventana muy comn
en NetWeaver. Esta ventana, nos pide asociar nuestra tabla a un
Package (Paquete), que nos es ms que una tabla donde se
organizan los desarrollos por tipos. Tenemos dos opciones, o
28
29
para
almacenar
nuestro
nuevo
Package,
30
31
32
33
34
35
con
una
tabla
que
llamaremos
crearla,
antes
de
continuar
con
la
tabla
ZLENGUAJES_PROG.
36
este
Dominio,
lo
llamaremos
ZD_ENT_NAME.
37
38
. E
39
retrocedemos
para
poder
acceder
al
Enhacement Category.
40
. Esto nos
41
42
no
existe
en
la
tabla
ZLENGUAJES_PROG.
Dejamos la ventana, como se muestra en la figura.
43
44
presionamos F5.
o presionamos Crtl. + S.
46
Para poder ver los registro que hemos creado, podemos presionar el
botn Table Contents (Contenido de Tabla)
o presionar Enter.
o presionamos F8.
47
48
Esos
son
los
registros
que
ingresamos
en
la
tabla
destacar
que
los
valores
que
estn
en
la
tabla
49
50
51
o presionamos
52
53
La pantalla del Screen Painter es la que nos interesa, sobre todos las
cabeceras que tienen un +.
54
Debemos hacer un clic en el botn Display <-> Change (Mostrar <> Cambiar)
o presionar F1.
Y en la segunda columna:
55
56
que
hemos
hecho
utilizando
los
lenguajes
de
Ahora,
creamos
un
Elemento
de
Datos
llamado
ZE_ID_LENGUAJE.
57
entre
ZLENGUAJES_PROG,
las
tablas
debemos
ZPROGRAMAS
modificar
la
y
tabla
58
59
60
61
o presionando F8.
62
63
Grabamos y activamos.
En la transaccin SE16 agregamos algunos cuantos registros.
64
65
, se nos
Utilizamos
los
mismos
componentes
que
en
la
tabla
66
67
o presionando Ctrl.
+ Shift + F10.
Se darn cuenta de que el sistema no enva a la transaccin SE16.
68
69
Programacin en ABAP
Introduccin
ABAP (Advances Business Application Programming), es el
lenguaje de programacin propietario de SAP AG, con el cual se
desarrollan aplicaciones que son integradas al NetWeaver. Cabe de
destacar que muchos de los componentes de NetWeaver han sido
desarrollados utilizado ABAP, lo cual nos permite hacer
modificaciones que otro tipo de sistemas seran imposibles.
El ABAP, viene a ser una especie de nieto del COBOL (Common
Object Business Oriented Language), que era muy utilizado para el
desarrollo de aplicaciones empresariales.
En cuanto a la sintaxis de lenguajes, podemos tomarlo como un
hbrido entre COBOL, PASCAL y SQL Server.
Hasta la versin 45B, el ABAP, era un lenguaje procedural, aunque
con el tiempo se el agregaron funcionalidades para convertirlo en un
lenguaje orientado a objetos, por lo cual al momento de programar,
se pueden mezclar ambas tecnologas sin mayores problemas.
El NetWeaver actualmente est en la versin 7.0.0, lo cual significa
que nos permite trabajar con ABAP Objects de manera muy
completa, aunque como es de suponerse, en versiones posteriores de
NetWeaver, se adicionarn algunos componentes extras.
En el presente captulo, vamos a revisar los principales componentes
del ABAP, as como la estructura de los programas que se crean con
el.
70
71
queremos
asignar
desarrollo,
elegimos
72
73
*&----------------------------------------------------*
*& Report
ZDUMMY_PRIMER_PROGRAMA
*&----------------------------------------------------*
*& Creado por: Alvaro "Blag" Tejada Galindo.
*&----------------------------------------------------*
REPORT
ZDUMMY_PRIMER_PROGRAMA.
*=====================================================*
* SELECTION-SCREEN
*=====================================================*
SELECTION-SCREEN BEGIN OF BLOCK PRUEBA
WITH FRAME TITLE TEXT-T01.
PARAMETERS:
TEXTO(30) TYPE C.
SELECTION-SCREEN END OF BLOCK PRUEBA.
*=====================================================*
* START-OF-SELECTION
*=====================================================*
START-OF-SELECTION.
WRITE: TEXTO.
74
76
77
78
Character
Space
Numeric String
000
Date
000000000
000000
X00
(YYYYMMDD)
T
Time
(HHMMSS)
Byte
(Hexadecimal)
Integer
Packed Integer
Floating point
0.0
number
STRING
String
Variable
Empty string
XSTRING
Byte Sequence
Variable
Empty X
String
79
END OF TABLA.
Con la introduccin de NetWeaver, esto no es posible, as que de
ahora en adelante, vamos a utilizar y aprender solamente las nuevas
sintaxis que se nos ofrecen gracias a la creacin del ABAP Objects.
TYPES: BEGIN OF TY_TABLA,
END OF TY_TABLA.
DATA: T_TABLA TYPE STANDARD TABLE
OF TY_TABLA.
80
81
Claro, si queremos crear una tabla interna que tenga datos propios,
lo hacemos de la siguiente forma.
TYPES: BEGIN OF TY_TEST,
NOMBRE(30) TYPE C,
EDAD TYPE I,
END OF TY_TEST.
DATA: TEST TYPE STANDARD TABLE
OF TY_TEST.
Seguramente se habrn dado cuenta y sobre todo se preguntarn,
porque tenemos que utilizar el TYPE STANDARD TABLE, muy
simple, porque tenemos disponibles ms tipos de tablas.
82
Seleccin de Datos
Al igual que en SQL, podemos utilizar la clsica sentencia
SELECT, para poder seleccionar datos. Aunque en el caso de
ABAP, tenemos mayor flexibilidad para poder almacenar los datos,
ya sea en Variable o en Tablas internas.
En Variables:
83
84
85
86
87
READ TABLE
TYPES: BEGIN OF TY_PROGRAMAS,
NOMBRE TYPE ZLENGUAJES_PROG-NOMBRE,
ENTORNO TYPE ZLENGUAJES_PROG-ENTORNO,
NOM_PROG TYPE ZPROGRAMAS-NOM_PROG,
END OF TY_PROGRAMAS.
DATA: T_PROGRAMAS TYPE STANDARD TABLE
OF TY_PROGRAMAS.
FIELD-SYMBOLS: <FS_PROGRAMAS> LIKE LINE
OF T_PROGRAMAS.
SELECT NOMBRE ENTORNO NOM_PROG
INTO TABLE T_PROGRAMAS
FROM ( ZLENGUAJES_PROG INNER JOIN ZPROGRAMAS
ON ZLENGUAJES_PROG~ID = ZPROGRAMAS~ID ).
READ TABLE T_PROGRAMAS INDEX 1
ASSIGNING <FS_PROGRAMAS>.
WRITE:/ <FS_PROGRAMAS>-NOM_PROG.
READ TABLE T_PROGRAMAS
WITH KEY NOMBRE = 'PHP'
ASSIGNING <FS_PROGRAMAS>.
WRITE:/ <FS_PROGRAMAS>-NOM_PROG.
88
Operadores de Comparacin
Un proceso muy comn, es el comparar valores entre variables o
tablas internas, para esto, contamos con los siguientes comandos.
=, EQ
Igual a
<>, NE
Distinto a
>, GT
Mayor que
<, LT
Menor que
>=, GE
Mayor igual
<=, LE
Menor igual
89
ENDIF.
Para poder afianzar los conocimientos adquiridos hasta el momento,
vamos a crear una pequea aplicacin.
REPORT ZDUMMY_PRIMER_PROGRAMA
NO STANDARD PAGE HEADING.
*=====================================================*
* DECLARACION DE TABLES
*=====================================================*
TABLES: ZPROGRAMAS.
*=====================================================*
* DECLARACION DE TYPES
*=====================================================*
TYPES: BEGIN OF TY_PROGRAMAS,
NOMBRE TYPE ZLENGUAJES_PROG-NOMBRE,
ENTORNO TYPE ZLENGUAJES_PROG-ENTORNO,
NOM_PROG TYPE ZPROGRAMAS-NOM_PROG,
END OF TY_PROGRAMAS.
*=====================================================*
* DECLARACION DE VARIABLES
*=====================================================*
DATA: T_PROGRAMAS TYPE STANDARD TABLE
OF TY_PROGRAMAS.
*=====================================================*
* FIELD-SYMBOLS
*=====================================================*
FIELD-SYMBOLS: <FS_PROGRAMAS> LIKE LINE
90
OF T_PROGRAMAS.
*=====================================================*
* SELECTION-SCREEN
*=====================================================*
SELECTION-SCREEN BEGIN OF BLOCK PRG
WITH FRAME TITLE TEXT-T01.
SELECT-OPTIONS:
S_ID FOR ZPROGRAMAS-ID.
SELECTION-SCREEN END OF BLOCK PRG.
*=====================================================*
* START-OF-SELECTION
*=====================================================*
START-OF-SELECTION.
SELECT NOMBRE ENTORNO NOM_PROG
INTO TABLE T_PROGRAMAS
FROM ( ZLENGUAJES_PROG INNER JOIN ZPROGRAMAS
ON ZLENGUAJES_PROG~ID = ZPROGRAMAS~ID )
WHERE ZPROGRAMAS~ID IN S_ID.
WRITE:/1 'Lenguaje',17 'Entorno',33 'Programa'.
WRITE:/ SY-ULINE(45).
LOOP AT T_PROGRAMAS
ASSIGNING <FS_PROGRAMAS>.
WRITE:/ <FS_PROGRAMAS>-NOMBRE,<FS_PROGRAMAS>-ENTORNO,
<FS_PROGRAMAS>-NOM_PROG.
ENDLOOP.
91
REPORT ZDUMMY_PRIMER_PROGRAMA
NO STANDARD PAGE HEADING.
TABLES: ZPROGRAMAS.
TABLES indica que vamos a utilizar una tabla para hacer referencia
a un campo en el SELECTION-SCREEN.
92
DATA indica que vamos a crear una variable o una tabla interna.
T_PROGRAMAS es el nombre de nuestra tabla interna.
TYPE STANDARD TABLE indica que la tabla es de tipo
STANDARD.
OF indica a que tipo de dato va a hacer referencia nuestra tabla
interna.
TY_PROGRAMAS es el nombre del tipo de tabla que creamos y al
cual va a hacer referencia nuestra tabla interna.
START-OF-SELECTION.
94
95
LOOP AT T_PROGRAMAS
ASSIGNING <FS_PROGRAMAS>.
WRITE:/ <FS_PROGRAMAS>-NOMBRE,<FS_PROGRAMAS>-ENTORNO,
<FS_PROGRAMAS>-NOM_PROG.
ENDLOOP.
96
97
Agregando registros
TYPES: BEGIN OF TY_PROGRAMAS,
ID_PROG TYPE ZPROGRAMAS-ID_PROG,
98
INITIAL
LINE
TO
asignndola
<FS_PROGRAMAS>.
Luego, agregamos los valores a la tabla y al momento de
leerla con el ndice 1, podemos imprimir los nuevos valores.
99
Modificando registros
TYPES: BEGIN OF TY_PROGRAMAS,
ID_PROG TYPE ZPROGRAMAS-ID_PROG,
NOM_PROG TYPE ZPROGRAMAS-NOM_PROG,
END OF TY_PROGRAMAS.
DATA: T_PROGRAMAS TYPE STANDARD TABLE
OF TY_PROGRAMAS.
FIELD-SYMBOLS: <FS_PROGRAMAS> LIKE LINE
OF T_PROGRAMAS.
APPEND INITIAL LINE TO
T_PROGRAMAS ASSIGNING <FS_PROGRAMAS>.
<FS_PROGRAMAS>-ID_PROG = '006'.
<FS_PROGRAMAS>-NOM_PROG = 'MP3 Player'.
READ TABLE T_PROGRAMAS INDEX 1
ASSIGNING <FS_PROGRAMAS>.
WRITE:/ <FS_PROGRAMAS>-ID_PROG.
WRITE:/ <FS_PROGRAMAS>-NOM_PROG.
READ TABLE T_PROGRAMAS INDEX 1
ASSIGNING <FS_PROGRAMAS>.
SKIP 1.
WRITE:/ 'Modificamos el registro'.
SKIP 1.
100
Eliminado registros
TYPES: BEGIN OF TY_PROGRAMAS,
ID_PROG TYPE ZPROGRAMAS-ID_PROG,
NOM_PROG TYPE ZPROGRAMAS-NOM_PROG,
END OF TY_PROGRAMAS.
DATA: T_PROGRAMAS TYPE STANDARD TABLE
OF TY_PROGRAMAS.
FIELD-SYMBOLS: <FS_PROGRAMAS> LIKE LINE
OF T_PROGRAMAS.
APPEND INITIAL LINE TO
T_PROGRAMAS ASSIGNING <FS_PROGRAMAS>.
101
<FS_PROGRAMAS>-ID_PROG = '006'.
<FS_PROGRAMAS>-NOM_PROG = 'MP3 Player'.
APPEND INITIAL LINE TO
T_PROGRAMAS ASSIGNING <FS_PROGRAMAS>.
<FS_PROGRAMAS>-ID_PROG = '007'.
<FS_PROGRAMAS>-NOM_PROG = 'Web Browser'.
DELETE T_PROGRAMAS INDEX 1.
DELETE T_PROGRAMAS WHERE ID_PROG EQ '006'.
102
lo
tanto
utilizamos
DELETE
ADJACENT
103
En
este
caso,
T_PROGRAMAS
tenemos
y
las
dos
tablas
T_PROGRAMAS_AUX,
internas
ambas
105
106
ASSIGNING <FS_PROGRAMAS_AUX>.
MOVE <FS_PROGRAMAS>-ID_PROG TO
<FS_PROGRAMAS_AUX>-ID_PROG.
MOVE <FS_PROGRAMAS>-NOM_PROG TO
<FS_PROGRAMAS_AUX>-NOM_PROG.
ENDLOOP.
107
OF TY_PROGRAMAS_AUX.
FIELD-SYMBOLS: <FS_PROGRAMAS> LIKE LINE
OF T_PROGRAMAS,
<FS_PROGRAMAS_AUX> LIKE LINE
OF T_PROGRAMAS_AUX.
APPEND INITIAL LINE TO
T_PROGRAMAS ASSIGNING <FS_PROGRAMAS>.
<FS_PROGRAMAS>-ID_PROG = '006'.
<FS_PROGRAMAS>-NOM_PROG = 'MP3 Player'.
LOOP AT T_PROGRAMAS
ASSIGNING <FS_PROGRAMAS>.
APPEND INITIAL LINE TO T_PROGRAMAS_AUX
ASSIGNING <FS_PROGRAMAS_AUX>.
MOVE-CORRESPONDING <FS_PROGRAMAS> TO
<FS_PROGRAMAS_AUX>.
ENDLOOP.
de
la
tabla
T_PROGRAMAS
la
tabla
T_PROGRAMAS_AUX.
108
109
Estructuras de Control
Como vimos, podemos utilizar un LOOP para recorrer todos los
registros de una tabla interna. Pero que pasa si lo que necesitamos
es recorrer los posibles valores de una variable?
Para estos casos contamos con WHILE-ENDWHILE.
Esto significa que mientras la variable VAR sea menor o igual a 10,
imprimimos el valor. Aumentamos el valor de VAR de uno en uno,
por cada vuelta del WHILE.
Tambin tenemos presente el DO-ENDO.
110
111
TRANSLATE
Convierte una cadena de texto a Maysculas o Minsculas.
CONCATENATE
Concatena dos o ms cadenas de texto. Es decir, une cadenas
en una cadena ms grande.
112
SPLIT
Divide una cadena en subcadenas, dependiendo de un carcter
aguja.
114
SHIFT
Utilizado con la sentencia DELETING, permite eliminar los
espacios o caracteres al inicio o al final de una cadena de
texto.
DATA: VAR_TEXT TYPE STRING.
VAR_TEXT = '
SAP NETWEAVER
'.
115
CONDENSE
Elimina los espacios en blanco, como lo hace el SHIFT, pero
toma los espacios del final y del inicio al mismo tiempo.
SAP NETWEAVER
'.
CONDENSE VAR_TEXT.
CONDENSE VAR_TEXT NO-GAPS.
REPLACE
Reemplaza una cadena por otra.
116
VAR_TEXT = 'SAP/NETWEAVER/PROGRAMMING'.
REPLACE ALL OCCURRENCES OF
'/' IN VAR_TEXT WITH SPACE .
FIND
Busca una subcadena en una cadena.
117
118
LOOP AT RESULT_TAB
ASSIGNING <FS_RESULT>.
WRITE:/ <FS_RESULT>-OFFSET.
ENDLOOP.
ENDIF.
STRLEN
Obtiene la longitud de una cadena.
119
SY-SUBRC
Retorna un valor que determina el estado de las operaciones
en ABAP.
SY-SUBRC = 0 Ejecutado con xito.
SY-SUBRC = 4 Error. No ha podido ejecutarse.
SY-PAGNO
En un reporte de tipo listado, determina el nmero de pgina
en la cual nos encontramos.
SY-TABIX
Dentro de un LOOP, nos indica el nmero de vuelta o
iteracin o el ndice del registro que estamos leyendo.
SY-LANGU
Idioma de trabajo actual.
SY-BACTH
Nos indica si el programa se est ejecutando en fondo o en
modo directo.
SY-MANDT
120
SY-TCODE
El nombre de la transaccin con la cual estamos trabajando.
SY-UCOMM
Nombre del cdigo de funcin lanzado por un Dynpro o por
un men.
SY-DATUM
Fecha actual del sistema.
SY-UZEIT
Hora actual del sistema.
SY-REPID
Nombre del programa que estamos creando o ejecutando.
SY-UNAME
Nombre del usuario logeado en el sistema.
Modularizacin de Programas
Para que nuestros programas sean ms fciles de mantener y de
programas, debemos utilizar funciones para poder modularizarlos.
121
ENDFORM.
Y se llaman as:
PERFORM XXX USING YYY
CHANGING YYY
TABLE YYY.
Para entender mejor a que nos referimos, vamos a hacer un ejemplo.
REPORT ZDUMMY_PRIMER_PROGRAMA
NO STANDARD PAGE HEADING.
*=====================================================*
* DECLARACION DE TABLES
*=====================================================*
TABLES: ZPROGRAMAS.
*=====================================================*
* DECLARACION DE TYPES
*=====================================================*
TYPES: BEGIN OF TY_PROGRAMAS,
NOMBRE TYPE ZLENGUAJES_PROG-NOMBRE,
122
*=====================================================*
DATA: T_PROGRAMAS TYPE STANDARD TABLE
OF TY_PROGRAMAS.
*=====================================================*
* FIELD-SYMBOLS
*=====================================================*
FIELD-SYMBOLS: <FS_PROGRAMAS> LIKE LINE
OF T_PROGRAMAS.
*=====================================================*
* SELECTION-SCREEN
*=====================================================*
SELECTION-SCREEN BEGIN OF BLOCK PRG
WITH FRAME TITLE TEXT-T01.
SELECT-OPTIONS:
S_ID FOR ZPROGRAMAS-ID.
SELECTION-SCREEN END OF BLOCK PRG.
*=====================================================*
* START-OF-SELECTION
*=====================================================*
START-OF-SELECTION.
PERFORM OBTENER_DATOS.
PERFORM MOSTRAR_REPORTE.
123
*&----------------------------------------------------*
*&
Form
obtener_datos
*&----------------------------------------------------*
FORM OBTENER_DATOS.
SELECT NOMBRE ENTORNO NOM_PROG
INTO TABLE T_PROGRAMAS
FROM ( ZLENGUAJES_PROG INNER JOIN ZPROGRAMAS
ON ZLENGUAJES_PROG~ID = ZPROGRAMAS~ID )
WHERE ZPROGRAMAS~ID IN S_ID.
ENDFORM.
"obtener_datos
*&----------------------------------------------------*
*&
Form
MOSTRAR_REPORTE
*&----------------------------------------------------*
FORM MOSTRAR_REPORTE.
WRITE:/1 'Lenguaje',17 'Entorno',33 'Programa'.
WRITE:/ SY-ULINE(45).
LOOP AT T_PROGRAMAS
ASSIGNING <FS_PROGRAMAS>.
WRITE:/ <FS_PROGRAMAS>-NOMBRE,
<FS_PROGRAMAS>-ENTORNO,
<FS_PROGRAMAS>-NOM_PROG.
ENDLOOP.
ENDFORM.
"MOSTRAR_REPORTE
124
START-OF-SELECTION.
PERFORM OBTENER_DATOS.
PERFORM MOSTRAR_REPORTE.
FORM OBTENER_DATOS.
SELECT NOMBRE ENTORNO NOM_PROG
INTO TABLE T_PROGRAMAS
FROM ( ZLENGUAJES_PROG INNER JOIN ZPROGRAMAS
ON ZLENGUAJES_PROG~ID = ZPROGRAMAS~ID )
WHERE ZPROGRAMAS~ID IN S_ID.
ENDFORM.
"obtener_datos
REPORT ZDUMMY_PRIMER_PROGRAMA
NO STANDARD PAGE HEADING.
*=====================================================*
* DECLARACION DE VARIABLES
*=====================================================*
DATA: VAR TYPE STRING.
*=====================================================*
* START-OF-SELECTION
125
*=====================================================*
START-OF-SELECTION.
PERFORM INICIALIZAR.
PERFORM CONVERTIR USING 'U'
CHANGING VAR.
WRITE:/ VAR.
PERFORM CONVERTIR USING 'L'
CHANGING VAR.
WRITE:/ VAR.
*&----------------------------------------------------*
*&
Form
INICIALIZAR
*&----------------------------------------------------*
FORM INICIALIZAR.
VAR = 'El Arte de Programar NETWEAVER'.
ENDFORM.
"INICIALIZAR
*&----------------------------------------------------*
*&
Form
CONVERTIR
*&----------------------------------------------------*
FORM CONVERTIR USING P_TIPO
CHANGING P_VAR.
CASE P_TIPO.
WHEN 'U'.
TRANSLATE P_VAR TO UPPER CASE.
WHEN 'L'.
TRANSLATE P_VAR TO LOWER CASE.
ENDCASE.
ENDFORM.
"CONVERTIR
126
REPORT ZDUMMY_PRIMER_PROGRAMA
NO STANDARD PAGE HEADING.
*=====================================================*
* DECLARACION DE TYPES
*=====================================================*
TYPES: BEGIN OF TY_PROGRAMAS,
ID_PROG TYPE ZPROGRAMAS-ID_PROG,
NOM_PROG TYPE ZPROGRAMAS-NOM_PROG,
END OF TY_PROGRAMAS.
*=====================================================*
* DECLARACION DE TABLAS INTERNAS
*=====================================================*
DATA: T_PROGRAMAS TYPE STANDARD TABLE
OF TY_PROGRAMAS.
*=====================================================*
127
* DECLARACION DE FIELD-SYMBOLS
*=====================================================*
FIELD-SYMBOLS: <FS_PROGRAMAS> LIKE LINE
OF T_PROGRAMAS.
*=====================================================*
* START-OF-SELECTION
*=====================================================*
START-OF-SELECTION.
PERFORM INICIALIZAR.
PERFORM IMPRIMIR_REPORTE TABLES T_PROGRAMAS.
*&----------------------------------------------------*
*&
Form
inicializar
*&----------------------------------------------------*
FORM INICIALIZAR.
APPEND INITIAL LINE
TO T_PROGRAMAS
ASSIGNING <FS_PROGRAMAS>.
<FS_PROGRAMAS>-ID_PROG = '001'.
<FS_PROGRAMAS>-NOM_PROG = 'TETRIS'.
APPEND INITIAL LINE
TO T_PROGRAMAS
ASSIGNING <FS_PROGRAMAS>.
<FS_PROGRAMAS>-ID_PROG = '002'.
<FS_PROGRAMAS>-NOM_PROG = 'POKEMON'.
ENDFORM.
" inicializar
*&----------------------------------------------------*
*&
Form
IMPRIMIR_REPORTE
*&----------------------------------------------------*
FORM IMPRIMIR_REPORTE TABLES T_TABLA.
LOOP AT T_TABLA
128
ASSIGNING <FS_PROGRAMAS>.
WRITE:/ <FS_PROGRAMAS>-ID_PROG.
WRITE: <FS_PROGRAMAS>-NOM_PROG.
ENDLOOP.
ENDFORM.
"IMPRIMIR_REPORTE
Depuracin de Programas
El termino bug en programacin, se refiere a un error o a un
evento no planeado dentro de la ejecucin de un programa.
Utilizando las herramientas que nos brinda NetWeaver podemos
hacer un DEBUG (Eliminar bichos) a cualquier programa para
analizar su funcionamiento interno.
Tenemos 3 formas de iniciar un DEBUG, utilizando la palabra
reservada BREAK-POINT en nuestro cdigo fuente, utilizar un
BREAK-POINT lgico o simplemente escribir /H en la barra de
men. Veamos ms a fondo las 3 formas.
Pero antes de comenzar, es mejor que hagamos un pequeo ajuste en
las propiedades del NetWeaver, puesto que el nuevo Debugger
(Que no vamos a revisar en este libro), es bastante complejo y
consume muchos recursos del sistema. Para esto, seguimos la ruta
Utilities Settings ABAP Editor Debugging Classic
Debugger. El Debugger clsico basta y sobra para que podamos
revisar y corregir nuestros programas.
129
REPORT ZDUMMY_PRIMER_PROGRAMA
NO STANDARD PAGE HEADING.
*=====================================================*
* DECLARACION DE TYPES
*=====================================================*
TYPES: BEGIN OF TY_PROGRAMAS,
ID_PROG TYPE ZPROGRAMAS-ID_PROG,
NOM_PROG TYPE ZPROGRAMAS-NOM_PROG,
130
END OF TY_PROGRAMAS.
*=====================================================*
* DECLARACION DE TABLAS INTERNAS
*=====================================================*
DATA: T_PROGRAMAS TYPE STANDARD TABLE
OF TY_PROGRAMAS.
*=====================================================*
* DECLARACION DE FIELD-SYMBOLS
*=====================================================*
FIELD-SYMBOLS: <FS_PROGRAMAS> LIKE LINE
OF T_PROGRAMAS.
*=====================================================*
* START-OF-SELECTION
*=====================================================*
START-OF-SELECTION.
SELECT ID_PROG NOM_PROG
INTO TABLE T_PROGRAMAS
FROM ZPROGRAMAS.
BREAK-POINT.
LOOP AT T_PROGRAMAS
ASSIGNING <FS_PROGRAMAS>.
WRITE:/ <FS_PROGRAMAS>-ID_PROG,
<FS_PROGRAMAS>-NOM_PROG.
ENDLOOP.
132
Una vez que tenemos el nombre escrito, basta con que hagamos
doble clic para poder ver su contenido.
133
Para avanzar entre las lneas del cdigo, contamos con los siguientes
botones.
134
135
136
137
Programas de ejemplo
Decimal a Binario
REPORT ZDUMMY_PRIMER_PROGRAMA
NO STANDARD PAGE HEADING.
*=====================================================*
* DECLARACION DE VARIABLES
*=====================================================*
DATA: SUMA_TEXT(50) TYPE C,
SUMA TYPE I,
EXPONENTE TYPE I,
FLAG TYPE C.
*=====================================================*
* SELECTION-SCREEN
*=====================================================*
SELECTION-SCREEN BEGIN OF BLOCK DEC_TO_BIN WITH FRAME.
PARAMETERS:
P_NUMERO TYPE I.
SELECTION-SCREEN END OF BLOCK DEC_TO_BIN.
138
*=====================================================*
* START-OF-SELECTION
*=====================================================*
START-OF-SELECTION.
PERFORM INICIALIZAR.
PERFORM CALCULAR_BINARIO USING P_NUMERO
CHANGING SUMA_TEXT.
IF FLAG EQ SPACE.
PERFORM IMPRIMIR.
ENDIF.
*&----------------------------------------------------*
*&
Form
INICIALIZAR
*&----------------------------------------------------*
FORM INICIALIZAR.
SUMA = 0.
EXPONENTE = 1.
ENDFORM.
" INICIALIZAR
*&----------------------------------------------------*
*&
Form
CALCULAR_BINARIO
*&----------------------------------------------------*
FORM CALCULAR_BINARIO USING P_NUM
CHANGING P_SUM.
DATA: DIGITO TYPE I,
NUMERO TYPE I.
NUMERO = P_NUM.
139
" CALCULAR_BINARIO
*&----------------------------------------------------*
*&
Form
IMPRIMIR
*&----------------------------------------------------*
FORM IMPRIMIR.
WRITE:/ 'El nmero binario de',25 P_NUMERO.
WRITE:/ 'es:',5 SUMA_TEXT.
ENDFORM.
" IMPRIMIR
140
IF SY-SUBRC = 5.
WRITE / 'Error de clculo'.
FLAG = 'X'.
ENDIF.
141
IF FLAG EQ SPACE.
PERFORM IMPRIMIR.
ENDIF.
Colores en ABAP
Este programa muestra las posibles combinaciones de colores que
pueden generarse en ABAP.
REPORT ZDUMMY_PRIMER_PROGRAMA
NO STANDARD PAGE HEADING.
*=====================================================*
* DECLARACION DE VARIABLES
*=====================================================*
DATA: I TYPE I,
142
COL(15) TYPE C.
*=====================================================*
* START-OF-SELECTION
*=====================================================*
START-OF-SELECTION.
PERFORM IMPRIMIR.
*&----------------------------------------------------*
*&
Form
IMPRIMIR
*&----------------------------------------------------*
FORM IMPRIMIR.
WRITE:/9 'INTESIFIED ON', 27 'INTENSIFIED OFF',
48 'INVERSE'.
SKIP 2.
WHILE I < 8.
CASE I.
WHEN 0. COL = 'COL_BACKGROUND '.
WHEN 1. COL = 'COL_HEADING '.
WHEN 2. COL = 'COL_NORMAL '.
WHEN 3. COL = 'COL_TOTAL '.
WHEN 4. COL = 'COL_KEY '.
WHEN 5. COL = 'COL_POSITIVE '.
WHEN 6. COL = 'COL_NEGATIVE '.
WHEN 7. COL = 'COL_GROUP '.
ENDCASE.
FORMAT INTENSIFIED COLOR = I.
WRITE: /(4) I, AT 7 SY-VLINE,
COL, SY-VLINE,
143
" IMPRIMIR
Lenguajes y Programas
REPORT ZDUMMY_PRIMER_PROGRAMA
NO STANDARD PAGE HEADING.
*=====================================================*
* DECLARACION DE INCLUDES
*=====================================================*
INCLUDE <ICON>.
*=====================================================*
* DECLARACION DE TYPES
*=====================================================*
144
*=====================================================*
DATA: T_PROGRAMAS TYPE STANDARD TABLE
OF TY_PROGRAMAS.
*=====================================================*
* DECLARACION DE FIELD-SYMBOLS
*=====================================================*
FIELD-SYMBOLS: <FS_PROGRAMAS> LIKE LINE
OF T_PROGRAMAS.
*=====================================================*
* DECLARACION DE VARIABLES
*=====================================================*
DATA: ICONO TYPE STRING.
*=====================================================*
* START-OF-SELECTION
*=====================================================*
START-OF-SELECTION.
PERFORM SELECCIONAR_DATOS.
PERFORM IMPRIMIR_DATOS.
*&----------------------------------------------------*
*&
Form
SELECCIONAR_DATOS
*&----------------------------------------------------*
145
FORM SELECCIONAR_DATOS.
SELECT NOMBRE ENTORNO NOM_PROG
INTO TABLE T_PROGRAMAS
FROM ( ZLENGUAJES_PROG INNER JOIN ZPROGRAMAS
ON ZLENGUAJES_PROG~ID = ZPROGRAMAS~ID ).
ENDFORM.
" SELECCIONAR_DATOS
*&----------------------------------------------------*
*&
Form
IMPRIMIR_DATOS
*&----------------------------------------------------*
FORM IMPRIMIR_DATOS.
FORMAT COLOR 5.
WRITE:/1 'Lenguaje',15 'Entorno', 25 'Programa',
40 'Icono'.
FORMAT COLOR OFF.
SKIP 1.
LOOP AT T_PROGRAMAS
ASSIGNING <FS_PROGRAMAS>.
WRITE:/1 <FS_PROGRAMAS>-NOMBRE,
15 <FS_PROGRAMAS>-ENTORNO,
25 <FS_PROGRAMAS>-NOM_PROG.
CASE <FS_PROGRAMAS>-ENTORNO.
WHEN 'WEB'.
ICONO = ICON_WD_WEB_PROJECT.
WHEN 'SCRIPT'.
ICONO = ICON_HISTORY.
WHEN 'DESKTOP'.
ICONO = ICON_FOLDER.
146
ENDCASE.
WRITE: 40 ICONO.
ENDLOOP.
ENDFORM.
" IMPRIMIR_DATOS
LOOP AT T_PROGRAMAS
ASSIGNING <FS_PROGRAMAS>.
WRITE:/1 <FS_PROGRAMAS>-NOMBRE,
15 <FS_PROGRAMAS>-ENTORNO,
25 <FS_PROGRAMAS>-NOM_PROG.
CASE <FS_PROGRAMAS>-ENTORNO.
WHEN 'WEB'.
ICONO = ICON_WD_WEB_PROJECT.
WHEN 'SCRIPT'.
ICONO = ICON_HISTORY.
WHEN 'DESKTOP'.
ICONO = ICON_FOLDER.
ENDCASE.
WRITE: 40 ICONO.
ENDLOOP.
147
REPORT ZDUMMY_PRIMER_PROGRAMA
NO STANDARD PAGE HEADING.
*=====================================================*
* DECLARACION DE TYPES
*=====================================================*
TYPES: X_LINES TYPE STRING.
*=====================================================*
* DECLARACION DE TABLAS INTERNAS
*=====================================================*
148
*=====================================================*
* DECLARACION DE FIELD-SYMBOLS
*=====================================================*
FIELD-SYMBOLS: <FS_TABLE> LIKE LINE OF T_TABLE.
*=====================================================*
* DECLARACION DE VARIABLES
*=====================================================*
DATA: TEXTO(30) TYPE C,
AUX_TEXT(30) TYPE C,
V_LEN TYPE I,
V_LONG TYPE I.
*=====================================================*
* SELECTION-SCREEN
*=====================================================*
SELECTION-SCREEN BEGIN OF BLOCK DEC_TO_BIN WITH FRAME.
PARAMETERS:
P_TEXTO(20) TYPE C.
SELECTION-SCREEN END OF BLOCK DEC_TO_BIN.
*=====================================================*
* START-OF-SELECTION
*=====================================================*
START-OF-SELECTION.
PERFORM INICIALIZAR.
PERFORM FILL_RIGHT_CHARACTERS USING '*'
CHANGING TEXTO.
PERFORM IMPRIMIR USING TEXTO.
149
PERFORM INICIALIZAR.
PERFORM CAPITALIZE_LETTERS CHANGING TEXTO.
PERFORM IMPRIMIR USING TEXTO.
PERFORM INICIALIZAR.
PERFORM SPLIT_LONG_TEXT TABLES T_TABLE
USING TEXTO.
PERFORM IMPRIMIR_TABLA TABLES T_TABLE.
PERFORM INICIALIZAR.
PERFORM REVERSE_STRING USING TEXTO.
PERFORM IMPRIMIR USING TEXTO.
*&----------------------------------------------------*
*&
Form
INICIALIZAR
*&----------------------------------------------------*
FORM INICIALIZAR.
TEXTO = P_TEXTO.
SKIP 1.
ENDFORM.
"INICIALIZAR
*&----------------------------------------------------*
*&
Form
IMPRIMIR_TABLA
*&----------------------------------------------------*
FORM IMPRIMIR_TABLA TABLES T_TAB.
LOOP AT T_TAB
ASSIGNING <FS_TABLE>.
WRITE:/ <FS_TABLE>.
150
ENDLOOP.
ENDFORM.
"INICIALIZAR
*&----------------------------------------------------*
*&
Form
imprimir
*&----------------------------------------------------*
FORM IMPRIMIR USING L_TEXTO.
WRITE:/ TEXTO.
ENDFORM.
"imprimir
*&----------------------------------------------------*
*&
Form
FILL_RIGHT_CHARACTERS
*&----------------------------------------------------*
*
*-----------------------------------------------------*
FORM FILL_RIGHT_CHARACTERS USING L_CHAR
CHANGING L_TEXTO.
V_LEN = STRLEN( L_TEXTO ).
DESCRIBE FIELD L_TEXTO LENGTH V_LONG
IN CHARACTER MODE.
V_LEN = V_LONG - V_LEN.
DO V_LEN TIMES.
CONCATENATE L_TEXTO L_CHAR INTO L_TEXTO.
ENDDO.
ENDFORM.
"FILL_RIGHT_CHARACTERS
151
*&----------------------------------------------------*
*&
Form
CAPITALIZE_LETTERS
*&----------------------------------------------------*
*
*-----------------------------------------------------*
FORM CAPITALIZE_LETTERS CHANGING L_TEXTO.
TRANSLATE L_TEXTO TO LOWER CASE.
SPLIT L_TEXTO AT SPACE INTO TABLE T_TABLE.
CLEAR L_TEXTO.
LOOP AT T_TABLE
ASSIGNING <FS_TABLE>.
V_LONG = STRLEN( <FS_TABLE> ).
V_LONG = V_LONG - 1.
AUX_TEXT = <FS_TABLE>+0(1).
TRANSLATE AUX_TEXT TO UPPER CASE.
CONCATENATE AUX_TEXT <FS_TABLE>+1(V_LONG)
INTO AUX_TEXT.
CONCATENATE L_TEXTO AUX_TEXT INTO L_TEXTO
SEPARATED BY SPACE.
SHIFT L_TEXTO LEFT DELETING LEADING SPACE.
ENDLOOP.
ENDFORM.
"CAPITALIZE_LETTERS
152
*&----------------------------------------------------*
*&
Form
SPLIT_LONG_TEXT
*&----------------------------------------------------*
*
una tabla
*-----------------------------------------------------*
FORM SPLIT_LONG_TEXT TABLES T_TAB
USING L_TEXTO.
CALL FUNCTION 'RSDG_WORD_WRAP'
EXPORTING
TEXTLINE
= L_TEXTO
DELIMITER
= SPACE
TABLES
OUT_LINES
= T_TAB
EXCEPTIONS
OUTPUTLEN_TOO_LARGE = 1
OTHERS
= 2.
"SPLIT_LONG_TEXT
153
*&----------------------------------------------------*
*&
Form
REVERSE_STRING
*&----------------------------------------------------*
*
*-----------------------------------------------------*
FORM REVERSE_STRING CHANGING L_TEXTO.
CALL FUNCTION 'STRING_REVERSE'
EXPORTING
STRING
= L_TEXTO
LANG
= SY-LANGU
IMPORTING
RSTRING
= L_TEXTO
EXCEPTIONS
TOO_SMALL = 1
OTHERS
= 2.
ENDFORM.
"REVERSE_STRING
154
"FILL_RIGHT_CHARACTERS
155
V_LONG = V_LONG - 1.
AUX_TEXT = <FS_TABLE>+0(1).
TRANSLATE AUX_TEXT TO UPPER CASE.
CONCATENATE AUX_TEXT <FS_TABLE>+1(V_LONG)
INTO AUX_TEXT.
CONCATENATE L_TEXTO AUX_TEXT INTO L_TEXTO
SEPARATED BY SPACE.
SHIFT L_TEXTO LEFT DELETING LEADING SPACE.
ENDLOOP.
ENDFORM.
"CAPITALIZE_LETTERS
156
= L_TEXTO
DELIMITER
= SPACE
TABLES
OUT_LINES
= T_TAB
EXCEPTIONS
OUTPUTLEN_TOO_LARGE = 1
OTHERS
= 2.
"SPLIT_LONG_TEXT
= L_TEXTO
157
LANG
= SY-LANGU
IMPORTING
RSTRING
= L_TEXTO
EXCEPTIONS
TOO_SMALL = 1
OTHERS
= 2.
ENDFORM.
"REVERSE_STRING
158
SapScript
Introduccin
Uno de los puntos fuertes que tiene el ABAP, es la posibilidad de
crear formularios, que pueden ser utilizados por ejemplo, para
Certificados de Trabajo, Notificaciones de Empresa, Facturas, etc.
Su creacin no es complicada y permite hacer varias cosas
interesantes. Como por ejemplo, incluir logos o imprimir cdigos de
barras, aunque lo ltimo depende ms que nada de la impresora o de
software adicional para poder mostrarlos correctamente.
Creando un formulario
Para poder crear formularios, debemos ingresar a la transaccin
SE71 (Form Painter).
159
para poder
160
161
162
Men de transaccin
Cuando creamos un nuevo elemento, el sistema nos mostrar la
siguiente ventana:
163
164
165
Por ejemplo:
su
asignacin
(Con
el
botn
Outline
), etc.
167
luego
en
el
botn
o presionamos
parametrizaciones
bsicas
. Es importante indicar
cual es la pgina principal.
168
REPORT ZDUMMY_PRIMER_PROGRAMA
NO STANDARD PAGE HEADING.
*=====================================================*
* DECLARACION DE TABLAS
*=====================================================*
TABLES: ZPROGRAMAS,ITCPO,TOA_DARA,ITCPP.
169
*=====================================================*
* DECLARACION DE TABLAS INTERNAS
*=====================================================*
DATA: T_ZPROGRAMAS TYPE STANDARD TABLE OF
ZPROGRAMAS.
*=====================================================*
* DECLARACION DE FIELD-SYMBOLS
*=====================================================*
FIELD-SYMBOLS: <FS_PROGRAMAS> LIKE LINE OF
T_ZPROGRAMAS.
*=====================================================*
* DECLARACION DE VARIABLES
*=====================================================*
DATA: V_FORM(14) TYPE C,
V_SCRIPT.
*=====================================================*
* SELECTION-SCREEN
*=====================================================*
SELECTION-SCREEN BEGIN OF BLOCK APP WITH FRAME.
SELECT-OPTIONS:
SID_PROG FOR ZPROGRAMAS-ID_PROG.
SELECTION-SCREEN END OF BLOCK APP.
*=====================================================*
* START-OF-SELECTION
*=====================================================*
START-OF-SELECTION.
PERFORM INICIALIZAR.
170
*=====================================================*
* END-OF-SELECTION
*=====================================================*
END-OF-SELECTION.
PERFORM ABRIR_SAPSCRIPT.
*&----------------------------------------------------*
*&
Form
INICIALIZAR
*&----------------------------------------------------*
FORM INICIALIZAR.
V_FORM = 'ZDUMMY_FORM'.
SELECT *
INTO TABLE T_ZPROGRAMAS
FROM ZPROGRAMAS
WHERE ID_PROG IN SID_PROG.
ENDFORM.
"INICIALIZAR
*&----------------------------------------------------*
*&
Form
ABRIR_SAPSCRIPT
*&----------------------------------------------------*
FORM ABRIR_SAPSCRIPT.
ITCPO-TDIMMED = '*'.
ITCPO-TDDELETE = '*'.
ITCPO-TDLIFETIME = '7'.
ITCPO-TDPREVIEW = 'X'.
IF V_SCRIPT EQ SPACE.
CALL FUNCTION 'OPEN_FORM'
EXPORTING
171
FORM
= V_FORM
LANGUAGE
= 'S'
OPTIONS
= ITCPO
ARCHIVE_INDEX = TOA_DARA
DEVICE
= 'PRINTER'
DIALOG
= 'X'
EXCEPTIONS
CANCELED
= 01.
IF SY-SUBRC NE 0.
EXIT.
ENDIF.
V_SCRIPT = 'X'.
ENDIF.
CALL FUNCTION 'START_FORM'
EXPORTING
FORM
= V_FORM
LANGUAGE = 'S'.
LOOP AT T_ZPROGRAMAS
ASSIGNING <FS_PROGRAMAS>.
CALL FUNCTION 'WRITE_FORM'
EXPORTING
ELEMENT = 'MAIN'
WINDOW
= 'MAIN'
EXCEPTIONS
OTHERS
= 01.
ENDLOOP.
CALL FUNCTION 'END_FORM'
IMPORTING
RESULT = ITCPP.
172
IF V_SCRIPT NE SPACE.
CALL FUNCTION 'CLOSE_FORM'.
ENDIF.
ENDFORM.
"ABRIR_SAPSCRIPT
TABLES: ZPROGRAMAS,ITCPO,TOA_DARA,ITCPP.
ITCPO-TDIMMED = '*'.
ITCPO-TDDELETE = '*'.
ITCPO-TDLIFETIME = '7'.
ITCPO-TDPREVIEW = 'X'.
173
Visualizacin de impresin.
IF V_SCRIPT EQ SPACE.
CALL FUNCTION 'OPEN_FORM'
EXPORTING
FORM
= V_FORM
LANGUAGE
= 'S'
OPTIONS
= ITCPO
ARCHIVE_INDEX = TOA_DARA
DEVICE
= 'PRINTER'
DIALOG
= 'X'
EXCEPTIONS
CANCELED
= 01.
IF SY-SUBRC NE 0.
EXIT.
ENDIF.
V_SCRIPT = 'X'.
ENDIF.
esto
OPEN_FORM.
= V_FORM
LANGUAGE = 'S'.
174
LOOP AT T_ZPROGRAMAS
ASSIGNING <FS_PROGRAMAS>.
CALL FUNCTION 'WRITE_FORM'
EXPORTING
ELEMENT = 'ITEM'
WINDOW
= 'MAIN'
EXCEPTIONS
OTHERS
= 01.
ENDLOOP.
175
Diseando el formulario
Adems de la forma que ya vimos para crear nuestro formulario,
contamos con un editor grfico. Para poder acceder, deberemos
ingresar a la transaccin SE71 (Form Painter).
Debemos ingresar al men Settings (Opciones) y presionar Form
Painter.
176
.
177
178
o presionar F3.
179
Para terminar, vamos a crear una caja para que se muestre el nombre
del programa. Para esto, debemos cambiar de editor, puesto que
debemos crear la caja utilizando cdigo.
180
/E
ITEM
181
Los datos son correctos, pero los textos estn muy juntos los unos de
los otros, adems la caja de texto simpre est en el mismo lugar,
veamos como resolvemos esto.
182
V_FORM = 'ZDUMMY_FORM'.
POS = 0.
LOOP AT T_ZPROGRAMAS
ASSIGNING <FS_PROGRAMAS>.
CALL FUNCTION 'WRITE_FORM'
EXPORTING
ELEMENT = 'ITEM'
WINDOW
= 'MAIN'
EXCEPTIONS
OTHERS
= 01.
183
184
185
Debugger en SAPScript
Hay que veces que necesitamos hacer un Debug a un SAPScript. Esto es
bastante sencillo, aunque no mucha gente lo sepa, puesto que no es una
opcin que est muy a la vista, y claro...No es de las mejores herramientas
de SAP.
Para activar el Debugger, ingresamos al transaccin SE71 (Form Painter).
Y elegir Utilities Activate Debugger (Utilidades Activar Debugger).
186
Simplemente presionamos OK
Debugger.
187
SmartForms
Introduccin
Los SmartForms, son la nueva generacin de formularios (Ok...No
tan nuevas si consideramos a los Adobe Forms, que no se incluyen
en este libro) que reemplazan a los para algunos obsoletos
formularios SAPScript.
En realidad es cuestin de gustos...Yo siempre he sido un fantico
acerrimo del SAPScript.
Creando un estilo
Para
crear
un
estilo
debemos
ingresar
la
transaccin
188
En esta ventana, vamos a crear nuestro prrafo por defecto, tal como
lo hicimos en el SAPScript.
Debemos crear un nuevo nodo en la opcin Paragraph Format
(Formato de Prrafo).
189
Y llenamos su descripcin.
190
191
Creando un Formulario
Creamos
nuestro
primer
SmartForm
llamado
ZPRIMER_SMARTFORM.
192
193
194
195
Una vez creado, debemos mover nuestro texto, dentro del LOOP.
196
REPORT ZDUMMY_PRIMER_PROGRAMA
NO STANDARD PAGE HEADING.
*=====================================================*
* DECLARACION DE TABLAS
*=====================================================*
TABLES: ZPROGRAMAS.
*=====================================================*
* DECLARACION DE TABLAS INTERNAS
*=====================================================*
DATA: T_ZPROGRAMAS TYPE STANDARD TABLE OF
ZPROGRAMAS.
197
*=====================================================*
* DECLARACION DE VARIABLES
*=====================================================*
DATA: MODULO_FUNCION TYPE RS38L_FNAM.
*=====================================================*
* SELECTION-SCREEN
*=====================================================*
SELECTION-SCREEN BEGIN OF BLOCK APP WITH FRAME.
SELECT-OPTIONS:
SID_PROG FOR ZPROGRAMAS-ID_PROG.
SELECTION-SCREEN END OF BLOCK APP.
*=====================================================*
* START-OF-SELECTION
*=====================================================*
START-OF-SELECTION.
PERFORM INICIALIZAR.
*=====================================================*
* END-OF-SELECTION
*=====================================================*
END-OF-SELECTION.
PERFORM ABRIR_SMARTFORMS.
198
*&----------------------------------------------------*
*&
Form
INICIALIZAR
*&----------------------------------------------------*
FORM INICIALIZAR.
SELECT *
INTO TABLE T_ZPROGRAMAS
FROM ZPROGRAMAS
WHERE ID_PROG IN SID_PROG.
ENDFORM.
"INICIALIZAR
*&----------------------------------------------------*
*&
Form
ABRIR_SAPSCRIPT
*&----------------------------------------------------*
FORM ABRIR_SMARTFORMS.
CALL FUNCTION 'SSF_FUNCTION_MODULE_NAME'
EXPORTING
FORMNAME
= 'ZPRIMER_SMARTFORM'
IMPORTING
FM_NAME
= MODULO_FUNCION
EXCEPTIONS
NO_FORM
= 1
NO_FUNCTION_MODULE = 2
OTHERS
= 3.
= T_ZPROGRAMAS
EXCEPTIONS
199
FORMATTING_ERROR = 1
INTERNAL_ERROR
= 2
SEND_ERROR
= 3
USER_CANCELED
= 4
OTHERS
= 5.
ENDFORM.
"ABRIR_SAPSCRIPT
Revisemos el programa.
DATA: MODULO_FUNCION TYPE RS38L_FNAM.
Porque
hacemos
esto?
Muy
simple,
los
= 'ZPRIMER_SMARTFORM'
IMPORTING
FM_NAME
= MODULO_FUNCION
EXCEPTIONS
NO_FORM
= 1
NO_FUNCTION_MODULE = 2
OTHERS
= 3.
200
Utilizamos
el
mdulo
de
funciones
= T_ZPROGRAMAS
EXCEPTIONS
FORMATTING_ERROR = 1
INTERNAL_ERROR
= 2
SEND_ERROR
= 3
USER_CANCELED
= 4
OTHERS
= 5.
Ejecutando el formulario
Al igual que en el SAPScript, se nos mostrar una pantalla de
parmetros de impresin.
201
Tenemos nuestra lista, impresa en color azul. Si les parece que est
un poco abajo, es cuestin simplemente de ajustar las propiedades
del texto.
202
ms
interesantes
que
nos
brindan
los
203
204
205
dibujamos
una
lnea
vertical
(Con
esto
creamos
automticamente un %CELL2).
206
pasamos
la
variables
&T_AUX_PROGRAMAS-
207
, para
deshabilitarlo.
Seleccionamos los campos de nuestra lnea de tabla (Utilizando la
tecla Control).
208
209
210
Screen Painter
Para poder crear Dynpros o pantallas en ABAP, deberemos ingresar
a la transaccin SE51 (Screen Painter).
211
213
214
215
216
Deberemos hacer clic en Yes (S) para que nuestra caja de texto
tome la referencia del campo ID de la tabla ZPROGRAMAS.
Para poder acceder a las propiedades de este control, simplemente
debemos hacer un doble clic.
217
218
219
En este caso, vamos a asociar los campos de nuestra tabla a una tabla
interna, que vamos a crear en nuestro programa, llamada
T_ZPROGRAMAS. Esta tabla vamos a definirla en el programa
ZDUMMY_PRIMER_PROGRAMA que en este caso, es el
programa control para el Dynpro.
*=====================================================*
* DECLARACION DE TABLAS INTERNAS
*=====================================================*
DATA: T_ZPROGRAMAS TYPE STANDARD TABLE OF
ZPROGRAMAS.
.
220
222
*&----------------------------------------------------*
*&
Module
STATUS_0100
OUTPUT
*&----------------------------------------------------*
MODULE STATUS_0100 OUTPUT.
DATA: LINEAS TYPE I,
ID TYPE ZPROGRAMAS-ID.
ID = ZPROGRAMAS-ID.
SELECT *
INTO TABLE T_ZPROGRAMAS
FROM ZPROGRAMAS
WHERE ID EQ ID.
DESCRIBE TABLE T_ZPROGRAMAS LINES LINEAS.
TABLA-LINES = LINEAS.
*
ENDMODULE.
" STATUS_0100
OUTPUT
223
REPORT ZDUMMY_PRIMER_PROGRAMA
NO STANDARD PAGE HEADING.
*=====================================================*
* DECLARACION DE TABLAS
*=====================================================*
TABLES: ZPROGRAMAS.
*=====================================================*
* DECLARACION DE TABLAS INTERNAS
*=====================================================*
DATA: T_ZPROGRAMAS TYPE STANDARD TABLE OF
ZPROGRAMAS WITH HEADER LINE.
*=====================================================*
* START-OF-SELECTION
*=====================================================*
START-OF-SELECTION.
CONTROLS TABLA TYPE TABLEVIEW USING SCREEN '100'.
CALL SCREEN '100'.
*&----------------------------------------------------*
*&
Module
STATUS_0100
OUTPUT
*&----------------------------------------------------*
MODULE STATUS_0100 OUTPUT.
DATA: LINEAS TYPE I,
ID TYPE ZPROGRAMAS-ID.
ID = ZPROGRAMAS-ID.
224
IF ID NE SPACE.
SELECT *
INTO TABLE T_ZPROGRAMAS
FROM ZPROGRAMAS
WHERE ID EQ ID.
DESCRIBE TABLE T_ZPROGRAMAS LINES LINEAS.
TABLA-LINES = LINEAS.
ENDIF.
*
ENDMODULE.
" STATUS_0100
OUTPUT
*&----------------------------------------------------*
*&
Module
USER_COMMAND_0100
INPUT
*&----------------------------------------------------*
MODULE USER_COMMAND_0100 INPUT.
ENDMODULE.
" USER_COMMAND_0100
INPUT
Revisemos el cdigo.
START-OF-SELECTION.
CONTROLS TABLA TYPE TABLEVIEW USING SCREEN '100'.
CALL SCREEN '100'.
225
ENDMODULE.
" STATUS_0100
OUTPUT
de tipo
ZPROGRAMAS-ID.
226
227
228
Menu Painter
Lo primero que debemos hacer, es crear un Status, que en este caso,
va a ser el 100. Para ello, como siempre, deberemos hacer clic en el
botn Create (Crear)
229
230
Ahora, debemos grabar y activar. Con esto, nuestro men est listo
para utilizarse.
Para poder agregarlo a nuestro programa, simplemente deberemos
incluir la siguiente lnea (O ms bien, descomentarla).
231
" USER_COMMAND_0100
INPUT
En este caso, los tres botones hacen lo mismo, as que no hay mucho
problema.
La variable del sistema SY-UCOMM, determina que valor tiene el
botn que ha sido presionado.
Aunque en este caso no es necesario, cuando tengamos ms botones,
deberamos incluir el OK_CODE dentro de nuestro Dynpro, as
que vamos a la transaccin SE51.
232
233
234
Aceptamos y continuamos.
235
propiedades.
Como podemos ver, los atributos del pulsador poseen dos campos
adicionales, que son Icon Name (Nombre de Icono) y Tooltip
(Informacin adicional). Para seleccionar el icono, simplemente
hacemos clic en el botn Choose Icon (Escoger Icono)
236
237
" USER_COMMAND_0100
INPUT
FORM PROCESAR_DATOS.
DATA: LINEAS TYPE I,
ID TYPE ZPROGRAMAS-ID.
ID = ZPROGRAMAS-ID.
IF ID NE SPACE.
SELECT *
INTO TABLE T_ZPROGRAMAS
FROM ZPROGRAMAS
238
WHERE ID EQ ID.
DESCRIBE TABLE T_ZPROGRAMAS LINES LINEAS.
TABLA-LINES = LINEAS.
ENDIF.
ENDFORM.
" PROCESAR_DATOS
" STATUS_0100
OUTPUT
239
240
PROCESS ON VALUE-REQUEST.
FIELD ZPROGRAMAS-ID MODULE MATCH_CODE_ID.
241
*=====================================================*
* DECLARACION DE TYPES
*=====================================================*
TYPES: BEGIN OF TY_MATCHCODE_ID,
ID TYPE ZPROGRAMAS-ID,
END OF TY_MATCHCODE_ID.
*=====================================================*
* DECLARACION DE TABLAS INTERNAS
*=====================================================*
DATA: T_ZPROGRAMAS TYPE STANDARD TABLE OF
ZPROGRAMAS WITH HEADER LINE,
T_MATCHCODE_ID TYPE STANDARD TABLE OF
TY_MATCHCODE_ID WITH HEADER LINE.
*=====================================================*
* DECLARACION DE VARIABLES
*=====================================================*
DATA: DYNPROFIELD TYPE HELP_INFO-DYNPROFLD,
PROGNAME TYPE SY-REPID,
DYNNUM TYPE SY-DYNNR.
Con
esto,
ya
estamos
MatchCodeClaro
hacer...Si
el
listos
para
programar
nuestro
campo
ID
ya
tiene
un
MatchCode?
Muy
y veremos una
243
= 'ID'
DYNPPROG
= PROGNAME
244
DYNPNR
= DYNNUM
DYNPROFIELD
= DYNPROFIELD
VALUE_ORG
= 'S'
TABLES
VALUE_TAB
= T_MATCHCODE_ID
RETURN_TAB
= RETURN_TAB
EXCEPTIONS
PARAMETER_ERROR = 1
NO_VALUES_FOUND = 2
OTHERS
= 3.
IF RETURN_TAB-FIELDVAL NE SPACE.
ZPROGRAMAS-ID = RETURN_TAB-FIELDVAL.
ENDIF.
ENDMODULE.
" MATCH_CODE_ID
INPUT
SELECT ID
INTO TABLE T_MATCHCODE_ID
FROM ZPROGRAMAS.
DYNPROFIELD = 'ZPROGRAMAS-ID'.
DYNNUM = '100'.
PROGNAME = SY-REPID.
245
CLEAR RETURN_TAB.
REFRESH RETURN_TAB.
= 'ID'
DYNPPROG
= PROGNAME
DYNPNR
= DYNNUM
DYNPROFIELD
= DYNPROFIELD
VALUE_ORG
= 'S'
TABLES
VALUE_TAB
= T_MATCHCODE_ID
RETURN_TAB
= RETURN_TAB
EXCEPTIONS
PARAMETER_ERROR = 1
NO_VALUES_FOUND = 2
OTHERS
= 3.
IF RETURN_TAB-FIELDVAL NE SPACE.
ZPROGRAMAS-ID = RETURN_TAB-FIELDVAL.
ENDIF.
246
es
bastante
sencillo,
y supone
hacer
unas
cuantas
247
248
249
IF SY-UCOMM EQ 'ELIMINA'.
IF FILA EQ 'X'.
DELETE T_ZPROGRAMAS INDEX TABLA-CURRENT_LINE.
ENDIF.
ENDIF.
ENDMODULE.
" ELIMINAR_FILA
INPUT
250
251
MODULE ACTUALIZA_TABLA.
ENDLOOP.
" ACTUALIZA_TABLA
INPUT
252
253
254
255
256
START-OF-SELECTION.
TEXTO_DINAMICO = 'Este es un texto dinmico'.
CONTROLS TABLA TYPE TABLEVIEW USING SCREEN '100'.
CALL SCREEN '100'.
START-OF-SELECTION.
TEXTO_DINAMICO = 'Este es un texto dinmico'.
CONTROLS TABLA TYPE TABLEVIEW USING SCREEN '100'.
DATA: COLS LIKE LINE OF TABLA-COLS.
CALL SCREEN '100'.
Declaramos la tabla COLS como una lnea de la tabla TABLACOLS, esto es porque TABLA-COLS es una Deep Structure
257
" USER_COMMAND_0100
INPUT
FORM CAMBIAR_ESTADO.
LOOP AT TABLA-COLS INTO COLS.
IF COLS-SCREEN-INPUT = '0'.
COLS-SCREEN-INPUT = '1'.
TEXTO_DINAMICO = 'Modificar'.
ELSEIF COLS-SCREEN-INPUT = '1'.
258
COLS-SCREEN-INPUT = '0'.
TEXTO_DINAMICO = 'Visualizar'.
ENDIF.
MODIFY TABLA-COLS FROM COLS.
ENDLOOP.
ENDFORM.
" CAMBIAR_ESTADO
259
260
261
Luego de haber creado las dos SubScreens, este ser el Flow Logic
para la pantalla principal.
263
como
nombre.
En
este
caso,
el
nombre
ser
ZPROGRAMAS-ID.
Vamos a agregar tambin un botn llamado PROCESAR y que va a
tener como cdigo de funcin la palabra PROCESS.
ZPROGRAMAS-NOM_PROG.
ZLENGUAJES_PROG-NOMBRE.
264
con el
el
campo
ZPROGRAMAS-
265
START-OF-SELECTION.
CONTROLS TAB_CONTROL TYPE TABSTRIP.
TAB_CONTROL-ACTIVETAB = 'TAB_1'.
CALL SCREEN '100'.
FORM OBTENER_DATOS.
SELECT SINGLE NOMBRE NOM_PROG
INTO (ZLENGUAJES_PROG-NOMBRE,ZPROGRAMAS-NOM_PROG)
FROM ( ZPROGRAMAS INNER JOIN ZLENGUAJES_PROG
ON ZPROGRAMAS~ID EQ ZLENGUAJES_PROG~ID )
WHERE ZPROGRAMAS~ID EQ ID.
ENDFORM.
"OBTENER_DATOS
266
" USER_COMMAND_0100
INPUT
267
*=====================================================*
* DECLARACION DE TYPES
*=====================================================*
TYPES: BEGIN OF TAB,
FIELDNAME TYPE DYNPREAD-FIELDNAME,
STEPL TYPE DYNPREAD-STEPL,
FIELDVALUE TYPE DYNPREAD-FIELDVALUE,
268
*=====================================================*
DATA: MY_TAB TYPE STANDARD TABLE OF
TAB,
MY_DYNP TYPE STANDARD TABLE OF
DYNP.
= SY-CPROG
DYNUMB
= <FS_MY_DYNP>-DYNUMB
REQUEST
= 'A'
TABLES
269
DYNPFIELDS = MY_TAB.
ENDLOOP.
REFRESH: MY_TAB, MY_DYNP.
ENDFORM.
"ACTUALIZAR_DYNPRO
FORM OBTENER_DATOS.
SELECT SINGLE NOMBRE NOM_PROG
INTO (ZLENGUAJES_PROG-NOMBRE,ZPROGRAMAS-NOM_PROG)
FROM ( ZPROGRAMAS INNER JOIN ZLENGUAJES_PROG
ON ZPROGRAMAS~ID EQ ZLENGUAJES_PROG~ID )
WHERE ZPROGRAMAS~ID EQ ID.
IF SY-SUBRC EQ 0.
APPEND INITIAL LINE TO MY_TAB
ASSIGNING <FS_MY_TAB>.
<FS_MY_TAB>-FIELDNAME = 'ZPROGRAMAS-ID'.
<FS_MY_TAB>-FIELDVALUE = ZPROGRAMAS-ID.
APPEND INITIAL LINE TO MY_TAB
ASSIGNING <FS_MY_TAB>.
<FS_MY_TAB>-FIELDNAME = 'ZPROGRAMAS-NOM_PROG'.
<FS_MY_TAB>-FIELDVALUE = ZPROGRAMAS-NOM_PROG.
APPEND INITIAL LINE TO MY_TAB
270
ASSIGNING <FS_MY_TAB>.
<FS_MY_TAB>-FIELDNAME = 'ZLENGUAJES_PROG-NOMBRE'.
<FS_MY_TAB>-FIELDVALUE = ZLENGUAJES_PROG-NOMBRE.
APPEND INITIAL LINE TO MY_DYNP
ASSIGNING <FS_MY_DYNP>.
<FS_MY_DYNP>-DYNUMB = '0101'.
PERFORM ACTUALIZAR_DYNPRO TABLES MY_TAB MY_DYNP.
ENDIF.
ENDFORM.
"OBTENER_DATOS
al FORM ACTUALIZAR_DYNPRO
271
WHEN 'MODIFY'.
PERFORM TRASPASAR_VALORES.
ENDCASE.
ENDMODULE.
" USER_COMMAND_0100
INPUT
FORM TRASPASAR_VALORES.
CLEAR: V_NOM_PROG,V_NOMBRE.
MOVE ZPROGRAMAS-NOM_PROG TO V_NOM_PROG.
MOVE ZLENGUAJES_PROG-NOMBRE TO V_NOMBRE.
ENDFORM.
" TRASPASAR_VALORES
272
273
274
*=====================================================*
* DECLARACION DE TYPES
*=====================================================*
TYPE-POOLS: VRM.
*=====================================================*
* DECLARACION DE TABLAS INTERNAS
*=====================================================*
DATA: VALUES TYPE VRM_VALUES,
FC_VALUES LIKE VALUES WITH HEADER LINE.
*=====================================================*
* DECLARACION DE VARIABLES
*=====================================================*
DATA: ID TYPE VRM_ID.
275
= ID
VALUES
VALUES
EXCEPTIONS
ID_ILLEGAL_NAME
= 1
OTHERS
= 2.
ENDIF.
ENDMODULE.
" LLENAR_LISTA_DESPLEGABLE
OUTPUT
276
277
" USER_COMMAND_0100
INPUT
FORM OBTENER_DATOS.
SELECT SINGLE ID_PROG NOM_PROG
INTO (ZPROGRAMAS-ID_PROG,ZPROGRAMAS-NOM_PROG)
FROM ZPROGRAMAS
WHERE ID EQ ZPROGRAMAS-ID.
IF SY-SUBRC NE 0.
CLEAR: ZPROGRAMAS-ID_PROG,ZPROGRAMAS-NOM_PROG.
ENDIF.
ENDFORM.
" OBTENER_DATOS
278
279
280
DYNUMB = '0100'.
CALL FUNCTION 'DYNP_VALUES_READ'
EXPORTING
DYNAME
= SY-CPROG
DYNUMB
= DYNUMB
TABLES
DYNPFIELDS = DYNPRO_VALUES.
READ TABLE DYNPRO_VALUES WITH KEY
FIELDNAME = 'ZPROGRAMAS-ID'.
IF SY-SUBRC EQ 0.
ZPROGRAMAS-ID = DYNPRO_VALUES-FIELDVALUE.
ENDIF.
ENDMODULE.
" READ_DYNP_VALUES
INPUT
281
la
transaccin
SE37,
crearemos
nuestra
282
283
texto de ayuda que indica que hace o que necesita el parmetro para
funcionar correctamente. Basta con hacer clic en el botn Create
(Crear) para ingresar al editor. Escribimos un pequeo texto
descriptivo, grabamos, activamos y salimos.
284
FUNCTION ZDUMMY_FUNCTION.
*"----------------------------------------------------*"*"Local Interface:
*"
*"
*"
IMPORTING
REFERENCE(FECHA_NAC) TYPE
SY-DATUM
CHANGING
285
*"
*"
REFERENCE(TABLA_EDAD) TYPE
ZEDAD_STR
EXCEPTIONS
*"
EDAD_FUERA_RANGO
286
ENDFUNCTION.
IF FECHA_NAC GT SY-DATUM.
RAISE EDAD_FUERA_RANGO.
ENDIF.
ZYEARS = FECHA_NAC+0(4).
ZMONTHS = FECHA_NAC+4(2).
ZDAYS = FECHA_NAC+6(2).
ZYEARS = SY-DATUM+0(4) - ZYEARS.
287
IF SY-DATUM+4(2) LT ZMONTHS.
ZYEARS = ZYEARS - 1.
ZMONTHS_AUX = 12 - ZMONTHS.
ZMONTHS = SY-DATUM+4(2) + ZMONTHS.
ENDIF.
IF SY-DATUM+6(2) LT ZDAYS.
ZDAYS = 30 - ZDAYS.
ZMONTHS = ZMONTHS - 1.
ZDAYS = ZDAYS + SY-DATUM+6(2).
ENDIF.
Si los das actuales son menores que los das del parmetro, entonces
a 30 le restamos la cantidad de das. Restamos 1 a meses y sumamos
los das actuales ms los das que obtuvimos al hacer la resta de 30
menos los das del parmetro.
Para probar nuestra funcin, simplemente debemos ejecutarla
presionando la tecla F8 o el botn Test/Exectute (Probar/Ejecutar)
.
288
. Adems podramos
.
289
Ahora que ya vimos que nuestra funcin hace lo que tiene que hacer,
es hora de llamarla desde un programa.
REPORT ZDUMMY_PRIMER_PROGRAMA
NO STANDARD PAGE HEADING.
290
*=====================================================*
* DECLARACION DE TABLAS
*=====================================================*
DATA: TABLA_EDAD TYPE ZEDAD_STR.
*=====================================================*
* Selection screen
*=====================================================*
SELECTION-SCREEN BEGIN OF BLOCK DATA WITH FRAME.
PARAMETERS:
P_FECHA TYPE SY-DATUM.
SELECTION-SCREEN END OF BLOCK DATA.
*=====================================================*
* START-OF-SELECTION
*=====================================================*
START-OF-SELECTION.
CALL FUNCTION 'ZDUMMY_FUNCTION'
EXPORTING
FECHA_NAC
= P_FECHA
CHANGING
TABLA_EDAD
= TABLA_EDAD
EXCEPTIONS
EDAD_FUERA_RANGO = 1
OTHERS
= 2.
IF SY-SUBRC <> 0.
WRITE: 'La edad ingresada est fuera del rango'.
ELSE.
WRITE: 'Su edad actual es',
TABLA_EDAD-ZYEARS, 'Aos',
291
TABLA_EDAD-ZMONTHS, 'Meses',
TABLA_EDAD-ZDAYS, 'Das'.
ENDIF.
Introduccin BAPIS
Una BAPI (Business Application Programming Interface Interface
de Programacin de Aplicaciones de Negocio), no es en el fondo
ms que un mdulo de funciones con caractersticas de RFC.
Aunque las BAPIs son utilizadas para realizar tareas especficas,
como por ejemplo, crear pedidos, realizar contabilizaciones, cargar
datos maestros, etc.
292
293
Creando un ALV
Para crear un ALV, necesitamos una funcin muy importante
llamada REUSE_ALV_GRID_DISPLAY, que es la que finalmente
crea todo el diseo visual y la gran mayora de las funcionalidades
standard que nos ofrecen estos reportes dinmicos.
Otro punto importante, es el uso de un TYPE-POOLS, llamado
SLIS. Este TYPE-POOLS, contiene todas las definiciones de
variables y tablas internas que necesitamos para poder trabajar, as
que veamos como sera el esqueleto del programa.
Lo primero que hay que hacer, es obtener los datos tal como lo
haramos en un programa normal, puesto que una vez que tengamos
lista la tabla interna, ser muy sencillo generar el ALV.
294
*=====================================================*
* DECLARACION DE TABLAS
*=====================================================*
TABLES: ZPROGRAMAS.
*=====================================================*
* DECLARACION DE TYPE-POOLS
*=====================================================*
TYPE-POOLS: SLIS.
*=====================================================*
* DECLARACION DE TYPES
*=====================================================*
TYPES: BEGIN OF TY_PROGRAMAS,
ID_PROG TYPE ZPROGRAMAS-ID_PROG,
NOM_PROG TYPE ZPROGRAMAS-NOM_PROG,
NOMBRE TYPE ZLENGUAJES_PROG-NOMBRE,
ENTORNO TYPE ZLENGUAJES_PROG-ENTORNO,
CONEX_SAP TYPE ZLENGUAJES_PROG-CONEX_SAP,
END OF TY_PROGRAMAS.
*=====================================================*
* DECLARACION DE TABLAS INTERNAS
*=====================================================*
DATA: T_PROGRAMAS TYPE STANDARD TABLE OF
TY_PROGRAMAS.
*=====================================================*
* Selection screen
*=====================================================*
SELECTION-SCREEN BEGIN OF BLOCK DATA WITH FRAME.
SELECT-OPTIONS:
295
*=====================================================*
START-OF-SELECTION.
PERFORM OBTENER_DATOS.
*&----------------------------------------------------*
*&
Form
OBTENER_DATOS
*&----------------------------------------------------*
FORM OBTENER_DATOS.
SELECT ID_PROG NOM_PROG NOMBRE ENTORNO CONEX_SAP
INTO TABLE T_PROGRAMAS
FROM ( ZPROGRAMAS INNER JOIN ZLENGUAJES_PROG
ON ZPROGRAMAS~ID EQ ZLENGUAJES_PROG~ID )
WHERE ID_PROG IN S_IDPROG.
ENDFORM.
" OBTENER_DATOS
Vamos a necesitar crear algunas tablas internas para poder llenar las
estructuras del ALV, as como algunas variables para manejar su
formato de visualizacin.
*=====================================================*
* DECLARACION DE TABLAS INTERNAS
*=====================================================*
DATA: T_PROGRAMAS TYPE STANDARD TABLE OF
TY_PROGRAMAS,
I_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV,
296
*=====================================================*
* DECLARACION DE VARIABLES
*=====================================================*
DATA: G_PROGRAM TYPE SY-REPID,
G_TITULO TYPE SY-TITLE,
G_REPID TYPE SY-REPID,
GS_SORT TYPE SLIS_T_SORTINFO_ALV.
*=====================================================*
* END-OF-SELECTION
*=====================================================*
END-OF-SELECTION.
*=====================================================*
END-OF-SELECTION.
PERFORM INIT_LAYOUT.
PERFORM FORMATEAR_DATOS_ALV_DET USING I_FIELDCAT[].
PERFORM BUILD_SORT.
PERFORM F_GENERAR_LISTA_ALV.
297
FORM INIT_LAYOUT.
GS_LAYOUT-ZEBRA = 'X'.
ENDFORM.
" INIT_LAYOUT
FORM BUILD_SORT.
APPEND INITIAL LINE TO GS_SORT
ASSIGNING <FS_SORT>.
<FS_SORT>-SPOS = 1.
<FS_SORT>-FIELDNAME = 'ID_PROG'.
<FS_SORT>-UP = 'X'.
ENDFORM.
" BUILD_SORT
298
299
"FORMATEAR_DATOS_ALV_DET
300
FORM F_GENERAR_LISTA_ALV.
G_PROGRAM = SY-REPID.
G_TITULO = 'Lista de Programas'.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
I_BUFFER_ACTIVE
= ' '
I_CALLBACK_PROGRAM = G_PROGRAM
I_GRID_TITLE
= G_TITULO
IS_LAYOUT
= GS_LAYOUT
IT_FIELDCAT
= I_FIELDCAT
IT_SORT
= GS_SORT[]
TABLES
T_OUTTAB
= T_PROGRAMAS
EXCEPTIONS
PROGRAM_ERROR
= 1
OTHERS
= 2.
IF SY-SUBRC <> 0.
EXIT.
ENDIF.
ENDFORM.
" F_GENERAR_LISTA_ALV
301
302
" INIT_LAYOUT
303
*=====================================================*
* DECLARACION DE TABLAS INTERNAS
*=====================================================*
DATA: T_PROGRAMAS TYPE STANDARD TABLE OF
TY_PROGRAMAS,
I_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV,
I_SORT_ALV TYPE SLIS_T_SORTINFO_ALV,
GS_LAYOUT TYPE SLIS_LAYOUT_ALV,
GT_LIST_TOP_OF_PAGE TYPE SLIS_T_LISTHEADER,
I_EVENTS TYPE SLIS_T_EVENT.
*=====================================================*
* END-OF-SELECTION
*=====================================================*
END-OF-SELECTION.
PERFORM INIT_LAYOUT.
PERFORM FORMATEAR_DATOS_ALV_DET USING I_FIELDCAT[].
PERFORM F_FORMATO_PAGE CHANGING GT_LIST_TOP_OF_PAGE.
PERFORM F_FORMATEAR_EVENTOS_ALV USING I_EVENTS[].
PERFORM BUILD_SORT.
PERFORM F_GENERAR_LISTA_ALV.
304
"F_FORMATO_PAGE
305
CLEAR L_EVENTS.
L_EVENTS-NAME = 'TOP_OF_PAGE'.
L_EVENTS-FORM = 'TOP_OF_PAGE'.
APPEND L_EVENTS TO P_EVENTS.
ENDFORM.
"F_FORMATEAR_EVENTOS_ALV
FORM TOP_OF_PAGE.
CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
EXPORTING
IT_LIST_COMMENTARY = GT_LIST_TOP_OF_PAGE.
ENDFORM.
"TOP_OF_PAGE
FORM F_GENERAR_LISTA_ALV.
G_PROGRAM = G_TITULO = SY-REPID.
306
= ' '
I_CALLBACK_PROGRAM = G_PROGRAM
I_GRID_TITLE
= G_TITULO
IS_LAYOUT
= GS_LAYOUT
IT_FIELDCAT
= I_FIELDCAT
IT_SORT
= GS_SORT[]
IT_EVENTS
= I_EVENTS
TABLES
T_OUTTAB
= T_PROGRAMAS
EXCEPTIONS
PROGRAM_ERROR
= 1
OTHERS
= 2.
IF SY-SUBRC <> 0.
EXIT.
ENDIF.
ENDFORM.
" F_GENERAR_LISTA_ALV
307
308
"F_FORMATO_PAGE
309
*=====================================================*
* DECLARACION DE VARIABLES
*=====================================================*
DATA: G_PROGRAM TYPE SY-REPID,
G_TITULO TYPE SY-TITLE,
G_REPID TYPE SY-REPID,
GS_SORT TYPE SLIS_T_SORTINFO_ALV,
G_USER_COMMAND TYPE SLIS_FORMNAME
VALUE 'USER_COMMAND'.
310
FORM INIT_LAYOUT.
GS_LAYOUT-ZEBRA = ' '.
GS_LAYOUT-F2CODE = 'FUNCION'.
ENDFORM.
" INIT_LAYOUT
*=====================================================*
* DECLARACION DE FIELD-SYMBOLS
*=====================================================*
FIELD-SYMBOLS: <FS_SORT> LIKE LINE OF GS_SORT,
<FS_PROGRAMAS> LIKE LINE OF T_PROGRAMAS.
311
ASSIGNING <FS_PROGRAMAS>.
CONCATENATE <FS_PROGRAMAS>-ID_PROG
<FS_PROGRAMAS>-NOM_PROG
<FS_PROGRAMAS>-NOMBRE
INTO MENSAJE SEPARATED BY SPACE.
CALL FUNCTION 'MESSAGE_TEXT_DISPLAY_WITH_PARA'
EXPORTING
TEXT = MENSAJE.
ENDCASE.
ENDFORM.
"USER_COMMAND
312
FORM F_GENERAR_LISTA_ALV.
G_PROGRAM = G_TITULO = SY-REPID.
G_TITULO = 'Lista de Programas'.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
I_BUFFER_ACTIVE
= ' '
I_CALLBACK_PROGRAM
= G_PROGRAM
I_GRID_TITLE
= G_TITULO
IS_LAYOUT
= GS_LAYOUT
I_SAVE
= 'A'
IT_FIELDCAT
= I_FIELDCAT
IT_SORT
= GS_SORT[]
IT_EVENTS
= I_EVENTS
I_CALLBACK_USER_COMMAND = G_USER_COMMAND
TABLES
T_OUTTAB
= T_PROGRAMAS
EXCEPTIONS
PROGRAM_ERROR
= 1
OTHERS
= 2.
IF SY-SUBRC <> 0.
EXIT.
ENDIF.
ENDFORM.
" F_GENERAR_LISTA_ALV
313
FORM INIT_LAYOUT.
GS_LAYOUT-ZEBRA = ' '.
GS_LAYOUT-F2CODE = 'FUNCION'.
GS_LAYOUT-KEY_HOTSPOT = 'X'.
ENDFORM.
" INIT_LAYOUT
CLEAR L_FIELDCAT.
L_FIELDCAT-TABNAME = 'T_PROGRAMAS'.
314
L_FIELDCAT-FIELDNAME = 'ID_PROG'.
L_FIELDCAT-SELTEXT_L = 'Id'.
L_FIELDCAT-KEY
= 'X'.
L_FIELDCAT-COL_POS = 1.
L_FIELDCAT-OUTPUTLEN = 5.
APPEND L_FIELDCAT TO T_FIELDCAT.
315
*=====================================================*
* DECLARACION DE TYPES
*=====================================================*
TYPES: BEGIN OF TY_PROGRAMAS,
ID_PROG TYPE ZPROGRAMAS-ID_PROG,
NOM_PROG TYPE ZPROGRAMAS-NOM_PROG,
NOMBRE TYPE ZLENGUAJES_PROG-NOMBRE,
ENTORNO TYPE ZLENGUAJES_PROG-ENTORNO,
CONEX_SAP TYPE ZLENGUAJES_PROG-CONEX_SAP,
LINE_COLOR(4) TYPE C,
END OF TY_PROGRAMAS.
FORM OBTENER_DATOS.
SELECT ID_PROG NOM_PROG NOMBRE ENTORNO CONEX_SAP
INTO TABLE T_PROGRAMAS
FROM ( ZPROGRAMAS INNER JOIN ZLENGUAJES_PROG
ON ZPROGRAMAS~ID EQ ZLENGUAJES_PROG~ID )
WHERE ID_PROG IN S_IDPROG.
LOOP AT T_PROGRAMAS
ASSIGNING <FS_PROGRAMAS>.
IF <FS_PROGRAMAS>-NOMBRE EQ 'RUBY'.
<FS_PROGRAMAS>-LINE_COLOR = 'C510'.
MODIFY T_PROGRAMAS FROM <FS_PROGRAMAS>.
ENDIF.
316
ENDLOOP.
ENDFORM.
" OBTENER_DATOS
FORM INIT_LAYOUT.
GS_LAYOUT-ZEBRA = ' '.
GS_LAYOUT-F2CODE = 'FUNCION'.
GS_LAYOUT-KEY_HOTSPOT = 'X'.
GS_LAYOUT-INFO_FIELDNAME = 'LINE_COLOR'.
ENDFORM.
" INIT_LAYOUT
317
*=====================================================*
* DECLARACION DE TYPES
*=====================================================*
TYPES: BEGIN OF TY_PROGRAMAS_AUX,
ID_PROG TYPE ZPROGRAMAS-ID_PROG,
NOM_PROG TYPE ZPROGRAMAS-NOM_PROG,
NOMBRE TYPE ZLENGUAJES_PROG-NOMBRE,
ENTORNO TYPE ZLENGUAJES_PROG-ENTORNO,
CONEX_SAP TYPE ZLENGUAJES_PROG-CONEX_SAP,
END OF TY_PROGRAMAS_AUX.
TYPES: BEGIN OF TY_PROGRAMAS,
ID_PROG TYPE ZPROGRAMAS-ID_PROG,
NOM_PROG TYPE ZPROGRAMAS-NOM_PROG,
NOMBRE TYPE ZLENGUAJES_PROG-NOMBRE,
ENTORNO TYPE ZLENGUAJES_PROG-ENTORNO,
CONEX_SAP TYPE ZLENGUAJES_PROG-CONEX_SAP,
COLOR_CELL TYPE LVC_T_SCOL,
END OF TY_PROGRAMAS.
318
*=====================================================*
* DECLARACION DE TABLAS INTERNAS
*=====================================================*
DATA: T_PROGRAMAS TYPE STANDARD TABLE OF
TY_PROGRAMAS,
T_PROGRAMAS_AUX TYPE STANDARD TABLE OF
TY_PROGRAMAS_AUX,
I_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV,
I_SORT_ALV TYPE SLIS_T_SORTINFO_ALV,
GS_LAYOUT TYPE SLIS_LAYOUT_ALV,
GT_LIST_TOP_OF_PAGE TYPE SLIS_T_LISTHEADER,
I_EVENTS TYPE SLIS_T_EVENT,
WA_COLOR TYPE LVC_S_SCOL,
IT_COLOR TYPE TABLE OF LVC_S_SCOL.
*=====================================================*
* DECLARACION DE FIELD-SYMBOLS
*=====================================================*
FIELD-SYMBOLS: <FS_SORT> LIKE LINE OF GS_SORT,
<FS_PROGRAMAS> LIKE LINE OF
319
T_PROGRAMAS,
<FS_PROGRAMAS_AUX> LIKE LINE OF
T_PROGRAMAS_AUX.
FORM OBTENER_DATOS.
SELECT ID_PROG NOM_PROG NOMBRE ENTORNO CONEX_SAP
INTO TABLE T_PROGRAMAS_AUX
FROM ( ZPROGRAMAS INNER JOIN ZLENGUAJES_PROG
ON ZPROGRAMAS~ID EQ ZLENGUAJES_PROG~ID )
WHERE ID_PROG IN S_IDPROG.
LOOP AT T_PROGRAMAS_AUX
ASSIGNING <FS_PROGRAMAS_AUX>.
REFRESH IT_COLOR.
MOVE 'NOMBRE' TO WA_COLOR-FNAME.
MOVE '6' TO WA_COLOR-COLOR-COL.
APPEND WA_COLOR TO IT_COLOR.
APPEND INITIAL LINE TO
T_PROGRAMAS ASSIGNING <FS_PROGRAMAS>.
MOVE-CORRESPONDING <FS_PROGRAMAS_AUX>
TO <FS_PROGRAMAS>.
IF <FS_PROGRAMAS_AUX>-NOMBRE EQ 'RUBY'.
320
<FS_PROGRAMAS>-COLOR_CELL[] = IT_COLOR[].
ENDIF.
ENDLOOP.
ENDFORM.
" OBTENER_DATOS
la tabla
IT_COLOR al
DEEP STRUCTURE
FORM INIT_LAYOUT.
GS_LAYOUT-ZEBRA = ' '.
GS_LAYOUT-F2CODE = 'FUNCION'.
GS_LAYOUT-KEY_HOTSPOT = 'X'.
GS_LAYOUT-COLTAB_FIELDNAME = 'COLOR_CELL'.
321
ENDFORM.
" INIT_LAYOUT
Ahora que ya sabemos como jugar con los eventos y con algunas
propiedades del ALV, sera bueno que tambin conocieramos un
poco de su barra de mens, que adems de ser Standard, nos brinda
toda la funcionalidad que podamos necesitar, por lo cual, muy rara
vez tendremos que agregar botones adicionales.
322
B Orden Ascendente
C Orden Descendente
323
324
H Fichero local
325
I Destinatario de Correo
326
J Funcin Grfica
K Modificar Disposicin
327
L Seleccionar Disposicin
M Grabar disposicin
328
N Informacin
329
Qu es la Orientacin a Objetos?
La Programacin Orientada a Objetos, es una serie de reglas,
sentencias y liniamientos que se deben seguir para poder moldear
procesos del mundo real. Es decir, con la POO nosotros podemos de
una manera ms clara y sencilla, representar situaciones y/o
procesos.
330
332
*-----------------------------------------------------*
* CLASS C_MATH DEFINITION
*-----------------------------------------------------*
CLASS C_MATH DEFINITION.
*DEFINICIN DE LA CLASE
PUBLIC SECTION.
*SECCIN PBLICA DE LA CLASE
METHODS:
*MTODOS
FACTORIAL.
PRIVATE SECTION.
*SECCIN PRIVADA DE LA CLASE
ENDCLASS.
"C_MATH DEFINITION
*-----------------------------------------------------*
* CLASS C_MATH IMPLEMENTATION
*-----------------------------------------------------*
CLASS C_MATH IMPLEMENTATION.
*IMPLEMENTACIN DE LA CLASE
METHOD FACTORIAL.
*DEFINICIN DE UN MTODO
ENDMETHOD.
ENDCLASS.
"FACTORIAL
"C_MATH IMPLEMENTATION
*-----------------------------------------------------*
* CLASS C_MATH DEFINITION
*-----------------------------------------------------*
CLASS C_MATH DEFINITION.
*DEFINICIN DE LA CLASE
PUBLIC SECTION.
*SECCIN PBLICA DE LA CLASE
METHODS:
*MTODOS
CONSTRUCTOR
IMPORTING NAME TYPE STRING,
FACTORIAL.
PRIVATE SECTION.
*SECCIN PRIVADA DE LA CLASE
ENDCLASS.
"C_MATH DEFINITION
*-----------------------------------------------------*
* CLASS C_MATH IMPLEMENTATION
*-----------------------------------------------------*
CLASS C_MATH IMPLEMENTATION.
*IMPLEMENTACIN DE LA CLASE
METHOD CONSTRUCTOR.
WRITE:/ NAME.
*ENVIAMOS EL PARMETRO AL CONSTRUCTOR DE LA CLASE
ENDMETHOD.
"CONSTRUCTOR
METHOD FACTORIAL.
*DEFINICIN DE UN MTODO
ENDMETHOD.
ENDCLASS.
"FACTORIAL
"C_MATH IMPLEMENTATION
*-----------------------------------------------------*
* CLASS C_SUPERMATH DEFINITION
*-----------------------------------------------------*
CLASS C_SUPERMATH DEFINITION.
ENDCLASS.
"C_SUPERMATH DEFINITION
*Definicin de la clase
*-----------------------------------------------------*
* CLASS C_MATH DEFINITION
*-----------------------------------------------------*
CLASS C_MATH DEFINITION
INHERITING FROM C_SUPERMATH .
*Hereda de C_SUPERMATH
PUBLIC SECTION.
*Seccin Pblica de la clase
METHODS:
*Mtodos
FACTORIAL.
335
PRIVATE SECTION.
*SECCIN PRIVADA DE LA CLASE
ENDCLASS.
"C_MATH
DEFINITION
*-----------------------------------------------------*
* CLASS C_MATH IMPLEMENTATION
*-----------------------------------------------------*
CLASS C_MATH IMPLEMENTATION.
*IMPLEMENTACIN DE LA CLASE
METHOD FACTORIAL.
*DEFINICIN DE UN MTODO
ENDMETHOD.
ENDCLASS.
"FACTORIAL
"C_MATH IMPLEMENTATION
336
*-----------------------------------------------------*
CLASS C_FACTORIAL DEFINITION.
PUBLIC SECTION.
CLASS-METHODS: MAIN.
METHODS:
SET_FACT IMPORTING NUM TYPE I,
GET_RESULT RETURNING VALUE(FACT) TYPE I.
PRIVATE SECTION.
DATA FACT TYPE I.
ENDCLASS.
"FACTORIAL DEFINITION
337
*-----------------------------------------------------*
*
*-----------------------------------------------------*
CLASS C_FACTORIAL IMPLEMENTATION.
METHOD MAIN.
CALL SELECTION-SCREEN '101' STARTING AT 10 10.
IF SY-SUBRC NE 0.
EXIT.
ENDIF.
ENDMETHOD.
"MAIN
METHOD SET_FACT.
FACT = 1.
IF NUM GT 0.
DO NUM TIMES.
FACT = FACT * SY-INDEX.
ENDDO.
ENDIF.
ENDMETHOD.
"SET_FACT
METHOD GET_RESULT.
WRITE: 'El Factorial es: ', ME->FACT.
ENDMETHOD.
ENDCLASS.
"GET_RESULT
"FACTORIAL IMPLEMENTATION
START-OF-SELECTION.
C_FACTORIAL=>MAIN( ).
DATA MY_OBJ TYPE REF TO C_FACTORIAL.
CREATE OBJECT MY_OBJ.
CALL METHOD
MY_OBJ->SET_FACT( EXPORTING NUM = NUMBER ).
CALL METHOD
MY_OBJ->GET_RESULT.
338
*-----------------------------------------------------*
*
*-----------------------------------------------------*
CLASS C_FACTORIAL DEFINITION.
PUBLIC SECTION.
CLASS-METHODS: MAIN.
METHODS:
SET_FACT IMPORTING NUM TYPE I,
GET_RESULT RETURNING VALUE(FACT) TYPE I.
PRIVATE SECTION.
DATA FACT TYPE I.
ENDCLASS.
"FACTORIAL DEFINITION
339
*-----------------------------------------------------*
*
*-----------------------------------------------------*
CLASS C_FACTORIAL IMPLEMENTATION.
METHOD MAIN.
CALL SELECTION-SCREEN '101' STARTING AT 10 10.
IF SY-SUBRC NE 0.
EXIT.
ENDIF.
ENDMETHOD.
"MAIN
METHOD SET_FACT.
FACT = 1.
IF NUM GT 0.
DO NUM TIMES.
FACT = FACT * SY-INDEX.
ENDDO.
ENDIF.
ENDMETHOD.
"SET_FACT
METHOD GET_RESULT.
WRITE: 'El Factorial es: ', ME->FACT.
ENDMETHOD.
ENDCLASS.
"GET_RESULT
"FACTORIAL IMPLEMENTATION
340
START-OF-SELECTION.
C_FACTORIAL=>MAIN( ).
DATA MY_OBJ TYPE REF TO C_FACTORIAL.
CREATE OBJECT MY_OBJ.
CALL METHOD
MY_OBJ->SET_FACT( EXPORTING NUM = NUMBER ).
CALL METHOD
MY_OBJ->GET_RESULT.
341
342
"FACTORIAL DEFINITION
343
METHOD SET_FACT.
CLEAR FLAG.
FACT = 1.
IF NUM GT 0.
DO NUM TIMES.
CATCH SYSTEM-EXCEPTIONS ARITHMETIC_ERRORS = 5.
FACT = FACT * SY-INDEX.
ENDCATCH.
IF SY-SUBRC EQ 5.
FACT = 0.
FLAG = 'X'.
EXIT.
ENDIF.
ENDDO.
ENDIF.
ENDMETHOD.
"SET_FACT
344
METHOD GET_RESULT.
IF FLAG EQ SPACE.
WRITE: 'El Factorial es: ', ME->FACT.
ELSE.
WRITE: 'Error, ingrese valores del 1 al 12'.
ENDIF.
ENDMETHOD.
"GET_RESULT
345
346
347
348
method SET_FACT.
CLEAR FLAG.
FACT = 1.
IF NUM GT 0.
DO NUM TIMES.
CATCH SYSTEM-EXCEPTIONS ARITHMETIC_ERRORS = 5.
FACT = FACT * SY-INDEX.
ENDCATCH.
IF SY-SUBRC EQ 5.
FACT = 0.
FLAG = 'X'.
EXIT.
ENDIF.
ENDDO.
ENDIF.
endmethod.
method GET_RESULT.
IF FLAG EQ SPACE.
WRITE: 'El Factorial es: ', ME->FACT.
ELSE.
WRITE: 'Error, ingrese valores del 1 al 12'.
ENDIF.
endmethod.
Con esto, solo nos queda grabar, activar. La clase est lista para ser
utilizada, pero claro, lo mejor es probarlo antes. Para esto,
presionamos el botn Test o presionamos F8
349
350
REPORT ZDUMMY_PRIMER_PROGRAMA.
SELECTION-SCREEN BEGIN OF SCREEN 101 AS WINDOW.
PARAMETERS NUMBER TYPE I.
SELECTION-SCREEN END OF SCREEN 101.
351
START-OF-SELECTION.
CALL SELECTION-SCREEN '101' STARTING AT 10 10.
IF SY-SUBRC NE 0.
EXIT.
ENDIF.
DATA MY_OBJ TYPE REF TO ZFACTORIAL.
CREATE OBJECT MY_OBJ.
CALL METHOD
MY_OBJ->SET_FACT( EXPORTING NUM = NUMBER ).
CALL METHOD
MY_OBJ->GET_RESULT.
352
*=====================================================*
* DECLARACION DE TYPES
*=====================================================*
TYPES: BEGIN OF TY_PROGRAMAS,
ID_PROG TYPE ZPROGRAMAS-ID_PROG,
NOM_PROG TYPE ZPROGRAMAS-NOM_PROG,
NOMBRE TYPE ZLENGUAJES_PROG-NOMBRE,
ENTORNO TYPE ZLENGUAJES_PROG-ENTORNO,
CONEX_SAP TYPE ZLENGUAJES_PROG-CONEX_SAP,
END OF TY_PROGRAMAS.
*=====================================================*
* DECLARACION DE TABLAS INTERNAS
*=====================================================*
DATA: T_PROGRAMAS TYPE STANDARD TABLE
OF TY_PROGRAMAS,
GS_LAYOUT TYPE LVC_S_LAYO,
GT_FIELDCAT TYPE LVC_T_FCAT,
GT_SORT TYPE LVC_T_SORT,
GS_VARIANT TYPE DISVARIANT.
353
*=====================================================*
* DECLARACION DE VARIABLES
*=====================================================*
DATA: MYCONTAINER TYPE SCRFNAME VALUE 'CUSTOM_ALV',
CUSTOM_CONTAINER TYPE REF TO
CL_GUI_CUSTOM_CONTAINER,
GRID1 TYPE REF TO CL_GUI_ALV_GRID,
X_SAVE.
*=====================================================*
* START-OF-SELECTION
*=====================================================*
START-OF-SELECTION.
PERFORM CARGAR_DATOS.
PERFORM FILL_LAYOUT.
PERFORM FILL_CATALOG.
PERFORM LLAMAR_ALV.
CALL SCREEN 0100.
*&----------------------------------------------------*
*&
Form
cargar_datos
*&----------------------------------------------------*
FORM CARGAR_DATOS.
SELECT ID_PROG NOM_PROG NOMBRE ENTORNO CONEX_SAP
INTO TABLE T_PROGRAMAS
FROM ( ZPROGRAMAS INNER JOIN ZLENGUAJES_PROG
ON ZPROGRAMAS~ID EQ ZLENGUAJES_PROG~ID ).
ENDFORM.
" cargar_datos
354
*&----------------------------------------------------*
*&
Form
fill_layout
*&----------------------------------------------------*
FORM FILL_LAYOUT.
GS_LAYOUT-SEL_MODE = 'A'.
ENDFORM.
" fill_layout
*&----------------------------------------------------*
*&
Form
fill_catalog
*&----------------------------------------------------*
FORM FILL_CATALOG.
DATA: GS_FIELDCAT TYPE LVC_S_FCAT.
CLEAR GS_FIELDCAT.
GS_FIELDCAT-TABNAME = 'T_PROGRAMAS'.
GS_FIELDCAT-FIELDNAME = 'ID_PROG'.
GS_FIELDCAT-REPTEXT = 'Id'.
GS_FIELDCAT-COL_POS = 1.
GS_FIELDCAT-OUTPUTLEN = 5.
APPEND GS_FIELDCAT TO GT_FIELDCAT.
CLEAR GS_FIELDCAT.
GS_FIELDCAT-TABNAME = 'T_PROGRAMAS'.
GS_FIELDCAT-FIELDNAME = 'NOM_PROG'.
GS_FIELDCAT-REPTEXT = 'Nombre Programa'.
GS_FIELDCAT-COL_POS = 2.
GS_FIELDCAT-OUTPUTLEN = 15.
APPEND GS_FIELDCAT TO GT_FIELDCAT.
355
CLEAR GS_FIELDCAT.
GS_FIELDCAT-TABNAME = 'T_PROGRAMAS'.
GS_FIELDCAT-FIELDNAME = 'NOMBRE'.
GS_FIELDCAT-REPTEXT = 'Nombre Lenguaje'.
GS_FIELDCAT-COL_POS = 3.
GS_FIELDCAT-OUTPUTLEN = 15.
APPEND GS_FIELDCAT TO GT_FIELDCAT.
CLEAR GS_FIELDCAT.
GS_FIELDCAT-TABNAME = 'T_PROGRAMAS'.
GS_FIELDCAT-FIELDNAME = 'ENTORNO'.
GS_FIELDCAT-REPTEXT = 'Entorno'.
GS_FIELDCAT-COL_POS = 4.
GS_FIELDCAT-OUTPUTLEN = 10.
APPEND GS_FIELDCAT TO GT_FIELDCAT.
CLEAR GS_FIELDCAT.
GS_FIELDCAT-TABNAME = 'T_PROGRAMAS'.
GS_FIELDCAT-FIELDNAME = 'CONEX_SAP'.
GS_FIELDCAT-REPTEXT = 'Conexin con SAP'.
GS_FIELDCAT-COL_POS = 5.
GS_FIELDCAT-OUTPUTLEN = 15.
APPEND GS_FIELDCAT TO GT_FIELDCAT.
ENDFORM.
" fill_catalog
*&----------------------------------------------------*
*&
Form
llamar_alv
*&----------------------------------------------------*
FORM LLAMAR_ALV.
IF CUSTOM_CONTAINER IS INITIAL.
356
= MYCONTAINER
EXCEPTIONS
CNTL_ERROR
= 1
CNTL_SYSTEM_ERROR
= 2
CREATE_ERROR
= 3
LIFETIME_ERROR
= 4
LIFETIME_DYNPRO_DYNPRO_LINK = 5.
ENDIF.
CREATE OBJECT GRID1
EXPORTING
I_PARENT = CUSTOM_CONTAINER.
CALL METHOD GRID1->SET_TABLE_FOR_FIRST_DISPLAY
EXPORTING
IS_VARIANT
= GS_VARIANT
I_SAVE
= X_SAVE
I_DEFAULT
= 'X'
IS_LAYOUT
= GS_LAYOUT
CHANGING
IT_FIELDCATALOG = GT_FIELDCAT
IT_SORT
= GT_SORT[]
IT_OUTTAB
= T_PROGRAMAS[].
" llamar_alv
357
*&----------------------------------------------------*
*&
Module
STATUS_0100
OUTPUT
*&----------------------------------------------------*
MODULE STATUS_0100 OUTPUT.
SET PF-STATUS '100'.
SET TITLEBAR '100'.
ENDMODULE.
" STATUS_0100
OUTPUT
*&----------------------------------------------------*
*&
Module
USER_COMMAND_0100
INPUT
*&----------------------------------------------------*
MODULE USER_COMMAND_0100 INPUT.
DATA: OK_CODE TYPE SY-UCOMM.
OK_CODE = SY-UCOMM.
CASE OK_CODE.
WHEN 'BACK' OR 'EXIT' OR 'CANCEL'.
SET SCREEN 0.
LEAVE SCREEN.
CLEAR SY-UCOMM.
ENDCASE.
ENDMODULE.
" USER_COMMAND_0100
INPUT
358
*=====================================================*
* DECLARACION DE TYPES
*=====================================================*
TYPES: BEGIN OF TY_PROGRAMAS,
ID_PROG TYPE ZPROGRAMAS-ID_PROG,
NOM_PROG TYPE ZPROGRAMAS-NOM_PROG,
NOMBRE TYPE ZLENGUAJES_PROG-NOMBRE,
ENTORNO TYPE ZLENGUAJES_PROG-ENTORNO,
CONEX_SAP TYPE ZLENGUAJES_PROG-CONEX_SAP,
END OF TY_PROGRAMAS.
359
*=====================================================*
* DECLARACION DE TABLAS INTERNAS
*=====================================================*
DATA: T_PROGRAMAS TYPE STANDARD TABLE
OF TY_PROGRAMAS,
GS_LAYOUT TYPE LVC_S_LAYO,
GT_FIELDCAT TYPE LVC_T_FCAT,
GT_SORT TYPE LVC_T_SORT,
GS_VARIANT TYPE DISVARIANT.
*=====================================================*
* DECLARACION DE VARIABLES
*=====================================================*
DATA: MYCONTAINER TYPE SCRFNAME VALUE 'CUSTOM_ALV',
CUSTOM_CONTAINER TYPE REF TO
CL_GUI_CUSTOM_CONTAINER,
GRID1 TYPE REF TO CL_GUI_ALV_GRID,
X_SAVE.
*=====================================================*
* START-OF-SELECTION
*=====================================================*
START-OF-SELECTION.
PERFORM CARGAR_DATOS.
PERFORM FILL_LAYOUT.
PERFORM FILL_CATALOG.
PERFORM LLAMAR_ALV.
CALL SCREEN 0100.
*&----------------------------------------------------*
*&
Form
cargar_datos
*&----------------------------------------------------*
FORM CARGAR_DATOS.
SELECT ID_PROG NOM_PROG NOMBRE ENTORNO CONEX_SAP
INTO TABLE T_PROGRAMAS
FROM ( ZPROGRAMAS INNER JOIN ZLENGUAJES_PROG
ON ZPROGRAMAS~ID EQ ZLENGUAJES_PROG~ID ).
ENDFORM.
" cargar_datos
361
*&----------------------------------------------------*
*&
Form
fill_layout
*&----------------------------------------------------*
FORM FILL_LAYOUT.
GS_LAYOUT-SEL_MODE = 'A'.
ENDFORM.
" fill_layout
*&----------------------------------------------------*
*&
Form
fill_catalog
*&----------------------------------------------------*
FORM FILL_CATALOG.
DATA: GS_FIELDCAT TYPE LVC_S_FCAT.
CLEAR GS_FIELDCAT.
GS_FIELDCAT-TABNAME = 'T_PROGRAMAS'.
GS_FIELDCAT-FIELDNAME = 'ID_PROG'.
GS_FIELDCAT-REPTEXT = 'Id'.
GS_FIELDCAT-COL_POS = 1.
GS_FIELDCAT-OUTPUTLEN = 5.
APPEND GS_FIELDCAT TO GT_FIELDCAT.
CLEAR GS_FIELDCAT.
GS_FIELDCAT-TABNAME = 'T_PROGRAMAS'.
GS_FIELDCAT-FIELDNAME = 'NOM_PROG'.
362
" fill_catalog
363
*&----------------------------------------------------*
*&
Form
llamar_alv
*&----------------------------------------------------*
FORM LLAMAR_ALV.
IF CUSTOM_CONTAINER IS INITIAL.
CREATE OBJECT CUSTOM_CONTAINER
EXPORTING
CONTAINER_NAME
= MYCONTAINER
EXCEPTIONS
CNTL_ERROR
= 1
CNTL_SYSTEM_ERROR
= 2
CREATE_ERROR
= 3
LIFETIME_ERROR
= 4
LIFETIME_DYNPRO_DYNPRO_LINK = 5.
ENDIF.
CREATE OBJECT GRID1
EXPORTING
I_PARENT = CUSTOM_CONTAINER.
CALL METHOD GRID1->SET_TABLE_FOR_FIRST_DISPLAY
EXPORTING
IS_VARIANT
= GS_VARIANT
I_SAVE
= X_SAVE
I_DEFAULT
= 'X'
IS_LAYOUT
= GS_LAYOUT
CHANGING
IT_FIELDCATALOG = GT_FIELDCAT
IT_SORT
= GT_SORT[]
IT_OUTTAB
= T_PROGRAMAS[].
364
" llamar_alv
mtodo
SET_TABLE_FOR_FIRST_DISPLAY
*&----------------------------------------------------*
*&
Module
STATUS_0100
OUTPUT
*&----------------------------------------------------*
MODULE STATUS_0100 OUTPUT.
SET PF-STATUS '100'.
SET TITLEBAR '100'.
ENDMODULE.
" STATUS_0100
OUTPUT
365
*&----------------------------------------------------*
*&
Module
USER_COMMAND_0100
INPUT
*&----------------------------------------------------*
MODULE USER_COMMAND_0100 INPUT.
DATA: OK_CODE TYPE SY-UCOMM.
OK_CODE = SY-UCOMM.
CASE OK_CODE.
WHEN 'BACK' OR 'EXIT' OR 'CANCEL'.
SET SCREEN 0.
LEAVE SCREEN.
CLEAR SY-UCOMM.
ENDCASE.
ENDMODULE.
" USER_COMMAND_0100
INPUT
366
*=====================================================*
* DECLARACION DE TYPES
*=====================================================*
TYPES: BEGIN OF TY_PROGRAMAS,
ID_PROG TYPE ZPROGRAMAS-ID_PROG,
NOM_PROG TYPE ZPROGRAMAS-NOM_PROG,
NOMBRE TYPE ZLENGUAJES_PROG-NOMBRE,
367
*=====================================================*
DATA: T_PROGRAMAS TYPE STANDARD TABLE
OF TY_PROGRAMAS,
T_NOMBRE TYPE STANDARD TABLE
OF TY_NOMBRE,
LT_F4 TYPE LVC_T_F4 WITH HEADER LINE,
RETURN_TAB TYPE STANDARD TABLE OF
DDSHRETVAL WITH HEADER LINE,
T_STABLE TYPE STANDARD TABLE OF
LVC_S_STBL WITH HEADER LINE,
GS_LAYOUT TYPE LVC_S_LAYO,
GT_FIELDCAT TYPE LVC_T_FCAT,
GT_SORT TYPE LVC_T_SORT,
GS_VARIANT TYPE DISVARIANT.
368
LT_F4 nos sirve para determinar que campos van a tener asignada
una ayuda de bsqueda.
RETURN_TAB es la tabla que nos devuelve el valor seleccionado
por la funcin para crear ayudas de bsqueda.
T_STABLE
*=====================================================*
* DECLARACION DE VARIABLES
*=====================================================*
DATA: MYCONTAINER TYPE SCRFNAME VALUE 'CUSTOM_ALV',
CUSTOM_CONTAINER TYPE REF TO
CL_GUI_CUSTOM_CONTAINER,
GRID1 TYPE REF TO CL_GUI_ALV_GRID,
EVENT_RECEIVER TYPE REF TO LCL_EVENT_RECEIVER,
X_SAVE,
W_ERROR TYPE C,
L_VALID(1) TYPE C.
369
*=====================================================*
* DECLARACION DE FIELD-SYMBOLS
*=====================================================*
FIELD-SYMBOLS: <FS_NOMBRE> LIKE LINE OF T_NOMBRE,
<FS_PROGRAMAS> LIKE LINE OF
T_PROGRAMAS.
*-----------------------------------------------------*
*
*-----------------------------------------------------*
CLASS LCL_EVENT_RECEIVER DEFINITION.
PUBLIC SECTION.
METHODS: HANDLE_DATA_CHANGED
FOR EVENT DATA_CHANGED OF CL_GUI_ALV_GRID
IMPORTING ER_DATA_CHANGED,
HANDLE_F4_HELP
FOR EVENT ONF4 OF CL_GUI_ALV_GRID
IMPORTING E_FIELDNAME ES_ROW_NO ER_EVENT_DATA.
ENDCLASS.
"LCL_EVENT_RECEIVER DEFINITION
si
algn
campo
ha
cambiado
su
valor)
370
*-----------------------------------------------------*
*
*-----------------------------------------------------*
CLASS LCL_EVENT_RECEIVER IMPLEMENTATION.
METHOD HANDLE_DATA_CHANGED.
PERFORM DATA_CHANGED USING ER_DATA_CHANGED.
ENDMETHOD.
"HANDLE_DATA_CHANGED
METHOD HANDLE_F4_HELP.
PERFORM HANDLE_ONF4 USING E_FIELDNAME ES_ROW_NO.
ER_EVENT_DATA->M_EVENT_HANDLED = 'X'.
ENDMETHOD.
"HANDLE_F4_HELP
ENDCLASS.
"LCL_EVENT_RECEIVER IMPLEMENTATION
X,
*&----------------------------------------------------*
*&
Form
cargar_datos
*&----------------------------------------------------*
FORM CARGAR_DATOS.
SELECT ID_PROG NOM_PROG NOMBRE ENTORNO CONEX_SAP
INTO TABLE T_PROGRAMAS
FROM ( ZPROGRAMAS INNER JOIN ZLENGUAJES_PROG
ON ZPROGRAMAS~ID EQ ZLENGUAJES_PROG~ID ).
371
SELECT ID NOMBRE
INTO TABLE T_NOMBRE
FROM ZLENGUAJES_PROG.
ENDFORM.
" cargar_datos
CLEAR GS_FIELDCAT.
GS_FIELDCAT-TABNAME = 'T_PROGRAMAS'.
GS_FIELDCAT-FIELDNAME = 'NOMBRE'.
GS_FIELDCAT-EDIT
= 'X'.
GS_FIELDCAT-F4AVAILABL = 'X'.
GS_FIELDCAT-REPTEXT = 'Nombre Lenguaje'.
GS_FIELDCAT-COL_POS = 3.
GS_FIELDCAT-OUTPUTLEN = 15.
APPEND GS_FIELDCAT TO GT_FIELDCAT.
*&----------------------------------------------------*
*&
Form
llamar_alv
*&----------------------------------------------------*
FORM LLAMAR_ALV.
372
IF CUSTOM_CONTAINER IS INITIAL.
CREATE OBJECT CUSTOM_CONTAINER
EXPORTING
CONTAINER_NAME
= MYCONTAINER
EXCEPTIONS
CNTL_ERROR
= 1
CNTL_SYSTEM_ERROR
= 2
CREATE_ERROR
= 3
LIFETIME_ERROR
= 4
LIFETIME_DYNPRO_DYNPRO_LINK = 5.
ENDIF.
CREATE OBJECT GRID1
EXPORTING
I_PARENT = CUSTOM_CONTAINER.
CREATE OBJECT EVENT_RECEIVER.
LT_F4-FIELDNAME = 'NOMBRE'.
LT_F4-REGISTER = 'X' .
LT_F4-GETBEFORE = 'X' .
LT_F4-CHNGEAFTER = 'X' .
APPEND LT_F4.
SET HANDLER EVENT_RECEIVER>HANDLE_DATA_CHANGED FOR GRID1.
SET HANDLER EVENT_RECEIVER->HANDLE_F4_HELP FOR GRID1.
CALL METHOD GRID1->REGISTER_F4_FOR_FIELDS
EXPORTING
IT_F4 = LT_F4[].
373
IF SY-BATCH IS INITIAL.
CALL METHOD GRID1->REGISTER_EDIT_EVENT
EXPORTING
I_EVENT_ID = CL_GUI_ALV_GRID=>MC_EVT_MODIFIED.
ENDIF.
CALL METHOD GRID1->SET_TABLE_FOR_FIRST_DISPLAY
EXPORTING
IS_VARIANT
= GS_VARIANT
I_SAVE
= X_SAVE
I_DEFAULT
= 'X'
IS_LAYOUT
= GS_LAYOUT
CHANGING
IT_FIELDCATALOG = GT_FIELDCAT
IT_SORT
= GT_SORT[]
IT_OUTTAB
= T_PROGRAMAS[].
" llamar_alv
374
*&----------------------------------------------------*
*&
Module
USER_COMMAND_0100
INPUT
*&----------------------------------------------------*
MODULE USER_COMMAND_0100 INPUT.
DATA: OK_CODE TYPE SY-UCOMM.
OK_CODE = SY-UCOMM.
CLEAR SY-UCOMM.
CASE OK_CODE.
WHEN 'BACK' OR 'EXIT' OR 'CANCEL'.
SET SCREEN 0.
LEAVE SCREEN.
WHEN 'SAVE'.
CALL METHOD GRID1->CHECK_CHANGED_DATA
IMPORTING
E_VALID = L_VALID.
IF L_VALID EQ 'X'.
PERFORM GRABAR_DATOS.
ENDIF.
ENDCASE.
ENDMODULE.
" USER_COMMAND_0100
INPUT
*&----------------------------------------------------*
*&
Form
data_changed
*&----------------------------------------------------*
FORM DATA_CHANGED USING RR_DATA_CHANGED
TYPE REF TO
CL_ALV_CHANGED_DATA_PROTOCOL.
DATA: W_NEW,
LS_MOD_CELLS TYPE LVC_S_MODI,
LS_CELLS TYPE LVC_S_MODI.
DATA: L_NOMBRE TYPE ZLENGUAJES_PROG-NOMBRE.
LOOP AT RR_DATA_CHANGED->MT_GOOD_CELLS
INTO LS_MOD_CELLS.
CASE LS_MOD_CELLS-FIELDNAME.
WHEN 'NOMBRE'.
CALL METHOD RR_DATA_CHANGED->GET_CELL_VALUE
EXPORTING
I_ROW_ID
= LS_MOD_CELLS-ROW_ID
I_FIELDNAME = LS_MOD_CELLS-FIELDNAME
IMPORTING
E_VALUE
= L_NOMBRE.
IF L_NOMBRE IS INITIAL.
CALL METHOD
RR_DATA_CHANGED->ADD_PROTOCOL_ENTRY
EXPORTING
I_MSGID
= '0K'
I_MSGNO
= '000'
I_MSGTY
= 'E'
I_MSGV1
I_FIELDNAME = LS_MOD_CELLS-FIELDNAME
376
I_ROW_ID
= LS_MOD_CELLS-ROW_ID.
W_ERROR = 'X'.
ELSE.
READ TABLE T_NOMBRE WITH KEY
NOMBRE = L_NOMBRE
ASSIGNING <FS_NOMBRE>.
IF SY-SUBRC NE 0.
CALL METHOD
RR_DATA_CHANGED->ADD_PROTOCOL_ENTRY
EXPORTING
I_MSGID
= '0K'
I_MSGNO
= '000'
I_MSGTY
= 'E'
I_MSGV1
I_FIELDNAME = LS_MOD_CELLS-FIELDNAME
I_ROW_ID
= LS_MOD_CELLS-ROW_ID.
W_ERROR = 'X'.
ELSE.
CALL METHOD RR_DATA_CHANGED->MODIFY_CELL
EXPORTING
I_ROW_ID
= LS_MOD_CELLS-ROW_ID
I_FIELDNAME = 'ID'
I_VALUE
= <FS_NOMBRE>-ID.
ENDIF.
ENDIF.
ENDCASE.
ENDLOOP.
ENDFORM.
Hacemos
"data_changed
un
LOOP
RR_DATA_CHANGED-
377
*&----------------------------------------------------*
*&
Form
handle_onf4
*&----------------------------------------------------*
FORM HANDLE_ONF4 USING P_E_FIELDNAME
P_ES_ROW_NO STRUCTURE
LVC_S_ROID.
CASE P_E_FIELDNAME.
WHEN 'NOMBRE'.
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
RETFIELD
= 'NOMBRE'
VALUE_ORG
= 'S'
TABLES
VALUE_TAB
= T_NOMBRE
RETURN_TAB
= RETURN_TAB
EXCEPTIONS
PARAMETER_ERROR = 1
NO_VALUES_FOUND = 2
OTHERS
= 3.
378
"handle_onf4
*&----------------------------------------------------*
*&
Form
grabar_datos
*&----------------------------------------------------*
FORM GRABAR_DATOS.
LOOP AT T_PROGRAMAS ASSIGNING <FS_PROGRAMAS>
WHERE ID NE SPACE.
UPDATE ZPROGRAMAS SET ID = <FS_PROGRAMAS>-ID
WHERE ID_PROG EQ <FS_PROGRAMAS>-ID_PROG.
379
IF SY-SUBRC EQ 0.
COMMIT WORK.
ELSE.
ROLLBACK WORK.
ENDIF.
ENDLOOP.
ENDFORM.
" GRABAR_DATOS
380
REPORT ZDUMMY_PRIMER_PROGRAMA.
*=====================================================*
* DECLARACION DE TYPES
*=====================================================*
TYPES: BEGIN OF TY_PROGRAMAS,
LENGUAJE TYPE ZVLENGUAJES_PROG-LENGUAJE,
NOM_PROG TYPE ZVLENGUAJES_PROG-NOM_PROG,
ENTORNO TYPE ZVLENGUAJES_PROG-ENTORNO,
END OF TY_PROGRAMAS.
TYPES: BEGIN OF TY_HEADER,
LENGUAJE TYPE ZVLENGUAJES_PROG-LENGUAJE,
END OF TY_HEADER.
381
*=====================================================*
* DECLARACION DE TABLAS INTERNAS
*=====================================================*
DATA: T_PROGRAMAS TYPE STANDARD TABLE OF
TY_PROGRAMAS,
T_TREE TYPE STANDARD TABLE OF
TY_PROGRAMAS WITH HEADER LINE,
T_HEADER TYPE STANDARD TABLE OF
TY_HEADER,
GT_FIELDCAT_TREE TYPE LVC_T_FCAT.
*=====================================================*
* DECLARACION DE VARIABLES
*=====================================================*
DATA: OK_CODE TYPE SY-UCOMM,
G_ALV_TREE TYPE REF TO CL_GUI_ALV_TREE,
G_CUSTOM_CONTAINER TYPE REF TO
CL_GUI_CUSTOM_CONTAINER,
L_HIERARCHY_HEADER TYPE TREEV_HHDR.
*=====================================================*
* DECLARACION DE FIELD-SYMBOLS
*=====================================================*
FIELD-SYMBOLS: <FS_PROGRAMAS> LIKE LINE OF
T_PROGRAMAS,
<FS_HEADER> LIKE LINE OF
T_HEADER,
<FS_TREE> LIKE LINE OF
T_PROGRAMAS.
382
*=====================================================*
* START-OF-SELECTION
*=====================================================*
START-OF-SELECTION.
PERFORM CARGAR_DATOS.
PERFORM INIT_TREE.
CALL SCREEN 0100.
*&----------------------------------------------------*
*&
Form
CARGAR_DATOS
*&----------------------------------------------------*
FORM CARGAR_DATOS.
SELECT LENGUAJE NOM_PROG ENTORNO
INTO TABLE T_PROGRAMAS
FROM ZVLENGUAJES_PROG.
LOOP AT T_PROGRAMAS
ASSIGNING <FS_PROGRAMAS>.
APPEND INITIAL LINE TO
T_HEADER ASSIGNING <FS_HEADER>.
<FS_HEADER>-LENGUAJE = <FS_PROGRAMAS>-LENGUAJE.
ENDLOOP.
SORT T_HEADER.
DELETE ADJACENT DUPLICATES FROM T_HEADER.
ENDFORM.
" CARGAR_DATOS
383
*&----------------------------------------------------*
*&
Module
STATUS_0100
OUTPUT
*&----------------------------------------------------*
MODULE STATUS_0100 OUTPUT.
SET PF-STATUS '100'.
SET TITLEBAR '100'.
ENDMODULE.
" STATUS_0100
OUTPUT
*&----------------------------------------------------*
*&
Module
USER_COMMAND_0100
INPUT
*&----------------------------------------------------*
MODULE USER_COMMAND_0100 INPUT.
OK_CODE = SY-UCOMM.
CLEAR SY-UCOMM.
CASE OK_CODE.
WHEN 'BACK' OR 'STOP' OR 'CANCEL'.
SET SCREEN 0.
LEAVE SCREEN.
ENDCASE.
ENDMODULE.
" USER_COMMAND_0100
INPUT
384
*&----------------------------------------------------*
*&
Form
INIT_TREE
*&----------------------------------------------------*
FORM INIT_TREE.
DATA: L_TREE_CONTAINER_NAME(30) TYPE C.
L_TREE_CONTAINER_NAME = 'CUSTOM_ALV'.
CREATE OBJECT G_CUSTOM_CONTAINER
EXPORTING
CONTAINER_NAME
L_TREE_CONTAINER_NAME
EXCEPTIONS
CNTL_ERROR
= 1
CNTL_SYSTEM_ERROR
= 2
CREATE_ERROR
= 3
LIFETIME_ERROR
= 4
LIFETIME_DYNPRO_DYNPRO_LINK = 5.
CREATE OBJECT G_ALV_TREE
EXPORTING
PARENT
= G_CUSTOM_CONTAINER
NODE_SELECTION_MODE
CL_GUI_COLUMN_TREE=>NODE_SEL_MODE_SINGLE
ITEM_SELECTION
= ''
NO_HTML_HEADER
= 'X'
NO_TOOLBAR
= ''
EXCEPTIONS
CNTL_ERROR
= 1
CNTL_SYSTEM_ERROR
= 2
CREATE_ERROR
= 3
385
LIFETIME_ERROR
= 4
ILLEGAL_NODE_SELECTION_MODE = 5
FAILED
= 6
ILLEGAL_COLUMN_NAME
= 7.
PERFORM FILL_CATALOG_TREE.
PERFORM BUILD_HIERARCHY_HEADER CHANGING
L_HIERARCHY_HEADER.
CALL METHOD G_ALV_TREE->SET_TABLE_FOR_FIRST_DISPLAY
EXPORTING
IS_HIERARCHY_HEADER = L_HIERARCHY_HEADER
CHANGING
IT_OUTTAB
= T_TREE[]
IT_FIELDCATALOG
= GT_FIELDCAT_TREE.
PERFORM CREATE_HIERARCHY.
ENDFORM.
" INIT_TREE
*&----------------------------------------------------*
*&
Form
fill_catalog_tree
*&----------------------------------------------------*
FORM FILL_CATALOG_TREE.
DATA: GS_FIELDCAT TYPE LVC_S_FCAT.
CLEAR GS_FIELDCAT.
GS_FIELDCAT-COL_POS
= 1.
GS_FIELDCAT-FIELDNAME = 'NOM_PROG'.
GS_FIELDCAT-SCRTEXT_S = 'Nom. Programa'.
GS_FIELDCAT-TABNAME
= 'T_PROGRAMAS'.
GS_FIELDCAT-OUTPUTLEN = 20.
386
= 2.
GS_FIELDCAT-FIELDNAME = 'ENTORNO'.
GS_FIELDCAT-SCRTEXT_S = 'Entorno'.
GS_FIELDCAT-TABNAME
= 'T_PROGRAMAS'.
GS_FIELDCAT-OUTPUTLEN = 15.
APPEND GS_FIELDCAT TO GT_FIELDCAT_TREE.
ENDFORM.
"fill_catalog_tree
*&----------------------------------------------------*
*
FORM build_hierarchy_header
*&----------------------------------------------------*
FORM BUILD_HIERARCHY_HEADER CHANGING
P_HIERARCHY_HEADER
TYPE TREEV_HHDR.
CLEAR P_HIERARCHY_HEADER.
P_HIERARCHY_HEADER-HEADING = 'Cdigo'(300).
P_HIERARCHY_HEADER-WIDTH = 60.
P_HIERARCHY_HEADER-WIDTH_PIX = ' '.
ENDFORM.
"BUILD_HIERARCHY_HEADER
*&----------------------------------------------------*
*&
Form
create_hierarchy
*&----------------------------------------------------*
FORM CREATE_HIERARCHY.
DATA: L_ROOT_KEY TYPE LVC_NKEY,
L_NEXT_KEY TYPE LVC_NKEY,
387
"CREATE_HIERARCHY
*&----------------------------------------------------*
*
FORM ADD_NODE
*&----------------------------------------------------*
FORM ADD_NODE USING L_NAME L_ROOT_KEY
CHANGING L_NEXT_KEY.
388
L_NAME.
CL_GUI_COLUMN_TREE=>RELAT_LAST_CHILD
I_NODE_TEXT
= L_NODE_TEXT
IS_OUTTAB_LINE
= LS_TREE
IMPORTING
E_NEW_NODE_KEY
= L_NEXT_KEY.
ENDFORM.
"ADD_NODE
*&----------------------------------------------------*
*
FORM ADD_LEAF
*&----------------------------------------------------*
FORM ADD_LEAF USING L_TREE TYPE TY_PROGRAMAS
L_NEXT_KEY
CHANGING L_LAST_KEY.
CALL METHOD G_ALV_TREE->ADD_NODE
EXPORTING
I_RELAT_NODE_KEY = L_NEXT_KEY
I_RELATIONSHIP
CL_GUI_COLUMN_TREE=>RELAT_LAST_CHILD
IS_OUTTAB_LINE
= T_TREE
IMPORTING
E_NEW_NODE_KEY
= L_LAST_KEY.
389
ENDFORM.
"ADD_LEAF
*=====================================================*
* DECLARACION DE TYPES
*=====================================================*
TYPES: BEGIN OF TY_PROGRAMAS,
LENGUAJE TYPE ZVLENGUAJES_PROG-LENGUAJE,
NOM_PROG TYPE ZVLENGUAJES_PROG-NOM_PROG,
ENTORNO TYPE ZVLENGUAJES_PROG-ENTORNO,
END OF TY_PROGRAMAS.
TYPES: BEGIN OF TY_HEADER,
LENGUAJE TYPE ZVLENGUAJES_PROG-LENGUAJE,
END OF TY_HEADER.
Declaramos dos TYPEs, uno para crear la tabla que guardar los
datos del ALV y otro para crear la tabla que guardar los datos de la
cabecera del programa.
*=====================================================*
* DECLARACION DE TABLAS INTERNAS
*=====================================================*
DATA: T_PROGRAMAS TYPE STANDARD TABLE OF
TY_PROGRAMAS,
T_TREE TYPE STANDARD TABLE OF
TY_PROGRAMAS WITH HEADER LINE,
T_HEADER TYPE STANDARD TABLE OF
390
TY_HEADER,
GT_FIELDCAT_TREE TYPE LVC_T_FCAT.
*=====================================================*
* DECLARACION DE VARIABLES
*=====================================================*
DATA: OK_CODE TYPE SY-UCOMM,
G_ALV_TREE TYPE REF TO CL_GUI_ALV_TREE,
G_CUSTOM_CONTAINER TYPE REF TO
CL_GUI_CUSTOM_CONTAINER,
L_HIERARCHY_HEADER TYPE TREEV_HHDR.
*=====================================================*
* DECLARACION DE FIELD-SYMBOLS
*=====================================================*
FIELD-SYMBOLS: <FS_PROGRAMAS> LIKE LINE OF
T_PROGRAMAS,
<FS_HEADER> LIKE LINE OF
391
T_HEADER,
<FS_TREE> LIKE LINE OF
T_PROGRAMAS.
*=====================================================*
* START-OF-SELECTION
*=====================================================*
START-OF-SELECTION.
PERFORM CARGAR_DATOS.
PERFORM INIT_TREE.
CALL SCREEN 0100.
*&----------------------------------------------------*
*&
Form
CARGAR_DATOS
*&----------------------------------------------------*
FORM CARGAR_DATOS.
SELECT LENGUAJE NOM_PROG ENTORNO
INTO TABLE T_PROGRAMAS
FROM ZVLENGUAJES_PROG.
LOOP AT T_PROGRAMAS
ASSIGNING <FS_PROGRAMAS>.
APPEND INITIAL LINE TO
T_HEADER ASSIGNING <FS_HEADER>.
<FS_HEADER>-LENGUAJE = <FS_PROGRAMAS>-LENGUAJE.
392
ENDLOOP.
SORT T_HEADER.
DELETE ADJACENT DUPLICATES FROM T_HEADER.
ENDFORM.
" CARGAR_DATOS
Module
STATUS_0100
OUTPUT
*&----------------------------------------------------*
MODULE STATUS_0100 OUTPUT.
SET PF-STATUS '100'.
SET TITLEBAR '100'.
ENDMODULE.
" STATUS_0100
OUTPUT
*&----------------------------------------------------*
*&
Module
USER_COMMAND_0100
INPUT
*&----------------------------------------------------*
MODULE USER_COMMAND_0100 INPUT.
OK_CODE = SY-UCOMM.
CLEAR SY-UCOMM.
393
CASE OK_CODE.
WHEN 'BACK' OR 'STOP' OR 'CANCEL'.
SET SCREEN 0.
LEAVE SCREEN.
ENDCASE.
ENDMODULE.
" USER_COMMAND_0100
INPUT
*&----------------------------------------------------*
*&
Form
INIT_TREE
*&----------------------------------------------------*
FORM INIT_TREE.
DATA: L_TREE_CONTAINER_NAME(30) TYPE C.
L_TREE_CONTAINER_NAME = 'CUSTOM_ALV'.
CREATE OBJECT G_CUSTOM_CONTAINER
EXPORTING
CONTAINER_NAME
L_TREE_CONTAINER_NAME
EXCEPTIONS
CNTL_ERROR
= 1
CNTL_SYSTEM_ERROR
= 2
CREATE_ERROR
= 3
LIFETIME_ERROR
= 4
LIFETIME_DYNPRO_DYNPRO_LINK = 5.
CREATE OBJECT G_ALV_TREE
394
EXPORTING
PARENT
= G_CUSTOM_CONTAINER
NODE_SELECTION_MODE
CL_GUI_COLUMN_TREE=>NODE_SEL_MODE_SINGLE
ITEM_SELECTION
= ''
NO_HTML_HEADER
= 'X'
NO_TOOLBAR
= ''
EXCEPTIONS
CNTL_ERROR
= 1
CNTL_SYSTEM_ERROR
= 2
CREATE_ERROR
= 3
LIFETIME_ERROR
= 4
ILLEGAL_NODE_SELECTION_MODE = 5
FAILED
= 6
ILLEGAL_COLUMN_NAME
= 7.
PERFORM FILL_CATALOG_TREE.
PERFORM BUILD_HIERARCHY_HEADER
CHANGING L_HIERARCHY_HEADER.
CALL METHOD G_ALV_TREE->SET_TABLE_FOR_FIRST_DISPLAY
EXPORTING
IS_HIERARCHY_HEADER = L_HIERARCHY_HEADER
CHANGING
IT_OUTTAB
= T_TREE[]
IT_FIELDCATALOG
= GT_FIELDCAT_TREE.
PERFORM CREATE_HIERARCHY.
ENDFORM.
" INIT_TREE
395
el
objeto
G_ALV_TREE
asignndolo
nuestro
contenedor G_CUSTOM_CONTAINER.
Llammos al FORM FILL_CATALOG_TREE donde llenaremos
el catlogo del ALV.
Llammos al FORM BUILD_HIERARCHY_HEADER, donde
establecemos los detalles de la cabecera.
Llammos al mtodo SET_TABLE_FOR_FIRST_DISPLAY para
llamar al ALV.
Finalmemte llammos al FORM CREATE_HIERARCHY, donde
creamos la estructura del ALV.
*&----------------------------------------------------*
*&
Form
fill_catalog_tree
*&----------------------------------------------------*
FORM FILL_CATALOG_TREE.
DATA: GS_FIELDCAT TYPE LVC_S_FCAT.
CLEAR GS_FIELDCAT.
GS_FIELDCAT-COL_POS
= 1.
GS_FIELDCAT-FIELDNAME = 'NOM_PROG'.
GS_FIELDCAT-SCRTEXT_S = 'Nom. Programa'.
GS_FIELDCAT-TABNAME
= 'T_PROGRAMAS'.
GS_FIELDCAT-OUTPUTLEN = 20.
APPEND GS_FIELDCAT TO GT_FIELDCAT_TREE.
396
CLEAR GS_FIELDCAT.
GS_FIELDCAT-COL_POS
= 2.
GS_FIELDCAT-FIELDNAME = 'ENTORNO'.
GS_FIELDCAT-SCRTEXT_S = 'Entorno'.
GS_FIELDCAT-TABNAME
= 'T_PROGRAMAS'.
GS_FIELDCAT-OUTPUTLEN = 15.
APPEND GS_FIELDCAT TO GT_FIELDCAT_TREE.
ENDFORM.
"fill_catalog_tree
*&----------------------------------------------------*
*
FORM build_hierarchy_header
*&----------------------------------------------------*
FORM BUILD_HIERARCHY_HEADER CHANGING
P_HIERARCHY_HEADER
TYPE TREEV_HHDR.
CLEAR P_HIERARCHY_HEADER.
P_HIERARCHY_HEADER-HEADING = 'Cdigo'(300).
P_HIERARCHY_HEADER-WIDTH = 60.
P_HIERARCHY_HEADER-WIDTH_PIX = ' '.
ENDFORM.
"BUILD_HIERARCHY_HEADER
*&----------------------------------------------------*
*&
Form
create_hierarchy
397
*&----------------------------------------------------*
FORM CREATE_HIERARCHY.
DATA: L_ROOT_KEY TYPE LVC_NKEY,
L_NEXT_KEY TYPE LVC_NKEY,
L_LAST_KEY TYPE LVC_NKEY,
HEADER TYPE STRING,
W_MENGE_TEXT(13) TYPE C.
CLEAR L_ROOT_KEY.
LOOP AT T_HEADER ASSIGNING <FS_HEADER>.
HEADER = <FS_HEADER>-LENGUAJE.
CLEAR L_ROOT_KEY.
CLEAR L_NEXT_KEY.
PERFORM ADD_NODE USING HEADER L_ROOT_KEY
CHANGING L_NEXT_KEY.
LOOP AT T_PROGRAMAS ASSIGNING <FS_PROGRAMAS>
WHERE LENGUAJE EQ <FS_HEADER>-LENGUAJE.
MOVE-CORRESPONDING <FS_PROGRAMAS> TO T_TREE.
PERFORM ADD_LEAF USING T_TREE L_NEXT_KEY
CHANGING L_LAST_KEY.
ENDLOOP.
ENDLOOP.
CALL METHOD G_ALV_TREE->FRONTEND_UPDATE.
ENDFORM.
"CREATE_HIERARCHY
398
vez
que
terminamos
llammos
al
mtodo
*&----------------------------------------------------*
*
FORM ADD_NODE
*&----------------------------------------------------*
FORM ADD_NODE USING L_NAME L_ROOT_KEY
CHANGING L_NEXT_KEY.
DATA: L_NODE_TEXT TYPE LVC_VALUE,
LS_TREE TYPE TY_PROGRAMAS.
L_NODE_TEXT =
L_NAME.
CL_GUI_COLUMN_TREE=>RELAT_LAST_CHILD
I_NODE_TEXT
= L_NODE_TEXT
IS_OUTTAB_LINE
= LS_TREE
IMPORTING
E_NEW_NODE_KEY
= L_NEXT_KEY.
399
ENDFORM.
"ADD_NODE
FORM ADD_LEAF
*&----------------------------------------------------*
FORM ADD_LEAF USING L_TREE TYPE TY_PROGRAMAS
L_NEXT_KEY
CHANGING L_LAST_KEY.
CALL METHOD G_ALV_TREE->ADD_NODE
EXPORTING
I_RELAT_NODE_KEY = L_NEXT_KEY
I_RELATIONSHIP
CL_GUI_COLUMN_TREE=>RELAT_LAST_CHILD
IS_OUTTAB_LINE
= T_TREE
IMPORTING
E_NEW_NODE_KEY
ENDFORM.
= L_LAST_KEY.
"ADD_LEAF
400
*=====================================================*
* DECLARACION DE VARIABLES
*=====================================================*
DATA: OK_CODE TYPE SY-UCOMM,
G_ALV_TREE TYPE REF TO CL_GUI_ALV_TREE,
G_CUSTOM_CONTAINER TYPE REF TO
CL_GUI_CUSTOM_CONTAINER,
L_HIERARCHY_HEADER TYPE TREEV_HHDR,
G_LINE_BEHAVIOUR TYPE REF TO CL_DRAGDROP,
G_FAV_BEHAVIOUR TYPE REF TO CL_DRAGDROP,
L_LAST_KEY TYPE LVC_NKEY,
W_NODE_KEY TYPE LVC_NKEY.
401
*-----------------------------------------------------*
*
*-----------------------------------------------------*
CLASS LCL_DRAGDROPOBJ DEFINITION.
PUBLIC SECTION.
DATA: CPS_PROGRAMAS TYPE TY_PROGRAMAS,
CP_NODE_TEXT TYPE LVC_VALUE,
CP_NODE_KEY TYPE LVC_NKEY.
ENDCLASS.
"LCL_DRAGDROPOBJ DEFINITION
*-----------------------------------------------------*
*
*-----------------------------------------------------*
CLASS LCL_DND_EVENT_RECEIVER DEFINITION.
PUBLIC SECTION.
METHODS:
402
HANDLE_LINE_DRAG
FOR EVENT ON_DRAG
OF CL_GUI_ALV_TREE
IMPORTING SENDER NODE_KEY FIELDNAME
DRAG_DROP_OBJECT,
HANDLE_FAV_DROP
FOR EVENT ON_DROP
OF CL_GUI_ALV_TREE
IMPORTING SENDER NODE_KEY DRAG_DROP_OBJECT.
ENDCLASS.
"lcl_dnd_event_receiver DEFINITION
*-----------------------------------------------------*
*
*-----------------------------------------------------*
CLASS LCL_DND_EVENT_RECEIVER IMPLEMENTATION.
METHOD HANDLE_LINE_DRAG.
DATA: DATAOBJ TYPE REF TO LCL_DRAGDROPOBJ.
CREATE OBJECT DATAOBJ.
DATAOBJ->CP_NODE_KEY = NODE_KEY.
CALL METHOD SENDER->GET_OUTTAB_LINE
EXPORTING
I_NODE_KEY
= NODE_KEY
IMPORTING
E_OUTTAB_LINE = DATAOBJ->CPS_PROGRAMAS
E_NODE_TEXT
= DATAOBJ->CP_NODE_TEXT.
403
DRAG_DROP_OBJECT->OBJECT = DATAOBJ.
ENDMETHOD.
"HANDLE_LINE_DRAG
METHOD HANDLE_FAV_DROP.
DATA: DATAOBJ TYPE REF TO LCL_DRAGDROPOBJ,
L_NEW_KEY TYPE LVC_NKEY.
CATCH SYSTEM-EXCEPTIONS MOVE_CAST_ERROR = 1.
DATAOBJ ?= DRAG_DROP_OBJECT->OBJECT.
W_NODE_KEY = DATAOBJ->CP_NODE_KEY.
PERFORM ADD_LEAF USING DATAOBJ->CPS_PROGRAMAS
NODE_KEY
CHANGING DATAOBJ->CP_NODE_KEY.
CALL METHOD G_ALV_TREE->DELETE_SUBTREE
EXPORTING
I_NODE_KEY = W_NODE_KEY.
CALL METHOD SENDER->FRONTEND_UPDATE.
ENDCATCH.
IF SY-SUBRC <> 0.
CALL METHOD DRAG_DROP_OBJECT->ABORT.
ENDIF.
ENDMETHOD.
ENDCLASS.
"HANDLE_FAV_DROP
"lcl_dnd_event_receiver IMPLEMENTATION
llenamos
las
variables
404
PERFORM DEFINE_DND_BEHAVIOUR.
405
EXPORTING
EVENTS
= LT_EVENTS
EXCEPTIONS
CNTL_ERROR
= 1
CNTL_SYSTEM_ERROR
= 2
ILLEGAL_EVENT_COMBINATION = 3.
CREATE OBJECT L_DND_EVENT_RECEIVER.
SET HANDLER
L_DND_EVENT_RECEIVER->HANDLE_FAV_DROP FOR
G_ALV_TREE.
SET HANDLER
L_DND_EVENT_RECEIVER->HANDLE_LINE_DRAG FOR
G_ALV_TREE.
CALL METHOD G_ALV_TREE->FRONTEND_UPDATE.
tablas
internas
LT_EVENTS,
L_EVENT,
L_DND_EVENT_RECIEVER
los
eventos.
Para
ello,
utilizamos
los
mtodos
GET_REGISTERED_EVENTS
SET_REGISTERED_EVENTS.
y
Adems,
establecemos
los
406
*&----------------------------------------------------*
*
FORM ADD_NODE
*&----------------------------------------------------*
FORM ADD_NODE USING L_NAME L_ROOT_KEY
CHANGING L_NEXT_KEY.
DATA: L_NODE_TEXT TYPE LVC_VALUE,
LS_TREE TYPE TY_PROGRAMAS,
L_LAYOUT_NODE TYPE LVC_S_LAYN,
L_HANDLE_FAVOURITE_FOLDER TYPE I.
CALL METHOD G_FAV_BEHAVIOUR->GET_HANDLE
IMPORTING
HANDLE = L_HANDLE_FAVOURITE_FOLDER.
L_LAYOUT_NODE-DRAGDROPID = L_HANDLE_FAVOURITE_FOLDER.
L_LAYOUT_NODE-ISFOLDER = 'X'.
L_NODE_TEXT =
L_NAME.
CL_GUI_COLUMN_TREE=>RELAT_LAST_CHILD
I_NODE_TEXT
= L_NODE_TEXT
IS_NODE_LAYOUT
= L_LAYOUT_NODE
IS_OUTTAB_LINE
= LS_TREE
IMPORTING
E_NEW_NODE_KEY
= L_NEXT_KEY.
407
ENDFORM.
"ADD_NODE
el
valor
de
L_HANDLE_FAVOURITE_FOLDER
la
hacia
variable
el
campo
*&----------------------------------------------------*
*
FORM ADD_LEAF
*&----------------------------------------------------*
FORM ADD_LEAF USING L_TREE TYPE TY_PROGRAMAS
L_NEXT_KEY
CHANGING L_LAST_KEY.
DATA: L_LAYOUT_NODE TYPE LVC_S_LAYN,
L_HANDLE_LINE TYPE I.
CALL METHOD G_LINE_BEHAVIOUR->GET_HANDLE
IMPORTING
HANDLE = L_HANDLE_LINE.
408
L_LAYOUT_NODE-DRAGDROPID = L_HANDLE_LINE.
CALL METHOD G_ALV_TREE->ADD_NODE
EXPORTING
I_RELAT_NODE_KEY = L_NEXT_KEY
I_RELATIONSHIP
CL_GUI_COLUMN_TREE=>RELAT_LAST_CHILD
IS_OUTTAB_LINE
= L_TREE
IS_NODE_LAYOUT
= L_LAYOUT_NODE
IMPORTING
E_NEW_NODE_KEY
= L_LAST_KEY.
ENDFORM.
"ADD_LEAF
L_LAYOUT_NODE-DRAGDROPID.
Pasamos
el
*&----------------------------------------------------*
*&
Form
DEFINE_DND_BEHAVIOUR
**&---------------------------------------------------*
FORM DEFINE_DND_BEHAVIOUR.
DATA: EFFECT TYPE I.
CREATE OBJECT G_LINE_BEHAVIOUR.
EFFECT = CL_DRAGDROP=>COPY.
CALL METHOD G_LINE_BEHAVIOUR->ADD
409
EXPORTING
FLAVOR
= 'X'
DRAGSRC
= 'X'
"#EC NOTEXT
= EFFECT.
= 'X'
DRAGSRC
= ' '
"#EC NOTEXT
DROPTARGET = 'X'
EFFECT
= EFFECT.
ENDFORM.
Creamos
" DEFINE_DND_BEHAVIOUR
dos
objetos
G_LINE_BEHAVIOUR
410
*=====================================================*
* DECLARACION DE TYPES
*=====================================================*
TYPES: BEGIN OF TY_PROGRAMAS,
ID_PROG TYPE ZVLENGUAJES_PROG-ID_PROG,
LENGUAJE TYPE ZVLENGUAJES_PROG-LENGUAJE,
411
*=====================================================*
DATA: T_PROGRAMAS TYPE STANDARD TABLE OF
TY_PROGRAMAS,
T_TABLE TYPE REF TO CL_SALV_TABLE,
T_FUNCTIONS TYPE REF TO CL_SALV_FUNCTIONS,
T_DSPSET TYPE REF TO CL_SALV_DISPLAY_SETTINGS,
LR_COLUMN TYPE REF TO CL_SALV_COLUMN_TABLE,
LV_SALV_COLUMNS_TABLE TYPE REF TO
CL_SALV_COLUMNS_TABLE.
*=====================================================*
* START-OF-SELECTION
*=====================================================*
START-OF-SELECTION.
PERFORM CARGAR_DATOS.
PERFORM LLAMAR_ALV.
*&----------------------------------------------------*
*&
Form
CARGAR_DATOS
*&----------------------------------------------------*
FORM CARGAR_DATOS.
SELECT ID_PROG LENGUAJE NOM_PROG ENTORNO
INTO TABLE T_PROGRAMAS
FROM ZVLENGUAJES_PROG.
412
ENDFORM.
" CARGAR_DATOS
*&----------------------------------------------------*
*&
Form
LLAMAR_ALV
*&----------------------------------------------------*
FORM LLAMAR_ALV.
TRY.
CL_SALV_TABLE=>FACTORY(
IMPORTING
R_SALV_TABLE
= T_TABLE
CHANGING
T_TABLE
= T_PROGRAMAS ).
CATCH CX_SALV_MSG .
ENDTRY.
LV_SALV_COLUMNS_TABLE = T_TABLE->GET_COLUMNS( ).
LR_COLUMN ?=
LV_SALV_COLUMNS_TABLE->GET_COLUMN( 'ID_PROG' ).
LR_COLUMN->SET_LONG_TEXT( 'Id' ).
LV_SALV_COLUMNS_TABLE = T_TABLE->GET_COLUMNS( ).
LR_COLUMN ?=
LV_SALV_COLUMNS_TABLE->GET_COLUMN( 'NOM_PROG' ).
LR_COLUMN->SET_LONG_TEXT( 'Programa' ).
T_FUNCTIONS = T_TABLE->GET_FUNCTIONS( ).
T_FUNCTIONS->SET_ALL( ABAP_TRUE ).
T_DSPSET = T_TABLE->GET_DISPLAY_SETTINGS( ).
T_DSPSET->SET_LIST_HEADER( 'Programas' ).
413
T_TABLE->DISPLAY( ).
ENDFORM.
" LLAMAR_ALV
*=====================================================*
TYPES: BEGIN OF TY_PROGRAMAS,
ID_PROG TYPE ZVLENGUAJES_PROG-ID_PROG,
LENGUAJE TYPE ZVLENGUAJES_PROG-LENGUAJE,
NOM_PROG TYPE ZVLENGUAJES_PROG-NOM_PROG,
ENTORNO TYPE ZVLENGUAJES_PROG-ENTORNO,
END OF TY_PROGRAMAS.
*=====================================================*
* DECLARACION DE TABLAS INTERNAS
*=====================================================*
DATA: T_PROGRAMAS TYPE STANDARD TABLE OF
TY_PROGRAMAS,
T_TABLE TYPE REF TO CL_SALV_TABLE,
T_FUNCTIONS TYPE REF TO CL_SALV_FUNCTIONS,
T_DSPSET TYPE REF TO CL_SALV_DISPLAY_SETTINGS,
LR_COLUMN TYPE REF TO CL_SALV_COLUMN_TABLE,
LV_SALV_COLUMNS_TABLE TYPE REF TO
CL_SALV_COLUMNS_TABLE.
414
*=====================================================*
* START-OF-SELECTION
*=====================================================*
START-OF-SELECTION.
PERFORM CARGAR_DATOS.
PERFORM LLAMAR_ALV.
*&----------------------------------------------------*
*&
Form
CARGAR_DATOS
*&----------------------------------------------------*
FORM CARGAR_DATOS.
SELECT ID_PROG LENGUAJE NOM_PROG ENTORNO
INTO TABLE T_PROGRAMAS
FROM ZVLENGUAJES_PROG.
415
ENDFORM.
" CARGAR_DATOS
Seleccionamos
todos
los
campos
de
la
vista
ZVLENGUAJES_PROG.
*&----------------------------------------------------*
*&
Form
LLAMAR_ALV
*&----------------------------------------------------*
FORM LLAMAR_ALV.
TRY.
CL_SALV_TABLE=>FACTORY(
IMPORTING
R_SALV_TABLE
= T_TABLE
CHANGING
T_TABLE
= T_PROGRAMAS ).
CATCH CX_SALV_MSG .
ENDTRY.
LV_SALV_COLUMNS_TABLE = T_TABLE->GET_COLUMNS( ).
LR_COLUMN ?=
LV_SALV_COLUMNS_TABLE->GET_COLUMN( 'ID_PROG' ).
LR_COLUMN->SET_LONG_TEXT( 'Id' ).
LV_SALV_COLUMNS_TABLE = T_TABLE->GET_COLUMNS( ).
LR_COLUMN ?=
LV_SALV_COLUMNS_TABLE->GET_COLUMN( 'NOM_PROG' ).
LR_COLUMN->SET_LONG_TEXT( 'Programa' ).
T_FUNCTIONS = T_TABLE->GET_FUNCTIONS( ).
T_FUNCTIONS->SET_ALL( ABAP_TRUE ).
416
T_DSPSET = T_TABLE->GET_DISPLAY_SETTINGS( ).
T_DSPSET->SET_LIST_HEADER( 'Programas' ).
T_TABLE->DISPLAY( ).
ENDFORM.
Llammos
" LLAMAR_ALV
al
mtodo
esttico
FACTORY
de
la
clase
417
418
*-----------------------------------------------------*
*
*-----------------------------------------------------*
CLASS LCL_HANDLE_EVENTS DEFINITION.
PUBLIC SECTION.
METHODS:
ON_DOUBLE_CLICK FOR EVENT DOUBLE_CLICK OF
CL_SALV_EVENTS_TABLE
IMPORTING ROW COLUMN.
ENDCLASS.
"lcl_handle_events DEFINITION
*-----------------------------------------------------*
*
*-----------------------------------------------------*
CLASS LCL_HANDLE_EVENTS IMPLEMENTATION.
METHOD ON_DOUBLE_CLICK.
PERFORM MOSTRAR_DETALLE USING ROW COLUMN.
ENDMETHOD.
"on_double_click
ENDCLASS.
Implementamos
"lcl_handle_events IMPLEMENTATION
el
mtodo
llamado
al
FORM
MOSTRAR_DETALLE.
*=====================================================*
* DECLARACION DE TABLAS INTERNAS
*=====================================================*
DATA: T_PROGRAMAS TYPE STANDARD TABLE OF
TY_PROGRAMAS,
T_TABLE TYPE REF TO CL_SALV_TABLE,
419
*=====================================================*
* DECLARACION DE FIELD-SYMBOLS
*=====================================================*
FIELD-SYMBOLS: <FS_PROGRAMAS> LIKE LINE OF
T_PROGRAMAS.
Declaramos un Field-Symbol.
PERFORM PROCESS_EVENTS.
T_TABLE->DISPLAY( ).
Dentro
de
LLAMAR_ALV,
agregamos
el
FORM
420
*-----------------------------------------------------*
*&
Form
mostrar_detalle
*-----------------------------------------------------*
FORM MOSTRAR_DETALLE USING P_ROW
P_COLUMN.
DATA: MENSAJE TYPE SHKONTEXT-MELDUNG.
IF P_COLUMN EQ 'NOM_PROG'.
READ TABLE T_PROGRAMAS INDEX P_ROW
ASSIGNING <FS_PROGRAMAS>.
CONCATENATE <FS_PROGRAMAS>-ID_PROG
<FS_PROGRAMAS>-NOM_PROG
<FS_PROGRAMAS>-LENGUAJE
<FS_PROGRAMAS>-ENTORNO
INTO MENSAJE SEPARATED BY SPACE.
CALL FUNCTION 'MESSAGE_TEXT_DISPLAY_WITH_PARA'
EXPORTING
TEXT = MENSAJE.
ENDIF.
ENDFORM.
" mostrar_detalle
421
*&----------------------------------------------------*
*&
Form
process_events
*&----------------------------------------------------*
FORM PROCESS_EVENTS.
DATA: LR_EVENTS TYPE REF TO CL_SALV_EVENTS_TABLE.
LR_EVENTS = T_TABLE->GET_EVENT( ).
CREATE OBJECT GR_EVENTS.
SET HANDLER GR_EVENTS->ON_DOUBLE_CLICK FOR LR_EVENTS.
ENDFORM.
" process_events
422
*=====================================================*
* DECLARACION DE TYPES
*=====================================================*
TYPES: BEGIN OF TY_GRAPHIC_TABLE,
LINE(255) TYPE X,
END OF TY_GRAPHIC_TABLE.
*=====================================================*
* DECLARACION DE TABLAS INTERNAS
*=====================================================*
DATA:
*=====================================================*
* DECLARACION DE VARIABLES
*=====================================================*
DATA: OK_CODE TYPE SY-UCOMM,
URL(255) TYPE C,
CONTAINER1 TYPE REF TO CL_GUI_CUSTOM_CONTAINER,
PICTURE TYPE REF TO CL_GUI_PICTURE,
L_BYTECOUNT TYPE I,
L_CONTENT TYPE STANDARD TABLE OF BAPICONTEN
INITIAL SIZE 0,
GRAPHIC_SIZE TYPE I.
423
*=====================================================*
* START-OF-SELECTION
*=====================================================*
START-OF-SELECTION.
CALL SCREEN 0100.
*&----------------------------------------------------*
*&
Module
STATUS_0100
OUTPUT
*&----------------------------------------------------*
MODULE STATUS_0100 OUTPUT.
SET PF-STATUS '100'.
SET TITLEBAR '100'.
PERFORM LOAD_IMAGE.
ENDMODULE.
" STATUS_0100
OUTPUT
*&----------------------------------------------------*
*&
Module
USER_COMMAND_0100
INPUT
*&----------------------------------------------------*
MODULE USER_COMMAND_0100 INPUT.
OK_CODE = SY-UCOMM.
CLEAR SY-UCOMM.
CASE OK_CODE.
WHEN 'BACK' OR 'STOP' OR 'CANCEL'.
SET SCREEN 0.
LEAVE SCREEN.
ENDCASE.
ENDMODULE.
" USER_COMMAND_0100
INPUT
424
*&----------------------------------------------------*
*&
Form
load_image
*&----------------------------------------------------*
FORM LOAD_IMAGE.
CREATE OBJECT: CONTAINER1 EXPORTING CONTAINER_NAME =
'CUSTOM_ALV',
PICTURE EXPORTING PARENT = CONTAINER1.
CALL FUNCTION 'SAPSCRIPT_GET_GRAPHIC_BDS'
EXPORTING
I_OBJECT
= 'GRAPHICS'
I_NAME
= 'ENJOY'
I_ID
= 'BMAP'
I_BTYPE
= 'BCOL'
IMPORTING
E_BYTECOUNT
= L_BYTECOUNT
TABLES
CONTENT
= L_CONTENT
EXCEPTIONS
NOT_FOUND
= 1
BDS_GET_FAILED = 2
BDS_NO_CONTENT = 3
OTHERS
= 4.
= 'BDS'
NEW_FORMAT
= 'BMP'
BITMAP_FILE_BYTECOUNT_IN = L_BYTECOUNT
IMPORTING
BITMAP_FILE_BYTECOUNT
= GRAPHIC_SIZE
425
TABLES
BDS_BITMAP_FILE
= L_CONTENT
BITMAP_FILE
= T_GRAPHIC_TABLE
EXCEPTIONS
OTHERS
= 1.
= 'IMAGE'
SUBTYPE = 'BMP'
TABLES
DATA
= T_GRAPHIC_TABLE
CHANGING
URL
= URL.
" load_image
*=====================================================*
TYPES: BEGIN OF TY_GRAPHIC_TABLE,
LINE(255) TYPE X,
END OF TY_GRAPHIC_TABLE.
426
*=====================================================*
* DECLARACION DE TABLAS INTERNAS
*=====================================================*
DATA:
*=====================================================*
* DECLARACION DE VARIABLES
*=====================================================*
DATA: OK_CODE TYPE SY-UCOMM,
URL(255) TYPE C,
CONTAINER1 TYPE REF TO CL_GUI_CUSTOM_CONTAINER,
PICTURE TYPE REF TO CL_GUI_PICTURE,
L_BYTECOUNT TYPE I,
L_CONTENT TYPE STANDARD TABLE OF BAPICONTEN
INITIAL SIZE 0,
GRAPHIC_SIZE TYPE I.
427
CONTAINER1
contiene
el
nombre
de
nuestro
CUSTOM_CONTROL.
PICTURE objeto que cargar y mostrar la imagen en el Dynpro.
L_BYTECOUNT cuenta el nmero de bytes de la imagen que
queremos visualizar.
L_CONTENT almacena el contenido de la imagen.
GRAPHIC_SIZE es el tamao de la imagen luego de convetirla a
BMP.
*=====================================================*
* START-OF-SELECTION
*=====================================================*
START-OF-SELECTION.
CALL SCREEN 0100.
*&----------------------------------------------------*
*&
Module
STATUS_0100
OUTPUT
*&----------------------------------------------------*
MODULE STATUS_0100 OUTPUT.
SET PF-STATUS '100'.
SET TITLEBAR '100'.
PERFORM LOAD_IMAGE.
ENDMODULE.
" STATUS_0100
OUTPUT
428
*&----------------------------------------------------*
*&
Form
load_image
*&----------------------------------------------------*
FORM LOAD_IMAGE.
CREATE OBJECT: CONTAINER1 EXPORTING
CONTAINER_NAME = 'CUSTOM_ALV',
PICTURE EXPORTING PARENT = CONTAINER1.
CALL FUNCTION 'SAPSCRIPT_GET_GRAPHIC_BDS'
EXPORTING
I_OBJECT
= 'GRAPHICS'
I_NAME
= 'ENJOY'
I_ID
= 'BMAP'
I_BTYPE
= 'BCOL'
IMPORTING
E_BYTECOUNT
= L_BYTECOUNT
TABLES
CONTENT
= L_CONTENT
EXCEPTIONS
NOT_FOUND
= 1
BDS_GET_FAILED = 2
BDS_NO_CONTENT = 3
OTHERS
= 4.
= 'BDS'
NEW_FORMAT
= 'BMP'
429
BITMAP_FILE_BYTECOUNT_IN = L_BYTECOUNT
IMPORTING
BITMAP_FILE_BYTECOUNT
= GRAPHIC_SIZE
TABLES
BDS_BITMAP_FILE
= L_CONTENT
BITMAP_FILE
= T_GRAPHIC_TABLE
EXCEPTIONS
OTHERS
= 1.
= 'IMAGE'
SUBTYPE = 'BMP'
TABLES
DATA
= T_GRAPHIC_TABLE
CHANGING
URL
= URL.
" load_image
430
431
Leer PDFs
Bueno, esto si que no creo que lo lleguen a necesitar alguna
vez...Pero bueno, vale la pena conocerlo.
Este es el cdigo.
*=====================================================*
* DECLARACION DE TABLAS INTERNAS
*=====================================================*
DATA: T_FILETAB TYPE FILETABLE.
*=====================================================*
* DECLARACION DE VARIABLES
*=====================================================*
DATA: OK_CODE TYPE SY-UCOMM,
MY_PDF_VIEWER TYPE REF TO CL_GUI_PDFVIEWER,
CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER,
W_SUBRC TYPE SY-SUBRC,
V_URL TYPE CHAR255.
*=====================================================*
* DECLARACION DE FIELD-SYMBOLS
*=====================================================*
FIELD-SYMBOLS: <FS_FILETAB> LIKE LINE OF T_FILETAB.
*&----------------------------------------------------*
*&
SELECTION-SCREEN
*&----------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK TEST WITH FRAME.
PARAMETERS:
FILE LIKE RLGRAP-FILENAME.
432
*=====================================================*
START-OF-SELECTION.
CALL SCREEN 0100.
*&----------------------------------------------------*
*&
AT SELECTION-SCREEN
*&----------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR FILE.
CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG
EXPORTING
WINDOW_TITLE
= 'Seleccionar archivo'
DEFAULT_FILENAME = '*.pdf'
FILE_FILTER
= '*.pdf'
CHANGING
FILE_TABLE
= T_FILETAB
RC
= W_SUBRC.
433
*&----------------------------------------------------*
*&
Module
STATUS_0100
OUTPUT
*&----------------------------------------------------*
MODULE STATUS_0100 OUTPUT.
SET PF-STATUS '100'.
SET TITLEBAR '100'.
IF CONTAINER IS INITIAL.
CREATE OBJECT CONTAINER
EXPORTING
CONTAINER_NAME = 'CUSTOM_ALV'
EXCEPTIONS
CNTL_ERROR
= 1
OTHERS
= 2.
= CONTAINER
EXCEPTIONS
CNTL_ERROR
= 1
CNTL_SYSTEM_ERROR = 2
OTHERS
= 3.
434
ENDIF.
ENDMODULE.
" STATUS_0100
OUTPUT
*&----------------------------------------------------*
*&
Module
USER_COMMAND_0100
INPUT
*&----------------------------------------------------*
MODULE USER_COMMAND_0100 INPUT.
OK_CODE = SY-UCOMM.
CLEAR SY-UCOMM.
CASE OK_CODE.
WHEN 'BACK' OR 'STOP' OR 'CANCEL'.
SET SCREEN 0.
LEAVE SCREEN.
ENDCASE.
ENDMODULE.
" USER_COMMAND_0100
INPUT
*=====================================================*
* DECLARACION DE TABLAS INTERNAS
*=====================================================*
DATA: T_FILETAB TYPE FILETABLE.
435
*=====================================================*
* DECLARACION DE VARIABLES
*=====================================================*
DATA: OK_CODE TYPE SY-UCOMM,
MY_PDF_VIEWER TYPE REF TO CL_GUI_PDFVIEWER,
CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER,
W_SUBRC TYPE SY-SUBRC,
V_URL TYPE CHAR255.
almacena
el
nombre
de
nuestro
CUSTOM_CONTROL.
W_SUBRC almacena el valor de retorno de llamar al mtodo
FILE_OPEN_DIALOG.
V_URL contiene la ruta donde se encuentra el ALV.
*=====================================================*
* DECLARACION DE FIELD-SYMBOLS
*=====================================================*
FIELD-SYMBOLS: <FS_FILETAB> LIKE LINE OF T_FILETAB.
436
*&----------------------------------------------------*
*&
SELECTION-SCREEN
*&----------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK TEST WITH FRAME.
PARAMETERS:
FILE LIKE RLGRAP-FILENAME.
SELECTION-SCREEN END OF BLOCK TEST.
*=====================================================*
* START-OF-SELECTION
*=====================================================*
START-OF-SELECTION.
CALL SCREEN 0100.
*&----------------------------------------------------*
*&
AT SELECTION-SCREEN
*&----------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR FILE.
CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG
EXPORTING
WINDOW_TITLE
= 'Seleccionar archivo'
DEFAULT_FILENAME = '*.pdf'
437
FILE_FILTER
= '*.pdf'
CHANGING
FILE_TABLE
= T_FILETAB
RC
= W_SUBRC.
*&----------------------------------------------------*
*&
Module
STATUS_0100
OUTPUT
*&----------------------------------------------------*
MODULE STATUS_0100 OUTPUT.
SET PF-STATUS '100'.
SET TITLEBAR '100'.
IF CONTAINER IS INITIAL.
CREATE OBJECT CONTAINER
EXPORTING
CONTAINER_NAME = 'CUSTOM_ALV'
EXCEPTIONS
438
CNTL_ERROR
= 1
OTHERS
= 2.
= CONTAINER
EXCEPTIONS
CNTL_ERROR
= 1
CNTL_SYSTEM_ERROR = 2
OTHERS
= 3.
" STATUS_0100
OUTPUT
439
*=====================================================*
TYPES: T_XLINE(2048) TYPE X.
440
*=====================================================*
* DECLARACION DE TABLAS INTERNAS
*=====================================================*
DATA: DATA_TAB TYPE STANDARD TABLE OF T_XLINE,
T_FILETAB TYPE FILETABLE,
RESULT_TAB TYPE MATCH_RESULT_TAB.
*=====================================================*
* DECLARACION DE VARIABLES
*=====================================================*
DATA: CL_ZIP TYPE REF TO CL_ABAP_ZIP,
SIZE TYPE I,
INPUT_X TYPE XSTRING,
OUTPUT_X TYPE XSTRING,
W_SUBRC TYPE SY-SUBRC,
W_FILE_IN TYPE STRING,
W_FILE_OUT TYPE STRING,
W_SIZE TYPE I,
W_LINE TYPE STRING,
W_EXT(4) TYPE C.
*=====================================================*
* DECLARACION DE FIELD-SYMBOLS
*=====================================================*
FIELD-SYMBOLS: <FS_FILETAB> LIKE LINE OF T_FILETAB,
<FS_RESULT_TAB> LIKE LINE OF RESULT_TAB.
*&----------------------------------------------------*
*&
SELECTION-SCREEN
*&----------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK TEST WITH FRAME.
PARAMETERS:
FILE_IN LIKE RLGRAP-FILENAME,
441
*=====================================================*
START-OF-SELECTION.
FIND ALL OCCURRENCES OF '\' IN W_FILE_IN
RESULTS RESULT_TAB.
DESCRIBE TABLE RESULT_TAB LINES W_SIZE.
READ TABLE RESULT_TAB INDEX W_SIZE
ASSIGNING <FS_RESULT_TAB>.
W_SIZE = STRLEN( W_FILE_IN )
<FS_RESULT_TAB>-OFFSET.
<FS_RESULT_TAB>-OFFSET = <FS_RESULT_TAB>-OFFSET +
<FS_RESULT_TAB>-LENGTH.
W_SIZE
= W_SIZE - <FS_RESULT_TAB>-LENGTH.
W_LINE = W_FILE_IN+<FS_RESULT_TAB>-OFFSET(W_SIZE).
CALL METHOD CL_GUI_FRONTEND_SERVICES=>GUI_UPLOAD
EXPORTING
FILENAME
= W_FILE_IN
FILETYPE
= 'BIN'
IMPORTING
FILELENGTH = SIZE
CHANGING
DATA_TAB
= DATA_TAB.
442
= INPUT_X
TABLES
BINARY_TAB
= DATA_TAB.
IF CL_ZIP IS INITIAL.
CREATE OBJECT CL_ZIP.
ENDIF.
CALL METHOD CL_ZIP->ADD
EXPORTING
NAME
= W_LINE
CONTENT = INPUT_X.
CALL METHOD CL_ZIP->SAVE
RECEIVING
ZIP = OUTPUT_X.
REFRESH DATA_TAB.
CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
EXPORTING
BUFFER
= OUTPUT_X
IMPORTING
OUTPUT_LENGTH = SIZE
TABLES
BINARY_TAB
= DATA_TAB.
443
= W_FILE_OUT
FILETYPE
= 'BIN'
CHANGING
DATA_TAB
= DATA_TAB.
*&----------------------------------------------------*
*&
AT SELECTION-SCREEN
*&----------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR FILE_IN.
CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG
EXPORTING
WINDOW_TITLE
= 'Seleccionar archivo'
DEFAULT_FILENAME = '*.*'
FILE_FILTER
= '*.*'
CHANGING
FILE_TABLE
= T_FILETAB
RC
= W_SUBRC.
444
REFRESH T_FILETAB.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR FILE_OUT.
CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG
EXPORTING
WINDOW_TITLE
= 'Seleccionar archivo'
DEFAULT_FILENAME = '*.zip'
FILE_FILTER
= '*.zip'
CHANGING
FILE_TABLE
= T_FILETAB
RC
= W_SUBRC.
445
*=====================================================*
* DECLARACION DE TYPES
*=====================================================*
TYPES: T_XLINE(2048) TYPE X.
*=====================================================*
* DECLARACION DE TABLAS INTERNAS
*=====================================================*
DATA: DATA_TAB TYPE STANDARD TABLE OF T_XLINE,
T_FILETAB TYPE FILETABLE,
RESULT_TAB TYPE MATCH_RESULT_TAB.
los
archivos
finalmente
RESULT_TAB
de
tipo
*=====================================================*
* DECLARACION DE VARIABLES
*=====================================================*
DATA: CL_ZIP TYPE REF TO CL_ABAP_ZIP,
SIZE TYPE I,
INPUT_X TYPE XSTRING,
OUTPUT_X TYPE XSTRING,
446
*=====================================================*
* DECLARACION DE FIELD-SYMBOLS
*=====================================================*
447
*&----------------------------------------------------*
*&
SELECTION-SCREEN
*&----------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK TEST WITH FRAME.
PARAMETERS:
FILE_IN LIKE RLGRAP-FILENAME,
FILE_OUT LIKE RLGRAP-FILENAME.
SELECTION-SCREEN END OF BLOCK TEST.
*=====================================================*
* START-OF-SELECTION
*=====================================================*
START-OF-SELECTION.
FIND ALL OCCURRENCES OF '\' IN W_FILE_IN
RESULTS RESULT_TAB.
DESCRIBE TABLE RESULT_TAB LINES W_SIZE.
READ TABLE RESULT_TAB INDEX W_SIZE
ASSIGNING <FS_RESULT_TAB>.
448
= W_SIZE - <FS_RESULT_TAB>-LENGTH.
W_LINE = W_FILE_IN+<FS_RESULT_TAB>-OFFSET(W_SIZE).
CALL METHOD CL_GUI_FRONTEND_SERVICES=>GUI_UPLOAD
EXPORTING
FILENAME
= W_FILE_IN
FILETYPE
= 'BIN'
IMPORTING
FILELENGTH = SIZE
CHANGING
DATA_TAB
= DATA_TAB.
= INPUT_X
TABLES
BINARY_TAB
= DATA_TAB.
IF CL_ZIP IS INITIAL.
CREATE OBJECT CL_ZIP.
ENDIF.
CALL METHOD CL_ZIP->ADD
EXPORTING
NAME
= W_LINE
CONTENT = INPUT_X.
449
= OUTPUT_X
IMPORTING
OUTPUT_LENGTH = SIZE
TABLES
BINARY_TAB
= DATA_TAB.
= W_FILE_OUT
FILETYPE
= 'BIN'
CHANGING
DATA_TAB
= DATA_TAB.
450
*&----------------------------------------------------*
*&
AT SELECTION-SCREEN
*&----------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR FILE_IN.
CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG
EXPORTING
WINDOW_TITLE
= 'Seleccionar archivo'
451
DEFAULT_FILENAME = '*.*'
FILE_FILTER
= '*.*'
CHANGING
FILE_TABLE
= T_FILETAB
RC
= W_SUBRC.
Llamamos
al
mtodo
FILE_OPEN_DIALOG
para
poder
452
*=====================================================*
* DECLARACION DE CONSTANTES
*=====================================================*
CONSTANTS: LINE_LENGTH TYPE I VALUE 254.
*=====================================================*
* DECLARACION DE VARIABLES
*=====================================================*
DATA: OK_CODE TYPE SY-UCOMM,
CUSTOM_CONTAINER TYPE REF TO
CL_GUI_CUSTOM_CONTAINER,
TEXT_EDITOR TYPE REF TO CL_GUI_TEXTEDIT.
*=====================================================*
* START-OF-SELECTION
*=====================================================*
START-OF-SELECTION.
CALL SCREEN 0100.
453
*&----------------------------------------------------*
*&
Module
STATUS_0100
OUTPUT
*&----------------------------------------------------*
MODULE STATUS_0100 OUTPUT.
SET PF-STATUS '100'.
SET TITLEBAR '100'.
PERFORM CALL_EDITOR.
ENDMODULE.
" STATUS_0100
OUTPUT
*&----------------------------------------------------*
*&
Module
USER_COMMAND_0100
INPUT
*&----------------------------------------------------*
MODULE USER_COMMAND_0100 INPUT.
OK_CODE = SY-UCOMM.
CLEAR SY-UCOMM.
CASE OK_CODE.
WHEN 'BACK' OR 'STOP' OR 'CANCEL'.
SET SCREEN 0.
LEAVE SCREEN.
ENDCASE.
ENDMODULE.
" USER_COMMAND_0100
INPUT
454
*&----------------------------------------------------*
*&
Form
CALL_EDITOR
*&----------------------------------------------------*
FORM CALL_EDITOR .
IF TEXT_EDITOR IS INITIAL.
CREATE OBJECT CUSTOM_CONTAINER
EXPORTING
CONTAINER_NAME
= 'CUSTOM_ALV'
EXCEPTIONS
CNTL_ERROR
= 1
CNTL_SYSTEM_ERROR
= 2
CREATE_ERROR
= 3
LIFETIME_ERROR
= 4
LIFETIME_DYNPRO_DYNPRO_LINK = 5.
CREATE OBJECT TEXT_EDITOR
EXPORTING
WORDWRAP_MODE
CL_GUI_TEXTEDIT=>WORDWRAP_AT_FIXED_POSITION
WORDWRAP_POSITION
= LINE_LENGTH
WORDWRAP_TO_LINEBREAK_MODE =
CL_GUI_TEXTEDIT=>TRUE
PARENT
= CUSTOM_CONTAINER
EXCEPTIONS
ERROR_CNTL_CREATE
= 1
ERROR_CNTL_INIT
= 2
ERROR_CNTL_LINK
= 3
ERROR_DP_CREATE
= 4
GUI_TYPE_NOT_SUPPORTED
= 5
OTHERS
= 6.
ENDIF.
455
" CALL_EDITOR
*=====================================================*
* DECLARACION DE CONSTANTES
*=====================================================*
CONSTANTS: LINE_LENGTH TYPE I VALUE 254.
*=====================================================*
* DECLARACION DE VARIABLES
*=====================================================*
DATA: OK_CODE TYPE SY-UCOMM,
CUSTOM_CONTAINER TYPE REF TO
CL_GUI_CUSTOM_CONTAINER,
TEXT_EDITOR TYPE REF TO CL_GUI_TEXTEDIT.
456
*=====================================================*
* START-OF-SELECTION
*=====================================================*
START-OF-SELECTION.
CALL SCREEN 0100.
*&----------------------------------------------------*
*&
Module
STATUS_0100
OUTPUT
*&----------------------------------------------------*
MODULE STATUS_0100 OUTPUT.
SET PF-STATUS '100'.
SET TITLEBAR '100'.
PERFORM CALL_EDITOR.
ENDMODULE.
" STATUS_0100
OUTPUT
*&----------------------------------------------------*
*&
Form
CALL_EDITOR
*&----------------------------------------------------*
FORM CALL_EDITOR .
IF TEXT_EDITOR IS INITIAL.
CREATE OBJECT CUSTOM_CONTAINER
457
EXPORTING
CONTAINER_NAME
= 'CUSTOM_ALV'
EXCEPTIONS
CNTL_ERROR
= 1
CNTL_SYSTEM_ERROR
= 2
CREATE_ERROR
= 3
LIFETIME_ERROR
= 4
LIFETIME_DYNPRO_DYNPRO_LINK = 5.
CREATE OBJECT TEXT_EDITOR
EXPORTING
WORDWRAP_MODE
CL_GUI_TEXTEDIT=>WORDWRAP_AT_FIXED_POSITION
WORDWRAP_POSITION
= LINE_LENGTH
WORDWRAP_TO_LINEBREAK_MODE =
CL_GUI_TEXTEDIT=>TRUE
PARENT
= CUSTOM_CONTAINER
EXCEPTIONS
ERROR_CNTL_CREATE
= 1
ERROR_CNTL_INIT
= 2
ERROR_CNTL_LINK
= 3
ERROR_DP_CREATE
= 4
GUI_TYPE_NOT_SUPPORTED
= 5
OTHERS
= 6.
ENDIF.
CALL METHOD CL_GUI_CFW=>FLUSH.
ENDFORM.
Creamos
" CALL_EDITOR
el
contenedor
para
el
control
de
texto
Como podemos ver, contamos con dos botones Load Local File
(Cargar archivo local)
archivo local)
459
WebDynpro
Introduccin
El WebDynpro es la nueva forma de desarrollar aplicaciones en
NetWeaver, esto es porque est completamente orientado a web y
respeta el modelo MVC (Model View Controller Modelo Vista
Controlador).
Aunque el Dynpro no est an muy difundido, es una herramienta muy
potente y bastante sencilla de usar.
460
461
Creamos una vista, donde van a estar los componentes que muestran
la informacin.
Para esto, hacemos un clic derecho sobre ZDUMMY_DYPRO y
seleccionamos Create View (Crear Vista).
462
463
464
465
466
467
Seleccionamos
Create
Container
Form
(Crear
formulario
contenedor).
contenedor.
468
469
470
471
crear
una
WebDynpro
Application
(Aplicacin
WebDynpro).
472
presionamos F8.
El navegador nos muestra una pantalla de login, as que debemos
logearnos. Para esto, presionamos el botn Log On
473
474
475
476
477
478
METHOD ONACTIONSHOW.
DATA: NODE_LENG TYPE REF TO IF_WD_CONTEXT_NODE,
ITAB_LENG TYPE STANDARD TABLE OF
ZVLENGUAJES_PROG.
DATA: ID_PROG TYPE STRING.
WD_CONTEXT->GET_ATTRIBUTE(
exporting NAME = 'ID_PROG'
importing VALUE = ID_PROG ).
SELECT ID_PROG NOM_PROG LENGUAJE ENTORNO
INTO TABLE ITAB_LENG
FROM ZVLENGUAJES_PROG
WHERE ID_PROG EQ ID_PROG.
NODE_LENG =
479
WD_CONTEXT->GET_ATTRIBUTE(
exporting NAME = 'ID_PROG'
importing VALUE = ID_PROG ).
NODE_LENG =
WD_CONTEXT->GET_CHILD_NODE( NAME = 'ZLENG_NODE' ).
NODE_LENG->BIND_TABLE( ITAB_LENG ).
480
method WDDOINIT.
DATA: NODE_LENG TYPE REF TO IF_WD_CONTEXT_NODE,
ITAB_LENG TYPE STANDARD TABLE OF
ZVLENGUAJES_PROG.
APPEND INITIAL LINE TO ITAB_LENG.
NODE_LENG =
WD_CONTEXT->GET_CHILD_NODE( NAME = 'ZLENG_NODE' ).
NODE_LENG->BIND_TABLE( ITAB_LENG ).
endmethod.
481
483
484
485
METHOD ONACTIONSHOW.
DATA: NODE_LENG TYPE REF TO IF_WD_CONTEXT_NODE,
ITAB_LENG TYPE STANDARD TABLE OF
ZVLENGUAJES_PROG.
DATA: ID_PROG_INI TYPE STRING,
ID_PROG_FIN TYPE STRING.
DATA: ID_PROG TYPE RANGE OF ZVLENGUAJES_PROG-ID_PROG.
FIELD-SYMBOLS: <FS_IDPROG> LIKE LINE OF ID_PROG.
NODE_LENG = WD_CONTEXT->GET_CHILD_NODE(
NAME = 'PARAMETROS' ).
486
WD_CONTEXT->GET_ATTRIBUTE(
EXPORTING NAME = 'ID_PROG_INI'
IMPORTING VALUE = ID_PROG_INI ).
WD_CONTEXT->GET_ATTRIBUTE(
EXPORTING NAME = 'ID_PROG_FIN'
IMPORTING VALUE = ID_PROG_FIN ).
APPEND INITIAL LINE TO ID_PROG
ASSIGNING <FS_IDPROG>.
<FS_IDPROG>-SIGN = 'I'.
<FS_IDPROG>-OPTION = 'BT'.
<FS_IDPROG>-LOW = ID_PROG_INI.
<FS_IDPROG>-HIGH = ID_PROG_FIN.
SELECT ID_PROG NOM_PROG LENGUAJE ENTORNO
INTO TABLE ITAB_LENG
FROM ZVLENGUAJES_PROG
WHERE ID_PROG IN ID_PROG.
NODE_LENG =
WD_CONTEXT->GET_CHILD_NODE( NAME = 'ZLENG_NODE' ).
NODE_LENG->BIND_TABLE( ITAB_LENG ).
ENDMETHOD.
487
NODE_LENG = WD_CONTEXT->GET_CHILD_NODE(
NAME = 'PARAMETROS' ).
Asignamos
el
nodo
PARAMETROS
nuestra
variable
NODE_LENG.
NODE_LENG->GET_ATTRIBUTE(
EXPORTING NAME = 'ID_PROG_INI'
IMPORTING VALUE = ID_PROG_INI ).
NODE_LENG->GET_ATTRIBUTE(
EXPORTING NAME = 'ID_PROG_FIN'
IMPORTING VALUE = ID_PROG_FIN ).
488
<FS_IDPROG>-LOW = ID_PROG_INI.
<FS_IDPROG>-HIGH = ID_PROG_FIN.
489
490
BSP
Introduccin
El BSP (Business Server Pages Pgina del Servidor de
Aplicaciones), viene a ser un lenguaje script basado en ABAP, es
decir, una especio de ASP, JSP o PHP.
El BSP es anterior al WebDynpro, aunque esto no quiere decir que
sea obsoleto o menos completo, por el contrario, lo que no se puede
hacer con WebDynpro, se hace con BSP.
491
492
Como podemos ver esta pgina, nos es ms que HTML con un par
de caractersticas adicionales.
onInputProcessing(show) Evento llamado cuando se ejecuta una
accin de procesamiento de datos. En este caso, show representa a
nuestro FORM.
navigation->set_parameter( ID_PROG ) Indica que estamos
estableciendo el campo ID_PROG como un parmetro de salida de
nuestra pgina.
Creamos una nueva pgina.
493
494
<tr>
<td><%= <fs_leng>-ID_PROG %></td>
<td><%= <fs_leng>-NOM_PROG %></td>
<td><%= <fs_leng>-LENGUAJE %></td>
<td><%= <fs_leng>-ENTORNO %></td>
</tr>
<%
endloop.
%>
</table>
</body>
</html>
de
Eventos)
escogemos
del
men
OnInputProcessing.
495
CASE EVENT_ID.
WHEN 'show'.
NAVIGATION->SET_PARAMETER('ID_PROG').
NAVIGATION->NEXT_PAGE('SHOW_DATA').
ENDCASE.
496
o presionando F8.
497
498
la
pestaa
Event
Handler
al
evento
OnInputProcessing.
499
CASE EVENT_ID.
WHEN 'show'.
NAVIGATION->SET_PARAMETER('ID_PROG_INI').
NAVIGATION->SET_PARAMETER('ID_PROG_FIN').
NAVIGATION->NEXT_PAGE('SHOW_DATA').
ENDCASE.
W_ID_PROG_INI.
<fs_r_leng>-HIGH = W_ID_PROG_FIN.
500
501
502
ABAP y XML
El XML (Extensible Markup Language Lenguaje extensible de
marcas) es un formato de intercambio de archivos muy utilizado en
al actualidad, puesto que es sumamente flexible.
Como era de esperarse, el ABAP nos permite trabajar con archivos
XML de una manera bastante simple.
*=====================================================*
* DECLARACION DE TYPES
*=====================================================*
TYPES: BEGIN OF TY_TAB,
LINE(100) TYPE C,
END OF TY_TAB.
*=====================================================*
* DECLARACION DE TABLAS INTERNAS
*=====================================================*
DATA: T_TAB TYPE STANDARD TABLE OF TY_TAB,
T_ZLENG TYPE STANDARD TABLE OF
ZVLENGUAJES_PROG,
T_FILETAB TYPE FILETABLE.
*=====================================================*
* DECLARACION DE FIELD-SYMBOLS
*=====================================================*
FIELD-SYMBOLS: <FS_FILETAB> LIKE LINE OF T_FILETAB.
503
*=====================================================*
* DECLARACION DE VARIABLES
*=====================================================*
DATA: XML_OUT TYPE STRING,
W_SUBRC TYPE SY-SUBRC,
SIZE TYPE I,
W_FILE TYPE STRING.
*&----------------------------------------------------*
*&
SELECTION-SCREEN
*&----------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK TEST WITH FRAME.
PARAMETERS:
FILE LIKE RLGRAP-FILENAME.
SELECTION-SCREEN END OF BLOCK TEST.
*=====================================================*
* START-OF-SELECTION
*=====================================================*
START-OF-SELECTION.
PERFORM OBTENER_DATOS.
PERFORM GENERAR_XML.
PERFORM DESCARGAR_XML.
*&----------------------------------------------------*
*&
AT SELECTION-SCREEN
*&----------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR FILE.
CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG
EXPORTING
WINDOW_TITLE
= 'Seleccionar archivo'
DEFAULT_FILENAME = '*.xml'
504
FILE_FILTER
= '*.xml'
CHANGING
FILE_TABLE
= T_FILETAB
RC
= W_SUBRC.
Form
OBTENER_DATOS
*&----------------------------------------------------*
FORM OBTENER_DATOS.
SELECT ID_PROG NOM_PROG LENGUAJE ENTORNO
INTO TABLE T_ZLENG
FROM ZVLENGUAJES_PROG.
ENDFORM.
" OBTENER_DATOS
*&----------------------------------------------------*
*&
Form
GENERAR_XML
*&----------------------------------------------------*
FORM GENERAR_XML.
CALL TRANSFORMATION ('ID')
505
" GENERAR_XML
*&----------------------------------------------------*
*&
Form
DESCARGAR_XML
*&----------------------------------------------------*
FORM DESCARGAR_XML.
CALL FUNCTION 'SWA_STRING_TO_TABLE'
EXPORTING
CHARACTER_STRING = XML_OUT
IMPORTING
CHARACTER_TABLE
= T_TAB.
= W_FILE
FILETYPE
= 'BIN'
CHANGING
DATA_TAB
= T_TAB.
ENDFORM.
" DESCARGAR_XML
506
*=====================================================*
* DECLARACION DE TYPES
*=====================================================*
TYPES: BEGIN OF TY_TAB,
LINE(100) TYPE C,
END OF TY_TAB.
*=====================================================*
* DECLARACION DE TABLAS INTERNAS
*=====================================================*
DATA: T_TAB TYPE STANDARD TABLE OF TY_TAB,
T_ZLENG TYPE STANDARD TABLE OF
ZVLENGUAJES_PROG,
T_FILETAB TYPE FILETABLE.
Creamos algunas tablas internas, una para guardar el XML, otra para
guardar los datos de la Base de Datos y el ltimo para guardar la ruta
del archivo de salida.
*=====================================================*
* DECLARACION DE FIELD-SYMBOLS
*=====================================================*
FIELD-SYMBOLS: <FS_FILETAB> LIKE LINE OF T_FILETAB.
Declaramos un field-symbol.
507
*=====================================================*
* DECLARACION DE VARIABLES
*=====================================================*
DATA: XML_OUT TYPE STRING,
W_SUBRC TYPE SY-SUBRC,
SIZE TYPE I,
W_FILE TYPE STRING.
*&----------------------------------------------------*
*&
SELECTION-SCREEN
*&----------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK TEST WITH FRAME.
PARAMETERS:
FILE LIKE RLGRAP-FILENAME.
SELECTION-SCREEN END OF BLOCK TEST.
*=====================================================*
* START-OF-SELECTION
*=====================================================*
START-OF-SELECTION.
PERFORM OBTENER_DATOS.
PERFORM GENERAR_XML.
PERFORM DESCARGAR_XML.
508
*&----------------------------------------------------*
*&
AT SELECTION-SCREEN
*&----------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR FILE.
CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG
EXPORTING
WINDOW_TITLE
= 'Seleccionar archivo'
DEFAULT_FILENAME = '*.xml'
FILE_FILTER
= '*.xml'
CHANGING
FILE_TABLE
= T_FILETAB
RC
= W_SUBRC.
509
*&----------------------------------------------------*
*&
Form
OBTENER_DATOS
*&----------------------------------------------------*
FORM OBTENER_DATOS.
SELECT ID_PROG NOM_PROG LENGUAJE ENTORNO
INTO TABLE T_ZLENG
FROM ZVLENGUAJES_PROG.
ENDFORM.
" OBTENER_DATOS
*&----------------------------------------------------*
*&
Form
GENERAR_XML
*&----------------------------------------------------*
FORM GENERAR_XML.
CALL TRANSFORMATION ('ID')
SOURCE TAB = T_ZLENG[]
RESULT XML XML_OUT.
ENDFORM.
" GENERAR_XML
510
*&----------------------------------------------------*
*&
Form
DESCARGAR_XML
*&----------------------------------------------------*
FORM DESCARGAR_XML.
CALL FUNCTION 'SWA_STRING_TO_TABLE'
EXPORTING
CHARACTER_STRING = XML_OUT
IMPORTING
CHARACTER_TABLE
= T_TAB.
= W_FILE
FILETYPE
= 'BIN'
CHANGING
DATA_TAB
ENDFORM.
= T_TAB.
" DESCARGAR_XML
511
*=====================================================*
* DECLARACION DE TYPES
*=====================================================*
TYPES: BEGIN OF TY_TAB,
LINE(100) TYPE C,
END OF TY_TAB.
512
*=====================================================*
* DECLARACION DE TABLAS INTERNAS
*=====================================================*
DATA: T_TAB TYPE STANDARD TABLE OF TY_TAB,
T_ZLENG TYPE STANDARD TABLE OF
ZVLENGUAJES_PROG,
T_FILETAB TYPE FILETABLE.
*=====================================================*
* DECLARACION DE FIELD-SYMBOLS
*=====================================================*
FIELD-SYMBOLS: <FS_FILETAB> LIKE LINE OF T_FILETAB,
<FS_ZLENG> LIKE LINE OF T_ZLENG.
*=====================================================*
* DECLARACION DE VARIABLES
*=====================================================*
DATA: XML_OUT TYPE STRING,
W_SUBRC TYPE SY-SUBRC,
SIZE TYPE I,
W_FILE TYPE STRING.
*&----------------------------------------------------*
*&
SELECTION-SCREEN
*&----------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK TEST WITH FRAME.
PARAMETERS:
FILE LIKE RLGRAP-FILENAME.
SELECTION-SCREEN END OF BLOCK TEST.
513
*=====================================================*
* START-OF-SELECTION
*=====================================================*
START-OF-SELECTION.
PERFORM CARGAR_XML.
PERFORM GENERAR_TABLA_INTERNA.
PERFORM IMPRIMIR.
*&----------------------------------------------------*
*&
AT SELECTION-SCREEN
*&----------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR FILE.
CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG
EXPORTING
WINDOW_TITLE
= 'Seleccionar archivo'
DEFAULT_FILENAME = '*.xml'
FILE_FILTER
= '*.xml'
CHANGING
FILE_TABLE
= T_FILETAB
RC
= W_SUBRC.
514
*&----------------------------------------------------*
*&
Form
GENERAR_TABLA_INTERNA
*&----------------------------------------------------*
FORM GENERAR_TABLA_INTERNA.
CALL TRANSFORMATION ('ID')
SOURCE XML XML_OUT
RESULT TAB = T_ZLENG[].
ENDFORM.
" GENERAR_TABLA_INTERNA
*&----------------------------------------------------*
*&
Form
CARGAR_XML
*&----------------------------------------------------*
FORM CARGAR_XML.
CALL METHOD CL_GUI_FRONTEND_SERVICES=>GUI_UPLOAD
EXPORTING
FILENAME
= W_FILE
FILETYPE
= 'BIN'
CHANGING
DATA_TAB
= T_TAB.
= T_TAB
IMPORTING
CHARACTER_STRING = XML_OUT.
ENDFORM.
" CARGAR_XML
515
*&----------------------------------------------------*
*&
Form
IMPRIMIR
*&----------------------------------------------------*
FORM IMPRIMIR.
LOOP AT T_ZLENG
ASSIGNING <FS_ZLENG>.
WRITE:/ <FS_ZLENG>-ID_PROG, <FS_ZLENG>-NOM_PROG,
<FS_ZLENG>-LENGUAJE, <FS_ZLENG>-ENTORNO.
ENDLOOP.
ENDFORM.
" IMPRIMIR
*=====================================================*
* START-OF-SELECTION
*=====================================================*
START-OF-SELECTION.
PERFORM CARGAR_XML.
PERFORM GENERAR_TABLA_INTERNA.
PERFORM IMPRIMIR.
516
*&----------------------------------------------------*
*&
Form
CARGAR_XML
*&----------------------------------------------------*
FORM CARGAR_XML.
CALL METHOD CL_GUI_FRONTEND_SERVICES=>GUI_UPLOAD
EXPORTING
FILENAME
= W_FILE
FILETYPE
= 'BIN'
CHANGING
DATA_TAB
= T_TAB.
= T_TAB
IMPORTING
CHARACTER_STRING = XML_OUT.
ENDFORM.
" CARGAR_XML
517
*&----------------------------------------------------*
*&
Form
GENERAR_TABLA_INTERNA
*&----------------------------------------------------*
FORM GENERAR_TABLA_INTERNA.
CALL TRANSFORMATION ('ID')
SOURCE XML XML_OUT
RESULT TAB = T_ZLENG[].
ENDFORM.
" GENERAR_TABLA_INTERNA
*&----------------------------------------------------*
*&
Form
IMPRIMIR
*&----------------------------------------------------*
FORM IMPRIMIR.
LOOP AT T_ZLENG
ASSIGNING <FS_ZLENG>.
WRITE:/ <FS_ZLENG>-ID_PROG, <FS_ZLENG>-NOM_PROG,
<FS_ZLENG>-LENGUAJE, <FS_ZLENG>-ENTORNO.
ENDLOOP.
ENDFORM.
" IMPRIMIR
518
519
Scripting in a Box
Scripting in a Box es una herramienta creada por Craig Cmehil de
SAP AG.
Esta herramienta basada en Eclipse, reune a todos los lenguajes script
que pueden conectados con NetWeaver, como PHP, Ruby, Rails,
Perl y Python. De muy sencilla instalacin, esta herramienta es
indispensable para el trabajo con lenguajes script.
La instalacin es lo mejor de todo, puesto que no existe una
instalacin, al igual que el Eclipse, el Scripting in a Box
simplementese descarga y se configura.
Como era de suponerse, cuenta adems con varios ejemplos
(Incluyendo mi emulador de SE16 en PHP), lo cual lo hace excelente
para aquellas personas que nunca han hecho una integracin con
NetWeaver.
Para descargarlo, debemos ingresar a la siguiente direccin (Debemos
ser usuarios del SDN SAP Developer Network).
https://www.sdn.sap.com/irj/sdn/go/portal/prtroot/docs/library/uuid/e5
0bd86e-0a01-0010-53bd-857585234a6a
O, ingresar a http://sdn.sap.com Downloads More Downloadable
Tools for Developers Scripting in a Box.
Veamos algunas imagenes de Scripting a in Box.
520
521
522
SAPLink
SAPLink es una herramienta creada por Daniel McWeeney y Ed
Herrmann de Colgate - Palmolive.
Esta herramienta, desarrollada en ABAP, nos permite crear una
verdadera librera de cdigos para poder transportar o compartir con
los dems. Creando paquetes basados en cdigo XML, podemos
almacenar Programas, Dynpros, WebDynpros, SmartForms y un
largo etctera.
Si bien existen muchas herramientas para descargar y cargar elementos
de NetWeaver (Yo he creado varias de ellas), no hay hasta el
momento ninguna que pueda competir con SAPLink, puesto que
SAPLink nos brinda una interfaz muy sencilla, opcin de descargar
Plug-Ins y un constante monitoreo de los posibles errores.
Podemos descargarla, debemos ingresar a la siguiente direccin.
http://code.google.com/p/saplink/
Y para los Plug-Ins, deberemos ingresar a la direccin.
http://code.google.com/p/saplink/wiki/pluginList
Veamos algunas cuantas imgenes.
523
524
525
526
Integracin PHP-NetWeaver
Introduccin
El PHP (PHP Preprocessor), es un lenguaje de programacin para
pginas web dinmicas. Lleva varios aos en el mercado, es open
source y en su versin 5 en adelante, es un lenguaje orientado a
objetos.
Su sintaxis es bastante similar a la de C++, por lo cual, conociendo
C++ o Java, es muy fcil de aprender.
Gracias a Eduard Koucky, existe un conector llamado SAPRFC, que
nos permite que las pginas web que desarrollemos en PHP, se
conecten con NetWeaver, para obtener datos de tablas, ejecutar
funciones, BAPIs, etc. Es decir, hacer lo mismo que hacemos todos
los das, pero accediendo a travs de una interface web.
Si se preguntan porque utilizar PHP con NetWeaver, en vez de
utilizar WebDynpro o BSP, la respuesta es muy simple: PHP es
gratuito, fcil de aprender y configurar. En todo caso, ya depende de
cada uno que tecnologa utilizar.
Lo nico que necesitamos para poder integrar PHP con NetWeaver es
lo siguiente (Si no hemos instalado Scripting in a Box claro est):
Instalando el SAPRFC
Simplemente debemos descomprimir el archivo .ZIP y copiar el
archivo php_saprfc.dll, dentro de la carpeta /ext del PHP.
En el PHP.ini debemos agregar la siguiente lnea.
extension = php_saprfc.dll;
comprobar
que
todo
est
funcionando
correctamente,
<?php
phpinfo();
?>
528
<?php
Class Login
{
var $Login, $rfc;
function Login_Page()
{
PRINT("<DIV ALIGN='CENTER'><BR><BR><BR><BR><H1>PHP & SAP
- SE16 Emulator</H1>");
PRINT("<BR><TABLE BORDER='1' BORDERCOLOR='BLUE'
BGCOLOR='WHITE'>");
PRINT("<FORM ACTION='index.php' METHOD='POST'>");
PRINT("<TR><TD>Server</TD><TD><INPUT TYPE='TEXT'
NAME='Server'></TD></TR>");
PRINT("<TR><TD>System Number</TD><TD><INPUT TYPE='TEXT'
NAME='Sysnum' SIZE='3'></TD></TR>");
PRINT("<TR><TD>Client</TD><TD><INPUT TYPE='TEXT'
529
NAME='Client' SIZE='3'></TD></TR>");
PRINT("<TR><TD>User</TD><TD><INPUT TYPE='TEXT'
NAME='User'></TD></TR>");
PRINT("<TR><TD>Password</TD><TD><INPUT TYPE='PASSWORD'
NAME='Pass'></TD></TR>");
PRINT("<TR><TD COLSPAN='2' ALIGN='CENTER'><INPUT
TYPE='SUBMIT' value='Log In' NAME='LOG_IN'>");
PRINT("<INPUT TYPE='RESET' value='Clear'></TD></TR>");
PRINT("</FORM>");
PRINT("<TABLE>");
PRINT("</DIV>");
}
function Log_In($Server,$Sysnum,$Client,$User,$Pass)
{
$this->Login = array ("ASHOST"=>$Server,
"SYSNR"=>$Sysnum,
"CLIENT"=>$Client,
"USER"=>$User,
"PASSWD"=>$Pass,
"CODEPAGE"=>"1404");
return $this->Login;
}
function RFC_Connection($Login)
{
$this->rfc = saprfc_open($Login);
IF ( !$this->rfc )
{
ECHO "The connection fails with the following
530
error:".saprfc_error();
EXIT;
}
else
{
return $this->rfc;
}
}
}
?>
<?php
Class SE16
{
var $fce;
531
function Show_Table($Table,$RFC_Me)
{
$this->fce = saprfc_function_discover($RFC_Me,
"RFC_READ_TABLE");
IF (! $this->fce )
{
ECHO "The function module had failed.";
EXIT;
}
$Table = STRTOUPPER($Table);
saprfc_import ($this->fce,"QUERY_TABLE",$Table);
saprfc_import ($this->fce,"DELIMITER","/");
saprfc_table_init ($this->fce,"OPTIONS");
saprfc_table_init ($this->fce,"FIELDS");
saprfc_table_init ($this->fce,"DATA");
$rfc_rc = "";
$rfc_rc = saprfc_call_and_receive ($this->fce);
if ($rfc_rc != SAPRFC_OK)
{
if ($rfc == SAPRFC_EXCEPTION )
echo ("Exception raised: ".saprfc_exception
($this->fce));
else
echo ("Call error: ".saprfc_error
($this->fce));
exit;
}
532
533
$fce = saprfc_function_discover($rfc,RFC_READ_TABLE);
534
saprfc_table_init($fce,OPTIONS);
$rc = saprfc_call_and_recieve($fce);
$data_row = saprfc_table_rows($fce,DATA);
$DATA = saprfc_table_read($fce,DATA,$i);
echo($DATA[WA].\n);
saprfc_function_free($fce);
saprfc_close($fce);
<?php
session_start();
include("Login_Class.php");
?>
<html>
<head>
<title>SE16 Simulation</title>
<style>
body {background: #F5F9FF;text-align: center;}
#login {background: #E5EAF6;border: 1px solid
#C7D3EA;}
</style>
</head>
<body>
<?php
if(isset($_POST['LOG_IN']) || (isset($_POST['Table'])))
536
{
if(!isset($_SESSION["Server"]))
{
$_SESSION["Server"] = $_POST["Server"];
$_SESSION["Sysnum"] = $_POST["Sysnum"];
$_SESSION["Client"] = $_POST["Client"];
$_SESSION["User"] = $_POST["User"];
$_SESSION["Pass"] = $_POST["Pass"];
}
$Login = new Login();
$Log_Me =
$Login->Log_In
($_SESSION["Server"],$_SESSION["Sysnum"],
$_SESSION["Client"],
$_SESSION["User"],$_SESSION["Pass"]);
$RFC_Me = $Login->RFC_Connection($Log_Me);
ECHO "<CENTER>";
PRINT("<FORM ACTION='Operation.php' METHOD='POST'>");
PRINT("<INPUT TYPE='TEXT' NAME='Table'><BR>");
PRINT("<INPUT TYPE='SUBMIT' value='Show Table'
NAME='Show_Table'> ");
PRINT("</FORM>");
ECHO "<A HREF='index.php'>Log Out</A>";
ECHO "</CENTER>";
}
else
{
$_SESSION = array();
session_destroy();
537
<?php
session_start();
include("Login_Class.php");
include("SE16.php");
?>
<html>
<head>
<title>SE16 Simulation</title>
<style>
body {background: #F5F9FF;text-align: left;}
#login {background: #E5EAF6;border: 1px solid
#C7D3EA;}
</style>
</head>
<body>
538
<?php
$Login = new Login();
$Log_Me =
$Login-
>Log_In($_SESSION["Server"],$_SESSION["Sysnum"],
$_SESSION["Client"],
$_SESSION["User"],$_SESSION["Pass"]);
$RFC_Me = $Login->RFC_Connection($Log_Me);
$SE16 = new SE16();
if(isset($_POST['Table']))
{
$Table = $_POST['Table'];
$SE16->Show_Table($Table,$RFC_Me);
}
?>
</body>
</html>
539
540
Integracin Ruby-NetWeaver
Introduccin
Ruby es un lenguaje de programacin japons, creado hace ms de 11
aos por Yukihiro Matz Matsumoto.
Ruby es un lenguaje de fcil aprendizaje, totalmente orientado a
objetos y que hereda las caractersticas ms importantes de Perl y
Python...Y como dice Matz, agrega todo lo que falta a esos dos
lenguajes.
Como no poda ser de otra forma, existe un conector para Ruby con
NetWeaver, llamado SAP::Rfc creado por el genial Piers Harding.
Lo nico que necesitamos para poder integrar Ruby con NetWeaver
es lo siguiente.
SAPRFC-0.19-mswin32.gem
http://www.piersharding.com/download/ruby/saprfc-0.19mswin32.gem
SAPRFC.so.win32
http://www.piersharding.com/download/ruby/saprfc.so.wi
n32
541
Instalando el SAP::Rfc
Simplemente debemos hacer un GEM INSTALL SAPRFC-0.19mswin32.gem y listo.
Para comprobar la instalacin basta con hacer un GEM LIST para
obtener la lista.
solamente 63
542
require 'rubygems'
gem 'saprfc'
require "SAP/Rfc"
print "Host: "
$Host = gets
print "System Number: "
$Sysnr = gets
print "Client: "
$Client = gets
print "User: "
$User = gets
print "Password: "
$Password = gets
rfc = SAP::Rfc.new(:ashost => $Host.chop!,
:sysnr
=> $Sysnr.chop!.to_i,
:lang
=> "EN",
=> $User.chop!,
=> 1)
543
$Table = gets
print "\n"
itab.query_table.value = $Table.chop!
itab.delimiter.value = "|"
# do the RFC call
rfc.call(itab)
$Fields = Array.new
$Data = Array.new
$Data_Fields = Array.new
$Data_Split = Array.new
itab.fields.hashRows {|field| $Fields.push(field) }
$Fields_Len = $Fields.length
itab.data.hashRows {|field| $Data.push(
field.to_s.strip!) }
$Data_Len = $Data.length
for i in 0...$Data_Len
$Data_Fields = $Data[i]
$Data_Split = $Data_Fields.split("|")
for i in 1...$Fields_Len
print $Data_Split[i].to_s.strip, "|"
end
print "\n\n"
end
print "\nclose connection: ", rfc.close(), "\n"
print "Exit"
544
require rubygems
gem saprfc
require SAP/Rfc
Llamamos a la librera de SAP::Rfc y especificamos que queremos
utilizar el GEM.
itab = rfc.discover("RFC_READ_TABLE")
itab.query_table.value = $Table.chop!
itab.delimiter.value = "|"
545
rfc.call(itab)
for i in 0...$Data_Len
$Data_Fields = $Data[i]
$Data_Split = $Data_Fields.split("|")
for i in 1...$Fields_Len
print $Data_Split[i].to_s.strip, "|"
end
print "\n\n"
end
546
547
548
Bibliografa y agradecimientos
549
550
Enlaces Web
Para terminar, quiero agregar algunos enlaces web que pienso que
pueden ser bastante tiles.
SAP http://www.sap.com
551