Você está na página 1de 19

Smartform a 3 Niveles - parte 1

Despus de mucho tiempo de haber abandonado este ejemplo, por fin puedo ponerlo a la luz.

Bsicamente lo que se espera es lo siguiente:

(Agrande la imagen dando click en ella)




Como soy el tpico hincha peruano que otra vez se qued sin mundial pero fiel al castigo vivo al
pendiente de mi interesante pero venido a menos futbol local, el ejemplo se basa desarrollar un
reporte que muestre como cabecera (primer nivel) los datos del campeonato nacional, un detalle
de los clubes que lo componen (segundo nivel) y los jugadores que componen su plantilla (tercer
nivel).

Bueno, como hacemos esto? Hay algunas maneras. Por mi parte mostrar la que se me a dado
bien en los pocos casos que he visto de esto (uno ms y este ejemplo jeje).


PASO 1 - OBTENER_DATA:

Por una cuestin de simplicidad, he hecho el ejemplo en el mismo smartform sin crear y utilizar un
programa Z aparte para el llamado del mismo, esto quiere decir que he utilizado las definiciones
globales para mis variables, estructuras y tablas.

Me d el trabajo de llenar el campeonato, los 16 clubes del 2013 y algunos nombres de jugadores a
la manera del comercial de la seleccin: "Soy hincha, y no me compadezcas... ni trates de
entender una insana, porque donde habita la pasin, no hay lugar para nada ms..."
En fin a las imgenes me remito:




A explicar:
En el primer cuadro se declaranlas variables, constantes, estructuras o tablas que vamos a
utilizar.
En el segundo cuadro, vamos a colocar los tipos para nuestras estructuras y tablas, y aqu si voy
a indicar que, las estructuras y tablas tienen declaraciones de tipos diferentes. La declaracin
normal y tpica para las estructuras y; como si estuviesemos creando una tabla interna excepto que
en vez de DATA colocamos TYPES, es la declaracin para los tipos de tabla.

*ESTRUCTURAS{
types: begin of y_cab,
cabid type belnr_d,
anio(4) type n,
pais type ttet_descrip30,
titulo type txdim,
descri type cts_description,
equips type i,
campnac type cts_description,
subcamp type cts_description,
terpsto type cts_description,
end of y_cab.
*}

*TABLAS{
types: gty_cab type standard table of y_cab.
*}

En el tercer cuadro, la parte del initialization, hacemos las llamadas a las rutinas que van a llenar
nuestras tablas de campeonatos, equipos y jugadores.
En el cuarto cuadro, creamos las rutinas y tambin una lgica que nos permita mostrar a los
jugadores segn el formato que observamos en la primera pantalla.

Veamos de manera general que datos nos pide el ejemplo:

CAMPEONATOS:
st_cab-cabid = '2013PER001'.
st_cab-anio = '2013'.
st_cab-pais = 'Per'.
st_cab-titulo = 'Copa Movistar 2013'.
st_cab-descri = 'Campeonato descentralizado de futbol Peruano.'.
st_cab-equips = '16'.
st_cab-campnac = 'Alianza Lima'.
st_cab-subcamp = 'Universitario'.
st_cab-terpsto = 'Real Garcilazo'.
append st_cab to ti_cab.

EQUIPOS:
st_det1-det1id = '2013EQP001'.
st_det1-cabid = '2013PER001'.
st_det1-club = 'Alianza Lima'.
st_det1-ciudad = 'Lima'.
st_det1-entren = 'Francisco Pizarro'.
st_det1-estadi = 'Alejandro Villanueva'.
append st_det1 to ti_det1.

JUGADORES:
st_det2-det2id = '2013JUG001'.
st_det2-det1id = '2013EQP001'.
st_det2-cabid = '2013PER001'.
st_det2-numero = '1'.
st_det2-posic = 'POR'.
st_det2-nombre = 'George Forsyth'.
append st_det2 to ti_det2.

Las rutinas son simples: Agarramos la estructura, le pasamos datos y aadimos los datos a la tabla
correspondiente, nada que resaltar aqu.

