Informix 4gl español2

52
 Por : Ing. Juan Carlos Contreras Villegas (c) Derechos Reservados  prohi bida s u reproducc ión total o par cial sin el consentimiento del autor  VS

Transcript of Informix 4gl español2

7/16/2019 Informix 4gl español2

http://slidepdf.com/reader/full/informix-4gl-espanol2 1/52

 

Por :

Ing. Juan Carlos Contreras Villegas

(c) Derechos Reservados

 prohibida su reproducción total o parcialsin el consentimiento del autor 

 

VS

7/16/2019 Informix 4gl español2

http://slidepdf.com/reader/full/informix-4gl-espanol2 2/52

. Curso de Programación en INFORMIX-4GL

Ing. Juan Carlos Contreras Vi ll egas U.A.G.R.M.-I NFORMATI CA

Página 1 

CONTENIDO

I INTRODUCCION1. Que es el INFORMIX?2. Que es una base de datos?

3. Que es una tabla?4. Base de datos ejemplo.

III PROGRAMACION EN INFORMIX-4GL1. Estructura de un Programa 4GL2. Tipos de datos en INFORMIX 4GL

3. Declaración de variables4. Asignación de datos

5. Estructuras de control5.1 Estructura Secuencial

5.2 Estructura Alternativa5.3 Estructura Repetitiva

6. Manejo de Menúes7. Formatos de pantalla

7.1 Estructura de un formato de pantalla

7.2 Instrucciones para manejo de formatos de pantalla desde 4GL6. Captura de datos

7. Query By Example9.1 Especificación del criterio de búsqueda

9.2 Preparación de la consulta9.3 Manejo de cursores

10. Reportes simples10.1 Construcción del reporte

10.2 Estructura del Formato de reporte10.3 Sentencias que se utilizan en la función reporte

10.4 Variables y funciones que se pueden usar en un formato de reporte11. Manejo de arreglos con formatos de pantalla

11.1 Captura de datos en arreglos11.2 Instrucciones para manejo de arreglos con formatos de pantalla

12. Reportes complejos con cortes de control

7/16/2019 Informix 4gl español2

http://slidepdf.com/reader/full/informix-4gl-espanol2 3/52

. Curso de Programación en INFORMIX-4GL

Ing. Juan Carlos Contreras Vi ll egas U.A.G.R.M.-I NFORMATI CA

Página 2 

IINTRODUCCIÓN

1.1.- Introducción.-

4GL .- Four Generation Language (Lenguaje de programación de cuartageneración), es un lenguaje de programación que conjuntamente con el SQLpermiten crear sistemas de archivos.

INFORMIX-4GL es un lenguaje de cuarta generación muy poderoso que proveetodas las herramientas que tu necesitas para crear sistemas de manejo de base dedatos relacionales

INFORMIX-4GL consta de:

• SQL (Para la manipulación de los datos)

• Estructuras de control (IF, WHILE, Etc)• Manejo de menús

• Manejo de ventanas

• Formatos de pantalla• Reportes

2.- Que es una Base de datos ?

- Es una colección de información o datos relacionados.- Es un conjunto de archivos relacionados.- Es una colección de tablas.

3.- Que es una tabla ?

Una tabla es una colección de datos organizados en filas y columnasUna base de datos contiene al menos una tabla, como también puede tener

muchas tablas, tantas como sea necesario.

4.- Para poder llevar adelante el curso se hace necesario trabajar sobre un ejemplo, para

así poder ser mas objetivo, y hacer que se comprenda mejor el manejo de INFORMIXcon un ejemplo practico.

7/16/2019 Informix 4gl español2

http://slidepdf.com/reader/full/informix-4gl-espanol2 4/52

. Curso de Programación en INFORMIX-4GL

Ing. Juan Carlos Contreras Vi ll egas U.A.G.R.M.-I NFORMATI CA

Página 3 

El ejemplo planteado para el presente curso es un sistema de control de almacénpara la empresa DELTA. El diseño de la base de datos ALMACEN es la siguiente:

MATERIAL

SECCION

PROVEEDOR 

cod_matdescrip

 p_unit

stock_mincantidad

Recibe

cant

nro_egr 

 p_unit

fechacod_sec descrip

Tiene

cod_pro nombre

cant p_unitnro_ing

Base de datos ALMACEN

INGRESO

EGRESO

Contiene

Hace

fecha1

M

 N

 N

1 N

M

 N

direc

 

7/16/2019 Informix 4gl español2

http://slidepdf.com/reader/full/informix-4gl-espanol2 5/52

. Curso de Programación en INFORMIX-4GL

Ing. Juan Carlos Contreras Vi ll egas U.A.G.R.M.-I NFORMATI CA

Página 4 

Descripción de las tablas para la base de datos ALMACEN

cod_prov nombre

MATERIAL

cod_mat descrip p_unit stock_min cantidad

SECCION

cod_sec descrip

INGRESOS

EGRESOS

nro_egr 

fechanro_ing

fecha

cod_prov

MAT_ING

MAT_EGR 

nro_ing p_unitcantcod_mat

nro_egr p_unitcantcod_mat

cod_sec

direc

 

7/16/2019 Informix 4gl español2

http://slidepdf.com/reader/full/informix-4gl-espanol2 6/52

. Curso de Programación en INFORMIX-4GL

Ing. Juan Carlos Contreras Vi ll egas U.A.G.R.M.-I NFORMATI CA

Página 5 

IIIINFORMIX - 4GL 

SQL + Estructuras de control + Formatos de pantalla + Reportes = 4GL

3.1.-- ESTRUCTURA DE UN PROGRAMA 4GL.-

DATABASE NombreBaseDeDatos

GLOBALSaqui va la declaracion de variables globales

END GLOBALS

MAIN

Sentencias------

------------

END MAIN

FUNCTION NombreFuncion(lista de argumentos)

definicion de argumentosdefinicion de variables locales

Sentencias--------

----END FUNCTION

REPORT NombreFuncionReporte(lista de argumentos)definicion de los argumentos

definicion de variables locales al reporteSentencias de reporte

---------------

END REPORT

7/16/2019 Informix 4gl español2

http://slidepdf.com/reader/full/informix-4gl-espanol2 7/52

. Curso de Programación en INFORMIX-4GL

Ing. Juan Carlos Contreras Vi ll egas U.A.G.R.M.-I NFORMATI CA

Página 6 

En un programa 4GL existen 5 secciones, las cuales se detallan a continuación:

Sección DATABASE.- En esta sección se especifica el nombre de la base de datos con laque se va a trabajar.

Sección GLOBALS.- En esta sección se definen las variables que serán globales a todoel programa.

Sección MAIN .- En esta sección se escriben la instrucciones.

Sección FUNCTION.- Se pueden definir las funciones o procedimientos que serannecesarios para el programa.

Sección REPORT.- También se pueden definir funciones especiales que dan formato alos reportes.

Nota:

Toda Sentencia en INFORMIX-4GL siempre comienza con una palabrareservada, la sentencia puede estar escrita en mas de una línea. Una sentencia 4GLtermina cuando comienza otra sentencia.

El sistema a desarrollar se llamara SCA (Sistema de control de almacén) y estarácompuesto por los siguientes módulos

sca_main

sca_mate sca_prove sca_secc sca_ingr sca_egre sca_repo

modulosprograma

 

Un programa en 4GL esta compuesto por módulos, de los cuales solo uno de ellosdebe tener la palabra reservada MAIN y sera considerado módulo principal.

7/16/2019 Informix 4gl español2

http://slidepdf.com/reader/full/informix-4gl-espanol2 8/52

. Curso de Programación en INFORMIX-4GL

Ing. Juan Carlos Contreras Vi ll egas U.A.G.R.M.-I NFORMATI CA

Página 7 

El diseño de pantalla para el sistema será el siguiente:

Menu: Proveedores seCcion Ingresos Egresos Reportes Salir  Materiales

 ABC de materiales---------------------------------------------------------------------------------------------------

---------------------------------------------------------------------------------------------------

S I S T E M A

D E C O N T R O L

D E A L M A C E N

Linea de Menu

Linea deComentarios

Formatos

de

pantalla

Linea de Mens.Linea de Mens.de error   

3.2.- TIPOS DE DATOS.-

3.2.1.-Tipos de dato simples-CHAR(n) .- string de n caracteresSMALLINT.- un numero en el rango de -32767 a 34767INTEGER.- Un numero en el rango de -2.147.483.647 a 2.147.483.647

DECIMAL(m,n).- Un numero decimal en punto flotante, con un total de 32 (m)dígitos significativos, y n (n<=m) dígitos a la derecha de la coma decimal.Cuando se le da ambos parámetros (m y n) la variable tiene aritmética de puntofijo.MONEY(m,n).- Su comportamiento es similar al tipo de dato DECIMAL. si no

tiene ningún parámetro es interpretado como un DECIMAL(16,2), si solo tiene elparámetro m es interpretado como DECIMAL(m,2).DATE.- Es una fecha ingresado como string de caracteres.DATETIME first TO last.- almacena un momento en el tiempo con la precisiónfirst a last. Una columna DATETIME consiste de una secuencia de campos YEAR,

MONTH, DAY, HOUR, MINUTE, SECOND y FRACTION(n) de segundo.INTERVAL first TO last.- Almacena un espacio de tiempo con la precisión first a

last. Una columna INTERVAL consiste de una secuencia contigua de uno de lasdos siguientes listas de campos:YEAR y MONTH o DAY, HOUR, MINUTE,SECOND y FRACTION(n) de segundo.

7/16/2019 Informix 4gl español2

http://slidepdf.com/reader/full/informix-4gl-espanol2 9/52

. Curso de Programación en INFORMIX-4GL

