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

MultiBase. Notas a la versión 1.0 release 4.0

Anexo B. Notas a la versión 1.0, release 4.0 (diferencias con la ver. 1.0, rel. 3.0)

Compatibilidad

Cambios en la gramática

Las instrucciones CTL: "WINDOW", "TSQL", "PATH WALK" y "TREE WALK" admitían la cláusula "at NUM, NUM", no permitiendo el uso de expresiones para posicionamiento de la WINDOW. En la release 4.0 se ha sustituido por "at EXPR, EXPR".

Cambios en el comportamiento del CTL

  1. Si existían dos campos consecutivos y en ambos se hacia NEXT FIELD sin parámetros.
  2. Si se hacía NEXT FIELD o NEXT FIELD DOWN EXPR en el primer campo y se entraba desde un MENU.
  3. En "query".

Estos casos ya funcionan correctamente.

Ejemplo:

msgtext(150, "clientes")

− Para el mensaje 150 = "La tabla %s no existe".
− Devuelve: "La tabla clientes no existe".

Sólo se admite uno o ningún parámetro, y en el primer caso el mensaje debe contener un "%s".

Sentence:
  Frase SQL
  Optimization: num Tables <− número de tablas implicadas
    Table [tabname] num Ranges <− para la tabla "tabname" se han
                                  definido "num" rangos
          Range [n] : key [start/length] ((s1/l1)(s2/l2)...)
                número de rango \——————−/
           descripción de la clave usada para este rango:
           ( ) indica acceso por rowid.

− El orden en que se listan las tablas implicadas en la sentencia SQL (en el caso de usar más de una tabla) es el orden que el optimizador selecciona para acceder a ellas.

− El número de rangos indica el número de porciones de una tabla que son seleccionadas en la cláusula WHERE.

− Para cada rango se especificará, en su caso, la clave por la que se va a acceder a la tabla.

Ejemplo:

prepare stmt from "select * from clientes where cliente = ?"
execute stmt using cli
if found = true then
    .....

Ejemplo:

select c1 from t1 where c1 = 1
{ si devuelve más de una fila }
variable ambiguous      -> TRUE
variable found          -> TRUE
{ si devuelve una fila }
variable ambiguous        -> FALSE
variable found          -> TRUE
{ si no devuelve ninguna fila }
variable ambiguous      -> FALSE
variable found          -> FALSE

NOTA: En versiones anteriores, y para este caso, la variable FOUND valía TRUE sólo si AMBIGUOUS era FALSE.

  1. Guarda la lista de DISPLAYS en curso, limpia la pantalla e inicializa una nueva lista de DISPLAYS vacía.
  2. Una vez finalizada la ejecución de instrucciones de esa opción limpia todos los DISPLAYS realizados en éstas.
  3. Recupera la lista de DISPLAYS original y la "refresca" en pantalla.

Nuevas funciones

1. Funciones de manejo del directorio de trabajo:

2. Funciones de uso del teclado:

— Si "expr" es numérica:

>= 2000: "lastkey" correspondiente a una acción.
1−256: Carácter ASCII a introducir.

— Si "expr" es char:

− Nombre de una acción ("fcancel", "fquit" ...).
− Si no es ninguna acción, se introduce carácter a carácter todo el string.

Ejemplo:

call dokey("fleft")
call dokey(3)            {‘control-c’}
call dokey(13)           {‘RETURN’}
call dokey("freturn")    {‘RETURN’}
call dokey("309-4589A")  {‘un string’}

Ejemplo:

{ Limpiar buffer de teclado }
while keypressed() = true
    read key

3. Funciones de manejo del cursor:

  1. on_off: Expresión que indica (TRUE o FALSE) si el cursor debe aparecer (TRUE) o desaparecer (FALSE).
  2. line: Expresión que indica la línea.
  3. col: Expresión que indica la columna.

4. Funciones de manejo de querys en los Forms:

Ejemplo:

let a = fquery()
valor de a -> "where cliente > 1"