Ahora, el ejemplo nos pide que en una fila podamos mostrar a 3 jugadores, por tanto el recorrido
que hagamos a la tabla para mostrar de esa manera a los jugadores no va a ser la forma comn,
tenemos que acondicionar los datos primero.

Para esto, se ha creado una rutina adicional y una tabla adicional donde se va a tener la data de tal
forma que al imprimirse en el smartform nos de el formato que buscamos. Deben haber de seguro
otras mejores formas de hacerlo, pero yo me decanto por esta ya que la he utilizado en mis
proyectos y
POR QUE ES LA NICA QUE S




Bueno directo al grano:

form formato_det2 using st_det2 type y_det2
ti_det2 type gty_det2
changing st_detout type y_detout
ti_detout type gty_detout.

Se utilizan la estructura y tabla de los jugadores enviadas desde el initialization, y llenamos en fin
la tabla TI_DETOUT que es la que al final se tiene que mostrar en el smartform. Esta tabla a tener
los campos siguientes:

det1id type belnr_d,"Cdigo de Equipo
cabid type belnr_d,"Cdigo de Campeonato

num1(2) type n, "Nmero de camiseta
pos1(20) type c, "Posicin dentro del campo
nom1(30) type c, "Nombre del jugador

num2(2) type n, "Nmero de camiseta
pos2(20) type c, "Posicin dentro del campo
nom2(30) type c, "Nombre del jugador

num3(2) type n, "Nmero de camiseta
pos3(20) type c, "Posicin dentro del campo
nom3(30) type c, "Nombre del jugador

Como se puede observar, esta tabla tiene la forma para que en una fila se ingresen 3 jugadores.



data: lv_ord type i."Tenemos una variable local que nos va a servir para
agrupar de 3 en 3 las filas.

sort ti_det2 by det1id cabid posic numero."Ordenamos por cdigo de equipo y
cdigo de campeonato. En la tabla TI_DET2, DET1ID tiene que ser el
primero (incluso primero que el cdigo de campeonato y jugador) ya que
esto nos podr permitir realizar los quiebres dentro del bucle
correctamente.

loop at ti_det2 into st_det2."Hacemos el bucle

lv_ord = lv_ord + 1."aadimos al contador 1

"En esta parte simplemente condicionamos que cuando el contador sea 1, 2
o 3, enve al jugador dentro de la fila a la columna correspondiente.
Cuando el contador llegue a 3, entonces le haga un append a la tabla,
agregando esos 3 jugadores en una sola fila. Inicializamos el contador y
limpiamos la estructura de la tabla.
if lv_ord eq 1.
st_detout-det1id = st_det2-det1id.
st_detout-cabid = st_det2-cabid.
st_detout-num1 = st_det2-numero.
st_detout-pos1 = st_det2-posic.
st_detout-nom1 = st_det2-nombre.
elseif lv_ord eq 2.
st_detout-num2 = st_det2-numero.
st_detout-pos2 = st_det2-posic.
st_detout-nom2 = st_det2-nombre.
elseif lv_ord eq 3.
st_detout-num3 = st_det2-numero.
st_detout-pos3 = st_det2-posic.
st_detout-nom3 = st_det2-nombre.
append st_detout to ti_detout.
clear: lv_ord, st_detout.
endif.

at end of det1id."Se ingresa cuando es el ltimo cdigo de equipo que se ha
venido repitiendo. Al ingresar valida si no ha hecho un append
anteriormente (ST_DETOUT no es vaco) para hacer el append e inicializar
el contador. Esto es en el caso de que sea el ultimo jugador del equipo
pero que no sea el tercero de la columna en la fila.
if st_detout is not initial.
append st_detout to ti_detout.
clear: lv_ord, st_detout.
endif.
endat.

endloop.

endform.




Aqu tenemos a 2 diferentes equipos: 2013EQP001 (3 jugadores), 2013EQP006 (4 jugadores),
2013EQP009 (1 jugador) y 2013EQP011 (2 jugadores).


