Página de inicio - Tecla de acceso: 1
Notas técnicas

MultiBase. Notas a la versión 2.0, release 05

1. Introducción

La versión 2.0 release 05 de MultiBase incluye substanciales mejoras respecto a la release 03. En algunos casos, como sucede por ejemplo en las versiones para Windows, estas mejoras afectan no sólo a la estructura interna de la herramienta, sino también a su apariencia externa (ver Notas Técnicas a la versión 2.0 release 05 para Windows).

2. Nuevas funcionalidades

2.1. Comunicación con un servicio remoto

Con el fin de mejorar el aprovechamiento de los recursos disponibles en una red de ordenadores se ha añadido a los STREAMS la capacidad de comunicarse con cualquier proceso UNIX remoto; es decir, un CTL ejecutando en una máquina «cliente» (MS-DOS, Windows o UNIX) podrá ponerse en comunicación bidireccional con cualquier proceso residente en cualquier máquina UNIX de la red, siempre y cuando este último proceso esté dado de alta como un servicio del TCP/IP.

Los STREAMS definidos con la cláusula THROUGH, que hasta ahora solamente permitían la comunicación con otro proceso UNIX residente en la misma máquina, admiten ahora indicar la dirección de red de la máquina en la que reside el proceso con el que se va a establecer la comunicación.

Para arrancar un proceso en una máquina remota bastará con especificar el nombre de la máquina y el nombre del servicio asociado a dicho proceso:

START INPUT-OUTPUT STREAM nombre_stream
THROUGH "@server_name:service_name"

Donde:

server_name
Nombre del servidor UNIX donde se encontrará el «servicio» a ejecutar.

service_name
Nombre del servicio de la máquina «servidor» que se encargará de ejecutar un programa en dicha máquina.

El server_name debe encontrarse en el fichero «HOSTS» de la máquina cliente.

El service_name debe encontrarse en el fichero «SERVICES», tanto de la máquina «cliente» como de la máquina «servidor». La línea a incluir en este fichero tiene la siguiente sintaxis:

service_name nnn/tcp comentario

El número nnn debe ser único en el fichero «SERVICES» e igual en ambas máquinas («cliente» y «servidor»).

Asimismo, el servicio server_name debe estar asignado a un comando, que será el que se ejecute cuando se invoque al STREAM. Esta relación servicio-comando se especifica en el fichero «INETD.CONF» de la máquina «servidor», la cual deberá tener el sistema operativo UNIX, encontrándose habitualmente el fichero indicado en el directorio «/etc». La sintaxis de la línea (una sola) a incluir en dicho fichero es la siguiente:

service_name stream tcp nowait root comand_path
argument argument...

Ejemplo: Supongamos que nos queremos poner en comunicación con un programa CTL, de nombre «buscaprv», residente en la máquina «unix134». A este servicio le vamos a llamar «ctlserver». Los ficheros de configuración del TCP/IP deberán tener las siguientes entradas:

Máquina Cliente:

− Fichero «HOSTS»:

unix134 125.1.1.1

− Fichero «SERVICES»:

ctlserver 12345/tcp "servidor de ctl"

Máquina Servidor:

− Fichero «SERVICES»:

ctlserver 12345/tcp "servidor de ctl"

− Fichero «INETD.CONF» (una sola línea):

ctlserver stream tcp nowait root /usr/ctl/bin/ctl
ctl -ef /usr/ctl/etc/conf1.env buscaprv

Dado que el CTL necesitará una serie de variables de entorno para su ejecución, éstas se le pasarán en el fichero indicado con el parámetro «-ef» de la línea de comando, indicándole a continuación el nombre del fichero donde se definen dichas variables de entorno. En nuestro ejemplo, este fichero es «/usr/ctl/etc/conf1.env» y su contenido podría ser:

TRANSDIR=/usr/ctl
DBPATH=/usr/mbdemo
DBPROC=/usr/mbdemo/progs

En el Apéndice 1 de estas notas se adjuntan dos programas CTL que ejercitan este tipo de comunicación.

2.2. Funciones CTL

2.2.1. De manejo de Queries en el Form

Las funciones «fquery» y «fgetquery», que ya existían en versiones anteriores, incorporan nuevas posibilidades a partir de la release 05:

fquery()
Su funcionamiento es igual que en versiones anteriores.

fquery(expression)
Si «expression» evalúa a TRUE la función devolverá la instrucción SELECT del FORM completa, incluyendo su cláusula «ORDER BY» en caso de que la hubiera. En caso contrario (no TRUE) su funcionamiento es idéntico a «fquery()», es decir, devuelve únicamente la cláusula «WHERE».

fgetquery()
Igual que en versiones anteriores. Sin parámetros limpia la lista en curso.

fgetquery(where_expr[,collist])
Su funcionamiento es igual que en versiones anteriores.