Ing. Juan Carlos Contreras Vi ll egas U.A.G.R.M.-I NFORMATI CA

Página 8 

3.2.2.-Tipos de dato compuestos.-

En 4GL se pueden definir variables registros, pero no se pueden definir tipos de datos.NomVariable RECORD 

NomCampo1 Tipo1,NomCampo2 Tipo2,

----------------

NomCampoN TipoNEND RECORD 

3.2.3.- Arreglos-

En 4GL se pueden definir variables arreglos de n dimensiones simples o arreglos deregistros, pero no se pueden definir tipos de datos.NombreVariable ARRAY [ m, n,.. ] OF TipoDato

3.3.-DECLARACION DE VARIABLES.-La palabra reservada DEFINE permite declarar variables.DEFINE Var1 TipoDato,

Var2 Tipo2,------VarN TipoN

Ejemplos:DEFINE a SMALLINT,

b,c DECIMAL(10,2),d RECORD

x SMALLINT,y INTEGER

END RECORD,e LIKE proveedor.cod_prov,f RECORD LIKE proveedor.*,g ARRAY [10] OF INTEGER,h ARRAY [10,3] OF DATE,i ARRAY [15] OF RECORD

x DATE,

y MONEY(5)END RECORD,

 j ARRAY [10] OF RECORD LIKE material.*

7/16/2019 Informix 4gl español2

http://slidepdf.com/reader/full/informix-4gl-espanol2 10/52

. Curso de Programación en INFORMIX-4GL

Ing. Juan Carlos Contreras Vi ll egas U.A.G.R.M.-I NFORMATI CA

Página 9 

3.4.-ASIGNACION DE DATOS-

Sintaxis:LET NombreVariable = Expresion  

INITIALIZE var1,var2,... TO NULL

La sentencia LET permite asignar el valor de una expresion a una variable.La sentencia INITIALIZE permite inicializar una o mas variables a NULL. NULL en4GL significa ausencia de dato, no cero (0), ni cadena vacia ("").Ejemplos:LET a=5LET b=10.3*5INITIALIZE d.x,d.y TO NULL

INITIALIZE d.* TO NULL

3.5.-ESTRUCTURAS DE CONTROL.-

3.5.1.- Secuencial.-Como se menciono anteriormente una sentencia en INFORMIX-4GL comienza con

una palabra reservada, y puede ocupar mas de una línea en el editor, y terminacuando comienza otra sentencia.

Ejemplo1 INITIALIZE x,

y TO NULL2 SELECT * FROM material

WHERE cod_mat > 200ORDER BY descrip

En este ejemplo se han escrito 2 sentencias, la sentencia 1 (INITIALIZE )ocupa doslineas, y la sentencia 2 (SELECT) ocupa tres lineas.

3.5.2.-Alternativa.-

3.5.2.1.- Alternativa simple.-IF Condicion THEN 

Sentencia-----

END IF 

7/16/2019 Informix 4gl español2

http://slidepdf.com/reader/full/informix-4gl-espanol2 11/52

. Curso de Programación en INFORMIX-4GL

Ing. Juan Carlos Contreras Vi ll egas U.A.G.R.M.-I NFORMATI CA

Página 10 

3.5.2.2.-Alternativa doble.-IF Condicion THEN 

Sentencia-----

ELSE 

Sentencia----

END IF 

3.5.2.3.-Alternativa multiple.-CASE 

 WHEN expresion1

Sentencia--------

 WHEN expresion2

Sentencia--------

OTHERWISE 

Sentencia--------

END CASE 

3.5.3.-Repetitivas.-

3.5.3.1.- DO WHILE.- WHILE Condicion

Sentencia--------

END WHILE 

3.5.3.2.- FOR.-

FOR VariableDeControl = ValorInicial TO ValorFinal [ STEP expresion ]

Sentencia--------

END FOR 

7/16/2019 Informix 4gl español2

http://slidepdf.com/reader/full/informix-4gl-espanol2 12/52

. Curso de Programación en INFORMIX-4GL

Ing. Juan Carlos Contreras Vi ll egas U.A.G.R.M.-I NFORMATI CA

Página 11 

3.6.- MANEJO DE MENUS.-MENU "NombreMenu" 

COMMAND [KEY(tecla)] "Opcion1" "Comentario de la opcion 1"

Sentencias-----

-----COMMAND [KEY(tecla)] "Opcion2" "Comentario de la opcion 2"

Sentencias-----

END MENU 

Nota: Existen dos sentencias exclusivas en menú, es decir, solo se las puede usardentro de la estructura menu .

EXIT MENU .- Permite salir del bucle de Menu  

NEXT OPTION "Nombre Opcion" .- Hace que la opción por default sea la indicada

por "nombre opcion"

La cláusula KEY en Command permite que la opción sea seleccionable por la teclaindicada.Por default las opciones pueden ser seleccionables por la primer letra de dicha opción.Si dos opciones comienzan con la misma letra se utiliza la cláusula KEY para definirotra letra y romper la ambigüedad.

7/16/2019 Informix 4gl español2

http://slidepdf.com/reader/full/informix-4gl-espanol2 13/52

. Curso de Programación en INFORMIX-4GL

Ing. Juan Carlos Contreras Vi ll egas U.A.G.R.M.-I NFORMATI CA

Página 12 

Ejemplo:

{****** MODULO PRINCIPAL DEL SISTEMA DE CONTROL DE ALMACEN **************** PROGRAMA SCA_MAIN.4GL *********

******* CopyRight(1995) by Juan Carlos Contreras Villegas *********

}DATABASE almacen

MAIN

OPEN FORM form_main FROM "f_main"DISPLAY FORM form_mainMENU "SCA"

COMMAND "Material" "Mantenimiento de materiales"CALL p_material()

DISPLAY FORM form_mainCOMMAND key(C) "seCcion" "Mantenimiento de seccion"

CALL p_seccion()DISPLAY FORM form_mainCOMMAND "Proveedores" "Mantenimiento de proveedores"

CALL p_proveedor()DISPLAY FORM form_main

COMMAND "Ingresos" "Registrar ingreso de materiales"

CALL p_ingreso()DISPLAY FORM form_main

COMMAND "Egresos" "Registrar egreso de materiales"CALL p_egreso()DISPLAY FORM form_main

COMMAND "Reportes" "Emitir reportes de la base de datos"DISPLAY FORM form_main

COMMAND "Salir" "Salir del sistema de control de almacen"EXIT MENU

END MENU

CLOSE FORM f_mainEND MAIN 

7/16/2019 Informix 4gl español2

http://slidepdf.com/reader/full/informix-4gl-espanol2 14/52

. Curso de Programación en INFORMIX-4GL

Ing. Juan Carlos Contreras Vi ll egas U.A.G.R.M.-I NFORMATI CA

Página 13 

3.7.- FORMATOS DE PANTALLA.-

Los formatos de pantalla son archivos que contienen texto que sirve de interfacecon el usuario. Se puede usar un formato de pantalla junto con las instrucciones demanipulación de datos para Ingresar, modificar, consultar y eliminar datos de las

tablas de una base de datos.

El archivo fuente de un formato de pantalla tiene la extensión .PER y su

contenido es texto ASCII.

Para que un archivo de formato de pantalla pueda ser utilizado con un programa4GL este debe ser compilado y tener una extensión .FRM 

7/16/2019 Informix 4gl español2

http://slidepdf.com/reader/full/informix-4gl-espanol2 15/52

. Curso de Programación en INFORMIX-4GL

Ing. Juan Carlos Contreras Vi ll egas U.A.G.R.M.-I NFORMATI CA

Página 14 

3.7.1.- Estructura de un formato de pantalla.-

Para que un archivo de formato de pantalla sea reconocido debe tener la siguienteestructura:

DATABASE NombreBaseDeDatos

SCREEN