Al final la tabla que nos arrojara sera:


De esta ltima tabla deducimos:

Inicio del bucle{
Lnea 1:
Ingresa a la condicin LV_ORD = 3 para hacer append e inicializar el contador.
Ingresa a la ruptura pero no cumple la condicin por que el append ya se hizo.

Lnea 2:
Ingresa a la condicin LV_ORD = 3 para hacer append e inicializar el contador.
NO ingresa a la ruptura pues no es el ltimo cdigo de equipo que se repite.
Lnea 3:
NO ingresa a la condicin LV_ORD = 3, sino a la 1.
Ingresa a la ruptura y cumple condicin haciendo el append e inicializando el contador.

Lnea 4:
NO ingresa a la condicin LV_ORD = 3, sino a la 1.
Ingresa a la ruptura y cumple condicin haciendo el append e inicializando el contador.

Lnea 5:
NO ingresa a la condicin LV_ORD = 3, sino a las 1 y 2.
Ingresa a la ruptura despues de ingresar a la condicin 2 y cumple la condicin haciendo el append
e inicializando el contador.

}Fin del bucle.

Hasta aqu aunque no hemos visto nada de la estructura interna del smartform, tenemos cubierta la
parte de la data que debe mostrarse y como debe mostrarse.

Bueno, hagamos pase a la segunda parte.
Quizs tambin le interese:
Impresin de varios Smartforms en un SPOOL
Funcion VIEW_MAINTENANCE_CALL
Funcin READ_TEXT
Linkwithin

Smartform a 3 Niveles - parte 2
Bueno, con la parte de la obtensin de los datos cubierta, ahora entramos de lleno a la estructura
del smartform en si.

NOTA: Quiero resaltar que para este taller se toma en cuenta los conocimientos bsicos en cuanto
a esta herramienta (el smartform), y que para una completa ejecucin, se recomienda que se cree
un programa con el cual pueda hacer la llamada al smartform dentro de un bucle que recorra una
tabla interna de campeonatos. Revisar el Taller: Impresin de varios Smartforms en un SPOOL.

Tambin por aqu podemos ir a la primera parte.

Pues bien veamos de manera general con qu y cmo est formado nuestro ejemplo:




Como ya sabemos, la parte de parametrizaciones globales no lo tocamos porque ya lo hicimos
(Definiciones globales, el resto no se toc).

PGINAS Y VENTANAS:
En definicin podemos decir que uno puede crear dentro de un smartform cuantos formatos de
pginas se necesite, en este ejemplo solo estamos necesitando un solo formato con el cual vamos
a mostrar toda la informacin de los distintos campeonatos que se ingresen.

Pgina PG_PRINCIPAL:
Esta pgina consta de 2 ventanas:
Se toma en cuenta que esta pagina es de tamao A4 (DINA4) de modo apaisado (horizontal).
Esto se define en la misma carpeta (dando doble click), pestaa opciones de salida, seleccionando
el radiobutton de Formato apaisado. Ms de esto no he configurado para la pgina.


Las dimenciones de una pgina A4:
Apaisado
29.70 CM de Ancho.
21.00 CM de Largo.

El margen general que se desea es:
Superior e Inferior: 1.00 CM
Izquierdo y Derecho: 1.35 CM

Ahora las dimensiones de las ventanas:
CABECERA: 27.00 CM Ancho; 9.00 CM Largo.
MAIN: 27.00 CM Ancho; 11.50 CM Largo.

Cabe resaltar que estamos utilizando una imagen a manera de logo para el ejemplo, que tiene
como dimensiones:
LOGO
Nombre CP22A
Objeto GRAPHICS
Id BMAP
Trama BCOL
Resol 100 DPI
2.13 CM Ancho.
1.52 CM Largo.
Este logo respeta las margenes establecidas.

Como ya hemos establecido de manera general las dimenciones del documento, veamos el
contenido de las ventanas, dejando de lado un poco las medidas internas ya que al final podrn
descargar el ejemplo el cual van a poder instalarlo a manera de prueba en cualquier servidor que
necesiten.


