Manual Usuario Informix 4GL

Embed Size (px)

Citation preview

Manual de Usuario

Manual de UsuarioSintaxis del lenguaje 4GL.Al igual que un programa en C, un programa en 4GL consta de uno o varios mdulos en los que se definen variables, funciones, formularios de entrada y listados. La estructura de cada mdulo ser la siguiente: [DATABASE ] [declaraciones variables globales] funciones [forms] [reports] En uno de los mdulos debe haber una funcin llamada main. La funcin main es la que se ejecuta al iniciarse el programa. Si el programa accede a una base de datos, ser necesario especificar el nombre de la misma en la primera lnea del programa, mediante la lnea DATABASE

ComentariosSe pueden incluir comentarios dentro de los programas para que su cdigo sea ms fcil de comprender. hy4GL permite introducir los comentarios entre llaves, en el estilo de Informix4GL o bien entre caracteres /* y */, al estilo de C. El compilador detecta los comentarios anidados e ignora todo el cdigo que encuentra entre las marcas de inicio y final de comentario. Ej: {Funcion: suma_totales; calcula el importe total de una fra.} function suma_totales() define j integer /* j lo uso para bucles */ /* ya no necesito esta variable. define suma integer /* para ir calculando... */ */ ...

hy4GL: compilador de lenguaje 4GL para PostgreSQL

21

Manual de Usuario

Declaraciones de variables:Tipos de datos:El lenguaje soporta los siguientes tipos de datos bsicos:

Integer El rango permitido para nmeros enteros es el de un long int de C. Depender de la plataforma en la que se est trabajando. En Linux, usando gcc 2.7, el rango es entre 2.147.483.647 y 2.147.483.648

Float Este tipo permite usar nmeros reales. Se implementa mediante el tipo de datos double de C, por lo que la precisin depender del compilador de C usado.

Char(x) Permite usar cadenas de caracteres. No hay lmite para el tamao de la cadena. A diferencia del lenguaje C, no es necesario reservar un carcter para la marca de fin de cadena puesto que lo reserva el compilador automticamente. Se puede omitir la longitud de la cadena. En este caso, la variable tendr una longitud de 1 carcter. En este tipo de datos slo se podrn almacenar caracteres imprimibles. No est pensado para almacenar datos binarios.

Date Para almacenar fechas. Se permiten fechas desde el 1de Enero del ao 1 (d.C.) hasta bien pasado el ao 40.000 (creo que con esto no habr problemas en el 2000).

Time Permite almacenar horas con precisin hasta las milsimas de segundo. Aunque el tipo de datos permite almacenar la hora con esa precisin, las milsimas de segundo se pierden al realizar operaciones aritmticas.

Datetime Almacena un instante, representado por fecha y hora. Las caractersticas comentadas en los dos tipos anteriores son aplicables a ste.

Interval Almacena un intervalo de tiempo, representado por un nmero de horas, minutos y segundos. La diferencia entre dos datetimes es un intervalo.

Adems de los tipos de datos bsicos, se permite definir registros, formados por campos de tipos bsicos. No se permite que un campo de un registro sea, a su vez, otro registro.

hy4GL: compilador de lenguaje 4GL para PostgreSQL

22

Manual de Usuario

Declaracin de variables:Como en cualquier lenguaje de programacin, hy4GL permite definir variables en las que se almacenarn los datos con los que se est trabajando. hy4GL es un lenguaje tipado: cada variable es de un tipo determinado, aunque se ver ms adelante que el propio lenguaje realiza la conversin de tipos automticamente. El nombre de las variables debe empezar por una letra o un signo de subrayado _, y puede contener cualquier combinacin de letras, nmeros y signos _. El mbito de una variable depende de la parte del mdulo en la que se declare. As, si una variable se declara dentro de una funcin, ser visible (se podr acceder a su contenido) solamente desde dentro de esa misma funcin. Si la variable se declara fuera de una funcin, ser visible desde cualquier funcin de este mdulo. No es posible usar en un mdulo una variable que est declarada en otro mdulo distinto. La sintaxis de la declaracin de variables es la siguiente: DEFINE [,,...] Ej: define define define define define define i integer hora time hoy,ayer date ahora datetime nombre,apellidos char(50) tecla char

Si la aplicacin accede a bases de datos, es posible definir variables del mismo tipo que determinado campo de una tabla en la base de datos. La sintaxis para ello es: DEFINE LIKE . Para ello es necesario que se haya indicado el nombre de la base de datos en la instruccin DATABASE Ej: database contabilidad define cuenta like cuentas.numero define importe like mayor.importe