{

Texto1 [v1 ]

Texto2 [v2 ]

texto3

[v3 ]

TABLES NomTabla1, NomTabla2, ...

ATTRIBUTES v1= NomTabla.Columna1, lista de atributos ; 

v2= NomTabla.Columna2, lista de atributos ; 

--------

INSTRUCTIONS DELIMITERS "ab" 

SCREEN RECORD regPant[n] ( tabla.* |

tabla.col1,tabla.col2, ... | tabla.colX THRU tabla.colY ) 

END 

Un formato de pantalla esta compuesta por cinco secciones que son:• La sección DATABASE permite especificar la base de datos con la que se va a

trabajar.• La sección SCREEN permite definir todo lo que se vera en la pantalla. También

permite definir las variables y los campos de pantalla.• La sección TABLES permite especificar las tablas con las que se interactuara en esta

pantalla.

7/16/2019 Informix 4gl español2

http://slidepdf.com/reader/full/informix-4gl-espanol2 16/52

. Curso de Programación en INFORMIX-4GL

Ing. Juan Carlos Contreras Vi ll egas U.A.G.R.M.-I NFORMATI CA

Página 15 

• La sección ATTRIBUTES permite asociar las variables de pantalla a un tipo de dato

para su validación, también permite dar o definir algunos atributos a los campos dela pantalla.

• La sección INSTRUCTIONS permite definir la forma de los delimitadores, pordefault son dos parentesis, pero se puede cambiar por dos caracteres. En esta

sección también se permite definir arreglos de pantalla

Se pueden utilizar los siguientes atributos para los campos de pantalla:

 AUTONEXT COMMENTS DEFAULTDOWNSHIFT FORMAT INCLUDENOENTRY PICTURE REQUIRED

REVERSE UPSHIFT VERIFYWORDWRAP ZEROFILL COLOR

• AUTONEXT .- Hace que el cursor avance automáticamente al siguiente campo

cuando se ha llenado el campo actual.

• COLOR = color [WHERE condicion].- Permite especificar los atributos de color

para los datos de los campos. Se desplegara en el color especificado si se cumple lacondición.

Los colores pueden ser:

WHITE YELLOW MAGENTA REDCYAN GREEN BLUE BLACKBLINK REVERSE

• COMMENTS = "Comentario" .- Permite desplegar el comentario en la línea de

comentarios cuando el cursor este en el campo actual.

• DEFAULT = Valor .- Permite especificar un valor por defecto para un campo de

despliegue.

• DISPLAY LIKE tabla.columna .- permite desplegar los datos en el campo deacuerdo a una columna de una tabla.

• DOWNSHIFT .- hace que los datos del campo sean convertidos en minúsculas sinimportar el estado del teclado.

7/16/2019 Informix 4gl español2

http://slidepdf.com/reader/full/informix-4gl-espanol2 17/52

. Curso de Programación en INFORMIX-4GL

Ing. Juan Carlos Contreras Vi ll egas U.A.G.R.M.-I NFORMATI CA

Página 16 

• INCLUDE = ( val1, val2, ... ) .- Permite definir una lista de valores que serán

permitidos para dicho campo. Si se digita un valor que no esta en la lista de valores,la entrada no será aceptada. Se utiliza con DEFAULT.

• NOENTRY .- Hace que el cursor no entre en este campo evitando la edición de

dicho campo.

• PICTURE = "formato" .- Se utiliza para dar un formato de despliegue de datos, es

muy utilizado para campos de tipo numérico.se pueden usar los siguientes caractes para formato:

A Permite la entrada de un caracter alfabético# Permite el ingreso de un dígitoX Permite el ingreso de cualquier caracter.

REQUIRED .- Obliga a que sea ingresado algun valor para el campo. Si no seingresa ningún valor, INFORMIX hará que el cursor no pueda moverse a ningúnotro campo.

• REVERSE .- Hace que los datos en este campo se muestren en video inverso.

• UPSHIFT .- Hace que los datos del campo sean convertidos en mayúsculas sinimportar el estado del teclado.

• VERIFY .- Obliga a que el usuario digite dos veces el mismo dato antes de ser

aceptado.

• VALIDATE LIKE tabla.columna .- Permite que INFORMIX valide el datoingresado para dicho campo del mismo tipo de dato que la columna de una tablaespecificada.

Ejemplos:

A continuación mostraremos los formatos de pantalla para la pantalla de presentacióninicial, y el formato de pantalla para materiales.

7/16/2019 Informix 4gl español2

http://slidepdf.com/reader/full/informix-4gl-espanol2 18/52

. Curso de Programación en INFORMIX-4GL

Ing. Juan Carlos Contreras Vi ll egas U.A.G.R.M.-I NFORMATI CA

Página 17 

# Formato de pantalla para la pantalla de presentación del sistema de control de almacén

# NOMBRE : f_main.per # Designed by : Juan Carlos Contreras Villegas

DATABASE formonly

SCREEN{-------------------------------------------------------------------------------

S I S T E M A

D E C O N T R O L

D E A L M A C E N

[x]-------------------------------------------------------------------------------

}

ATTRIBUTESx=formonly.nada;

INSTRUCTIONSDELIMITERS " "

7/16/2019 Informix 4gl español2

http://slidepdf.com/reader/full/informix-4gl-espanol2 19/52

. Curso de Programación en INFORMIX-4GL

Ing. Juan Carlos Contreras Vi ll egas U.A.G.R.M.-I NFORMATI CA

Página 18 

#**** Formato de pantalla para el modulo de materiales

#**** Nombre : f_mate.per #**** CopyRight (1995) by Juan Carlos Contreras Villegas

DATABASE almacen

SCREEN{-------------------------------------------------------------------------------

M A T E R I A L E S

=====================

CODIGO [f000]

DESCRIPCION [f001 ]

PRECIO UNITARIO [f002 ]

STOCK MINIMO [f003 ]

CANT [f004 ]

-------------------------------------------------------------------------------}

end

TABLES Material

ATTRIBUTES

f000 = material.cod_mat,REVERSE,REQUIRED;f001 = material.descrip,REVERSE,UPSHIFT;

f002 = material.p_unit,REVERSE,NOENTRY;f003 = material.stock_min,REVERSE,PICTURE="####.###";f004 = material.cant,REVERSE,NOENTRY;

end

INSTRUCTIONSDELIMITERS " " 

7/16/2019 Informix 4gl español2

http://slidepdf.com/reader/full/informix-4gl-espanol2 20/52

. Curso de Programación en INFORMIX-4GL

Ing. Juan Carlos Contreras Vi ll egas U.A.G.R.M.-I NFORMATI CA

Página 19 

3.7.2.- Instrucciones para manejo de formatos de pantalla. desde 4GL.-

• OPEN FORM var_formato FROM "archivo_formato" Esta instrucción asocia el nombre de un archivo de formato de pantalla con unavariable 4GL.

• DISPLAY FORM var_formato Permite visualizar el formato de pantalla.

• CLEAR FORM Deja en blanco todos los campos del formato de pantalla.

• CLEAR Campo1,campo2, ... Limpia (deja en nulo ) todos los campos de pantalla especificados.

CLEAR SCREEN Limpia toda la pantalla.

• CLEAR WINDOW nombre_ventana

Limpia el contenido de una ventana especifica.

• CLOSE FORM var_formato Libera la memoria requerida para el formato de pantalla asociado a una variable.

Ejemplo:

Como ejemplo citaremos el procedimiento principal del modulo sca_mate.4gl

7/16/2019 Informix 4gl español2

http://slidepdf.com/reader/full/informix-4gl-espanol2 21/52

. Curso de Programación en INFORMIX-4GL

Ing. Juan Carlos Contreras Vi ll egas U.A.G.R.M.-I NFORMATI CA

Página 20 

{****** MODULO PRINCIPAL DE MATERIALES *********************** MODULO SCA_MATE.4GL *********************** CopyRight (1995) by Juan Carlos Contreras Villegas ****************

}DATABASE almacen

FUNCTION p_material()OPEN FORM form_mate FROM "f_mate"DISPLAY FORM form_mate

MENU "MATERIAL"COMMAND "Altas" "Permite registrar nuevos materiales"

CALL alta_mate()COMMAND "Bajas" "Permite dar de baja a materiales"

CALL baja_mate()

COMMAND "Modificaciones" "Permite modificar datos de materiales"CALL modi_mate()

COMMAND "Consultas" "Permite Realizar consultas de materiales".6CALL cons_mate()

COMMAND "Reportes" "Permite obtener algunos reportes de materiales"

CALL repo_mate()COMMAND "Salir" "Retorna al menu principal"

EXIT MENUEND MENUCLEAR SCREEN

CLOSE FORM form_mateEND FUNCTION 

7/16/2019 Informix 4gl español2

http://slidepdf.com/reader/full/informix-4gl-espanol2 22/52

. Curso de Programación en INFORMIX-4GL

Ing. Juan Carlos Contreras Vi ll egas U.A.G.R.M.-I NFORMATI CA

Página 21 

3.8.- CAPTURA DE DATOS.-

La sentencia INPUT permite la captura de datos desde pantalla a través de unformato de pantalla. Se puede usar esta sentencia de dos formas:

INPUT BY NAME lista_de_variables [ WITHOUT DEFAULTS ]

BEFORE FIELD NombreCampo Sentencias--------

AFTER FIELD NombreCampo Sentencias--------

AFTER INPUT Sentencias

--------ON KEY (tecla) 

Sentencias--------

END INPUT 

Donde :lista_de_variables es una lista de variables de programa que tienen el mismo nombre delos campos declarados en el formato de pantalla.

NombreCampo es el nombre de la columna asociada a las variables de campo delformato de pantalla

tecla es una tecla o una lista de teclas que pueden ser capturadas, normalmente estasteclas son teclas de funcion (por Ej. F1) o teclas control (por Ej control-g). Se puedenusar cualquier tecla excepto control-x,control-h,control-d,control-a,control-l,control-r.

 WITHOUT DEFAULTS .- Esta cláusula permite desplegar en la pantalla los valores

actuales de la lista de variables.

BEFORE FIELD NombreCampo.- Transfiere el control del programa a las sentencias

especificadas, un instante antes de que el cursor entre al campo especificado.

7/16/2019 Informix 4gl español2

http://slidepdf.com/reader/full/informix-4gl-espanol2 23/52

. Curso de Programación en INFORMIX-4GL

Ing. Juan Carlos Contreras Vi ll egas U.A.G.R.M.-I NFORMATI CA

Página 22 

AFTER FIELD  NombreCampo.- Transfiere el control del programa a las sentencias

especificadas, un instante antes de que el cursor salga del campo especificado.

AFTER INPUT .- Esta cláusula transfiere el control del programa a las sentencias

especificadas cuando el el usuario a terminado la introducción de datos.

ON KEY (tecla) .- Transfiere el control del programa a las sentencias especificadas

cuando el usuario pulse la tecla especificada.

También se pueden utilizar las siguientes sentencias solo dentro de INPUT.EXIT INPUT.- Permite salir de input inmediatamente.

NEXT FIELD NombreCampo .- Mueve el cursor al campo especificado.

INFIELD(NombreCampo) .- Es una función que devuelve verdadero (TRUE) si el cursor

esta en el campo especificado. Devuelve falso (FALSE) en caso contrario.

La segunda forma de escribir esta sentencia es la siguiente. 

INPUT lista_de_variables [ WITHOUT DEFAULTS ] FROM lista_de_campos BEFORE FIELD NombreCampo 

Sentencias--------

AFTER FIELD NombreCampo Sentencias--------

AFTER INPUT Sentencias--------

ON KEY (tecla) Sentencias--------

END INPUT 

En donde: la lista de campos son los campos del formato de pantalla que se asociaran alas variables de programa.

7/16/2019 Informix 4gl español2

http://slidepdf.com/reader/full/informix-4gl-espanol2 24/52

. Curso de Programación en INFORMIX-4GL

Ing. Juan Carlos Contreras Vi ll egas U.A.G.R.M.-I NFORMATI CA

Página 23 

Ejemplo:

Como ejemplo realizaremos los procedimientos de Altas, Bajas y modificación demateriales

FUNCTION alta_mate()DEFINE reg RECORD LIKE material.*,

codi LIKE material.cod_matMESSAGE "PULSE ESC=Finalizar CTRL-G = Grabar"INPUT BY NAME reg.*

AFTER FIELD cod_matIF reg.cod_mat IS NOT NULL THEN

SELECT cod_mat INTO codi FROM material WHERE cod_mat=reg.cod_mat

IF STATUS<>NOTFOUND THENERROR "Codigo ya existe"

LET reg.cod_mat=NULL NEXT FIELD cod_mat

END IF

END IFON KEY (control-G)

IF reg.cod_mat IS NOT NULL THENLET reg.p_unit=0LET reg.cant=0

INSERT INTO material VALUES (reg.*)

CLEAR FORMINITIALIZE reg.* TO NULLERROR “Registro grabado” NEXT FIELD cod_mat

END IFEND INPUT

CLEAR FORMEND FUNCTION

7/16/2019 Informix 4gl español2

http://slidepdf.com/reader/full/informix-4gl-espanol2 25/52

. Curso de Programación en INFORMIX-4GL

Ing. Juan Carlos Contreras Vi ll egas U.A.G.R.M.-I NFORMATI CA

Página 24 

#*************** PERMITE DAR DE BAJA MATERIALES ****************FUNCTION baja_mate()DEFINE reg RECORD LIKE material.*,

codi LIKE material.cod_matINITIALIZE reg.* TO NULL

MESSAGE " ESC=Finalizar CTRL-E = Eliminar Registro"INPUT codi FROM cod_mat

AFTER FIELD cod_mat

IF codi IS NOT NULL THENSELECT * INTO reg.* FROM material WHERE cod_mat=codi

IF STATUS=NOTFOUND THENERROR "REGISTRO NO ENCONTRADO"

ELSE

DISPLAY BY NAME reg.*END IF

END IFON KEY (control-e)

IF codi IS NOT NULL THEN

MENU "Eliminar"COMMAND "No" "No elimina el registro actual"

EXIT MENUCOMMAND "Si" "Elimina el registro actual"

DELETE FROM material WHERE cod_mat=codi

CLEAR FORMEXIT MENU

END MENU

MESSAGE " ESC=Finalizar CTRL-E = Eliminar Registro"INITIALIZE codi TO NULL

END IFEND INPUT

END FUNCTION

7/16/2019 Informix 4gl español2

http://slidepdf.com/reader/full/informix-4gl-espanol2 26/52

. Curso de Programación en INFORMIX-4GL

Ing. Juan Carlos Contreras Vi ll egas U.A.G.R.M.-I NFORMATI CA

Página 25 

#********** PERMITE MODIFICAR DATOS DE MATERIALES ****************FUNCTION modi_mate()DEFINE reg RECORD LIKE material.*

INITIALIZE reg.* TO NULLMESSAGE " ESC = Salir CTRL-G = Grabar" ATTRIBUTE (REVERSE)

INPUT BY NAME reg.* WITHOUT DEFAULTSAFTER FIELD cod_mat

IF reg.cod_mat IS NOT NULL THEN

SELECT * INTO reg.* FROM material WHERE cod_mat=reg.cod_matIF STATUS=NOTFOUND THEN

ERROR "CODIGO NO ENCONTRADO" NEXT FIELD cod_mat

ELSE

DISPLAY BY NAME reg.*END IF

END IFON KEY (control-g)

IF reg.cod_mat IS NOT NULL THEN

UPDATE material SET *=(reg.*) WHERE cod_mat=reg.cod_matERROR "REGISTRO ACTUALIZADO"

INITIALIZE reg.* TO NULLCLEAR FORM NEXT FIELD cod_mat

END IFEND INPUTEND FUNCTION 

7/16/2019 Informix 4gl español2

http://slidepdf.com/reader/full/informix-4gl-espanol2 27/52

. Curso de Programación en INFORMIX-4GL

Ing. Juan Carlos Contreras Vi ll egas U.A.G.R.M.-I NFORMATI CA

Página 26 

3.9.- QUERY BY EXAMPLE.-

El Query By Example (Consulta por ejemplos) Es una forma de escribir programas que permiten recuperar información basado en un criterio de búsquedaque el usuario ingresa con la ayuda de un formato de pantalla.

Para realizar un query by example necesitamos conocer cuatro instrucciones:- CONSTRUCT (Como el usuario introduce el criterio de búsqueda)- PREPARE (Como se prepara una sentencia SELECT ejecutable )

- Manejo de cursores- DISPLAY (como mostrar información en la pantalla )

3.9.1.- Como el usuario puede especificar el criterio de busqueda.-

La sentencia que permite al usuario especificar el criterio de búsqueda es

CONSTRUCT. La sentencia CONSTRUCT permite crear una variable CHAR (string)que contiene la condición para la cláusula WHERE de la sentencia SELECT.

La sentencia CONSTRUCT se puede usar de dos formas:Sintaxis:1) CONSTRUCT varString  ON lista_de_columnas FROM lista_de_campos 2) CONSTRUCT BY NAME varString  ON lista_de_columnas 

