viernes, 6 de marzo de 2015

Expresión SQL para simplificar selección de datos

Utilización de IN en predicado Where

Utilizar IN puede facilitar la creación de selecciones complejas en sentencias SQL. Conocemos la forma básica de utilizar este operando que permite verificar que el valor un campo está entre alguno de n valores.

Por ejemplo, la instrucción siguiente que selecciona los datos asociados a algunos de los países que se indican se podría escribir como:

Select
 *
from
 Usuarios
Where Pais=ES' or Pais='PT' or Pais='FR'

Pero utilizando IN se podría también escribir como:

Select
 *
from
 Usuarios
Where Pais in ('ES', 'PT', 'FR')

Comparándolas;


  • Semanticamente son iguales, el resultado es el mismo
  • Sintacticamente parece mucho mejor la segunda sentencia que la primera
    • Más sencilla
    • Más legible
    • Menos escritura




Además se puede ampliar las posibilidades de IN de la siguiente forma para simplificar la selección de datos

Si tenemos la siguiente sentencia SQL con alguna complicación en la definición del predicado Where mezclando bastantes condiciones and y or para los mismos campos

SELECT 
 * 
FROM 
 Usuarios
WHERE 
 (Pais='ES' and Dpto=1) or
 (Pais='FR' and Dpto=2) or 
 (Pais='PT' and Dpto=3)


Se puede simplificar utilizando IN de la siguiente manera ya que se puede incorporar más de un campo para la claúsula

SELECT 
 * 
FROM 
 Usuarios 
WHERE 
 (Pais, Dpto) in 
 (values('ES', 1), ('FR', 2), ('PT', 3))  

lunes, 26 de enero de 2015

Lenguaje Binder.

En la entrada "Lenguaje Binder. Características y estrategias" anterior os presenté las características generales y estrategias en la creación de programas de servicio y el sentido de la signature. 
Ahora en esta entradas os explicaré los comandos del lenguaje binder. 

El código fuente binder se almacena en un miembro de un archivo de fuentes y el tipo de fuente es BND. En este fuente se almacenan las exportaciones de componentes que se incluirán en el programa de servicio cuando se compile. Este archivo no se compila; se utiliza en la creación del programa de servicio.


Creación de un programa de servicio

A la hora de crear un programa de servicio y en relación con las exportaciones que se incluirán en un programa de servicio existen dos posibilidades en el comando de creación (CRTSRVPGM):
  • Indicarle el miembro fuente donde está la definición de exportaciones a través del binder
Exportar . . . . . . . . . . . . EXPORT         *SRCFILE    
Exportar archivo fuente  . . . . SRCFILE        ArchivoFuente    
  Biblioteca . . . . . . . . . .                  Biblioteca
Exportar miembro fuente  . . . . SRCMBR         Miembro   
  • Indicarle que no existe miembro fuente y que recoja todas las exportaciones que están indicadas en el módulo o módulos que se van a enlazar en el programa de servicio.
Exportar . . . . . . . . . . . . EXPORT         *ALL_____    
Exportar archivo fuente  . . . . SRCFILE        ________    
  Biblioteca . . . . . . . . . .                  _________
Exportar miembro fuente  . . . . SRCMBR         ________



Personalmente utilizo la primera para poder tener control sobre las diferentes signatures que tenga y permita un programa de servicio. 


Binder. Definición de componentes exportables

Para facilitar la comprensión vamos a exponer un ejemplo sobre el que posteriormente crearemos el fuente Binder. Supongamos que tenemos un módulo que vamos a enlazar en un programa de servicio y en ese modulo tenemos tres componentes exportables (calcPrecio, calcDescuento, calcImpuesto) y un componente interno no exportable (convMoneda)

En el miembro Binder pondremos los componentes exportables de TODOS los módulos que compondrán el programa de servicio. Sobre el ejemplo anterior el miembro contendrá:

/*  Comentarios                                               */
/*                                                            */
          STRPGMEXP  PGMLVL(*CURRENT) LVLCHK(*YES)              
             EXPORT     SYMBOL(calcPrecio)                    
             EXPORT     SYMBOL(calcDescuento)                    
             EXPORT     SYMBOL(calcImpuesto)                    

          ENDPGMEXP                                             