Donde:

  1. where_clause: Expresión alfanumérica que indica la(s) condición(es) WHERE y/u ORDER BY a usar como QUERY.
  2. collist: Expresión alfanumérica que indica la lista de columnas, separadas por comas, que se añadiran a la SELECT que ejecuta el QUERY. Si se usa ORDER BY, se deben indicar las columnas de ordenación, ya que en caso contrario el SQL devolvería el error: "La lista del SELECT debe incluir la columna (...) del ORDER BY".

Devuelve: Número de filas seleccionadas.

Ejemplos:

let num = fgetquery("order by cliente", "cliente")
let num = fgetquery("where cliente = 1")
let num = fgetquery("where cliente > 2 order by cliente", "cliente")

5. Funciones que devuelven valores internos al programa:

expr           Devuelve
"version"     Versión del ctl. P. ej.: "1.0.4.0".
"o.s."         Sistema operativo. P. ej.: "WINDOWS".
"porting"     Indica variación dentro de un mismo S.O.
"atcol"        Columna en la que arrancó el programa en curso.
"atrow"       Fila en la que arrancó el programa en curso.
"ctlname"   Nombre del CTL en curso.

Ejemplo:

if getctlvalue("O.S") = "MSDOS" then
....

6. Funciones de evaluación:

Donde:

funname: Expresión alfanumérica que indica el nombre de una función de usuario o interna.

Ejemplo:

evalfun("getctlvalue", "version")
    equivale a ——> getctlvalue("version")
evalfun(funname(), parm1)
    si funname devuelve "fun1"
    equivale a ——> fun1(parm1)

  1. exprtrue: Si el resultado es cierto.
  2. exprfalse: Si el resultado es falso.
  3. NULL: Si hay error de parámetros.

"oper" puede ser uno de los siguientes: "=", ">", "<", ">=", "<=", "!=", "<>", "like", "matches"

Ejemplo:

let a = (b, ">", c, "ddd", a)

es equivalente a:

if b > c then
    let a = "ddd"
else
    let a = a

  1. exprtrue: Si "exp1" es nulo.
  2. exprfalse: Si "exp1" no es nulo.

7. Funciones de manejo de strings:

  1. where: Expresión alfanumérica donde buscar.
  2. what: Expresión alfanumérica a buscar.
  3. num: Valor por defecto: 1.
  • num < 0: Busca desde el final.
  • num −1: Indica el último.
  • num −2: Indica el penúltimo.

Devuelve posición 1 a "n", o 0 si no encuentra.

Ejemplo:

let pos = strlocate("MultiBase TransTOOLs", "OO")

Devuelve el número de veces encontradas.

Ejemplo:

let num = strcount("A-3393457332", "33")

Ejemplo:

let var = strreplace("/disk1/demo", "k1", "k2", 1)

  1. num: Número de palabra que se desea. Si no se especifica, se asume la primera por defecto.
  2. charseparator: Carácter a utilizar como separador.
  3. typesep Si su valor es FALSE indicará que varios separadores consecutivos equivalen a un solo separador, TRUE en caso contrario. Su valor por defecto es FALSE si el separador es un " " (espacio), TRUE si no lo es.

Devuelve la palabra encontrada, o bien NULL cuando:

  1. No existe la ocurrencia solicitada,
  2. "typesep" es TRUE y hay dos separadores consecutivos en la posición indicada,
  3. si "string" comienza con separador, la primera palabra es NULL. Si "string" finaliza con separador, la última palabra es NULL.

Ejemplo:

let a = strgetword ("/tmp ::/usr", ":", 2, false)

En "a" se cargará el valor "/usr".

  1. charseparator: ver strgetword.
  2. typesep: ver strgetword.

Devuelve número de palabras.

Ejemplo:

let oldpath = "/path1:/path2:/path3"
let num = strnumwords(oldpath, ":")
for i = num down to 1
let newpath = newpath & strgetword(oldpath, ":", i) & ":"

Ejemplo:

let a = strrepeat("-.", 40)

NOTA: Todas devuelven NULL si hay un error en los parámetros, excepto "strgetword", que también puede significar vacío. Para ello debe comprobarse viendo el número real de palabras con "strnumwors()".