Donde :varString  .- Es la variable varString es una variable de programa de tipo CHAR.

lista_de_columnas .- Es una lista de las columnas de la o las tablas sobre las que sehara la consulta.lista_de_campos .- Es una lista de uno o mas campos del formato de pantalla

En la segunda forma de usar CONSTRUCT la lista de columnas debe tener el

mismo nombre de la lista de campos del formato de pantalla.

El usuario puede usar algunos operadores para especificar su criterio de

búsqueda.

7/16/2019 Informix 4gl español2

http://slidepdf.com/reader/full/informix-4gl-espanol2 28/52

. Curso de Programación en INFORMIX-4GL

Ing. Juan Carlos Contreras Vi ll egas U.A.G.R.M.-I NFORMATI CA

Página 27 

Operado Significado Tipos de dato Sintaxis Ejemplo= Igual a todos =dato =5

> Mayor que todos >dato >500

< Menor que todos <dato <300>= Mayor o igual que todos >=dato >=200

<= Menor o igual que todos <=dato <=400<> Diferente de todos <>dato <>200: Rango todos v_ini : val_fin 100:400* comodin (Cualquier Caracter CHAR *x, x*,*x* *JUAN*

? Comodin (un caracter) CHAR ?x,x?,?x?,x?? ?AR?A| O ( OR ) todos a | b | c | ... 2 | 3 | 4 | 20 

Ejemplo:

DEFINE cons,consu CHAR (300)CONSTRUCT BY NAME cons ON material.*

LET consu = "SELECT * FROM material WHERE ",cons CLIPPED

Si el usuario digita [ > 300 ] en el campo cod_mat y [ > 100 ] en el campo stock_min,la variable cons después de CONSTRUCT tendrá el siguiente valor cons = "material.cod_mat > 300 AND material. stock_min > 100". Luego la sentenciaLET permite tener en la variable consu un cadena que contiene la consulta, y su

resultado sera:consu = "SELECT * FROM material WHERE material.cod_mat > 300 AND

material.stock_min > 100".

3.9.2.- Como se prepara la sentencia SELECT ejecutable.-

Recordemos de el ejemplo anterior que la variable consu contiene un cadena en laque esta definida la consulta, pero esta cadena no puede ser ejecutada. La sentencia

PREPARE permite crear una sentencia ejecutable a partir de un string.

Sintaxis:PREPARE NombreSentencia FROM varString

Ejemplo:

PREPARE consu_mate FROM consu

Para poder ejecutar una sentecia SQL se puede utilizar la sentencia EXECUTE

(Ejemplo EXECUTE consu_mate), esto hara que se ejecute la sentencia SELECT.

7/16/2019 Informix 4gl español2

http://slidepdf.com/reader/full/informix-4gl-espanol2 29/52

. Curso de Programación en INFORMIX-4GL

Ing. Juan Carlos Contreras Vi ll egas U.A.G.R.M.-I NFORMATI CA

Página 28 

3.9.3.- Manejo de cursores.-

Los cursores con archivos temporales que se crean debido a una consulta, y quepueden ser manipulados. Existen dos clases de cursores : secuencial y el SCROLLCURSOR (acceso directo).

3.9.3.1.- SCROLL CURSOR.-

Un SCROLL CURSOR tiene cuatro propiedades:Situar el puntero al primer registro, Situar el puntero en el ultimo registro, situar elpuntero en el anterior y situar el puntero en el siguiente registro.

Las sentencias para manipular los cursores son los siguientes:DECLARE NombreCursor  SCROLL CURSOR FOR Select . . . 

Crea el cursor a partir de la consulta.OPEN NombreCursor  

 Abre el cursor y posiciona el puntero antes del primer registroFETCH FIRST NombreCursor  INTO lista_de_variables 

Posiciona el puntero en el primer registro del cursor y recupera sus datos en lasvariables especificadas en la lista de variables.FETCH LAST NombreCursor  INTO lista_de_variables 

Posiciona el puntero del cursor en el ultimo registro y recupera sus datos en las

variables especificadas en la lista de variablesFETCH NEXT NombreCursor  INTO lista_variables 

Posiciona el puntero del cursor en el ultimo registro y recupera sus datos en las

variables especificadas en la lista de variablesFETCH PREVIOUS NombreCursor  INTO lista_de_variables 

Posiciona el puntero del cursor en el ultimo registro y recupera sus datos en lasvariables especificadas en la lista de variables.CLOSE NombreCursor  

Cierra el cursor (destruye el archivo temporal).

7/16/2019 Informix 4gl español2

http://slidepdf.com/reader/full/informix-4gl-espanol2 30/52

. Curso de Programación en INFORMIX-4GL

Ing. Juan Carlos Contreras Vi ll egas U.A.G.R.M.-I NFORMATI CA

Página 29 

3.9.3.2.- CURSOR secuencial.-

Las sentencias que permiten manipular cursores secuenciales son las siguientes.DECLARE NombreCursor  CURSOR FOR Select ...

Crea el cursor a partir de la consulta.FOREACH NombreCursor  INTO lista_de_variables 

Senetencias--------

END FOREACH

La sentencia FOREACH avanza el cursor registro a registro recuperando los datos delcursor en las variables especificadas por la lista de variables. Es una especie de WHILENOT EOF DO

3.9.4.- Ejemplo) Como ejemplo citaremos los procedimientos de consulta de

