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