Ventana CABECERA:
Esta ventana es una ventana Auxiliar, dicho sea de paso es una ventana esttica que facilita
mostrar datos tipo cabecera o pie de pgina o cualquier dato que se necesite repetir en caso de
que la ventana MAIN llene toda su longitud (en el largo) y genere una nueva pgina.

Al contenido de esta ventana se le ha puesto dentro de una carpeta llamada CAMPEONATOS, el
cual sirve slo a manera de orden y descripcin.

Dentro de la carpeta, vamos a observar 3 mscaras de edicin:
La primera que va a ser la encargada de mostrar los datos principales de los campeonatos, la
segunda que va a generar las lneas de espacio que va a existir entren la cabecera y el detalle, y la
tercera que va a ser el rtulo de los detalles. En este caso, la cabecera son los datos del
campeonato, el espacio son 2 lneas de separacin y el rtulo es la cabecera de la tabla para los
equipos.




CAB_CAMP:



Para este caso ya que la distribucin de la grilla en la cual vamos a presentar la cabecera tiene
columnas iguales para todas sus filas, entonces creamos una linea dibujandole las columnas en la
mscara de edicin para que dentro de detalles, en los campos: "De" y "A" coloquemos cuantas
lneas se van a replicar (en el ejemplo 4 lneas). Tambin para los casos donde las lneas tienen
columnas diferentes aun de diferentes tamaos, lo recomendable es crear cada lnea segn la
necesidad.

Se ha agrupado por carpetas las columnas que van a contener los textos (tanto los estticos como
los dinmicos). Se hace mencin que la primera columna de la mscara no se usa y esta vaca
para que haya espacio para la imgen
Creo que vale mencionar tambin que la manera de colocar los textos en determinadas celdas se
realiza de la siguiente manera:


Ya que nuestra lnea de cabecera tiene 4 lneas replicadas con sus respectivas columnas, en el
texto tenemos que indicar la coordenada de la celda a la que va a ir a parar el texto; en este caso
este texto va a ir en la columna 2 de la primera lnea (la que se encuentra arriba).

De esta manera para todos los textos, se irn indicando sus respectivas posiciones en la mscara
de edicin que corresponde a la cabecera.



ESPACIO1:
Esta mscara de edicin funciona como lneas vacas para dar espacio entre los elementos que
queremos mostrar en la pgina. Tiene 4 lneas y en una de ellas se encuentra un prrafo.




TABLA_CAB_DET1:
Esta mscara es la encargada de ser la cabecera de nuestra tabla de detalle (donde se han de
mostrar los equipos), se coloca en la ventana CABECERA ya que la idea del reporte es que cada
pagina que se genere, se haga por que el equipo en su respectiva pgina llen su sub-detalle (que
viene a ser su plantel). Se toma en cuenta que lo que se va a repetir en todo caso seria el
campeonato.


Para terminar esta parte vale decir que las dimenciones necesarias para estas ltimas mscaras
pueden ser referenciadas en base a la primera (CAB_CAMP) ya que se busca en el ejemplo que
entre mcaras pueda existir una simetra, por lo menos en el ancho.

Vamos a la tercera parte.

lunes, 11 de noviembre de 2013
Smartform a 3 Niveles - parte 3
ltima parte del tutorial, donde desarrollaremos la ventana que nos permite mostrar el detalle, el
sub-detalle y el salto de pgina.

Pueden ver las 2 partes anteriores por aqu:
Primera parte.
Segunda parte.

Ventana MAIN:
Esta es una ventana tipo principal. Tiene como caractersticas importantes la impresin de datos de
manera dinmica (bucles) y los saltos de pgina. En esta ventana por lo general se muestran los
detalles de la cabecera dejando el reporte a 2 Niveles (cabecera y detalle); pero en nuestro
ejemplo, le hemos aadido un sub nivel ms, ya que alguna vez tuve la oportunidad de modficar un
smartforma como este a 3 Niveles.