materiales.

7/16/2019 Informix 4gl español2

http://slidepdf.com/reader/full/informix-4gl-espanol2 31/52

. Curso de Programación en INFORMIX-4GL

Ing. Juan Carlos Contreras Vi ll egas U.A.G.R.M.-I NFORMATI CA

Página 30 

#***** PROCEDIMIENTO QUE PERMITE REALIZAR CONSULTAS DE MATERIALES *******FUNCTION cons_mate()DEFINE cons,consu CHAR (300),

reg RECORD LIKE material.*

MESSAGE "Presione ESC para efectuar la consulta"

CONSTRUCT BY NAME cons ON material.* #construye las especificaciones del usr.

LET consu="SELECT * FROM material WHERE ",cons CLIPPEDPREPARE cons_mate FROM consu #prepara la consulta

DECLARE q_mat SCROLL CURSOR FOR cons_mateOPEN q_matFETCH FIRST q_mat INTO reg.*

IF STATUS<>NOTFOUND THENDISPLAY BY NAME reg.*MENU "VER"

COMMAND "Primero" "Ver el primer registro de la consulta"FETCH FIRST q_mat INTO reg.*DISPLAY BY NAME reg.*

COMMAND KEY (R) "pRoximo" "Ver Siguiente registro de la consulta"FETCH NEXT q_mat INTO reg.*IF STATUS=NOTFOUND THEN

ERROR "No hay mas registros hacia adelante"ELSE

DISPLAY BY NAME reg.*END IF

COMMAND "Anterior" "Ver anterior registro de la consulta"FETCH PREVIOUS q_mat INTO reg.*

IF STATUS=NOTFOUND THENERROR "No hay mas registros hacia atras"

ELSEDISPLAY BY NAME reg.*

END IFCOMMAND "Ultimo" "Ver el ultimo registro de la consulta"

FETCH LAST q_mat INTO reg.*DISPLAY BY NAME reg.*

COMMAND "Salir" "Retornar al menu de Materiales"EXIT MENU

END MENUELSE

ERROR "Ningun registro fue encontrado con las especificaciones dadas"END IFCLOSE q_matCLEAR FORM

END FUNCTION 

7/16/2019 Informix 4gl español2

http://slidepdf.com/reader/full/informix-4gl-espanol2 32/52

. Curso de Programación en INFORMIX-4GL

Ing. Juan Carlos Contreras Vi ll egas U.A.G.R.M.-I NFORMATI CA

Página 31 

3.10.- REPORTES.-

Para poder obtener un reporte es necesario seguir 2 pasos: construir el reporte, y darformato al reporte.

3.10.1.- Construccion del reporte.-Para poder ejecutar un reporte primero se debe seleccionar la información que sedesea, luego se construiye el reporte.

Para seleccionar la informacion para el reporte se debe realizarlo mediante lasentencia SELECT y uso de Cursores.

Para construir el reporte se procede de la siguiente forma:

START REPORT  NombreFuncReporte [TO "nomarch" | TO PRINTER ]

bucle sentencias--------------OUTPUT TO REPORT NombreFuncReporte (lista de parametros) 

fin bucleFINISH REPORT NombreFuncReporte

7/16/2019 Informix 4gl español2

http://slidepdf.com/reader/full/informix-4gl-espanol2 33/52

. Curso de Programación en INFORMIX-4GL

Ing. Juan Carlos Contreras Vi ll egas U.A.G.R.M.-I NFORMATI CA

Página 32 

3.10.2.- Formato del reporte.

REPORT NombreFuncReporte ( lista_de_argumentos )DEFINE lista_de_argumentos # se define el tipo de dato de los argumentosDEFINE lista_de_variables # se define las variables para el reporteOUTPUT

REPORT [ TO "nombre archivo" | TO PRINTER ]LEFT MARGIN n # margen izquierdo (Default=5)RIGHT MARGIN n # ancho de pagina en caracteres. Solo es efectivo si se

# utiliza la sentencia EVERY ROW (Default=132)TOP MARGIN n # margen superior (en líneas) (Default=3 líneas)BOTTOM MARGIN n # margen inferior ( en líneas ) (Default=3

líneas)PAGE LENGTH n # Longitud de pagina (en líneas) (Default=66 líneas)

FORMATFIRST PAGE HEADER # encabezado para la primer pagina

Sentencia--------

PAGE HEADER # encabezado para todas las paginasSentencia--------

ON EVERY ROW # cada registro que le llegaSentencia-----

PAGE TRAILER # pie de paginaSentencia----------

BEFORE GROUP OF variable # Subtítulos ( Antes que se ejecute ON EVERYSentencia # ROW)----

AFTER GROUP OF variable # Sub pie de pagina (después que se haya ejecutadoSentencia # ON EVERY ROW)----

ON LAST ROW # Especifica lo que Informix hará después que se haya

Sentencia # procesado la última línea que recibió REPORT----

END REPORT

7/16/2019 Informix 4gl español2

http://slidepdf.com/reader/full/informix-4gl-espanol2 34/52

. Curso de Programación en INFORMIX-4GL

Ing. Juan Carlos Contreras Vi ll egas U.A.G.R.M.-I NFORMATI CA

Página 33 

Donde n es un numero literal, es decir, n no puede ser una variable

Margen superior ->

Margen inferior ->

Logitud de pagina

RIGHT MARGIN(Ancho de pagina en caracters)

Titulo o encabezado de cada pagina

PAGE HEADER

----------------------------------------------

----------------------------------------------Pie de paginaPAGE TRAILER

Subtitulo: BEFORE GROUP OF

Subpie de pagina: AFTER GROUP OF

Lineas de detalle : ON EVERY ROW----------------------------------

Subtitulo: BEFORE GROUP OF

Lineas de detalle : ON EVERY ROW----------------------------------

Subpie de pagina: AFTER GROUP OF

 

Sentencias que se utilizan en la funcion reporte PRINT lista_de_expresiones Ejemplo)

PRINT p_unit, " ",catidad

SKIP n LINES # salta n lineas o imprime n lineas en blanco (n es una constante literal)

PAUSE "mensaje" # muestra un mensaje mientras se detiene un instanteclausula COLUMN

COLUMN n # avanza el cabezal de la impresora hasta la columna n

Ejemplo)PRINT "Hola", COLUMN 20, PAGENO USING "###"

7/16/2019 Informix 4gl español2

http://slidepdf.com/reader/full/informix-4gl-espanol2 35/52

. Curso de Programación en INFORMIX-4GL

Ing. Juan Carlos Contreras Vi ll egas U.A.G.R.M.-I NFORMATI CA

Página 34 

Variables y funciones que se pueden utilizar en una funcion de formato de reporte.

PAGENO # Numero de paginaLINENO # numero de linea { 0 .. (PAGE LENGHT -1) }TODAY # fecha del sistema

GROUP COUNT (expresion) [ WHERE Condicion ] #cuenta las expresiones que

cumplen con la condición dentro de un grupo.GROUP SUM (expresion) [ WHERE Condicion ] #suma la expresión en el grupoGROUP AVG (expresion) [ WHERE Condicion ] # calcula el promedio del grupoGROUP MIN (expresion) [ WHERE Condicion ] #calcula el menor de la expresiónGROUP MAX (expresion) [ WHERE Condicion ] #calcula el mayor de la expresión

Las funciones GROUP se utilizan normalmente en la sección AFTER GROUP OFEjemplo)

Como un primer ejemplo se citara el programa de reporte de materiales.

#******* FUNCION QUE PERMITE SELECCIONAR EL ORDEN DEL REPORTE *****FUNCTION repo_mate()

MENU "Reporte ordenado por"COMMAND "Codigo" "Reporte de materiales ordenado por codigo"

CALL repo_mate1("C")COMMAND "Descripcion" "Reporte de materiales ordenado por descripcion"

CALL repo_mate1("D")

COMMAND "Salir" "Retornar al menu de materiales"EXIT MENU

END MENU

END FUNCTION

#* PROCESO QUE SELECCIONA EL DISPOSITIVO DE SALIDA PARA EL REPORTE **FUNCTION repo_mate1(orden)

DEFINE orden CHAR(1)MENU "REPORTE DE MATERIALES - Salida por"

COMMAND "Pantalla" "Salida por pantalla"

CALL repo_mat_pant(orden)COMMAND "Impresora" "Salida por impresora"