hy4GL: compilador de lenguaje 4GL para PostgreSQL

23

Manual de Usuario

Es posible definir registros que agrupen varias variables en una sola estructura. Para definir un registro se usar la siguiente sintaxis: DEFINE RECORD ... END RECORD Para acceder a un campo de un registro se especificar el nombre del registro y el del campo separados por un punto. Para referirse a la lista completa de campos de un registro, se usar el nombre del registro seguido de .* Ej: define cliente record codigo integer nombre char(50) apellidos char(50) end record let cliente.nombre="JUAN" let cliente.*=busca_cliente(cliente.nombre) Se puede definir un registro con la misma estructura que una tabla de la base de datos: DEFINE RECORD LIKE .* Por supuesto, ser necesario haber indicado el nombre de la base de datos mediante la instruccin DATABASE Ej: database contabilidad define reg record like mayor.* define rcta record like cuentas.*

hy4GL: compilador de lenguaje 4GL para PostgreSQL

24

Manual de Usuario

Funciones:Las funciones se declararn con la siguiente sintaxis: FUNCTION ( [par1 [,par2,...]] ) declaraciones variables locales y parmetros sentencias END FUNCTION Si la funcin rebice parmetros, se relacionarn los nombres de los parmetros formales entre los parntesis. Hay que tener en cuenta que los parmetros habr que declararlos dentro de la funcin, junto con las variables locales, si las hubiera. Ej: function graba_registro(r,donde) define r record like clientes.* define donde char(20) if donde="clientes" then insert into clientes values (r.*) else insert into proveedores values(r.*) end if end function La funcin main, es una excepcin. Su sintaxis es: MAIN declaraciones variables locales sentencias END MAIN La funcin main es, como se coment anteriormente, la primera funcin que se ejecuta al lanzar la aplicacin. La variable global arg_count indica el nmero de parmetros que se han enviado al programa, y la funcin arg_val(i) devuelve el parmetro nmero i. Al igual que en C, el parmetro nmero cero es el nombre del programa.

hy4GL: compilador de lenguaje 4GL para PostgreSQL

25

Manual de Usuario

Ej: main define param char(50) if arg_count=0 then display "Error. Numero de parametros erroneo." exit program end if let param=arg_val(1) ... end main Una funcin puede devolver varios parmetros usando la sentencia return, cuya sintaxis es: RETURN [[,[,....]]] El lenguaje soporta recursividad sin que exista ms lmites que los impuestos por el compilador de C usado Ej: function factorial(n) define n integer if n=0 then return 1 else return n*(factorial(n1)) end if end function

hy4GL: compilador de lenguaje 4GL para PostgreSQL

26

Manual de Usuario

Expresiones:Expresiones simples:hy4GL soporta las siguientes expresiones simples:

Variable Basta con indicar el nombre de la variable. El tipo de la expresin ser el mismo que el tipo de la variable. La variable debe ser de un tipo bsico, no permitindose para este tipo de expresiones nombres de registros. Ej: define a integer define r record like clientes.* display a display r.nombre Nmero Se pueden usar nmeros enteros o reales. Para indicar decimales se usa el punto . y no se deben usar separadores para los miles. Si el nmero no lleva el punto decimal, la expresin ser de tipo entero, mientras que ser de tipo float en caso de llevarlo. Ej: display 4 display 4.5

Cadena Se expresarn las cadenas entre comillas dobles "". La expresin ser de tipo cadena. Ej: display "Error." display "No se encuentra el cliente"

hy4GL: compilador de lenguaje 4GL para PostgreSQL

27

Manual de Usuario

Operadores USING, CLIPPED y [ ]:Operador USINGEl operador USING convierte una expresin numrica al formato especificado en la mscara. La sintaxis es la siguiente: expresion USING mascara La mscara consistir en una serie de caracteres ,#,&,, y .. La mscara es aplicada a la expresin numrica, devolviendo una cadena en la que los caracteres ,# y & son sustituidos por los dgitos correspondientes. El smbolo # es usado para rellenar con espacios a la izquierda; el smbolo rellena tambin con espacios, excepto en la primera posicin en la que no haya dgtos, que ser sustituida por el signo en caso de que el nmero sea negativo. El smbolo & se usa para rellenar con ceros las posiciones correspondientes. Los signos , se usan para separar los miles y el . para indicar la posicin del punto decimal Ej: 0 using "##,###.##" 10.23 using "##,###.##" 1123.23 using "##,###.##" 1123.23 using "&&,&&&.&&" 1123.23 using ",&.&&" > > > > > " . " " 10.23" " 1,123.23" "01,123.23" "1,123.23"