Entre STRPGMEXP y ENDPGMEXP se podrán todos los componentes exportables bajo el código EXPORT.

STRPGMEXP tiene dos parametros. El primero (PGMLVL) lo veremos a continuación y el segundo LVLCHK(*YES) le indica al programa de servicio que cuando un ejecutable utilice este programa de servicio compruebe la Signature del programa de servicio con la que tiene almacenada el programa ejecutable y que se tomó en el momento de compilación. Esto sirve para que el SO entienda que no hay problema en utilizar el programa de servicio por el programa ejecutable que lo intenta utilizar.
Con /* */ podremos poner los comentarios que queramos.

Imaginemos que al compilar el programa de servicio SRVPGM1 con este binder, se genera una signature X1. 
Posteriormente se compilar dos programas PGM1 y PGM2 que se enlazan con ese programa de servicio por lo que en la definición de esos dos programas podremos comprobar que se enlazaron con la signature X1 del programa de servicio.


Binder. Añadir un nuevo componente

Aquí vamos a mostrar como añadir nuevos componentes SIN tener que recompilar todos los programas que ya están enlazados con el programa de servicio.

Supongamos que ahora en el módulo hemos añadido un componente exportable más (calcMargen). Tendremos que modificar el miembro binder y compilar el programa de servicio PERO lo que deseamos es que no tengamos que volver a compilar todos los programas que ya estaban utilizando ese programa de servicio. 
Eso lo facilita las signatures y el lenguaje Binder. Lo haremos de las siguiente forma:


          STRPGMEXP  PGMLVL(*CURRENT) LVLCHK(*YES)              
             EXPORT     SYMBOL(calcPrecio)                    
             EXPORT     SYMBOL(calcDescuento)                    
             EXPORT     SYMBOL(calcImpuesto)                    
             EXPORT     SYMBOL(calcMargen)                    

          ENDPGMEXP   

          STRPGMEXP  PGMLVL(*PRV) LVLCHK(*YES)              
             EXPORT     SYMBOL(calcPrecio)                    
             EXPORT     SYMBOL(calcDescuento)                    
             EXPORT     SYMBOL(calcImpuesto)                    

          ENDPGMEXP   

Sobre el contenido del miembro binder anterior hemos añadido un nuevo grupo de entradas y hemos modificado la entrada anterior poniendo *PRV. Este parámetro se refiere únicamente a que es una versión anterior (puede haber tantas como versiones haya tenido el programa de servicio) y *CURRENT identifica la versión actual.

En las lineas antiguas cambiaremos *CURRENT por *PRV y crearemos un nuevo conjunto con la expresión *CURRENT y que contenga todos los componentes anteriores más los que hayamos añadido nuevos (calcMargen). Es necesario que los nuevos componentes se añadan al final para que no haya que recompilar todos los programas que enlazaron la versión anterior del programa de servicio.

Siguiendo con el ejemplo, al compilar el programa de servicio SRVPGM1 tendremos que tiene la signature X2 y X1 (la anterior).
Los programas antiguos PGM1 y PGM2 que tenían la signature X1 siguen funcionando correctamente sin tener que volver a compilarlo.
Ahora se compila un nuevo programa PGM3 y en este caso al enlazarlo al programa de servicio, recogerá la signature X2 del programa de servicio.  
Y todos los programas funcionan perfectamente!!!!!


Es la gran ventaja de los programas de servicio. Podremos añadir funcionalidades nuevas (y hacer determinados cambios) que hacen que todos los programas que los utilizan no haya que recompilarlo... (lógicamente teniendo un poquito de cuidado con el orden de componente exportables y con los parámetros de los componentes exportables).

Binder. Eliminar un componentes exportables sin recompilar programas

Aquí vamos a mostrar como eliminar un componentes SIN tener que recompilar todos los programas que ya están enlazados con el programa de servicio. No sería la mejor opción pero podría ser útil en el caso de que tengamos un programa de servicio con muchísimos programas que lo utilicen y no queramos (o no podamos) compilarlos.