CALL repo_mat_impr(orden)COMMAND "Salir" "Retorna a Seleccionar orden en reporte de materiales"

EXIT MENU

END MENUEND FUNCTION

7/16/2019 Informix 4gl español2

http://slidepdf.com/reader/full/informix-4gl-espanol2 36/52

. Curso de Programación en INFORMIX-4GL

Ing. Juan Carlos Contreras Vi ll egas U.A.G.R.M.-I NFORMATI CA

Página 35 

#***** PROCESO QUE CONSTRUYE EL REPORTE POR PANTALLA ******

FUNCTION repo_mat_pant(orden)DEFINE orden CHAR(1), titulo CHAR(11), reg RECORD LIKE material.*,

cons CHAR(100)

IF orden="C" THENLET cons="SELECT * FROM material ORDER BY cod_mat"

LET titulo="CODIGO"ELSE

LET cons="SELECT * FROM material ORDER BY descrip"

LET titulo="DESCRIPCION"END IF

PREPARE consu FROM consDECLARE q_mat2 CURSOR FOR consuSTART REPORT rep1_mate

FOREACH q_mat2 INTO reg.*OUTPUT TO REPORT rep1_mate(reg.*,titulo)

END FOREACHFINISH REPORT rep1_mate

END FUNCTION

#***** PROCESO QUE CONSTRUYE EL REPORTE POR IMPRESORA ******FUNCTION repo_mat_impr(orden)DEFINE orden CHAR(1), titulo CHAR(11), reg RECORD LIKE material.*,

cons CHAR(100)IF orden="C" THEN

LET cons="SELECT * FROM material ORDER BY cod_mat"

LET titulo="CODIGO"ELSE

LET cons="SELECT * FROM material ORDER BY descrip"LET titulo="DESCRIPCION"

END IF

PREPARE conti FROM consDECLARE q_mat5 CURSOR FOR conti

START REPORT rep2_mate TO PRINTER FOREACH q_mat5 INTO reg.*

OUTPUT TO REPORT rep2_mate(reg.*,titulo)

END FOREACHFINISH REPORT rep2_mate

END FUNCTION

7/16/2019 Informix 4gl español2

http://slidepdf.com/reader/full/informix-4gl-espanol2 37/52

. Curso de Programación en INFORMIX-4GL

Ing. Juan Carlos Contreras Vi ll egas U.A.G.R.M.-I NFORMATI CA

Página 36 

#************** FORMATO DE REPORTE POR PANTALLA **************

REPORT rep1_mate(reg,titulo)DEFINE reg RECORD LIKE material.*,titulo CHAR(11)

OUTPUT # margenesLEFT MARGIN 0

TOP MARGIN 0BOTTOM MARGIN 0PAGE LENGTH 21

FORMAT

PAGE HEADER # titulo para todas las paginasPRINT "Hospital Japones REPORTE DE MATERIALES",COLUMN 64,

"FECHA : ",TODAY USING "dd/mm/yy"

PRINT "Seccion Almacen ORDENADO POR ",titulo,COLUMN 64,"Pagina : ",PAGENO USING "####"

PRINT "---------------------------------------------------------","---------------------"

PRINT "CODIGO DESCRIPCION PRECIO UNIT. STOCK ",

"STOCK MINIMO"PRINT "---------------------------------------------------------",

"---------------------"ON EVERY ROW # linea de detalle

PRINT reg.cod_mat, USING "#### ",

reg.descrip," ",reg.p_unit USING "#,##&.&& ",reg.cant USING "#,##&.&&& ",

reg.stock_min USING "#,##&.&&&"

PAGE TRAILER # pie de paginaPAUSE "Pulse una tecla para continuar"

ON LAST ROW # despues de la ultima linea procesadaPRINT "---------------------------------------------------------",

"---------------------"PRINT COLUMN 50,"TOTAL --> ",SUM(reg.cant*reg.p_unit)

END REPORT

7/16/2019 Informix 4gl español2

http://slidepdf.com/reader/full/informix-4gl-espanol2 38/52

. Curso de Programación en INFORMIX-4GL

Ing. Juan Carlos Contreras Vi ll egas U.A.G.R.M.-I NFORMATI CA

Página 37 

#************** FORMATO DE REPORTE POR IMPRESORA **************REPORT rep2_mate(reg,titulo)DEFINE reg RECORD LIKE material.*,titulo CHAR(11)

OUTPUT # margenes

LEFT MARGIN 0TOP MARGIN 0BOTTOM MARGIN 0

FORMAT

PAGE HEADER # Titulo para cada paginaPRINT "Hospital Japones REPORTE DE MATERIALES",COLUMN 64,

"FECHA : ",TODAY USING "dd/mm/yy"PRINT "Seccion Almacen ORDENADO POR ",titulo,COLUMN 64,

"Pagina : ",PAGENO USING "####"PRINT "---------------------------------------------------------",

"---------------------"

PRINT "CODIGO DESCRIPCION PRECIO UNIT. STOCK ","STOCK MINIMO"

PRINT "---------------------------------------------------------","---------------------"

ON EVERY ROW # Linea de detallePRINT reg.cod_mat," ",

reg.descrip," ",

reg.p_unit USING "#,##&.&& ",reg.cant USING "#,##&.&&& ",

reg.stock_min USING "#,##&.&&&"

ON LAST ROW # Despues de haber procesado la ultima línea

PRINT "---------------------------------------------------------","---------------------"

PRINT COLUMN 50,"TOTAL --> ",SUM(reg.cant*reg.p_unit)

END REPORT

7/16/2019 Informix 4gl español2

http://slidepdf.com/reader/full/informix-4gl-espanol2 39/52

. Curso de Programación en INFORMIX-4GL

Ing. Juan Carlos Contreras Vi ll egas U.A.G.R.M.-I NFORMATI CA

Página 38 

3.11.- MANEJO DE ARREGLOS CON FORMATOS DE PANTALLA.-

Ingresos : Anular Consultar Salir  Ingresar 

Permite realizar las notas de ingreso de materiales---------------------------------------------------------------------------------------------------

---------------------------------------------------------------------------------------------------

DESCRIPCION PRECIO UNIT.CANTIDAD

Nro.IngresoFecha :

Proveedor CODIGO MONTO

TOTAL - >

INGRESOSDE MATERIALES

---------------------------------------------------------------------------------------------------

---------------------------------------------------------------------------------------------------

Hospital JaponesSeccion Almacen

 

Para poder trabajar con datos que están en múltiples filas (varios ítems) es hacenecesarioasociar un arreglo de programa con un arreglo de pantalla.

Como Ejemplo citaremos el formato de pantalla para registrar los ingresos demateriales.

7/16/2019 Informix 4gl español2

http://slidepdf.com/reader/full/informix-4gl-espanol2 40/52

. Curso de Programación en INFORMIX-4GL

Ing. Juan Carlos Contreras Vi ll egas U.A.G.R.M.-I NFORMATI CA

Página 39 

#****** FORMATO DE PANTALLA PARA INGRESOS DE MATERIALES ******

#****** FORMATO F_ING.PER ******DATABASE AlmacenSCREEN

{-----------------------------------------------------------------------------------

Hospital JAPONES INGRESOS Nro.Ingreso [c1 ]Seccion Almacen DE MATERIALES Fecha : [c2 ]

Proveedor [c3 ] [c4 ]CODIGO DESCRIPCION PRECIO UNIT. CANTIDAD MONTO -----------------------------------------------------------------------------------

[c5 ] [c6 ] [c7 ] [c8 ] [c9 ][c5 ] [c6 ] [c7 ] [c8 ] [c9 ]

[c5 ] [c6 ] [c7 ] [c8 ] [c9 ][c5 ] [c6 ] [c7 ] [c8 ] [c9 ][c5 ] [c6 ] [c7 ] [c8 ] [c9 ]

[c5 ] [c6 ] [c7 ] [c8 ] [c9 ][c5 ] [c6 ] [c7 ] [c8 ] [c9 ]

[c5 ] [c6 ] [c7 ] [c8 ] [c9 ]------------------------------------------------------------------------------------

Total -> [c10 ]

------------------------------------------------------------------------------------}

TABLES ingreso,proveedor,material,mat_ing

ATTRIBUTES

c1 = ingreso.nro_ing,REVERSE;

c2 = fecha,REVERSE;c3 = proveedor.cod_prov,REVERSE;c4 = nombre,REVERSE,UPSHIFT,NOENTRY;c5 = material.cod_mat,REVERSE;

c6 = descrip,REVERSE,UPSHIFT,NOENTRY;c7 = mat_ing.p_unit,REVERSE;

c8 = mat_ing.cant,REVERSE;c9 = formonly.monto TYPE DECIMAL(10,2),REVERSE,NOENTRY;c10 = formonly.montoTot TYPE DECIMAL(10,2),REVERSE,NOENTRY;

INSTRUCTIONS

DELIMITERS " "SCREEN RECORD arr_ing[8] ( material.cod_mat, descrip, mat_ing.p_unit, mat_ing.cant,

formonly.monto ) 

7/16/2019 Informix 4gl español2

http://slidepdf.com/reader/full/informix-4gl-espanol2 41/52

. Curso de Programación en INFORMIX-4GL

Ing. Juan Carlos Contreras Vi ll egas U.A.G.R.M.-I NFORMATI CA

Página 40 

3.11.1.- Instrucciones para manejo de arreglos con formatos de pantalla.-

• Captura de datos en arreglos.-

INPUT ARRAY arr_prog [ WITHOUT DEFAULTS ] FROM arr_pant.*  BEFORE FIELD NomCampo 

Sentencias # Estas sentencias se ejecutaran un instante

-------------- # antes de que el cursor entre al campo-------------- # especificado.

