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

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

Apéndice 1. Ejemplo de comunicación con un servicio remoto

A continuación se muestra un ejemplo de utilización del CTL como servidor remoto para un programa de mantenimiento de clientes. El ejemplo es similar al de la aplicación de demostración de MultiBase en el que se ha supuesto que la tabla «provincias» pertenece a una base de datos remota y el resto de tablas están en la base de datos local.

El nombre de la máquina UNIX remota es «unix», y el nombre del servicio que lanza el CTL remoto es «serverctl». El ejemplo 1 será el programa que ejecuta en local y el ejemplo 2 será el programa lanzado en remoto.

Ejemplo 1: Programa de la máquina «cliente»:

database almacen
define
    variable resultado char(20)
    variable seleccionar char(500)
    variable insertar char(500)
    variable err integer
    stream serv
    frame provi
screen
{
Codigo Provincia ....:[a1 ]
Descripcion ....: [a2          ]
Prefijo ........: [a3 ]
}
end screen
variables
    a1 = provinfram smallint
    a2 = descrip char
    a3 = prefijo smallint
end variables
end frame

form
screen
{
  Codigo Cliente...... : [f1    ]
  Empresa............. : [f2       ]
  Apellidos........... : [f3       ]
  Nombre.............. : [f4      ]
  Direccion1.......... : [f5       ]
  Direccion2.......... : [f6       ]
  Poblacion........... : [f7      ]
  Provincia........... : [f8]   [u1   ]
  Distrito............ : [f9     ]
  Telefono............ : [f10      ]
  Forma de Pago....... : [a ]
  Total Facturado..... : [f12      ]
  }
end screen

tables
    clientes
end tables

variables
    f1 = clientes.cliente       required
    f2 = clientes.empresa
    f3 = clientes.apellidos
    f4 = clientes.nombre
    f5 = clientes.direccion1
    f6 = clientes.direccion2
    f7 = clientes.poblacion
    f8 = clientes.provincia
    u1 = vartable.descripcion    char
    f9 = clientes.distrito
    f10 = clientes.telefono
    a = clientes.formpago
    f12 = clientes.total_factura
end variables

menu mb ‘Clientes’
    option a1 ‘Seleccionar’
      query
    option a2 ‘Modificar’
      modify
    option a3 ‘Borrar’
      remove
    option a4 ‘Agregar’
      add
end menu

editing
 after provincia
   let seleccionar =
   "select descripcion from " &&
   "provincias where provincia ="
   && provincia left
   let descripcion = exec_remote (seleccionar, "L")
   if descripcion is null or descripcion = ""
   then begin
   if yes ("No existe. Desea darla de alta","Y")=true
      then begin
       let provi.provinfram = provincia
       let provi.descrip = NULL
       let provi.prefijo = NULL
       input frame provi for update at 5,5 end input
        let insertar = "insert into provincias " &&
         "(provincia, descripcion, prefijo) "
         && "values ("&& provi.provinfram &&",’"
         && provi.descrip
         &&"’,"&& provi.prefijo &&")"
       clear frame provi
       let err = exec_remote(insertar, "I")
       let descripcion = exec_remote(seleccionar, "L")
        end
        else begin
          let provincia = null
          next field "provincia"
        end
      end
end editing
end form
end define

main begin
    call open_serv()
    menu form
    call close_serv()
end main

function exec_remote(stmt, oper)
begin
    put stream serv oper, skip, flush
    put stream serv stmt clipped, skip, flush
    let resultado = NULL
    prompt stream serv for resultado as line
    end prompt
    return resultado
end function

function open_serv()
begin
    start input-output stream serv
      through "@unix:serverctl"
end function

function close_serv()
begin
    stop input-output stream serv
end function

Ejemplo 2: Programa de la máquina «servidor»:

define
    variable directorio char(60)
    variable operacion char(1)
    variable frase char(500)
    variable descripcion char(20)
end define

main begin
    database almacen
    forever begin
      let operacion = NULL
      let frase = NULL
      prompt for operacion as line end prompt
      if eof of standard = true then
        break
      prompt for frase as line end prompt
      if frase is null then begin
        put stream standard skip, flush
        continue
      end
      prepare instr from frase clipped
      switch operacion
        case "L"
        declare cursor lectura for instr
        let descripcion = ""
        open lectura
        fetch lectura into descripcion
        close lectura
        put stream standard descripcion clipped, skip, flush
        case "I"
        execute instr
        put stream standard errno, skip, flush
      end
    end
end main

« »