fgetquery(select_expr)
A partir de esta versión, admite como primer parámetro una instrucción SELECT completa, cuya primera columna debe ser el ROWID. «select_expr» deberá evaluar a una instrucción SELECT completa. Por ejemplo:

a)

fgetquery("select rowid, descripcion from
provincias where provincia > 10
order by descripcion desc")

b)

fgetquery(fquery(true))

2.2.2. De manejo de la lista en curso del Form

Se ha añadido una función para manejar la lista en curso del FORM.

gotoclist(expression)
Permite posicionarse sobre una determinada fila de la lista en curso del FORM. Los posibles valores de «expression» deben ser numéricos e indican lo siguiente:

expression = 0 Se posiciona en la fila en curso.
expression = n Se posiciona en la «n-ésima» fila de la lista en curso.
expression = -1 Se posiciona en la última fila de la lista en curso.
expression = -2 Se posiciona en la penúltima fila de la lista en curso.
 

El valor devuelto por la función es el número de registro de la lista en curso donde se posiciona («currec»).

2.2.3. De control de páginas del Form/Frame

Se ha añadido la siguiente función.

gotoscreen(expression)
Permite ir a la página («SCREEN») indicada en «expression» de la lista en curso de un FORM/FRAME. Los valores posibles de «expression» son:

expression = 0 Se posiciona en la página en curso.
expression = n Se posiciona en la página «n» de la lista en curso.
expression = -1 Se posiciona en la última página de la lista en curso.
expression = -2 Se posiciona en la penúltima página de la lista en curso.
 

El valor devuelto por la función es el número de página donde se posiciona.

2.2.4. De evaluación dinámica de variables

Se han añadido las siguientes funciones de evaluación dinámica de variables.

evalvar(var_name)
Siendo «var_name» una expresión que evalúa al nombre de una variable de programa (cualquiera incluida en la sección DEFINE del módulo, incluidas las de FORM y FRAME).

Esta función devuelve el valor contenido de esta variable.
evalarray(array_name, num)
Igual que «evalvar», pero para el elemento «num» del ARRAY indicado por «array_name».

Ejemplo:

define
    variable var1 integer
    array arr1[20] char(10)
end define

main begin
    let var1 = 5
    ...
    ...
    pause evalvar("var1")
    ...
    let arr1[15] = "hola"
    ...
    pause evalarray ("arr1", 15)
    ...
end main

2.2.5. De asignación dinámica de variables

Se han añadido las siguientes funciones de asignación dinámica de variables:

letvar(var_name, value)
Esta función asigna el valor contenido en «value» a la variable de programación indicada en «var_name».

letarray(array_name, num, value)
Igual que «letvar» pero para el elemento «num» del ARRAY indicado por «array_name».

Ejemplo:

define
    variable var1 integer
    array arr1[20] char(10)
end define
main begin
    call letvar("var1", 5)
    pause var1
    ...
    call letarray ("arr1", 15, "hola")
    pause arr1[15]
    ...
end main

2.3. Otros cambios en el CTL

Las versiones MS-DOS y UNIX de CTL admiten ahora algunos de los parámetros que se admiten en Windows:

-ef filename
Lanza el CTL con el entorno definido en el fichero «filename».

-env
Añade al entorno definido por el usuario aquel que necesita el comando trans para su ejecución.

-cd pathname
Al ejecutar el CTL cambiará al directorio indicado en «pathname».

Asimismo, en caso de existir un fichero de nombre «MBENV» en el directorio «$TRANSDIR/etc», el CTL añadirá a su entorno las variables definidas en dicho fichero, siempre y cuando éstas no tuviesen definido un valor previo.

En esta versión, el ámbito de las variables internas de CTL que se citan a continuación es por programa. Anteriormente estas variables no alteraban su valor al pasar de un programa a otro.

ambiguous cancelled errno
found lastkey newvalue
locked status sqlrows

Ahora, los valores de estas variables al volver de una llamada a otro programa (por medio de la instrucción «CTL progname») son recuperados.

La instrucción «WINDOW SCROLL» permite a partir de esta versión congelar columnas utilizando las teclas asignadas a las acciones <fins-char> y <fdel-char> (en Windows podrá emplear también el ratón).

Las variables locales de las funciones de usuario pueden definirse con la cláusula «LIKE» como en el siguiente ejemplo:

function nombre()
    nombre like clientes.empresa
begin
    ...
    ...
end function

2.4. Variables de entorno

A partir de la versión 2.0 release 0.3 no funciona la variable de entorno TERMCAP. Actualmente, ésta ha sido sustituida por la variable MBTERMCAP.

La variable de entorno MBISFILES, que ya existía en versiones anteriores, admite ahora el siguiente formato:

MBISFILES=n[,m]

Donde:

n
Indica el número máximo de tablas de la base de datos que pueden estar abiertas simultáneamente. Al alcanzar este número, el SQL buscará una tabla que pueda ser cerrada. Si no la encuentra dará error.