El objetivo es que no cambien las signatures. Para ello, simplemente dejaremos el componente (con sus parámetros de entrada y salida) pero le "limpiaremos" el código, es decir, no hará nada. Aún así, se supone que no hay ningún programa que utilice ese componente. En el fuente binder dejaremos el componente en la misma posición. De esta forma al no eliminar el componente, no se cambiarán las signatures.










miércoles, 26 de junio de 2013

Lenguaje Binder. Características y estrategias.

Los programas de servicio (*SRVPGM) se crearon en ILE para encapsular funciones reutilizables y cuya gran ventaja es que en tiempo de ejecución es rendimiento es muy bueno debido en parte a que cuando se crea un programa, se guarda cierta información del programa de servicio que facilita la carga e inicialización del mismo. Es la signature.
Podéis tener una información más detallada de las formas de llamada a objetos en ILE sobre este enlace.


Signature.

Pero ¿qué es esto?. De forma burda, se puede comparar con el lvlchk de un fichero. En este caso si un programa se ha creado utilizando un determinado lvlchk de un fichero, en el momento en que se vaya a utilizar dicho fichero en tiempo de ejecución, el sistema operativo comprobará que es el mismo, en cuyo caso permitirá continuar con la ejecución pero en caso contrario dará un error y finalizará el programa.

La signature es similar. Cuando se crea un programa ILE y se enlazan los programas de servicio, se almacena en el programas la signature del programa de servicio. En tiempo de ejecución, cuando se llama al programa, en tiempo de inicialización, revisa que la signature almacenada en el programa es igual a la que tiene el programa de servicio y si es así, permitirá la ejecución del programa y en caso contrario dará error.

Una diferencia muy importante con respecto al lvlchk de un fichero y que nos facilitará el mantenimiento de aplicaciones es que un programa de servicio puede tener muchas signatures que serían como versiones del mismo programa se servicio. 
Así, si por ejemplo tenemos, un programa de servicio con las signatures 1 y 2 y lo llaman dos programas, el programa X que cuando se creo lo enlazaba con la signature 1 y el programa Y que cuando se creo lo enlazaba con la signature 2, pueden funcionar perfectamente.



Ejemplo de múltiples signatures válidas de un programa de servicios. Comando DspSrvPgm


Como se genera y en que se basa

Hay dos formas de crear la signature. De forma automática o de forma manual. 
  • En la automática es el sistema operativo quien crea la signature en el momento de creación de programa de servicio.
  • En la forma manual es la persona que crea el programa de servicio quien le da el código que desea.
 Yo, hasta el momento, siempre he utilizado la forma automática ya que la ventaja principal que le encuentro es que es el SO quien controla el código que debe asignarle. En la forma manual es el usuario quien debe controlar el código o códigos que se le da y sería un trabajo más a realizar y con la posibilidad de generar errores cuando un programa de servicio pudiera tener varias signatures.

Pero en ¿qué se basa el código que le genera?

Esto tiene que ver con la reducción del tiempo de inicialización del programa de servicio en tiempo de ejecución. Para ello, se pretende que en tiempo de compilación ya que pueda revisar que esa llamada sea correcta. Y para ello inventaron la signature. 
Por ello, el código que genera está basado en:

  • Los componentes exportables que tienen un programa de servicio
  • El orden de los componentes exportables
  • Los parámetros de entrada y salida de cada componente exportable. 

Por lo tanto, como se ve, ese código que genera le permite al sistema operativo realizar una revisión muy rápida en tiempo de ejecución de si va a "casar" las llamadas al programa de servicio dentro del programa que estoy ejecutando.

Por ello es muy importante indicar que si cambio el código "interno" de un componente de un programa de servicio (sin tocar los parámetros de entrada/salida), la signature NO cambiará. 


Entendido, pero ¿cómo facilitan el mantenimiento de aplicaciones?

Hemos comentado que los programas de servicio permiten reutilizar código, realizar funciones comunes y me facilitan el mantenimiento de aplicaciones pero con la gestión de la signature ¿cómo puedo hacerlo fácilmente?

