Professional Documents
Culture Documents
Manual de Usuario
Sintaxis 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<id>]
[declaracionesvariablesglobales]
funciones
[forms]
[reports]
Comentarios
Se 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 Informix-4GL 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;
calculaelimportetotaldeunafra.}
functionsuma_totales()
definejinteger/*jlousoparabucles*/
/*yanonecesitoestavariable.
definesumainteger/*paraircalculando...*/
*/
...
Declaraciones de variables:
Tipos de datos:
El lenguaje soporta los siguientes tipos de datos bsicos:
Integer
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.
o
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.
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<id>[,<id>,...]<tipo>
Ej:
defineiinteger
definehoratime
definehoy,ayerdate
defineahoradatetime
definenombre,apellidoschar(50)
defineteclachar
Se puede definir un registro con la misma estructura que una tabla de la base
de datos:
DEFINE<id>RECORDLIKE<tabla>.*
Por supuesto, ser necesario haber indicado el nombre de la base de datos
mediante la instruccin DATABASE
Ej:
databasecontabilidad
defineregrecordlikemayor.*
definerctarecordlikecuentas.*
Funciones:
Las funciones se declararn con la siguiente sintaxis:
FUNCTION<nombre>([par1[,par2,...]])
declaraciones variables locales y parmetros
sentencias
ENDFUNCTION
Ej:
functiongraba_registro(r,donde)
definerrecordlikeclientes.*
definedondechar(20)
ifdonde="clientes"then
insertintoclientesvalues(r.*)
else
insertintoproveedoresvalues(r.*)
endif
endfunction
MAIN
declaraciones variables locales
sentencias
ENDMAIN
Ej:
main
defineparamchar(50)
ifarg_count=0then
display"Error.Numerodeparametroserroneo."
exitprogram
endif
letparam=arg_val(1)
...
endmain
El lenguaje soporta recursividad sin que exista ms lmites que los impuestos
por el compilador de C usado
Ej:
functionfactorial(n)
defineninteger
ifn=0then
return1
else
returnn*(factorial(n1))
endif
endfunction
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:
defineainteger
definerrecordlikeclientes.*
displaya
displayr.nombre
o
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:
display4
display4.5
Cadena
una
expresin
numrica
al
formato
La sintaxis es la siguiente:
expresionUSINGmascara
Operador CLIPPED
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]
Llamadas a funciones
Los 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:
definehoratime
lethora=time()/*lafunciontime()devuelvela
horaactual*/
Operadores binarios
Los 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 sumardepende del tipo de las expresiones originales. En el siguiente cuadro se
detalla el comportamiento de este operador:
Char
("10")
Char
Integer
Float
Date
Time
Datetime
Interval
"10"
(5)
(5.5)
(10/12/1998)
(10:10:05)
(10/12/1998
10:10:05)
(123:10:20)
Char
Char
Char
Char
Char
Char
Char
"1010"
"105"
(105.5"
"1010-12-1998"
"1010:10:05"
"1010-12-1998
"10123:10:20"
10:10:05"
Char
Integer
Float
Date
Time
Datetime
Interval
"10"
(5)
(5.5)
(10/12/1998)
(10:10:05)
(10/12/1998
10:10:05)
(123:10:20)
Integer
Char
Integer
Float
Date
Time
Datetime
Interval
(5)
"510"
10
10.5
15/12/1998
10:10:10
10-12-1998
123:10:25
10:10:10"
Float
Char
Float
Float
Date
Time
Datetime
Interval
(5.5)
"5.500010"
10.5
11
15/12/1998
10:10:10
10-12-1998
123:10:25
10:10:10"
Date
(10-121998)
Char
Date
Date
"10-12-199810"
15-12-1998
15-12-1998
No permitido
Datetime
No permitido
No permitido
No permitido
Time
10-12-1998
10:10:05
Time
(10:10:05)
Char
Time
Time
Datetime
"10:10:05.00010"
10:10:10
10:10:10
10-12-1998
No permitido
13:20:25
10:10:05
Datetime
(10-12-1998
Char
Datetime
Datetime
10-12-1998
10:10:05.00010
10-12-1998
10-12-1998
10:10:10
10:10:10
Char
Interval
Interval
123:10:20.010
123:10:25
123:10:25
10:10:05)
Interval
(123:10:20)
No permitido
No permitido
No permitido
15-12-1998 13:20:25
No permitido
Time
Datetime
Interval
13:20:25
15-12-1998
246:20:40
13:20:25
Operador -
Datetime
Char
Char
Integer
Float
Date
Time
Datetime
Interval
"10"
(5)
(5.5)
(10/12/1998)
(10:10:05)
(10/12/1998
10:10:05)
(123:10:20)
No permitido
No
permitido
No
permitido
No permitido
No permitido
No permitido
No permitido
Integer
Integer
Float
No permitido
No permitido
No permitido
No permitido
-5
-0.5
Float
Float
Float
Float
No permitido
No permitido
No permitido
No permitido
(5.5)
-4.5
0.5
Date
No permitido
Date
Date
Integer
No permitido
Integer
No permitido
5-12-1998
15-12-1998
diferencia en dias
diferencia en dias
("10")
Integer
(5)
(10-12-1998)
Time
No permitido
(10:10:05)
Datetime
No permitido
(10-12-1998
10:10:05)
Interval
(123:10:20)
No permitido
Time
Time
No permitido
Time
No permitido
10:10:00
10:10:10
Datetime
Datetime
Interval
Datetime
Interval
Datetime
10-12-1998
10-12-1998
10:10:05
10-12-1998
00:00:00
00:00:00
5-12-1998 06:59:45
10:10:00
10:10:00
Interval
Interval
No permitido
No permitido
No permitido
Interval
123:10:15
123:10:15
00:00:00
Time
06:59:45
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.
Operadores de comparacin
Para realizar comparaciones de expresiones se usan los operadores <, <=, =, !
=, >= y >
expresion1<expresion2
expresion1<=expresion2
expresion1=expresion2
expresion1!=expresion2
expresion1>=expresion2
expresion1>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:
01-01-1998 < 02-01-1998
01-01-1998 10:10:25 > 01-01-1998 10:10:24
expresionORexpresion
Precedencia de operadores
La precedencia de los operadores en hy4GL es, de mayor a menor, la
siguiente:
!
USINGCLIPPED
[]
*/
+
<<==!=>>=
AND
OR
Sentencias:
C Embebido (ampliacin a Informix-4GL)
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:
...
sentencias4GL
.c
[declaracionesC]
sentenciasC
c.
sentencias4GL
...
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:
defineusuariochar(50)
definedirectoriochar(255)
/*leoelnombredeusuarioyeldirectorioactual
*
.c
strncpy(usuario,getenv("LOGNAME"),sizeof(usuario)
1);
getcwd(directorio,sizeof(directorio1));
c.
ifusuario="root"then
display"Nopuedeejecutarelprogramacomoroot."
exitprogram
endif
Asignacin:
Para asignar valores a variables se usar la sentencia LET. Su sintaxis es la
siguiente:
LET<id>=expresion
Ej:
definedtdatetime
defineddate
defineiinteger
definecchar(40)
letdt=datetime()/*Asignaadtlafechayhora
actual*/
letd=dt/*Asignaa'd'lafechaactual*/
/*Asignaa'c'unacadenaconlafechayhora
contenida
en'dt'enelformato"ddmmaaaaHH:MM:SS.mmm"*/
letc=dt
leti="50"+"20"/*Asignaa'i'elnumero5020*/
LET<id>.*=expresion1,expresion2,...
Ej:
LETcliente.*="JUAN","PEREZ","C/RABIDA,
10",21003,"HUELVA"
Llamadas a funciones
Se puede realizar una llamada a una funcin mediante la sentencia CALL. La
sintaxis de esta sentencia es la siguiente:
CALLfuncion(expr1,expr2,...)[RETURNING
var1,var2,...]
Ej:
defineclienterecordlikeclientes.*
prompt"Codigodelcliente:"forcliente.numero
callbusca_cliente(cliente.numero)returning
cliente.*
IF<condicion>THEN
sentencias1
[ELSE
sentencias2]
ENDIF
Bucles WHILE
Esta 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<condicion>
sentencias
CONTINUEWHILE
EXITWHILE
...
ENDWHILE
Ej:
definei,total,parcialinteger
leti=0
lettotal=0
/*Facturasquesumannuestroprimermillon*/
whiletotal<1000000
leti=i+1
/*lafacturanumero3nolasumo...*/
ifi=3then
continuewhile
endif
selectimporteintoparcialfromfacturaswhere
numero=i
ifstatus=notfoundthen
display"Error...noseencuentralafacturan",i
lettotal=0
exitwhile
endif
display"Fra:",i,"Importe:",parcialusing
"###,###,##&"
lettotal=total+parcial
endwhile
Bucles FOR
Los bucles FOR son usados para ejecutar un conjunto de sentencias variando
el valor de una variable desde un valor inicial hasta un valor final.
La variable que se use para ir variando su valor debe ser de tipo numrico o
de tipo fecha. En la primera iteracin su valor ser el de la expresin1, y se ir
incrementando en una unidad hasta alcanzar el valor de la expresin2.
FOR<variable>=<expresion1>TO<expresion2>
sentencias
CONTINUEFOR
EXITFOR
...
ENDFOR
Al igual que en los bucles WHILE, se pueden usar las sentencias CONTINUE
FOR y EXITFOR para forzar una nueva iteracin o para salir inmediatamente
del bucle.
Ej:
{Mostramostodoslosdiaslaborablesdeestemes
apartirdehoy}
defineminteger
defineddate
letmes=month(today())
ford=today()totoday()+31
ifmonth(d)!=mesthen
exitfor
endif
ifdow(d)="Domingo"ordow(d)="Sabado"then
continuefor
endif
displayd
endfor
Interfaz de usuario
Operaciones con ventanas.
La informacin que aparece en pantalla se muestra dentro de ventanas. Todo
programa en hy4GL usa, al menos, una ventana que se crea automticamente al
iniciar el programa y que ocupa toda la pantalla.
OPEN WINDOW
OPENWINDOW<nombre>AT<y>,<x>WITH<h>ROWS,<w>
COLUMNS
[ATTRIBUTE(<color>[OVER<color>][,BRIGHT]
[,BORDER])]
[TITLEexpresion]
Ej:
openwindoww1at1,1with10rows,78columns
attribute(whiteoverred,bright,border)
title"Tareasparaeldia"+today()
display"Estaventanasecerraren1segundo"
delay1
closewindoww1
CURRENT WINDOW
CURRENTWINDOW<nombre>
MOVE WINDOW
En ocasiones es necesario mover una ventana para poder abrir otra sin ocultar
la anterior. La sintaxis de la sentencia para mover una ventana es:
MOVEWINDOW<nombre>TO<y>,<x>
CLEAR WINDOW
CLOSE WINDOW
DISPLAYexpresion[,expresion...][ATy,x]
[ATTRIBUTE(color[overcolor][,bright])]
[,expresion...AT...ATTRIBUTE...]
Ej:
display"Nombre:",cliente.nombreat1,1
attribute(cyanoverblue,bright),
"Direccin:",cliente.direccionat2,1
attribute(cyanoverblue)
PROMPT[expresion]FOR[CHAR]<variable>
Ej:
defineteclachar
definei,jinteger
prompt"Introduceunnumero:"fori
display"Introduceotronumero:"
promptforj
prompt"Pulseunateclaparacontinuar..."forchar
tecla
Mens:
hy4GL ofrece la sentencia MENU para la definicin de mens de opciones.
Un men consiste en una serie de opciones, cada una de las cuales tiene asociada
un conjunto de sentencias que se ejecutarn en caso de ser seleccionadas.
Adems, es posible indicar un grupo de acciones que se ejecutarn al pulsar una
tecla determinada.
La sintaxis para la definicin de mens es la siguiente:
MENU[HORIZONTAL|VERTICAL]
[ATTRIBUTE(color[OVERcolor])[;(color[OVER
color])]]
COMMAND<expresion>[,<expresion>]
sentencias
ONKEY(<id>)
sentencias
...
EXITMENU
...
ENDMENU
Ej:
openwindoww_menuat1,1with5rows,78columns
attribute(yellowoverblue,bright,border)
menu
command"Articulos","Gestiondealmacen"
callgest_almacen()
command"Clientes","Gestiondeclientes"
callgest_clientes()
command"Proveedores","Gestiondeproveedores"
callgest_prov
command"Salir","Findelaaplicacion"
exitmenu
onkey(F1)
openwindoww_ayudaat5,5with10rows,50columns
attribute(whiteoverred)
callayuda()
closewindoww_ayuda
onkey(F8)
exitmenu
endmenu
closewindoww_menu
exitprogram
Formularios de entrada:
Se vio anteriormente la sentencia PROMPT, que permite introducir
informacin por teclado. En esta seccin se ver el uso de formularios de entrada
de datos. Estos formularios permiten la introduccin y visualizacin de
informacin de una manera ms compleja que la ofrecida por la sentencia
PROMPT.
Los formularios de entrada permiten al usuario editar el valor de varias
variables al mismo tiempo, desplazndose con el cursor entre distintos campos.
Un formulario est compuesto por uno o ms campos de edicin, botones y
casillas de verificacin. Los campos de edicin aparecen en pantalla como
regiones rectangulares en las que se puede introducir un texto. Las casillas de
verificacin son cuadros de edicin que slo admiten los valores 'X' o ' '
(activado/desactivado). Los botones permiten ejecutar acciones al ser pulsados.
Formato
Manejo
CREATEFORM<nombre>
La primera accin que hay que realizar para poder usar un formulario de
entrada es crearlo. La sentencia CREATE FORM crea en memoria todas las
estructuras necesarias para el manejo del formulario. El formulario es creado y
asociado a la ventana actual. No se puede tener dos formularios activos al mismo
tiempo en la misma ventana.
DISPLAYFORM<nombre>
La sentencia CREATEFORM prepara el formulario para su uso, pero no lo
muestra en pantalla. Para ello, se necesita usar la sentencia DISPLAYFORM.
DISPLAYBYNAME<variables>
INPUTBYNAME<variables>
formf_clientes
inputcodigofrom1,10to1,6
inputnombrefrom2,10to2,30
inputdireccionfrom3,10to3,30
checkfacturarat4,10
buttonaceptarat2,40
buttoncancelarat3,40
endform
functioneditar_cliente
definesw_aceptadointeger
definerrecord
codigointeger
nombrechar(20)
direccionchar(20)
facturarinteger
endrecord
letsw_aceptado=0
createformf_clientes
displayformf_clientes
inputbynamer.*
onkey(F1)
callayuda()
onbuttonaceptar
validatefield
letsw_aceptado=1
exitinput
onbuttoncancelar
letsw_aceptado=0
exitinput
afterfieldcodigo
ifr.codigo<100then
letr.codigo=0
displaybynamer.codigo
nextfieldr.codigo
endif
endinput
endfunction
BEGINTRANSACTION
Indica el comienzo de una transaccin. Todas las actualizaciones que se
realicen sobre la base de datos no sern definitivas hasta que se ejecute la
sentencia COMMITTRANSACTION
COMMITTRANSACTION
Esta sentencia indica que se ha llegado al final de una transaccin y que se
deben fijar todas las actualizaciones realizadas sobre la base de datos.
ABORTTRANSACTION
Con esta sentencia se cancela una transaccin. Todas las actualizaciones
realizadas desde la sentencia BEGINTRANSACTION son desechadas.
display"Elcliente",r.codigo,"sellama
",r.nombre
endif
Insercin de valores
La sentencia de SQL para insertar valores dentro de una tabla es INSERT.
En hy4GL se usa con la misma sintaxis que en SQL:
INSERT INTO <tabla> VALUES ( <expresiones> )
Ej:
inputbynamer_cliente.*
onbuttonaceptar
ifconfirmar()="SI"then
insertintoclientesvalues(r_cliente.*)
ifstatus=okthen
exitinput
else
callmensaje_error("Nosepuedeinsertarel
registro")
exitprogram
endif
endif
endinput
Borrado de valores
Para borrar valores de una tabla se usa la sentencia DELETE de SQL. Su
sintaxis es la siguiente:
DELETEFROM<tabla>[WHERE<condicion>]
Cursores
Una consulta a la base de datos puede devolver varias tuplas. PostgreSQL
ofrece dos mtodos para acceder a los datos devueltos por estas consultas. Por un
lado, se pueden obtener del servidor de bases de datos todas las tuplas devueltas
por la consulta y, una vez en memoria, tratarlas de manera local. Por otra parte, se
puede declarar un cursor e ir obteniendo las tuplas una a una para tratarlas. La
desventaja de este ltimo mtodo es que PostgreSQL solamente permite hacerlo
dentro de una transaccin, mientras que el primero no se puede usar si la consulta
devuelve gran cantidad de tuplas.
hy4GL ofrece una interfaz homognea para usar ambos mtodos. En ambos
ser necesario declarar un cursor. Si se opta por el primer mtodo, se incluir el
atributo de local en la declaracin del cursor.
DECLARE<nombre>[LOCAL]CURSORFORselect...
DECLARE<nombre>[LOCAL]CURSORFORexpresion
Ej:
declareclocalcursorfor
select*fromclienteswhereult_compra<"111998"
Ej:
letconsulta=
"selectprovincia,count(*)fromclientesgroupby
provincia"
declareccursorforconsulta
FETCH[NEXT|PREVIOUS]<cursor>INTO
<lista_variables>
Ej:
definerrecordlikeclientes.*
declareclocalcursorforselect*fromclientes
wherecodigo<10
openc
fetchcintor.*
whilestatus!=notfound
display"Cliente",r.codigo,"",r.nombre
fetchcintor.*
endwhile
closec
EXEC_SQL
hy4GL no soporta la sintaxis completa del lenguaje SQL, sin embargo ofrece
esta sentencia para permitir al programador ejecutar sentencias SQL no
soportadas por el lenguaje.
Su sintaxis es la siguiente:
EXEC_SQL<expresion>[INTO<lista_variables>]
Ej:
EXEC_SQL"selectmax(numero)fromfacturas"INTO
num_fac
FOREACH
La estructura FOREACH se usa para recorrer un cursor desde el pricipio
hasta el final. La sintaxis de esta estructura repetitiva es la siguiente:
FOREACH<cursor>INTO<lista_variables>
sentencias
...
CONTINUEFOREACH
...
EXITFOREACH
...
ENDFOREACH
BROWSE<cursor>INTO<lista_variables>
[FROMy,xTOyy,xx]
[TITLE<expresion]
DISPLAY<expresiones>
ONKEY(id)
sentencias
ONKEY(num)
sentencias
ONKEY(cadena)
sentencias
...
EXITBROWSE
ENDBROWSE
Ej:
definerprecordlikeprovincias.*
declareclocalcursorforselect*fromprovincias
browsecintorp.*
title"MatriculaProvincia"
displayrp.mat+""+rp.nombre
onkey(F1)
callayuda()
onkey(KEY_ENTER)
callver_provincia(rp.*)
onkey(F8)
exitbrowse
endbrowse
Generador de Listados
El lenguaje 4GL ofrece una sintaxis sencilla a la vez que potente para generar
listados. El generador de listados controla los saltos de pgina, encabezamientos
y los cambios de grupo, lo que facilita enormemente la tarea al programador.
Formato del listado
Los listados se definen fuera de las funciones con la siguiente sintaxis:
REPORT<nombre>(parametros)
declaracioneslocales
OUTPUT
REPORTTO<fichero>
REPORTTOPIPE<comando>
PAGEWIDTH<num>
PAGEHEIGTH<num>
FORMAT
FIRSTPAGEHEADER
sentencias
PAGEHEADER
sentencias
BEFOREGROUPOF<lista_variables>
sentencias
ONEVERYROW
sentencias
AFTERGROUPOF<lista_variables>
sentencias
PAGEFOOTER
sentencias
ONLASTROW
sentencias
ENDREPORT
Un listado debe tener un nombre y recibir unos parmetros, que sern la base
de la informacin que se imprima. Al igual que una funcin, un listado puede
usar variables locales para realizar sus clculos internos. Estas variables habr
que definirlas junto con los parmetros formales.
La definicin de un listado tiene dos secciones: la primera, OUTPUT, en la
que se indica el nombre del fichero de salida o un comando que se ejecutar y al
que se va a enviar la salida del listado. En esta seccin se especifica tambin el
tamao (lineas y columnas) de una pgina, para permitir la deteccin automtica
de los saltos de pgina.
En la segunda seccin, FORMAT, se indica la apariencia que va a tomar el
listado. Consta de varias condiciones (todas ellas opcionales) y de las sentencias
que se deben ejecutar al cumplirse cada una de las condiciones.
FIRSTPAGEHEADER
Sentencias que se deben ejecutar al comenzar el listado.
PAGEHEADER
Sentencias que se deben ejecutar al comenzar cada pgina
BEFOREGROUPOF<var1>,<var2>,...
Sentencias que se ejecutarn cuando se vaya a producir un cambio en los
valores de las variables indicadas
ONEVERYROW
Sentencias que se ejecutan en cada lnea
AFTERGROUPOF
Sentencias que se ejecutan despus de producirse el cambio en los valores
de las variables.
PAGETRAILER
Sentencias que se ejecutan al final de cada pgina
ONLASTROW
Sentencias que se ejecutan al final del listado
Para enviar realmente una lnea al listado se usa la sentencia PRINT. Esta
sentencia deber estar incluida en alguna/s de las condiciones de la
seccinFORMAT de la definicin del listado si se quiere que el listado produzca
alguna salida.
Dentro de un listado se pueden usar las variables pageno y lineno, que
indican el nmero de pgina y el nmero de lnea dentro de la pgina
respectivamente.
STARTREPORT<nombre>
Esta sentencia indica el comienzo del listado. Al ejecutarla se preparan
todas las estructuras internas y se crean tablas temporales para almacenar
la informacin que va a generar el listado.
o
OUTPUTTOREPORT<nombre>(param1,
param2,...)
Enva al generador de listados los parmetros indicados.
o
FINISHREPORT<nombre>
Da por finalizado el listado. Al ejecutar esta sentencia es cuando se genera
realmente el listado a partir de todos los parmetros recibidos mediante
sentencias OUTPUTTOREPORT
Ej:
functionlistar_alumnos()
definerrecordlikealumnos.*
declareccursorforselec*fromalumnosorderby
grupo
startreportr1
foreachcintor.*
outputtoreportr1(r.grupo,r.nombre)
endforeach
finishreportr1
endfunction
reportr1(grupo,nombre)
definegrupochar(5)
definenombrechar(40)
outputreporttopipe"lpdlaser"
pagewidth78
pagelength64
format
firstpageheader
print"LISTADODEALUMNOSPORGRUPOFecha:"+today()
print""
print"Nombreyapellidos"
print""
pageheader
print"LISTADODEALUMNOSPORGRUPOPag:"+pageno
print""
print"Nombreyapellidos"
print""
beforegroupofgrupo
print
print"Grupo:",grupo
print""
oneveryrow
printnombre
endreport
Ej:
hy4glalumnos.4gl
o
Para
generar gestion.ea
profesores.4glyalumnos.4gl:
partir
demenu.4gl,
hy4glogestion.emenu.4glprofesores.4gl
alumnos.4gl
o
Para compilar profesores.4gl y obtener el modulo objeto, pero no
generar ejecutable:
hy4glcprofesores.4gloprogesores.o
Variables de entorno
Las siguientes variables de entorno pueden influir en el comportamiento del
compilador:
o
HYVERB: Si existe esta variable de entorno, el compilador muestra
en pantalla el cdigo generado.
o
C_LIBRARY_PATH: Indica la lista de directorios en los que el
enlazador va a buscas las libreras
o
C_INCLUDE_PATH: Indica la lista de directorios en los que el
compilador de C va a buscar los archivos de cabecera.
Indice
Precedencia de operadores 13
Sentencias: 14
C Embebido (ampliacin a Informix-4GL) 14
Asignacin: 15
Asignaciones mltiples (ampliacin a Informix-4GL) 15
Estructuras condicionales y repetitivas: 17
EXIT PROGRAM 17
Llamadas a funciones 17
Condiciones IF... THEN... ELSE... END IF 18
Bucles WHILE 18
Bucles FOR 20
Interfaz de usuario 21
Operaciones con ventanas. 21
OPEN WINDOW 21
CURRENT WINDOW 22
MOVE WINDOW 22
CLEAR WINDOW 22
CLOSE WINDOW 22
Presentacin en pantalla 23
Introduccin de datos simples 23
Mens: 24
Formularios de entrada: 26
Formato 26
Manejo 26
Acceso a Bases de Datos. Sentencias SQL 30
Transacciones 30
Consultas 30
Insercin de valores 31
Borrado de valores 32
Cursores 32
EXEC_SQL 34
FOREACH 34
BROWSE (ampliacin a Informix-4GL) 35
Generador de Listados 37
Formato del listado 37
Sentencias de control de listados 39
Uso del compilador de 4GL. 41
Variables de entorno 41
1Nota para los usuarios de Informix-4GL: En Informix-4GL 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.
2La opcin TITLE es una ampliacin a la sintaxis de Informix-4GL.
3Informix-4GL muestra un borde 'exterior' a la ventana.
4Vase tambin la seccin 'Formularios de Entrada'.