Podemos observar que tenemos 2 carpetas, EQUIPOS y JUGADORES. Dentro de ellas tambin
tenemos 2 bucles respectivos, que a fin de cuentas es lo k vamos a tratar, ya que lo de las
mscaras ser solo un vistazo pues el procedimiento es el mismo que las anteriores mscaras.



Bucle DET1:
Como la carpeta nos seala, este bucle va a manejar la tabla interna referente a los equipos, los
cuales en la primera parte del tutorial ya hemos visto de que manera obtenemos estos datos.

El bucle trabaja con la tabla interna y la estructura de la siguiente manera:


Bsicamente, lo que estamos haciendo aqu es colocar la tabla interna GTD_DET1 utilizando la
estructura GWA_DET1 en donde va a recorrer todos los registros que tengan como condicin que
el campo CABID sea igual al CABID que viene de la cabecera (GWA_DET1-CABID = GWA_CAB-
CABID). As solo recorrer los equipos correspondientes al cdigo de campeonato enviado.

De momento este es un bucle muy simple (sin campos calculados para la sumarizacin, conteo,
quiebres AT NEW, END, etc ...) pero eso ser motivo de otro ejemplo.

Luego viene lo ya conocido, como mostrar los datos del bucle:

TABLA_DET_DET1: Muestra una lnea de datos del equipo de la estructura del bucle.



Solo para recordar: Para agregar una variable, campo de estructura o field-symbol, recordemos
que es de la siguiente forma:

No olvidar que la variable, campo de estructura o field-symbol, est entre 2 ampersand.

ESPACIO2: Muestra una lnea de espacio.




TABLA_CAB_DET2: Muestra la cabecera de la tabla del sub-detalle (el mismo principio de la
mscara TABLA_CAB_DET1). sta por una cuestin de orden y ayuda visual est dentro de una
carpeta llamada JUGADORES.


Solo para recordar: Me parece siempre una buena opcin ordenar los textos y dems objetos
dentro de carpetas que digan ms o menos que es lo que contiene, a manera de referencia. Cmo
podemos observar en este caso, que la cabecera esttica para el sub-detalle va a tener 3 grupos
de columnas iguales (Nmero, posicin y Nombres).

Recordemos tambin que para crear un bucle es tan simple como hacer esto:



Bucle DETOUT:
Esta es la ltima rueda del coche. Con este bucle vamos a mostrar los datos del plantel, es decir
datos de los jugadores que pertenecen a sus respectivos clubes, que en fin de cuentas pertenecen
a sus respectivos campeonatos. Las formas, las mismas que ya hemos trabajado. Dmosle un
vistazo:


La tabla utilizada es GTD_DETOUT, la estructura GWA_DETOUT y las condiciones son:
GWA_DETOUT-CABID = GWA_CAB-CABID >> Cdigo de Campeonato
GWA_DETOUT-DETID = GWA_DET1-DETID >> Cdigo de Equipo

Con estas condiciones aseguramos que el plantel se muestre segn su equipo correspondiente.

Lo que tenemos que sealar, es que para este ejemplo, la cantidad de jugadores nunca generan
por si solos el salto de pgina (a no ser que ingreses mas de 100 jugadores cosa que no se da en
un equipo de futbol); por tanto, la manera que tenemos que hacer para generarlo es utilizando un
comando dentro del bucle que haga el salto por cada equipo (el equipo tampoco genera salto de
pgina por si solo).



Comando SALTO_POR_EQUIPO:
Este comando es el encargado de manipular el salto de pgina segn nos convenga. De esta
manera se crea el comando:


Aqu lo que se necesita tener en cuenta es que este comando se coloca debajo de las mcaras de
edicin que estn dentro del bucle de equipos, ya que el salto de pgina lo queremos por equipo.


Adicionalmente, se puede destacar que este salto de pgina no solo se podra hacer con la misma
pgina, sino con otra que estuviese creada.

Con esto, el resultado sera el siguiente:




Bueno hemos llegado al final, cualquier consulta o comentario no olviden escribirnos.
Saludos y xitos.

Você também pode gostar