AFTER FIELD NomCampo 

Sentencias # Estas sentencias se ejecutaran cuando-------------- # el cursor intente salir del campo-------------- # especificado

BEFORE INSERT Sentencias # Estas sentencias se ejecutaran antes de-------------- # insertar una nueva fila--------------

AFTER INSERTSentencias # Estas sentencias se ejecutaran despues-------------- # de que se haya insertado una nueva fila--------------

BEFORE DELETE Sentencias # Estas sentencias se ejecutaran antes de-------------- # suprimir una fila del arreglo--------------

AFTER DELETE 

Sentencias # Estas sentencias se ejecutaran despues-------------- # de suprimir una fila del arreglo--------------

BEFORE ROW 

Sentencias # Estas sentencias se ejecutaran antes que-------------- # el cursor entre a una fila--------------

AFTER ROW  

Sentencias # Estas sentencias se ejecutaran cuando-------------- # el cursor esta saliendo de una fila--------------

ON KEY (tecla) 

Sentencias # Estas sentencias se ejecutaran cuando-------------- # se pulse la tecla especificada--------------

END INPUT

7/16/2019 Informix 4gl español2

http://slidepdf.com/reader/full/informix-4gl-espanol2 42/52

. Curso de Programación en INFORMIX-4GL

Ing. Juan Carlos Contreras Vi ll egas U.A.G.R.M.-I NFORMATI CA

Página 41 

• Mostrar datos de arreglos en pantalla

DISPLAY ARRAY ArrayProg TO ArrPant.*  ON KEY (tecla) 

----------------------

END DISPLAY 

3.11.2- Funciones y procedimientos para manejo de arreglos.-

SCR_LINE() .- Función que devuelve la posición de fila en la que se encuentra elcursor en el arreglo de pantalla.

ARR_CURR() .- Función que devuelve la posición de fila en la que se encuentra el

cursor en el arreglo de programa.

ARR_COUNT() .- Función que devuelve el numero de filas llenas que tiene el arreglo

de programa.

SET_COUNT(n) .- Procedimiento que le informa a INFORMIX el numero de filas

llenas que tiene un arreglo de programa. Este dato será utilizado para desplegar datosde arreglos en pantalla.

Ingresos : Anular Consultar Salir  Ingresar 

Permite realizar las notas de ingreso de materiales-------------------------------------------------------------------------------------

-------------------------------------------------------------------------------------

DESCRIPCION PRECIO UNIT.CANTIDAD

Nro.Ingreso

Fecha :

Proveedor CODIGO MONTO

TOTAL - >

INGRESOS

DE MATERIALES

-------------------------------------------------------------------------------------

-------------------------------------------------------------------------------------

Hospital Japones

Seccion Almacen

100

200

300

D

E

F

 

7/16/2019 Informix 4gl español2

http://slidepdf.com/reader/full/informix-4gl-espanol2 43/52

. Curso de Programación en INFORMIX-4GL

Ing. Juan Carlos Contreras Vi ll egas U.A.G.R.M.-I NFORMATI CA

Página 42 

DATABASE Almacen

SCREEN

{---------------------------------------------------------------------------------------------------------Hospital JAPONES INGRESOS Nro.Ingreso [c1 ]Seccion Almacen DE MATERIALES Fecha: [c2 ]

Proveedor [c3 ] [c4 ]

CODIGO DESCRIPCION PRECIO UNIT. CANTIDAD MONTO---------------------------------------------------------------------------------------------------------[c5 ] [c6 ] [c7 ] [c8 ] [c9 ]

[c5 ] [c6 ] [c7 ] [c8 ] [c9 ][c5 ] [c6 ] [c7 ] [c8 ] [c9 ]

[c5 ] [c6 ] [c7 ] [c8 ] [c9 ][c5 ] [c6 ] [c7 ] [c8 ] [c9 ][c5 ] [c6 ] [c7 ] [c8 ] [c9 ]

[c5 ] [c6 ] [c7 ] [c8 ] [c9 ][c5 ] [c6 ] [c7 ] [c8 ] [c9 ]

---------------------------------------------------------------------------------------------------------Total -> [c10 ]

---------------------------------------------------------------------------------------------------------

}TABLES ingreso,proveedor,material,mat_ing

 ATTRIBUTES

c1 = ingreso.nro_ing,REVERSE;c2 = fecha,REVERSE;

c3 = proveedor.cod_prov,REVERSE;c4 = nombre,REVERSE,UPSHIFT,NOENTRY;c5 = mat_ing.cod_mat,REVERSE;

c6 = descrip,REVERSE,UPSHIFT,NOENTRY;c7 = mat_ing.p_unit,REVERSE;

c8 = mat_ing.cant,REVERSE;c9 = formonly.monto TYPE DECIMAL(10,2),REVERSE,NOENTRY;c10= formonly.montoTot TYPE DECIMAL(10,2),REVERSE,NOENTRY;

INSTRUCTIONS

DELIMITERS " "SCREEN RECORD arr_ing[8] (mat_ing.cod_mat, descrip, mat_ing.p_unit,cant,

formonly.monto)

7/16/2019 Informix 4gl español2

http://slidepdf.com/reader/full/informix-4gl-espanol2 44/52

. Curso de Programación en INFORMIX-4GL

Ing. Juan Carlos Contreras Vi ll egas U.A.G.R.M.-I NFORMATI CA

Página 43 

DATABASE almacen

MAIN

DEFER QUIT

OPTIONS INPUT WRAPCALL p_ingreso()END MAIN

FUNCTION p_Ingreso()OPEN FORM f_ing FROM "f_ing"

DISPLAY FORM f_ingMENU "Ingresos"

COMMAND "Ingresar" "Registrar Notas de ingreso"

CALL ingresar()COMMAND "Anular" "Anular notas de ingreso emitidas"

COMMAND "Consultar" "Revisar notas de ingreso anteriores"COMMAND "Salir" "Salir del modulo de Ingresos"

EXIT MENU

END MENUCLOSE FORM f_ing

END FUNCTION

FUNCTION ingresar()

DEFINE salir SMALLINT,regi RECORD

nro_ing INTEGER,

fecha DATE,cod_prov LIKE proveedor.cod_prov,

nombre LIKE proveedor.nombreEND RECORD

LET salir=falseINITIALIZE regi.* TO NULL

WHILE NOT salir MESSAGE "^I=Editar Items ESC=Retornar al Menu Principal"CALL PedirEncabezado(regi.*) RETURNING regi.*,salir 

IF NOT salir THENCALL PedirDetalle(regi.*) RETURNING regi.*, salir 

END IFEND WHILE

END FUNCTION

7/16/2019 Informix 4gl español2

http://slidepdf.com/reader/full/informix-4gl-espanol2 45/52

. Curso de Programación en INFORMIX-4GL

Ing. Juan Carlos Contreras Vi ll egas U.A.G.R.M.-I NFORMATI CA

Página 44 

FUNCTION PedirEncabezado(regi)DEFINE salir SMALLINT,

regi RECORD

nro_ing INTEGER,

fecha DATE,cod_prov LIKE proveedor.cod_prov,nombre LIKE proveedor.nombre

END RECORD,

nroi INTEGER

LET salir=TRUEINPUT BY NAME regi.* WITHOUT DEFAULTS AFTER FIELD nro_ing

IF regi.nro_ing IS NOT NULL THENSELECT nro_ing INTO nroi FROM ingreso where nro_ing=regi.nro_ing

IF STATUS <> NOTFOUND THENERROR "Nota de ingreso ya fue registrada"NEXT FIELD nro_ing

END IFEND IF

 AFTER FIELD cod_provIF regi.cod_prov IS NOT NULL THEN

SELECT nombre INTO regi.nombre FROM proveedor 

WHERE cod_prov=regi.cod_provIF STATUS=NOTFOUND THEN

ERROR "Proveedor no ha sido registrado"

NEXT FIELD cod_provELSE

DISPLAY BY NAME regi.nombreEND IF

END IF

ON KEY (control-I)LET salir=FALSE

EXIT INPUTEND INPUTRETURN regi.*,salir 

END FUNCTION

7/16/2019 Informix 4gl español2

http://slidepdf.com/reader/full/informix-4gl-espanol2 46/52

. Curso de Programación en INFORMIX-4GL

Ing. Juan Carlos Contreras Vi ll egas U.A.G.R.M.-I NFORMATI CA

Página 45 

FUNCTION PedirDetalle(regi)DEFINE salir SMALLINT,

regi RECORD

nro_ing INTEGER,

fecha DATE,cod_prov LIKE proveedor.cod_prov,nombre LIKE proveedor.nombre

END RECORD,

VIng ARRAY [50] OF RECORD

cod_mat LIKE material.cod_mat,descrip LIKE material.descrip,p_unit LIKE mat_ing.p_unit,

cant LIKE mat_ing.cant,monto LIKE mat_ing.p_unit

END RECORD,montoTot MONEY(10),i,j,n SMALLINT,

canti LIKE mat_ing.cant,p_uni LIKE mat_ing.p_unit

MESSAGE "ESC=Retornar al Menu ^G=Registrar INGRESO ^V=Volver atras"LET salir=TRUE

FOR i=1 TO 50INITIALIZE Ving[i].* TO NULL

END FOR

# CALL set_count(0)CLEAR arr_ing.*

INPUT ARRAY Ving FROM arr_ing.* AFTER FIELD cod_mat

LET i=arr_curr()

LET j=scr_line()IF Ving[i].cod_mat IS NOT NULL THEN

SELECT descrip INTO ving[i].descrip FROM materialWHERE cod_mat=ving[i].cod_mat

IF STATUS = NOTFOUND THEN

