Documentos de Académico
Documentos de Profesional
Documentos de Cultura
00 Informix 4gl Espanol2 PDF
00 Informix 4gl Espanol2 PDF
Por :
Ing. Juan Carlos Contreras Villegas
CONTENIDO
I INTRODUCCION
1. Que es el INFORMIX?
2. Que es una base de datos?
3. Que es una tabla?
4. Base de datos ejemplo.
I
INTRODUCCIN
1.1.- Introduccin.-
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 INFORMIX
con un ejemplo practico.
1 N
SECCION Recibe EGRESO
M
cod_pro nombre
p_unit
direc cant
PROVEEDOR
Contiene
1
fecha
p_unit
Hace cod_mat
nro_ing descrip cantidad
p_unit cant stock_min
N N
M
INGRESO Tiene MATERIAL
N
PROVEEDOR
cod_prov nombre direc
MATERIAL
cod_mat descrip p_unit stock_min cantidad
SECCION
cod_sec descrip
INGRESOS
nro_ing fecha cod_prov
EGRESOS
MAT_ING
nro_ing cod_mat cant p_unit
MAT_EGR
III
INFORMIX - 4GL
GLOBALS
aqui va la declaracion de variables globales
END GLOBALS
MAIN
Sentencias
------
------
------
END MAIN
Seccin GLOBALS.- En esta seccin se definen las variables que sern globales a todo
el programa.
Seccin REPORT.- Tambin se pueden definir funciones especiales que dan formato a
los reportes.
Nota:
Toda Sentencia en INFORMIX-4GL siempre comienza con una palabra
reservada, la sentencia puede estar escrita en mas de una lnea. Una sentencia 4GL
termina cuando comienza otra sentencia.
sca_main
modulos
programa
Un programa en 4GL esta compuesto por mdulos, de los cuales solo uno de ellos
debe tener la palabra reservada MAIN y sera considerado mdulo principal.
Linea de Menu Menu: Materiales Proveedores seCcion Ingresos Egresos Reportes Salir
Linea de ABC de materiales
Comentarios ---------------------------------------------------------------------------------------------------
S I S T E M A
Formatos
de D E C O N T R O L
pantalla
D E A L M A C E N
---------------------------------------------------------------------------------------------------
Linea de Mens.
Linea de Mens.
de error
3.2.3.- Arreglos-
En 4GL se pueden definir variables arreglos de n dimensiones simples o arreglos de
registros, 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.*
3.4.-ASIGNACION DE DATOS-
Sintaxis:
LET NombreVariable = Expresion
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 lnea en el editor, y termina
cuando comienza otra sentencia.
Ejemplo
1 INITIALIZE x,
y TO NULL
2 SELECT * FROM material
WHERE cod_mat > 200
ORDER BY descrip
3.5.2.-Alternativa.-
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
Nota: Existen dos sentencias exclusivas en men, es decir, solo se las puede usar
dentro de la estructura menu.
NEXT OPTION "Nombre Opcion" .- Hace que la opcin por default sea la indicada
por "nombre opcion"
La clusula KEY en Command permite que la opcin sea seleccionable por la tecla
indicada.
Por default las opciones pueden ser seleccionables por la primer letra de dicha opcin.
Si dos opciones comienzan con la misma letra se utiliza la clusula KEY para definir
otra letra y romper la ambigedad.
Ejemplo:
MAIN
OPEN FORM form_main FROM "f_main"
DISPLAY FORM form_main
MENU "SCA"
COMMAND "Material" "Mantenimiento de materiales"
CALL p_material()
DISPLAY FORM form_main
COMMAND key(C) "seCcion" "Mantenimiento de seccion"
CALL p_seccion()
DISPLAY FORM form_main
COMMAND "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_main
END MAIN
Los formatos de pantalla son archivos que contienen texto que sirve de interface
con el usuario. Se puede usar un formato de pantalla junto con las instrucciones de
manipulacin de datos para Ingresar, modificar, consultar y eliminar datos de las
tablas de una base de datos.
Para que un archivo de formato de pantalla pueda ser utilizado con un programa
4GL este debe ser compilado y tener una extensin .FRM
DATABASE NombreBaseDeDatos
SCREEN
{
Texto1 [v1 ]
Texto2 [v2 ]
texto3
[v3 ]
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
DOWNSHIFT .- hace que los datos del campo sean convertidos en minsculas sin
importar el estado del teclado.
INCLUDE = ( val1, val2, ... ) .- Permite definir una lista de valores que sern
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.
REVERSE .- Hace que los datos en este campo se muestren en video inverso.
UPSHIFT .- Hace que los datos del campo sean convertidos en maysculas sin
importar el estado del teclado.
VERIFY .- Obliga a que el usuario digite dos veces el mismo dato antes de ser
aceptado.
Ejemplos:
DATABASE formonly
SCREEN
{
-------------------------------------------------------------------------------
SISTEMA
DE CONTROL
DE ALMACEN
[x]
-------------------------------------------------------------------------------
}
ATTRIBUTES
x=formonly.nada;
INSTRUCTIONS
DELIMITERS " "
DATABASE almacen
SCREEN
{
-------------------------------------------------------------------------------
MATERIALES
=====================
CODIGO [f000]
DESCRIPCION [f001 ]
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
INSTRUCTIONS
DELIMITERS " "
CLEAR FORM
Deja en blanco todos los campos del formato de pantalla.
CLEAR SCREEN
Limpia toda la pantalla.
Ejemplo:
Como ejemplo citaremos el procedimiento principal del modulo sca_mate.4gl
Donde :
lista_de_variables es una lista de variables de programa que tienen el mismo nombre de
los campos declarados en el formato de pantalla.
tecla es una tecla o una lista de teclas que pueden ser capturadas, normalmente estas
teclas son teclas de funcion (por Ej. F1) o teclas control (por Ej control-g). Se pueden
usar cualquier tecla excepto control-x,control-h,control-d,control-a,control-l,control-r.
AFTER INPUT .- Esta clusula transfiere el control del programa a las sentencias
especificadas cuando el el usuario a terminado la introduccin de datos.
En donde: la lista de campos son los campos del formato de pantalla que se asociaran a
las variables de programa.
Ejemplo:
Como ejemplo realizaremos los procedimientos de Altas, Bajas y modificacin de
materiales
FUNCTION alta_mate()
DEFINE reg RECORD LIKE material.*,
codi LIKE material.cod_mat
MESSAGE "PULSE ESC=Finalizar CTRL-G = Grabar"
INPUT BY NAME reg.*
AFTER FIELD cod_mat
IF reg.cod_mat IS NOT NULL THEN
SELECT cod_mat INTO codi FROM material WHERE cod_mat=reg.cod_mat
IF STATUS<>NOTFOUND THEN
ERROR "Codigo ya existe"
LET reg.cod_mat=NULL
NEXT FIELD cod_mat
END IF
END IF
ON KEY (control-G)
IF reg.cod_mat IS NOT NULL THEN
LET reg.p_unit=0
LET reg.cant=0
INSERT INTO material VALUES (reg.*)
CLEAR FORM
INITIALIZE reg.* TO NULL
ERROR Registro grabado
NEXT FIELD cod_mat
END IF
END INPUT
CLEAR FORM
END FUNCTION
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 se
hara la consulta.
lista_de_campos .- Es una lista de uno o mas campos del formato de pantalla
Sintaxis:
PREPARE NombreSentencia FROM varString
Ejemplo:
La sentencia FOREACH avanza el cursor registro a registro recuperando los datos del
cursor en las variables especificadas por la lista de variables. Es una especie de WHILE
NOT EOF DO
IF STATUS<>NOTFOUND THEN
DISPLAY 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 THEN
ERROR "No hay mas registros hacia atras"
ELSE
DISPLAY BY NAME reg.*
END IF
COMMAND "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 MENU
ELSE
ERROR "Ningun registro fue encontrado con las especificaciones dadas"
END IF
CLOSE q_mat
CLEAR FORM
END FUNCTION
3.10.- REPORTES.-
Para poder obtener un reporte es necesario seguir 2 pasos: construir el reporte, y dar
formato al reporte.
----------------------------------------------
Pie de pagina
PAGE TRAILER
Margen inferior ->
RIGHT MARGIN
(Ancho de pagina en caracters)
SKIP n LINES # salta n lineas o imprime n lineas en blanco (n es una constante literal)
OUTPUT # margenes
LEFT MARGIN 0
TOP MARGIN 0
BOTTOM MARGIN 0
PAGE LENGTH 21
FORMAT
PAGE HEADER # titulo para todas las paginas
PRINT "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 "#,##&.&&&"
OUTPUT # margenes
LEFT MARGIN 0
TOP MARGIN 0
BOTTOM MARGIN 0
FORMAT
END REPORT
Proveedor
CODIGO DESCRIPCION PRECIO UNIT.CANTIDAD MONTO
---------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------
TOTAL - >
---------------------------------------------------------------------------------------------------
Para poder trabajar con datos que estn en mltiples filas (varios tems) es hace
necesario
asociar un arreglo de programa con un arreglo de pantalla.
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 )
ARR_COUNT() .- Funcin que devuelve el numero de filas llenas que tiene el arreglo
de programa.
Proveedor
CODIGO DESCRIPCION PRECIO UNIT.CANTIDAD MONTO
---------------------------------------------------------------------------------------------------
100 D
200 E
300 F
---------------------------------------------------------------------------------------------------
TOTAL - >
---------------------------------------------------------------------------------------------------
DATABASE Almacen
SCREEN
{
---------------------------------------------------------------------------------------------------------
Hospital JAPONES INGRESOS Nro.Ingreso [c1 ]
Seccion Almacen DE MATERIALES Fecha: [c2 ]
INSTRUCTIONS
DELIMITERS " "
SCREEN RECORD arr_ing[8] (mat_ing.cod_mat, descrip, mat_ing.p_unit,cant,
formonly.monto)
DATABASE almacen
MAIN
DEFER QUIT
OPTIONS INPUT WRAP
CALL p_ingreso()
END MAIN
FUNCTION p_Ingreso()
OPEN FORM f_ing FROM "f_ing"
DISPLAY FORM f_ing
MENU "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 MENU
CLOSE 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.nombre
END RECORD
LET salir=false
INITIALIZE regi.* TO NULL
WHILE NOT salir
MESSAGE "^I=Editar Items ESC=Retornar al Menu Principal"
CALL PedirEncabezado(regi.*) RETURNING regi.*,salir
IF NOT salir THEN
CALL PedirDetalle(regi.*) RETURNING regi.*, salir
END IF
END WHILE
END FUNCTION
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=TRUE
INPUT BY NAME regi.* WITHOUT DEFAULTS
AFTER FIELD nro_ing
IF regi.nro_ing IS NOT NULL THEN
SELECT nro_ing INTO nroi FROM ingreso where nro_ing=regi.nro_ing
IF STATUS <> NOTFOUND THEN
ERROR "Nota de ingreso ya fue registrada"
NEXT FIELD nro_ing
END IF
END IF
AFTER FIELD cod_prov
IF regi.cod_prov IS NOT NULL THEN
SELECT nombre INTO regi.nombre FROM proveedor
WHERE cod_prov=regi.cod_prov
IF STATUS=NOTFOUND THEN
ERROR "Proveedor no ha sido registrado"
NEXT FIELD cod_prov
ELSE
DISPLAY BY NAME regi.nombre
END IF
END IF
ON KEY (control-I)
LET salir=FALSE
EXIT INPUT
END INPUT
RETURN regi.*,salir
END FUNCTION
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,
END IF
AFTER FIELD p_unit,cant
LET 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 DELETE
LET n=arr_count()
LET montoTot=0
FOR i=1 TO n
IF (ving[i].p_unit IS NOT NULL) AND (ving[i].cant IS NOT NULL) THEN
LET montoTot=montoTot + ving[i].p_unit*ving[i].cant
END IF
END FOR
DISPLAY BY NAME montoTot
AFTER ROW
LET n=arr_count()
LET montoTot=0
FOR i=1 TO n
IF (ving[i].p_unit IS NOT NULL) AND (ving[i].cant IS NOT NULL) THEN
LET montoTot=montoTot + ving[i].p_unit*ving[i].cant
END IF
END FOR
DISPLAY BY NAME montoTot
ON KEY (control-v)
LET salir=FALSE
EXIT INPUT
ON KEY (control-G)
LET n=arr_count()
LET j=0
FOR i=1 TO n
IF ving[i].cod_mat IS NOT NULL THEN
LET j=j+1
IF ving[i].p_unit IS NULL THEN
LET ving[i].p_unit=0
END IF
IF ving[i].cant IS NULL THEN
LET ving[i].cant=0
END IF
SELECT MAX(nro_ing)+1 INTO regi.nro_ing FROM ingreso
IF regi.nro_ing IS NULL THEN
LET regi.nro_ing=0
END IF
INSERT INTO mat_ing VALUES (regi.nro_ing,ving[i].cod_mat,
ving[i].cant,ving[i].p_unit)
SELECT cant,p_unit INTO canti,p_uni FROM material
WHERE 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].cant
UPDATE material set cant=canti,p_unit=p_uni
END IF
END FOR
IF j>0 THEN
INSERT INTO ingreso (fecha,cod_prov,anulado) VALUES
(regi.fecha,regi.cod_prov,"0")
ERROR "el INGRESO fue registrado"
LET Salir=FALSE
CLEAR FORM
INITIALIZE regi.* TO NULL
EXIT INPUT
ELSE
ERROR "No hay Items validos. el INGRESO no fue registrado"
END IF
END INPUT
RETURN regi.*, salir
END FUNCTION
ELSE
SELECT nombre INTO regi.nombre FROM proveedor
WHERE cod_prov=regi.cod_prov
DISPLAY BY NAME regi.nro_ing THRU regi.nombre
CALL mostrarDetalle(regi.*)
END IF
END IF
END INPUT
CLEAR FORM
END FUNCTION
LET i=1
LET montoTot=0
FOREACH q1_ing INTO ving[i].*
LET montoTot=montoTot + (ving[i].p_unit*ving[i].cant)
LET i=i+1
END FOREACH
LET n=i-1
IF n>0 THEN
CALL set_count(n)
DISPLAY ARRAY ving TO arr_ing.*
ON KEY (control-p)
CALL print_ing(regi.*)
END DISPLAY
END IF
END FUNCTION
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 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
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)
END FUNCTION