Vamos a ver con un ejemplo todas las posibilidades. Imaginemos que tenemos:

  • Un programa de servicio llamado SRV1 que tiene un componente exportable llamado calcDescuento. Este componente tiene un parámetro de entrada Importe y un parámetro de salida que es Descuento (como función). Básicamente lo que hace es recibir un importe y base a una serie de criterios, calcula un descuento que lo devuelve al programa que lo llamó. Los criterios son:
    • Si el importe es menor o igual que 1000 el descuento es un 0%
    • Si el importe está entre 1000 y 5000 el descuento es de un 10%
    • Si el importe es mayor que 5000 el descuento será de un 20%
  • Este componente del programa de servicio es utilizado 120 en los programas
 *==============================================
 *  calcDescuento    Calcula descuento          
 *==============================================
PcalcDescuento    B                   EXPORT    
DcalcDescuento    PI     15      4              
D P_Importe              15      4    Const     
                                                
D w_Descuento     S      15      4              
 /Free                                          
    // Aqui vendra el codigo del componente     
                                                
    Return w_Descuento                          
 /End-Free                                      
P                 E                             



1. Solo cambia el código interno

Ahora la Dirección indica que los criterios de descuento han cambiado y hay que aplicarle los nuevos que son:
  • Si el importe es menor o igual que 1000 el descuento es un 0%
  • Si el importe está entre 1000 y 2000 el descuento es de un 10%
  • Si el importe es mayor que 2000 el descuento será de un 20%
En este caso, modificaré el componente calcDescuento, compilaré el programa de servicio SRV1. 
NO cambia la signature del programa de servicio y NO es necesario compilar el resto de programa para que tome el nuevo funcionamiento.


2. Se cambian los parámetros de un componente.

Ahora, por evolución del negocio, se ha pedido que al componente calculoDescuento se incluya un parámetro que sea un indicador de si tiene derecho a un descuento especial
 adicional. Además, la posibilidad de utilizar este descuento sólo estará habilitada en unos pocos de los actuales programas que utilizan el programa de servicio.

La forma de proceder para evitar tener que volver a crear todos los programas que utilizan ese componente sería la siguiente:

  • En el componente calcDescuento se añade el nuevo parámetro pero con opción *NOPASS. De esta forma, no será necesario modificar todas las llamadas de todos los programas que utilicen ese componente si no sólo los programas donde tenga sentido utilizar ese componente.
  • En las líneas de código de este componente, lo primero será determinar si ese parámetro viene "relleno". En caso de que venga, se tomará el valor que se recibe y en caso contrario se tomará el valor por defecto, en este caso, que no tiene derecho a descuento especial.
De esta forma, se creará de nuevo el programa de servicio y no será necesario crear todos los programas que lo utilicen. Solo se deberán crear aquellos donde se quiera utilizar el nuevo parámetro.

PcalcDescuento    B                   EXPORT                           
DcalcDescuento    PI     15      4                                     
D P_Importe              15      4    Const                            
D P_DescEspecial                  n   Const OPTIONS(*NOPASS)           
                                                                       
D w_Descuento     S      15      4                                     
D w_DescEspecial  S               n                                    
 /Free                                                                 
    If %PARMS >=2;                                                     
      w_DescEspecial = P_DescEspecial;                                 
    Else;                                                              
      w_DescEspecial = *Off;                                           
    EndIf;                                                             
    // Aqui vendra el codigo del componente y opera 
    // con w_DescEspecial 
                                                                       
    Return w_Descuento                                                 
 /End-Free                                                             

P                 E                                                    


3. Se añade un nuevo componente al programa de servicio.

Ahora, por necesidades de algunos programas, se ha creado un nuevo componente calcImpuesto que se ha incluido en el mismo programa de servicio y será utilizado sólo por unos pocos programas.

En este caso, si NO utilizamos el lenguaje binder, al crear el programa de servicio, cambiará la signature y estaremos obligados a volver a crear TODOS los programas enlazando de nuevo con el programa de servicio.