Operador CLIPPEDEl operador CLIPPED corta los espacios finales de una cadena. La expresin resultante es una nueva cadena. Su sintaxis es la siguiente: expresion CLIPPED Ej: let let let let let nombre= "JUAN " apellidos="PEREZ" nomape=nombre+apellidos /* nomape="JUAN PEREZ" */ nomape=nombre clipped+apellidos /* nomape="JUANPEREZ" */ nomape=nombre clipped+" "+apellidos /* nomape="JUAN PEREZ*/

hy4GL: compilador de lenguaje 4GL para PostgreSQL

28

Manual de Usuario

Operador [ ]El operador [ ] permite obtener una subcadena a partir de una expresin. La nueva expresin resultante es de tipo cadena. Su sintaxis es la siguiente: expresion[i,j] expresion[i] Entre los corchetes se indicarn la posicin de inicio y final de la subcadena que se desea obtener. Se puede omitir la posicin de final, con lo que se tomar la subcadena que comienza y termina en la posicin i. Ej: define ccc char(20) define entidad,sucursal char(4) define dc1,dc2 char define cuenta char(10) prompt "Introduzca su numero de cuenta (20 digitos) " for ccc let entidad=ccc[1,4] let sucursal=ccc[5,8] let dc1=ccc[9] let dc2=ccc[10] let cuenta=ccc[11,20]

hy4GL: compilador de lenguaje 4GL para PostgreSQL

29

Manual de Usuario

Llamadas a funcionesLos valores devueltos por una funcin son usados como expresiones. El tipo de estas expresiones depender del tipo de los valores devueltos por la funcin. Ej: define hora time let hora=time() /* la funcion time() devuelve la hora actual */

Operadores binariosLos siguientes operadores transforman dos expresiones en una nueva expresin. El tipo de la expresin resultante depender de los tipos de las expresiones originales.

