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.
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))
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»).
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.
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
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
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
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 |
El Nivel 1 devuelve en «fichero» información sobre el orden de selección de las tablas de la cláusula «FROM» y el índice utilizado para acceder a cada una de ellas, en su caso.
El Nivel 2 devuelve en «fichero», además de la información del nivel anterior, información sobre los criterios empleados para obtener este orden de selección de tablas.
El Nivel 3 devuelve en «fichero», además de la información del nivel anterior, información sobre los criterios empleados para seleccionar cada índice de cada tabla.
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».
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.
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 |
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.
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.