Si utilizamos el lenguajes binder podremos evitar tener que compilar todos los programas. Añadiremos una nueva entrada para que genere una nueva signature y con el ello, cuando se cree  el programa de servicio, será válido para todas las signatures previas y por lo tanto NO será necesario volver a crear los programas que lo utilizan.


En próximas entregas, indicaré como se codifica el lenguaje binder para el mantenimiento de programas de servicio en base a estas características.



viernes, 21 de junio de 2013

Tipos de llamadas

Desde la llegada del ILE se dispone de varios formas de hacer llamadas para ejecutar código y es conveniente conocer el funcionamiento de cada una de ellas para definir una correcta estrategia de diseño de aplicaciones utilizando ILE.

Formas de ejecutar código

1. Ejecución de programa.

Existe desde el comienzo de la programación y se corresponde con la ejecución de un programa desde otro programa. En Rpg sería el tradicional CALLHasta la llegada de ILE era la única opción existente. 

El funcionamiento es simple desde un programa llamamos a otro y podemos pasarle parámetros. 

A nivel de sistema operativo, la verificación del programa llamado se realiza en tiempo de ejecución por lo que si, por alguna causa, no concuerdan los parámetros se producirá un error de ejecución. 
La inicialización del programa llamado conlleva bastante tiempo de ejecución ya que debe cargar el programa en memoria, inicializar variables y realizar aperturas de ficheros. Y lo mismo ocurre al finalizar un programa.

Es por ello que cuando desde un programa se llama a otro en múltiples y repetidas ocasiones, incidía notablemente en el rendimiento de la aplicación; por ejemplo, tenemos un programa que procesa un elevado número de registros y por cada registro llama a un programa para un determinado cálculo. Por ello, para reducir el tiempo y mejorar el rendimiento, recurríamos a finalizar el programa llamado con return para evitar los costes de tiempo de inicialización y finalización de programa. 

2. Llamada a módulo de un programa.

Se incorporó con la llegada del ILE y permite "llamar" a un módulo desde otro módulo del mismo programa. En RpgLe sería CALLPRC.

La verificación de la llamada (y sus parámetros) se produce en tiempo de compilación y creación del programa, cuando se "linkan" todos los módulos dentro del mismo programa. 

Al nivel de rendimiento, como se ha verificado, revisado y linkado en tiempo de compilación, el tiempo de carga e inicialización del módulo es irrelevante ya que sería el mismo que la ejecución de una subrutina dentro del programa.

Esta posibilidad de tener llamadas a módulos codificados independientemente pero cuyo rendimiento es como el de una subrutina a permitido dividir los programas en varios módulos para facilitar el desarrollo y el mantenimiento del programa.
Antes de existir ILE teníamos programas monolíticos de miles de líneas de código cuyo desarrollo y sobre todo mantenimiento (ante nuevas funcionalidades o corrección de incidencias) era muy complejo y problemático. Con ILE ese mismo programa se puede dividir en varios módulos (facilitando el desarrollo y el mantenimiento) y que se enlazan finalmente para formar un programa y cuyo rendimiento es exactamente igual que el antiguo programa monolítico.

3. Llamadas a programas de servicio.

También se incorporó con la llegada del ILE y permite "llamar" a un proceso desde un programa. Normalmente encapsulan procesos que van a ser utilizados desde múltiples programas y se corresponderían con una rutina de negocio reutilizable, por ejemplo, un procedimiento que devuelva el total de impuestos a aplicar a un determinado importe.

La verificación de la llamada (y sus parámetros) se produce, parte en tiempo de compilación y creación del programa y parte en tiempo de ejecución. 
Cuando se crea el programa es necesario indicarle que programas de servicio va a utilizar y en ese momento verifica, a través de los prototipos, la correspondencia de parámetros y en base a ello almacena en el programa la SIGNATURE del programa de servicio.  

La signature se como una firma basada en los componentes que tiene almacenados el programa de servicio y en los parámetros de esos mismos componentes. En próximas entregas hablaré de este concepto y del lenguaje binder.