Operador +Este operador toma dos expresiones y devuelve una nueva expresin, resultado de sumar las dos expresiones originales. El significado de sumar depende del tipo de las expresiones originales. En el siguiente cuadro se detalla el comportamiento de este operador:+ Char "10" Char ("10") Char "1010" Char "105" Integer (5) Float (5.5) Char (105.5" Date (10/12/1998) Char "1010121998" Time (10:10:05) Char "1010:10:05" Datetime (10/12/1998 10:10:05) Char "1010121998 10:10:05" Integer (5) Char "510" Integer 10 Float 10.5 Date 15/12/1998 Time 10:10:10 Datetime 10121998 10:10:10" Float (5.5) Char "5.500010" Float 10.5 Float 11 Date 15/12/1998 Time 10:10:10 Datetime 10121998 10:10:10" Date (1012 1998) Time (10:10:05) Char "1012199810" Date Date No permitido Datetime 10121998 10:10:05 Char Time Time 10:10:10 Datetime 10121998 10:10:05 Datetime Char Datetime Datetime No permitido No permitido No permitido Datetime 15121998 13:20:25 No permitido No permitido Time 13:20:25 No permitido No permitido Interval 123:10:25 Interval 123:10:25 Char "10123:10:20" Interval (123:10:20)

15121998 15121998

"10:10:05.00010" 10:10:10

(10121998 10121998 10:10:05.00010 10:10:05) Interval (123:10:20) Char 123:10:20.010

10121998 10121998 10:10:10 Interval 123:10:25 10:10:10 Interval 123:10:25 No permitido Time 13:20:25 Datetime 15121998 13:20:25

Interval 246:20:40

hy4GL: compilador de lenguaje 4GL para PostgreSQL

210

Manual de Usuario

Operador Devuelve la expresin resultante de calcular la diferencia entre las dos expresiones originales. El comportamiento de este operador, as como el tipo de la expresin resultante depende de las expresiones originales: Char "10" Char ("10") Integer (5) Float (5.5) Date (1012 1998) Time (10:10:05) Datetime (10121998 10:10:05) Interval (123:10:20) No permitido No permitido No permitido Integer 5 Float 4.5 No permitido No permitido Integer (5) No permitido Integer 0 Float 0.5 Date 5121998 Float (5.5) Date (10/12/1998) Time (10:10:05) No permitido Datetime (10/12/1998 10:10:05) No permitido Interval (123:10:20) No permitido

No permitido No permitido

Float 0.5 Float 0 Date 15121998

No permitido

No permitido

No permitido

No permitido

No permitido

No permitido

No permitido

No permitido

Integer 0 diferencia en dias

No permitido

Integer 0 diferencia en dias

No permitido

Time 10:10:00 Datetime

Time 10:10:10 Datetime

No permitido

Time 00:00:00

No permitido

Time 06:59:45

Interval 10:10:05

Datetime 10121998 00:00:00 No permitido

Interval 00:00:00

Datetime 5121998 06:59:45

10121998 10121998 10:10:00 Interval 123:10:15 10:10:00 Interval 123:10:15

No permitido

No permitido

Interval 00:00:00

Operadores * y /Estos operadores realizan las operaciones aritmticas de producto y divisin respectivamente. Slo pueden operar entre nmeros, ya sean reales o enteros. La expresin que se obtiene es de tipo real. Si se intenta operar con expresiones que no son de tipo numrico, stas se convierten automticamente a tipo real.

hy4GL: compilador de lenguaje 4GL para PostgreSQL

211

Manual de Usuario

Operadores de comparacinPara realizar comparaciones de expresiones se usan los operadores expresion1 expresion1 expresion1 expresion1 expresion1 expresion1 < = > expresion2 expresion2 expresion2 expresion2 expresion2 expresion2

Las expresiones numricas se comparan, como es de esperar, por su valor. Las expresiones de tipo cadena se comparan segn su orden alfabtico, teniendo en cuenta que todas las maysculas van delante de las minsculas. Las expresiones de tipo fecha/hora se comparan segn su antigedad. De esta manera, se cumple que: 01011998 < 02011998 01011998 10:10:25 > 01011998 10:10:24 Estas expresiones devuelve 1 si se cumple la condicin, y 0 en caso contrario.

Operadores lgicosLas siguientes expresiones realizan las operaciones lgicas comunes: ! expresion expresion AND expresion expresion OR expresion Estas expresiones devuelven verdadero (1) o falso (0) segn se cumpla o no la condicin.

hy4GL: compilador de lenguaje 4GL para PostgreSQL

212

Manual de Usuario

Precedencia de operadoresLa precedencia de los operadores en hy4GL es, de mayor a menor, la siguiente: ! USING CLIPPED [] * / + < AND OR

>=

Se han colocado en la misma lnea aquellos operadores que tienen la misma precedencia. Se pueden agrupar expresiones entre parntesis para conseguir que las operaciones se realicen en un orden determinado

hy4GL: compilador de lenguaje 4GL para PostgreSQL

213

Manual de Usuario

Sentencias:C Embebido (ampliacin a Informix4GL)El lenguaje aporta una gran funcionalidad y permite al programador relizar la mayora de las acciones necesarias para el desarrollo de una aplicacin de bases de datos. Sin embargo, siempre hay acciones que no es posible realizar directamente usando las sentencias del lenguaje 4GL o que por motivos de eficiencia es preferible realizarlas en lenguaje C. Para estos casos, hy4GL permite insertar sentencias en C dentro del fuente en 4GL. La sintaxis para ello es la siguiente: ... sentencias 4GL .c [declaraciones C] sentencias C c. sentencias 4GL ... Dentro del bloque de C se puede acceder a los datos almacenados en las variables del programa. Vase la gua de implementacin para conocer los tipos de datos con los que se implementan las variables. Tambin se pueden definir variables cuyo mbito ser el del bloque de C exclusivamente. Ej: define usuario char(50) define directorio char(255) /* leo el nombre de usuario y el directorio actual * .c strncpy(usuario,getenv("LOGNAME"),sizeof(usuario)1); getcwd(directorio,sizeof(directorio1)); c. if usuario="root" then display "No puede ejecutar el programa como root." exit program end if

hy4GL: compilador de lenguaje 4GL para PostgreSQL

214

Manual de Usuario

Asignacin:Para asignar valores a variables se usar la sentencia LET. Su sintaxis es la siguiente: LET = expresion El lenguaje realiza la conversin automtica de tipos, por lo que no es necesario que la expresin sea del mismo tipo que la variable de destino. Ej: define dt datetime define d date define i integer define c char(40) let dt=datetime() /* Asigna a dt la fecha y hora actual */ let d=dt /* Asigna a d la fecha actual */ /* Asigna a c una cadena con la fecha y hora contenida en dt en el formato "ddmmaaaa HH:MM:SS.mmm" */ let c=dt let i="50"+"20" /* Asigna a i el numero 5020 */

Asignaciones mltiples (ampliacin a Informix4GL)Se permite realizar varias asignaciones en una misma sentencia LET. La sintaxis para ello es la siguiente1: LET ,,... = expresion1,expresion2,... A la variable id1 se le asignar el valor de la expresin expresion1; a la variable id2 el valor de la expresin expresion2, etc. Habr que prestar especial atencin en que el nmero de variables de destino sea igual al nmero de valores devueltos por las expresiones. Especial cuidado hay que tener al llamar a funciones, ya que una funcin puede devolver varios valores: define sw_encontrado integer define nombre,apellidos,direccion char(50) LET sw_encontrado, nombre, apellidos = datos_cliente("0001") Esta construccin puede ser til para operaciones como intercambio de valores entre variables1 Nota para los usuarios de Informix4GL: En Informix4GL se usa la coma , para concatenar cadenas. Una consecuencia directa de esto es que no se puedan concatenar cadenas al enviar parmetros a funciones, debiendo asignar primero las cadenas a una variable y despus enviar dicha variable a la funcin. Para evitar estos problemas, hy4GL usa el operador + para concaternar cadenas.

hy4GL: compilador de lenguaje 4GL para PostgreSQL

215

Manual de Usuario

(swap), para lo cual no es necesario una variable temporal: LET a,b=b,a Al igual que en cualquier situacin en la que se puede expresar una lista de variables, es posible asignar valores a todos los campos de un registro de la siguiente manera: LET .* = expresion1,expresion2,... Ej: LET cliente.*="JUAN","PEREZ","C/ RABIDA, 10",21003,"HUELVA"

hy4GL: compilador de lenguaje 4GL para PostgreSQL

216

Manual de Usuario

Estructuras condicionales y repetitivas:hy4GL ofrece las siguientes construcciones para variar el flujo del programa:

EXIT PROGRAMEsta sentencia provoca el final inmediato del programa. Se desconecta de la base de datos (si estuviera conectado) y el terminal vuelve a su estado normal. No se borra la pantalla. Ej: define usuario like usuarios.nombre prompt "Usuario: " for usuario select * into usuario from usuarios where nombre=usuario if status=notfound then display "Acceso denegado\n" exit program end if

Llamadas a funcionesSe puede realizar una llamada a una funcin mediante la sentencia CALL. La sintaxis de esta sentencia es la siguiente: CALL funcion(expr1,expr2,...) [ RETURNING var1,var2,...] En caso de que la funcin devuelva uno o ms valores, se usar la clusula RETURNING para asignar estos valores a variables. Ej: define cliente record like clientes.* prompt "Codigo del cliente: " for cliente.numero call busca_cliente(cliente.numero) returning cliente.*

hy4GL: compilador de lenguaje 4GL para PostgreSQL

217

Manual de Usuario

Condiciones IF... THEN... ELSE... END IFEsta estructura permite la ejecucin de una serie de sentencias slo en caso de que se cumpla una condicin. De manera opcional se puede indicar tambin un conjunto de sentencias que se ejecutarn si la condicin no se cumple. La sintaxis es la siguiente: IF THEN sentencias1 [ELSE sentencias2] END IF En primer lugar se evaluar la condicin. En caso de que sta se cumpla, se ejecutar el grupo de sentencias sentencias1. Si la condicin no se cumple, se ejecutar el grupo de sentencias sentencias2. Ej: if dow(today())="Domingo" then display "Cerrado." exit program else call menu_ppal() end if

Bucles WHILEEsta construccin permite ejecutar un conjunto de sentencias mientras se cumpla una condicin. La condicin se evaluar antes de entrar en el bucle, por lo que si sta no se cumple, es posible que no se entre nunca en el bucle. La sintaxis es la siguiente: WHILE sentencias CONTINUE WHILE EXIT WHILE ... END WHILE

hy4GL: compilador de lenguaje 4GL para PostgreSQL

218

Manual de Usuario

Dentro del bucle se pueden usar las sentencias CONTINUE WHILE y EXIT WHILE. La primera salta hasta el principio del bucle, ignorando las sentencias que se encuentran despus de sta. EXIT WHILE sale del bucle directamente. Ej: define i,total,parcial integer let i=0 let total=0 /* Facturas que suman nuestro primer millon */ while total