ERROR "Material todavia no fue registrado"INITIALIZE ving[i].* TO NULL

NEXT FIELD cod_matELSE

DISPLAY ving[i].descrip,ving[i].p_unit TO

arr_ing[j].descrip,arr_ing[j].p_unitEND IF

7/16/2019 Informix 4gl español2

http://slidepdf.com/reader/full/informix-4gl-espanol2 47/52

. Curso de Programación en INFORMIX-4GL

Ing. Juan Carlos Contreras Vi ll egas U.A.G.R.M.-I NFORMATI CA

Página 46 

END IF

 AFTER FIELD p_unit,cantLET i=arr_curr()LET j=scr_line()

LET ving[i].monto=ving[i].p_unit*ving[i].cant

DISPLAY ving[i].monto TO arr_ing[j].monto AFTER DELETELET n=arr_count()LET montoTot=0

FOR i=1 TO nIF (ving[i].p_unit IS NOT NULL) AND (ving[i].cant IS NOT NULL) THEN

LET montoTot=montoTot + ving[i].p_unit*ving[i].cantEND IF

END FOR

DISPLAY BY NAME montoTot AFTER ROW

LET n=arr_count()LET montoTot=0FOR i=1 TO n

IF (ving[i].p_unit IS NOT NULL) AND (ving[i].cant IS NOT NULL) THENLET montoTot=montoTot + ving[i].p_unit*ving[i].cant

END IFEND FORDISPLAY BY NAME montoTot

ON KEY (control-v)LET salir=FALSEEXIT INPUT

ON KEY (control-G)LET n=arr_count()

LET j=0FOR i=1 TO n

IF ving[i].cod_mat IS NOT NULL THEN

LET j=j+1IF ving[i].p_unit IS NULL THEN

LET ving[i].p_unit=0END IFIF ving[i].cant IS NULL THEN

LET ving[i].cant=0END IF

SELECT MAX(nro_ing)+1 INTO regi.nro_ing FROM ingresoIF regi.nro_ing IS NULL THEN

LET regi.nro_ing=0

END IFINSERT INTO mat_ing VALUES (regi.nro_ing,ving[i].cod_mat,

7/16/2019 Informix 4gl español2

http://slidepdf.com/reader/full/informix-4gl-espanol2 48/52

. Curso de Programación en INFORMIX-4GL

Ing. Juan Carlos Contreras Vi ll egas U.A.G.R.M.-I NFORMATI CA

Página 47 

ving[i].cant,ving[i].p_unit)

SELECT cant,p_unit INTO canti,p_uni FROM materialWHERE cod_mat=ving[i].cod_mat

LET p_uni=((canti*p_uni) + (ving[i].cant*ving[i].p_unit))/

(canti+ving[i].cant)

LET canti=canti+ving[i].cantUPDATE material set cant=canti,p_unit=p_uniEND IF

END FOR

IF j>0 THENINSERT INTO ingreso (fecha,cod_prov,anulado) VALUES

(regi.fecha,regi.cod_prov,"0")ERROR "el INGRESO fue registrado"LET Salir=FALSE

CLEAR FORMINITIALIZE regi.* TO NULL

EXIT INPUTELSE

ERROR "No hay Items validos. el INGRESO no fue registrado"

END IFEND INPUT

RETURN regi.*, salir END FUNCTION

7/16/2019 Informix 4gl español2

http://slidepdf.com/reader/full/informix-4gl-espanol2 49/52

. Curso de Programación en INFORMIX-4GL

Ing. Juan Carlos Contreras Vi ll egas U.A.G.R.M.-I NFORMATI CA

Página 48 

{*** Procedimiento que permite revisar notas de ingreso e imprimirlas ****}FUNCTION cons_ingr()DEFINE regi RECORD

nro_ing INTEGER, fecha DATE, cod_prov LIKE proveedor.cod_prov,

nombre LIKE proveedor.nombre,anulado CHAR(1)END RECORD

INITIALIZE regi.* TO NULL

MESSAGE "^P = Imprimir Notas ESC = Retornar al Menu Principal"INPUT BY NAME regi.nro_ing

 AFTER FIELD nro_ingCLEAR FORMIF regi.nro_ing IS NOT NULL THEN

SELECT fecha,cod_prov,anulado INTO regi.fecha,regi.cod_prov,regi.anulado FROM ingreso WHERE nro_ing=regi.nro_ing

IF STATUS=NOTFOUND THENINITIALIZE regi.* TO NULLCLEAR FORM

ERROR "Nota de ingreso no fue encontrado"

ELSESELECT nombre INTO regi.nombre FROM proveedor 

WHERE cod_prov=regi.cod_provDISPLAY BY NAME regi.nro_ing THRU regi.nombreCALL mostrarDetalle(regi.*)

END IFEND IF

END INPUTCLEAR FORM

END FUNCTION

7/16/2019 Informix 4gl español2

http://slidepdf.com/reader/full/informix-4gl-espanol2 50/52

. Curso de Programación en INFORMIX-4GL

Ing. Juan Carlos Contreras Vi ll egas U.A.G.R.M.-I NFORMATI CA

Página 49 

{*** PROCESO QUE MUESTRA LOS ITEMS DE LA NOTA DE INGRESO ***}FUNCTION mostrarDetalle(regi)DEFINE regi RECORD

nro_ing INTEGER,

fecha DATE,cod_prov LIKE proveedor.cod_prov,nombre LIKE proveedor.nombre,

anulado CHAR(1)

END RECORD,

VIng ARRAY [50] OF RECORDcod_mat LIKE material.cod_mat,

descrip LIKE material.descrip,

p_unit LIKE mat_ing.p_unit,cant LIKE mat_ing.cant,

monto LIKE mat_ing.p_unitEND RECORD,

montoTot MONEY(10),

i,n SMALLINT

DECLARE q1_ing CURSOR FOR SELECTmi.cod_mat,m.descrip,mi.p_unit,mi.cant, mi.p_unit*mi.cant

FROM mat_ing mi,material m

WHERE (nro_ing=regi.nro_ing) AND (mi.cod_mat=m.cod_mat)

LET i=1

LET montoTot=0FOREACH q1_ing INTO ving[i].*

LET montoTot=montoTot + (ving[i].p_unit*ving[i].cant)LET i=i+1

END FOREACH

LET n=i-1IF n>0 THEN

CALL set_count(n)DISPLAY ARRAY ving TO arr_ing.*

ON KEY (control-p)

CALL print_ing(regi.*)END DISPLAY

END IFEND FUNCTION

7/16/2019 Informix 4gl español2

http://slidepdf.com/reader/full/informix-4gl-espanol2 51/52

. Curso de Programación en INFORMIX-4GL

Ing. Juan Carlos Contreras Vi ll egas U.A.G.R.M.-I NFORMATI CA

Página 50 

{*** PROCESO QUE PERMITE IMPRIMIR LA NOTA DE INGRESO ***}

FUNCTION print_ing(regi)

DEFINE regi RECORD

nro_ing INTEGER,fecha DATE,cod_prov LIKE proveedor.cod_prov,nombre LIKE proveedor.nombre,

anulado CHAR(1)END RECORD,

regd RECORDcod_mat LIKE material.cod_mat,

descrip LIKE material.descrip,

p_unit LIKE mat_ing.p_unit,cant LIKE mat_ing.cant,

monto LIKE mat_ing.p_unitEND RECORD

DECLARE q2_ing CURSOR FOR SELECT

mi.cod_mat,m.descrip,mi.p_unit,mi.cant,mi.p_unit*mi.cant FROM mat_ing mi,material m

WHERE (nro_ing=nroi) AND (mi.cod_mat=m.cod_mat)

START REPORT nota_ing

FOREACH q2_ing INTO regd.*OUTPUT TO REPORT nota_ing(regi.*,regd.*)

END FOREACH

FINISH REPORT nota_ing

END FUNCTION

7/16/2019 Informix 4gl español2

http://slidepdf.com/reader/full/informix-4gl-espanol2 52/52

. Curso de Programación en INFORMIX-4GL

{*** PROCESO QUE FORMATO A LA NOTA DE INGRESO IMPRESA ***}REPORT nota_ing(regi,regd)DEFINE regi RECORD

nro_ing INTEGER,

fecha DATE,cod_prov LIKE proveedor.cod_prov,nombre LIKE proveedor.nombre,anulado CHAR(1)

END RECORD,regd RECORD

cod_mat LIKE material.cod_mat,descrip LIKE material.descrip,p_unit LIKE mat_ing.p_unit,

cant LIKE mat_ing.cant,monto LIKE mat_ing.p_unit

END RECORDOUTPUT

LEFT MARGIN 0

TOP MARGIN 0BOTTOM MARGIN 0

PAGE LENGTH 21FORMAT

PAGE HEADER

PRINT "Hospital XYZ",COLUMN 32,"NOTA DE ENTREGA",COLUMN 69,"Nro.",regi.nro_ing USING "######"

PRINT "Seccion ALMACEN",COLUMN 63,"FECHA: ",

regi.fecha USING "dd/mm/yyyy"PRINT regi.cod_prov USING "#### ",regi.nombre

PRINT "--------------------------------------------------------------"PRINT "ITEM DESCRIPCION P.UNIT CANTIDAD MONTO"PRINT "--------------------------------------------------------------"

ON EVERY ROWPRINT regd.cod_mat USING "#### ",regd.descrip,

regd.p_unit USING " #,##&.&& ", regd.cant USING "#,###&.&&& ",regd.monto USING "##,##&.&&"

ON LAST ROW

PRINT "--------------------------------------------------------------"PRINT COLUMN 60,"Total ",SUM(regd.cant*regd.p_unit) USING "#,##&.&&"

END REPORT