8. Funciones de manejo de ficheros:

  1. NULL: Error de parámetros o no puede abrir un fichero.
  2. true/false: Si ha copiado o no algo al fichero de salida.

Ejemplo:

nocomment("f1.err", "f1.sct")

Donde:

  1. file: Fichero.
  2. attri: Expresión alfabética que contiene los permisos que se desean comprobar. Cada caracter indica un permiso:
r: Lectura.
w: Escritura.
x: Ejecución (en ficheros) o búsqueda (en directorios).
f: Si es un fichero.
d: Si es un directorio.

Se puede especificar cualquier combinacion de éstos.

Devuelve:

  1. TRUE si cumple todos los permisos.
  2. FALSE si no cumple alguno de ellos o no existe el fichero.
  3. NULL: error de parámetros.

Ejemplo:

if testfile("fichero", "rwf") = true then
...

Ejemplo:

if filesize("fichero") > 0 then
....

9. Funciones de manejo de directorios:

Ejemplo:

if opendir(dir) = true then begin
    forever begin
      let fil = readdir()
      if fil is null then break
      ...
      ...
    end
    closedir()
end

Nuevas características del entorno

El entorno de la versión 1.0 release 4.0 de MultiBase para sistema operativo UNIX incorpora las siguientes características:

  1. Nuevos generadores.
  2. Macro-Movimientos sobre los distintos menús.
  3. Selección de objetos.

a) GENERADORES: Los nuevos generadores recogen información del diccionario, sobre todo de aquellos elementos de la integridad referencial (Primary y Foreign Keys). Por tanto, cuando deseemos generar el prototipo de la base de datos, convendría tener bien pensada la integridad entre todas las tablas.

En este nuevo entorno no existe persiana de generadores, sino que la generación se encuentra en el mismo nivel que la modificación, compilación, etc., de módulos.

b) MACRO-MOVIMIENTOS: En el nuevo entorno aparece una serie de teclas que provocan un macro-movimiento sobre los menús del pulldown. Por defecto, vienen fijados tres tipos de movimientos, teniendo los puntos de destino que se indican a continuación:

<Ctrl-k>: Elección de un módulo de entrada de datos.
<Ctrl-l>: Creación, modificación de la estructura de una tabla.
<Ctrl-p>: Editor de SQL.

Para cambiar estos tres movimientos por otros cualquiera debemos mantener un nuevo fichero que se encuentra en el directorio donde se haya instalado el MultiBase ($TRANSDIR/etc). El fichero se denomina "fastmove", cuyas características se comentan a continuación.

1. Número: Nivel en el que nos encontramos dentro del pulldown.

0: Primer nivel (pulldown). Los siguientes niveles son las llamadas a menús.
1: Segundo nivel.
2: Tercer nivel.

2. Acción o acciones a tomar para llegar a la opción deseada. En caso de especificar más de una acción, éstas deben ir separadas por un espacio en blanco. Estas acciones serán las que se pasen como parámetros a la función dokey( ) para que provoque dichos movimientos en el pulldown.

3. Tecla que tendremos que pulsar para provocar el movimiento especificado en el campo 2 de este fichero.

Ejemplo:

0|fquit freturn d m e fuser2|fuser3|
0|fquit freturn b t d fuser2|fuser4|
0|fquit freturn s t |fuser5|
1|fquit fquit freturn d m e fuser2|fuser3|
1|fquit fquit freturn b t d fuser2|fuser4|
1|fquit fquit freturn s t |fuser5|
2|fquit fquit fquit freturn d m e fuser2|fuser3|
2|fquit fquit fquit freturn b t d fuser2|fuser4|
2|fquit fquit fquit freturn s t |fuser5|

c) SELECCIÓN DE OBJETOS: En este nuevo entorno, la selección de objetos (tablas, módulos, programas, etc.) se puede realizar especificando el nombre completo o parte de él empleando los metacaracteres que maneja la cláusula MATCHES (asterisco "*", interrogación "?", corchetes "[ ..]", etc.). En caso de introducir el nombre en blanco aparecerá una ventana de selección del objeto en cuestión.

« »