Al nivel de rendimiento, consume mucho más tiempo que llamadas a módulos pero no se acerca al tiempo de inicialización de llamadas de programas
Simplemente, cuando se inicializa un programa que tiene una llamada a un programa de servicio, en ese momento se verifica que la signature que tiene el programa con relación al programa de servicio y la que tiene el programa de servicio son la misma y si es así se ejecuta y en caso contrario da un error.

Adicionalmente, el tiempo de carga es menor que el de llamadas a programas ya que el sistema operativo solo cargará en memoria una instancia del programa de servicio que podrá ser utilizada por todos los programas que lo llamen.

También es necesario indicar que es posible modificar el programa de servicio  sin tener que volver a compilar o a recrear todos los programas que lo utilizan lo cual facilita el desarrollo y mantenimiento.


Resumen

Con la llegada de ILE existen más opciones de llamadas que nos facilitan el desarrollo, mantenimiento y ejecución de aplicaciones y es necesario conocerlas para definir una estrategia conveniente en el desarrollo de aplicaciones. 
Así, por ejemplo, yo utilizaré:

  • En programas de servicio, rutinas de negocio que van a ser llamadas desde múltiples programas.
  • Llamadas de módulos. Cuando divida un programa en multiples módulos para facilitar el desarrollo y mantenimiento. Por ejemplo, un diseño de un programa que tiene cuatro pantallas podría hacerse que cada pantalla esté gestionada en un módulo y después de cree el programa utilizando los cuatro módulos
  • Llamadas entre programas. Pues eso, cuando necesite llamar a otro programa


sábado, 1 de junio de 2013

SQL. Función Row_Number

Esta función permite obtener el ranking de posición de cada uno  de los registros de la sentencia SQL según la clasificación y ordenación que deseemos.


Número de fila de resultado


Con la estructura de de la función en su forma row_number() podremos obtener el número de fila en los resultados de la ejecución de SQL según la ordenación y selección de la sentencia.

Ejemplo:  Sentencia simple
SELECT IdCliente, IdPais, IdTipCli, row_number() over() as Orden,  Nombre, Apellidos FROM Cliente;                            


  



Ejemplo: Sentencia simple con una ordenación
SELECT IdCliente, IdPais, IdTipCli, row_number() over() as Orden,  Nombre, Apellidos FROM Clienteorder by apellidos, nombre





Over Partición

Con esta funcionalidad permite calcular la secuencia en base a clasificaciones por n campos. El formato es row_number() over(partition by campo1, campo2..).

Tendrá secuencias diferentes para todas las combinaciones de campo1, campo2, etc. Imaginemos que se hace la partición por código de país, entonces habrá una secuencia 1, 2, 3, 4, para el país X, otra secuencia 1, 2, 3, 4 ... para el país Y y así sucesivamente para cada unos de los países que tenga el fichero.

Ejemplo: Sentencia simple con una ordenación y calculo de número de fila en base a una clasificación (en este caso por IdPais)
SELECT IdCliente, IdPais, IdTipCli, 
row_number() over(partition by idpais) as Orden,  
Nombre, Apellidos FROM Cliente order by apellidos, nombre;    





Over Order 

Con esta funcionalidad permite calcular la secuencia en base a la ordenación que se le indica. El formato es row_number() over(order by campo1, campo2..).

Generará la secuencia 1,2,3,4 según el orden de campos indicado (independientemente del order by que tuviera la sentencia SQL) 

Ejemplo: Sentencia con una ordenación y calculo la secuencia base a una clasificación (en este caso por IdPais) y en base a la ordenación que se propone (apellidos y nombre)
SELECT IdCliente, IdPais, IdTipCli, 
row_number() over(partition by idpais order by apellidos, nombre) as Orden, Nombre, Apellidos FROM Cliente order by apellidos, nombre   




Ejemplo: Sentencia con una ordenación y calculo de número de fila en base a una clasificación (en este caso por IdPais y IdTipCli) y en base a la ordenación que se propone de los mismos campos
SELECT IdCliente, IdPais, IdTipCli, 
row_number() over(partition by idpais, IdTipCLi order by idpais, IdTipCLi) as OrdenNombre, Apellidos FROM Cliente



jueves, 23 de mayo de 2013

Modulo. Mantenimiento de un registro



Objetivo