m
En caso de definir este parámetro el proceso de cierre de tablas comenzará a partir de «m» (SQL optimizará cerrando las tablas que no se estén utilizando).

El valor por defecto de «m» es:

1. m=n Para una base de datos no transaccional.
2. m=0 En una base de datos transaccional.

Ejemplos:

MBISFILES=30
MBISFILES=100,20

Si no se especifica esta variable se asumirá:

MBISFILES=50  en versiones UNIX.
MBISFILES=20  en versiones MS-DOS y Windows.

El rango de valores válidos para «m» y «n» es: 16-100 (siendo «m» siempre menor o igual que «n»).

A partir de esta release se ha incorporado la variable de entorno DBPASSWD, que servirá para incluir la «password» del usuario UNIX para conectarse a una base de datos residente en una máquina «servidor» (UNIX) en instalaciones cliente-servidor.

Si el usuario UNIX al que se va a conectar la aplicación tiene definida una «password», la variable de entorno DBPASSWD deberá contener este valor antes de establecer la comunicación con el SQL remoto (es decir, antes de ejecutar la primera instrucción «DATABASE dbname»).

Si el CTSQL (o «gateway») con el que se va a establecer la comunicación es de una versión anterior a la release 05, y por tanto no examina la «password» del usuario UNIX, la variable DBPASSWD deberá contener el valor «NOPASSWD» («DBPASSWD=NOPASSWD»).

Ejemplo:

...
{ getpasswd() es una función que pide la password por pantalla}
let pass = getpasswd()
call putenv("DBPASSWD",pass clipped)
...
database dbname
...

La variable de entorno OUTOPT de releases anteriores se puede utilizar ahora también en las versiones para MS-DOS y Windows. La sintaxis de esta variable es:

OUTOPT=fichero

Donde:

fichero
«Path» absoluto o relativo donde se generará el «fichero» con la información devuelta por el optimizador. En caso de no indicar «path», éste se creará en el directorio en curso.

Con el fin de obtener información más detallada sobre el proceso de optimización de «queries» de CTSQL se han definido tres niveles del detalle que se desea obtener en el fichero de salida devuelto por el optimizador. El nivel deseado se indica definiendo una de las siguientes variables de entorno:

OUTOPT=fichero Nivel 1 de detalle
OUTOPT2=fichero Nivel 2 de detalle
OUTOPT3=fichero Nivel 3 de detalle

En el Apéndice 2 de estas notas se explica la información devuelta en estos ficheros.

La nueva variable de entorno ONXON permite activar o desactivar el protocolo XON/XOFF de la línea serie del terminal (sólo en UNIX). Si se especifica el valor «ONXON=1» no lo desactiva. Por defecto desactiva dicho protocolo dejándolo en «DTR».

2.5. Cambios en el Tword

El comando tword admite la cláusula «-p» para imprimir un fichero. Asimismo, la cláusula «-pm» imprimirá un fichero con opción de mailing. Su sintaxis es la siguiente:

tword -p fichero Imprime «fichero».
tword -pm fichero mailing Imprime «fichero» con mailing.

2.6. Cambios en el CTSQL

Las tablas temporales admiten la creación de claves primarias, referenciales, índices y atributos de columnas.

Cuando en una condición «BETWEEN» los límites (desde y hasta) sean iguales, CTSQL optimizará como si se tratase de una condición por igual, es decir, «expresión = valor». Por ejemplo:

EXPRESIÓN ORIGINAL EXPRESIÓN OPTIMIZADA
columna between 1 and 1 columna=1

Asimismo, en el siguiente caso los paréntesis son necesarios para asegurarse de que el optimizador reconozca este tipo de expresión y optimice a las expresiones de la derecha:

EXPRESIÓN ORIGINAL EXPRESIÓN OPTIMIZADA
(columna >=1 and columna <=1) columna=1
(columna >=1 and columna1 <=1 and (columna2 >=2 and columna2 <=2) columna1=1 and columna2=2

2.7. Cambios en el comando «trans»

El TRANS interactivo (trans - -) se ha modificado, de tal forma que ahora es posible editar las últimas instrucciones y direccionar la ejecución a pantalla, impresora o fichero.

En el entorno de desarrollo TRANS, en la opción «DBSQL», al cargar o descargar filas sobre/desde tablas es posible generar un fichero, con extensión «.sql», que contenga todas las instrucciones LOAD o UNLOAD de cada una de las tablas cargadas/descargadas, respectivamente.

2.8. Cambios en el comando «tdocu»

El comando tdocu admite ahora nuevos parámetros para formatear el resultado:

-r: Respeta el formato especificado en el fichero.
-nl número: Indica el número de líneas de la página de salida.
-nc número: Indica el número de columnas de la página de salida.
-ml número: Indica el margen izquierdo.
-mr número: Indica el margen derecho.
-mt número: Número de líneas dejadas en la parte superior de la página.
-mb número: Número de líneas dejadas como pie de página.

»