Realizar un módulo que presenta una ventana para el mantenimiento de los datos de un registro. Permitirá dar de alta un nuevo registro o realizar las opciones de modificación, consulta o borrado de un registro existente. Lógicamente validará la información introducida por el usuario antes de actualizar la información en la base de datos.
Para los campos de tipo tabla también se habilita el acceso a los programas de lista de selección (F4) en el ejemplo que se mostrará sobre el campo de país y de tipo de cliente.
En este ejemplo, se realizará una pantalla de mantenimiento de un cliente. Será llamado desde la pantalla de lista de clientes.





Tiene el mandato F10 para confirmar  la acción de alta, modificación o borrado. Con F4 accederá a la lista de selección de país y de tipo de cliente. Con F12 no realizará ninguna acción y volverá a la pantalla que le llamó.

Referencias: ILE estrategiaBD Pruebas

Configuración

Este programa utilizará un componente de acceso a base de datos de lista de clientes, los componentes de actualización (alta, baja y modificación) de un registro y los componentes de validación que se encuentran todos ellos en el programa de servicio correspondiente.
  • El nombre del módulo donde esta el ventana de lista de registros para mantenimiento BAN02P1
    • La definición de la pantalla estará definida como BAN02S1
  • Utiliza el programa de servicio BAN01SRV que contiene los componentes de acceso a BD, de actualización y de validación
    • El miembro (/Copy) con la definición del prototipo con los componentes y con la definición de estructuras será BAN01M1CP
  • Llamará a los programas de lista de países (PAN40P1) y lista de tipos de cliente (PAN40P2) 
    Este ejemplo sirve de plantilla para otro proceso similar.


    Fuente de la pantalla. BAN02S1

    Se define la pantalla para presentar el mantenimiento de un registro.

    miércoles, 22 de mayo de 2013

    Modulo. Lista para mantenimiento


    Objetivo


    Realizar un módulo que presenta una ventana con una lista de registros que servirá para el mantenimiento de los mismo. Tendrá opciones para acceder a la pantalla que permite dar de alta un nuevo registro o realizar las opciones de modificación, consulta o borrado de un registro existente. Además incorpora una búsqueda para seleccionar los registros que aparecen en la lista. La lista se cargará por páginas.
    Para los campos de tipo tabla también se habilita el acceso a los programas de lista de selección (F4) en el ejemplo que se mostrará sobre el campo de país y de tipo de cliente.
    En este ejemplo, se realizará una pantalla de lista de registros para mantenimiento para la tabla de clientes.




    Tiene el mandato F9 para dar de alta un nuevo registro. Las opciones sobre el subfichero 2, 4, 5 para realizar las opciones de mantenimiento de modificación, borrado y consulta respectivamente. 
    Tiene en la cabecera los campos de búsqueda para restringir la información que se muestra en la lista.
    Adicionalmente he añadido una opción (8) en el subfichero para acceder a la lista de cuentas del cliente que será otra pantalla similar a esta y que utilizará la misma plantilla con el punto adicional que se presenta información del cliente al que pertenece (maestro-detalle)

    Referencias: ILE estrategiaBD Pruebas

    Configuración

    Este programa utilizará un componente de acceso a base de datos de lista de clientes que se definió en la entrada de acceso a BD a través del uso del programa de servicio que lo contiene .
    • El nombre del módulo donde esta el ventana de lista de registros para mantenimiento BAN01P1
      • La definición de la pantalla estará definida como BAN01S1
    • Utiliza el programa de servicio BAN01SRV que contiene los componentes de acceso a BD.
      • El miembro (/Copy) con la definición del prototipo con los componentes y con la definición de estructuras será BAN01M1CP
    • Llamará a los módulos de mantenimiento de un registro de cliente (PAN02P1) y a la lista de cuentas asociadas a un cliente (PAN03P1)
    • Llamará a los programas de lista de países (PAN40P1) y lista de tipos de cliente (PAN40P2) 
    Este ejemplo sirve de plantilla para otro proceso similar.


    Fuente de la pantalla. BAN01S1

    Se define la pantalla para presentar la lista de registros para mantenimiento.