Manual Referencia
Manual Referencia
Manual Referencia
Descripción
La clase sqldata es una clase desarrollada en Visual FoxPro 9.0 sp2 (7423) ADO y ADO-ODBC
La clase sqldata2 es una clase desarrollada en Visual FoxPro 9.0 sp2 (7423) solo ODBC
Con esta clase es posible realizar conexiones al motor de base de datos sql server en todas sus versiones
Tambien mysql, mariadb, firebird, prosgreSQL,oracle,sqlite,access,excel (32 y 64 bits), Visual Foxpro (32 bits únicamente)
deben descargar e instalar, en cada pc el correspondiente driver OLEDB , ODBC (32 y 64 bits)
para activar las conexiones remotas de una pc a otra pc servidor con windows y sql server de cualquier version
deberán instalar en el cliente el conector odbc u oledb para el servidor sql que eligieron
Esta clase probada en distintas aplicaciones, resuelve los problemas que pueden ocurrir en las conexiones a servidores mediante internet, y facilita el desarrollo de aplicaciones complejas. Todo mediante las funciones de visual foxpro, para los distintos motores
Deben respetarse algunas pautas de diseño de las bases de datos para que la clase pueda realizar las operaciones de consultar, agregar, modificar y eliminar registros.
Deben utilizarse rutinas de lectura y grabación al servidor que involucran funciones de la sqldata y funciones nativas de Visual FoxPro. El usar las rutinas de grabación que se indican como ejemplo hará que sqldata, se reconecte en caso de haber cortes en internet., también permite abrir y
cerrar conexiones al servidor automáticamente (Si la base de datos esta en la nube se recomienda cierre manual)
Debido a que el cursor que se forma en la consulta a SQL es un cursoradapter, pueden usarse todas las funciones de Visual Foxpro relacionadas.
1) Un campo identity con el nombre “id”. También podran elegir el id key, como “IDK”, o “tipo,documento”
2) Un campo uniqueidentifier con nombre “ui” marcada por rowguide y con valor predeterminado newid() (esto es opcional, pero será útil en caso de querer realizar aplicaciones distribuidas). O ui char(36) para otros motores
3) Un campo timestamp con nombre “ts” (esto es opcional, pero será útil en caso de querer realizar aplicaciones distribuidas).
4) Los campos datetime, y date, (fechas), binary,o image , deben marcarse que permiten nulos.
5) Cualquier otro campo debe ser marcado como no nulo y con valor predeterminado. (recomendado)
Página 1 de 17
Puede verse la base de datos de ejemplo “fabrica”.
Consideraciones adicionales
*Instrucciones generales
*Requiere visual foxpro 9 sp2 7423 visual foxpro advanced 10 32 y 64 bits, windows xp sp3, windows vista, windows 7, windows 8.1, windows 10, windows 11, y todos los windows server
*Las tablas de la base de datos debe contener un campo llamado ID key (opcional).
*Los campos fechas deben marcarse como permitir nulos sin valor por defecto
*Los campos blob o image deben marcarse como permitir nulos, sin valor por defecto
*Los campos binary o varbinary deben marcarse como permitir nulos, sin valor por defecto
*a partir de sql 2008 se puede tener un campo date en lugar del datetime
*Use las clase visuales VCX, y deben usar SET CLASSLIB TO SQLDATA
*Es necesario declarar la clase en cada modulo o metodo por lo menos una vez al comienzo
*el ultimo parametro de la sql cadena isolation puede ser "read uncommitted" o "read committed",”serializable”
*cuando haya que hacer muchas inserciones conviene ir grabando de apoco por posibles cortes de luz sobre el cursor de cursoradapter
*también se puede agregar un timer, que grabe automáticamente cada cierto tiempo
ejemplo
*creación del entorno de conexión una primera conexion via ado a sql server (no se modifica)
osqldata=CREATEOBJECT("sqldata.sqldata")
Página 2 de 17
osqldataload=CREATEOBJECT("custom")
osqldata.psqlcargar(_screen,"1",osqldataload)
osqldata=CREATEOBJECT("sqldata.sqldata")
osqldata.psqlcadena(_screen,"10","mariadb10","localhost","root","colon.1618","spanish","read uncommitted","fabrica",””,”3306”)
osqldata.psqlcadena(_screen,"6","mysql80","localhost","root","colon.1618","spanish","read uncommitted","fabrica",””,”3306”)
*consultas repetitiva
las tablas modelos que siempre se cargan en el formulario, puede resultar lento, ya que cada vez que se abre el formulario vuelve a consultar al servidor
esto desde internet es muy lento, lo que hay que hacer es todos las tablas modelos se deben traer con consultac, osea agregar la "c" a la clasica consulta
la idea es cargar en cada formulario que se abre esta tecnica de cargar las tablas modelos aunque no se usen todas, ya que la programacion, puedes ser mas complejas
se puede hacer un case endcase por grupos, si es que alguna es muy grande y no se desea cargar en todos los formularios
sqlserver, mysql, mariadb, postgresql, con sqldata desde la version 50, para tenes grabadas imagenes o archivos, y ser leido desde cualquier terminal en red local, o por internet
he simplificado la complejidad de manejar imagenes en servidores, con una sola funcion, los campos en los servidores deben especificarse de una manera, unicamente
por ejemplo, si desea colocar 2 imagenes en la tabla "clientes", debe usar estos nombre de campos numerados para cada tabla, o consulta
imagenA: este campo tiene la ruta , donde se almacena la imagen (tipo varchar(200))
imagenD: este campo contiene la foto, u otro archivo (Tipo Image y muy importante, que permita nulos, igual que las fechas )
imagenN: este campo tiene el nombre y la ubicacion original del archivo (en caso de querer ver de donde se subio cierta imagen ) (tipo varchar(200)
estos 3 campos hay que agregarle el numero de imagen "1","2","3", y asi sucesibamente
Página 3 de 17
para agregar imagenes a un formulario se usa un objeto IMAGE
y se configura de 2 maneras
thisform.oimagen.Picture = clientes.imagenA1
thisform.oimagen.Pictureval = clientes.imagenD1
thisform.oimagen.Picture = clientes.imagenA2
thisform.oimagen.Pictureval = clientes.imagenD2
thisform.oimagen.Picture = clientes.imagenA3
thisform.oimagen.Pictureval = clientes.imagenD3
para un reporte deben configurar un objeto image (uno para cada imagen) y agregar como source el camino de la foto, y una condicion
Página 4 de 17
necesitas 2 botones uno "agregar imagen", y otro "borrar imagen"
Página 5 de 17
en el boton agregar imagen colocan estas instrucciones
LOCAL varchivo,vextension,vmodo,valias,vnumimagen
osqldata=CREATEOBJECT("sqldata.sqldata")
varchivo=GETPICT()
vextension=""
vmodo="archivo"
valias="clientes"
SELECT (valias)
vnumimagen="1"
*************************** el siguiente codigo se agrega, copiando y pegando, no debe ser modificado, solo si desea usar otro metodo de grabacion
osqldata.psqlimagenr(_screen,"1",thisform,valias,vmodo,vnumimagen,varchivo,vextension)
************************************************************************
varchivo=GETPICT()
vnumimagen="2"
varchivo=GETPICT()
vextension=""
Página 6 de 17
vmodo="archivo"
valias="clientes"
************************************************************************
osqldata.psqlimagenr(_screen,"1",thisform,valias,vmodo,vnumimagen,varchivo,vextension)
**********************************************************************************
varchivo=""
vextension=""
vmodo="borrar"
valias="clientes"
************************************************************************
osqldata.psqlimagenr(_screen,"1",thisform,valias,vmodo,vnumimagen,varchivo,vextension)
**********************************************************************************
el limite maximo de caracteres de la imagen o del archivo, no debe superar los 16 megas
Página 7 de 17
Psqlcadena. osqldata.psqlcadena(objeto screen,"numero o nombre de osqldata.psqlcadena(_screen,"1", "sql2017", "pcgerman\sqlexpress", "sa",
Establece la conexion", "versión del servidor (sqlauto,sql2000, sql2005, "contraseña", "spanish", "read uncommitted",
cadena de sql2008, sql2012, sql2014,sql2016)", "dirección del servidor\ ”fabrica”,””,”1433”)
conexión al instancia", "usuario", "contraseña", "lenguaje del servidor",
servidor SQL. "método de manejo de transacciones”,”mas opciones”,”puerto”)
mas opciones y puertos son opcionales
Psqlcomienzo. osqldata.psqlcomienzo(objeto screen,"numero o nombre de osqldata.psqlcomienzo(_screen,"1")
Realiza la conexión")
conexión al
servidor si
este está
desconectado.
También
verifica la
conexión y
reconecta en
caso de fallas.
Psqlejecutar. osqldata.psqlejecutar(objeto screen,"numero o nombre de osqldata.psqlejecutar(_screen, "1", _screen,oclientes, "consultag", "clientes",
Realiza conexión", objeto entorno de datos,vacio, "fabrica.dbo.clientes", "select * from fabrica.dbo.clientes")
consultas y "consultag,consultah,consulta,consultac,consultar o comando", CURSORSETPROP("Buffering",5,"clientes") &&por defecto es buffering 5
comandos en el "cursor", "basededatos.dbo.tabla", "select * from
servidor y trae basededatos.dbo.tabla",-1 o numero del select a traer o osqldata.psqlejecutar(_screen, "1", _screen,oclientes, "consultag", "clientes",
el resultado a vacio,”nombreid”,”camposignorados y condiciones separados por "fabrica.dbo.clientes", "select * from fabrica.dbo.clientes",,”idcliente”)
un cursor. coma”,vacio,”idice clave primaria si se usan CURSORSETPROP("Buffering",5,"clientes") &&por defecto es buffering 5
conultag: trae dbf”,”campossimbolos” )
el cursor para CURSORSETPROP("Buffering",3,"cursor") &&por osqldata.psqlejecutar(_screen, "1", _screen,oclientes, "consultag", "clientes",
ser grabado Para poder crear índices "fabrica.dbo.clientes", "select * from
posteriormente Y volver al 5 obligatoriamente fabrica.dbo.clientes",,”codcli”,”grabarid”)
consulta: para CURSORSETPROP("Buffering",5,"cursor") CURSORSETPROP("Buffering",5,"clientes") &&por defecto es buffering 5
informes,
reportes, Por defecto se considsera al usar consultag osqldata.psqlejecutar(_screen, "1", _screen,oclientes, "consultag", "clientes",
consultac: trae Que es una tabla con clave primaria llamada “id” "fabrica.dbo.clientes", "select * from fabrica.dbo.clientes",,”sinidk”)
del cache autoincremental CURSORSETPROP("Buffering",5,"clientes") &&por defecto es buffering 5
Consultar: se
conecta al Puede colocar cualquier nombre y si no es autoincremental
servidor remoto Coloque la palabra grabarid en camposignorados separados por
coma.
Coloque sinidk en el valor de id solo para insertar registros
en una tabla que no tiene id.
ocom=osqldata.psqlejecutar(_screen,"2",,,"procedimiento",,,"fabrica.dbo.sp_test")
MESSAGEBOX( osqldata.psqlparametros("resultado","@result"))
osqldata.psqlparametros("finalizar")
osqldata.psqlfinal(_screen,"2")
Página 8 de 17
Psqlfinal. osqldata.psqlfinal(objeto screen,"numero o nombre de osqldata.psqlfinal(_screen,"1")
Cierra el conexión")
bloque abierto
por
psqlcomienzo
Psqldesconectar osqldata.psqldesconectar(objeto screen,"numero o nombre de osqldata.psqldesconectar(_screen,"1")
. conexión")
Se desconecta
del servidor.
Psqlerror. osqldata.psqlerror(objeto screen) osqldata.psqlerror(_screen)
Rutina que
deshace las
transacciones
abiertas en
caso de
producirse un
error en el
sistema. Debe
ir en el
procedimiento
llamado por ON
ERROR
Psqlgrabar. osqldata.psqlgrabar(objeto screen, "numero o nombre de
Graba un cursor conexión", objeto del entorno de datos, "cursor") LOCAL osqldata as sqldata OF sqldata.sqldata
obtenido con osqldata=CREATEOBJECT("sqldata.sqldata")
consultag osqldata.psqlcomienzo(_screen,"1")
osqldata.psqlcomtran(_screen,"1")
osqldata.psqlgrabar(_screen, "1", thisform, clientes")
osqldata.psqlfintran(_screen,"1")
osqldata.psqlfinal(_screen,"1")
WAIT "Grabado." WINDOW NOWAIT
Página 9 de 17
Psqlconsulta. osqldata.psqlconsulta(objeto screen,"numero o nombre de osqldata.psqlconsulta(_screen,"1",”select * from clientes”)
Envia consultas conexión",”consulta sql”)
directamente al siempre genera una tabla llamada “temporal”
server que ustedes deben cerrar cuando no la necesiten
Psqlcomandoscon osqldata.psqlcomandoscon(objeto screen,"numero o nombre de osqldata.psqlcomandoscon(_screen,"1","SET XACT_ABORT ON") genera error general si
Envia comandos conexion","comando1;comando2;comando3") cualquier comando da error separados por “;”
al conectarse
al servidor osqldata.psqlcomandoscon(objeto screen,"numero o nombre de osqldata.psqlcomandoscon(_screen,"1","SET XACT_ABORT ON",.T.) envia comando por
conexion","comando1;comando2;comando3",.T.) comando separado por “;” y si alguno genera error no lo ejecuta y los demás si
Página 10 de 17
Psqlcerrar abre osqldata.psqlcerrar(_screen,"1","automatico,manual,mantener") osqldata.psqlcerrar(_sreen,"1","automatico")
la conexión al automatico
server en abre y cierra la conexión en cada psqlcomienzo y cierra en
psqlcomienzo y cada psqlfinal de comienzo y fin de bucle
la cierra en
psqlfinal en manual
modo automatico abre la conexión en cada psqlcomienzo y cierra en cada
psqlfinal pasado 15 minutos por defecto, puede cerrarse sola,
por inactividad del servidor. Puede cerrarla antes o después
especificando el tiempo en minutos
osqldata.psqlcerrar(_screen,"1","manual”,20)
mantener
envia un comando cada 5 minutos al servidor para evitar que
cierre la conexion
osqldata.psqlcerrar(_screen,"1","mantener")
envia un comando cada cierto tiempo especificado en minutos
al servidor para evitar que se cierre la conexión con el
servidor y se pieda la configuracion
osqldata.psqlcerrar(_screen,"1","mantener",1)
*creación del entorno de conexión primera conexion via ado a sql server
LOCAL osqldata as sqldata OF sqldata.sqldata
osqldata=CREATEOBJECT("sqldata.sqldata")
osqldataload=CREATEOBJECT("custom")
osqldata.psqlcargar(_screen,"1",osqldataload)
*creación del entorno de conexión segunda conexion via ado a sql server local
LOCAL osqldata as sqldata OF sqldata.sqldata
osqldata=CREATEOBJECT("sqldata.sqldata")
osqldataload=CREATEOBJECT("custom")
osqldata.psqlcargar(_screen,"1local",osqldataload)
*creación del entorno de conexión para una tercera conexión via ado a sql sever
LOCAL osqldata as sqldata OF sqldata.sqldata
osqldata=CREATEOBJECT("sqldata.sqldata")
osqldataload=CREATEOBJECT("custom")
osqldata.psqlcargar(_screen,"2",osqldataload)
*creación del entorno de conexión para una cuarta conexión via odbc a sql server
LOCAL osqldata as sqldata OF sqldata.sqldata
osqldata=CREATEOBJECT("sqldata.sqldata")
osqldataload=CREATEOBJECT("custom")
osqldata.psqlcargar(_screen,"3",osqldataload)
*creación del entorno de conexión para una quinta conexión via oledb a sql server
LOCAL osqldata as sqldata OF sqldata.sqldata
osqldata=CREATEOBJECT("sqldata.sqldata")
osqldataload=CREATEOBJECT("custom")
osqldata.psqlcargar(_screen,"4",osqldataload)
*creación del entorno de conexión para una sexta conexión via a sql server especificando la base de datos
LOCAL osqldata as sqldata OF sqldata.sqldata
osqldata=CREATEOBJECT("sqldata.sqldata")
osqldataload=CREATEOBJECT("custom")
osqldata.psqlcargar(_screen,"11",osqldataload)
*ejemplo de servidor para conexiones odbc con el proveedor sql server generico
LOCAL osqldata as sqldata OF sqldata.sqldata
osqldata=CREATEOBJECT("sqldata.sqldata")
osqldata.psqlcadena(_screen,"3","odbcsql-sqlserver","DRIVER={ODBC Driver 17 for SQL Server};Server=localhost\sql2017e","sa","colon.1618","spanish","read uncommitted")
Página 12 de 17
_____________________
*estableciendo la cadena de conexion para la primera conexión usando oledb a sql server genérico
vcadenaconexionado="Provider=sqloledb;Persist Security Info=True;Integrated Security=SSPI;Packet Size=8192;Current Language=español;Initial Catalog=tempdb;Data Source=localhost\sql2017e"
osqldata.psqlcadena(_screen,"1","oleddbsql-sqlserver”,vcadenaconexionado,"sa","colon.1618","spanish","read uncommitted",”fabrica”)
*estableciendo la cadena de conexion para la segunda conexión usando oledb a sql server
osqldata.psqlcadena(_screen,"2","sql2017","localhost\sql2017e","windows","","spanish","read uncommitted",”fabrica”)
*estableciendo la cadena de conexion para la tercera conexión usando oledb a sql server para uso especial
osqldata.psqlcadena(_screen,"1local","sql2017","localhost\sql2017e","windows","","spanish","read uncommitted",”fabrica”)
osqldata=CREATEOBJECT("sqldata.sqldata")
osqldata.psqlcerrar(_screen,"1","automatico") &&abre la conexion al servidor en psqlcomienzo y la cierra en psqlfinal los parametros son manual o automatico
osqldata.psqlinternet(_screen,"1","automatico") &&indica que la conexion es por internet
osqldata.psqlcache(_screen,"1","automatico") &&indica que se usara cache por cada consultac
osqldata.psqlcache(_screen,"1local","automatico") &&indica que se usara cache por cada consultac
osqldata.psqllocal(_screen,"1local","automatico") &&indica que se usara consultas servidores locales por cada consulta o consultac
*osqldata.psqlcacheborrar(_screen,"1","todo") &&borra las consultas del cache
osqldata.psqlcomandoscon(_screen,"1","ALTER DATABASE fabrica SET AUTO_CLOSE OFF",.F.) &&desde sql server 2012 en adelante
*proba con la segunda siempre, y si da error reenplazala por la primera
osqldata.psqltiempocon(_screen,"1",15) &&tiempo en segundos que se espera para conectarse al servidor (15 segundos por defecto
osqldata.psqltiempocom(_screen,"1",0) &&tiempo en segundos que se espera que finalize una sentencia, (0 segundos por defecto es indefinidamente)
*verificando la conexiones
&&si hay un error al conectarse debe verse sqldataconexion.txt en %appdata%\sqldata, donde se describe por que no se conecta
IF osqldata.psqlestado(_screen,"1")=.f.
MESSAGEBOX("Error al conectarse 1",64,"Atención")
RETURN
ENDIF
IF osqldata.psqlestado(_screen,"1local")=.f.
MESSAGEBOX("Error al conectarse 1local",64,"Atención")
RETURN
ENDIF
IF osqldata.psqlestado(_screen,"2")=.f.
MESSAGEBOX("Error al conectarse 2",64,"Atención")
RETURN
ENDIF
IF osqldata.psqlestado(_screen,"3")=.f.
MESSAGEBOX("Error al conectarse 3",64,"Atención")
RETURN
ENDIF
IF osqldata.psqlestado(_screen,"4")=.f.
MESSAGEBOX("Error al conectarse 4",64,"Atención")
RETURN
ENDIF
Página 13 de 17
Lo que sigue se puede colocar en métodos del formulario o de botones
DO FORM clientes
DO FORM oclientes
*lineas para traer un cursor con los datos seleccionados para posteriormente ser grabados los cambios (consultag)
LOCAL osqldata as sqldata OF sqldata.sqldata
osqldata=CREATEOBJECT("sqldata.sqldata")
oclientes=CREATEOBJECT("cursoradapter")
osqldata.psqlejecutar(_screen,"1",_screen,oclientes,"consultag","clientes","fabrica.dbo.clientes","select * from fabrica.dbo.clientes where confirma=0 order by id")
CURSORSETPROP("Buffering",3,"clientes")
*se puede crear índices al cursor, como si fueran tablas dbc, pero si refrescan los datos, tienen que volver a crearlos
SELECT clientes
INDEX on id TAG id
INDEX on nombre TAG nombre
INDEX on precio TAG precio
CURSORSETPROP("Buffering",5,"clientes")
*el tercer parámetro corresponde al objeto formulario que contiene el entorno de datos puede ser (_screen, thisformset, o thisform)
*solo cuando se trabaja con multiples sesiones de datos. sino usar _screen
*se especifica el ID key que por defecto es id y se excluye una columna calculada de la grabacion "totales" estos 2 campos son opcionales
*ejemplo con otro id y campos ignorados
osqldata.psqlejecutar(_screen,"1",_screen,oclientes,"consultag","clientes","fabrica.dbo.clientes","select *, 99.99 as total1,999999.99 as total2 from fabrica.dbo.clientes order by
id_cliente",,"id_cliente","total1,total2")
*puede colocar en camposignorados la expresion "grabarid" y eso hara que el id se grabe en el servidor cuando no sea autoincremental
*por ejemplo si usa una combinacion de fecha y nrodefactura podra ponerlos separados pos coma
*puede llamar al metodo psqlcamposignorados para indicar que campos no deben grabarse tambien puede llamar al metodo para indicar "grabarid" y eso hara
*que en todo el programa se grabe el id por no usar autoincremental
Página 14 de 17
*cancelando cualquier cambio realizado en el cursor
LOCAL osqldata as sqldata OF sqldata.sqldata
osqldata=CREATEOBJECT("sqldata.sqldata")
osqldata.psqlcancelar(_screen,"1",_screen,"clientes") &&todas las modificaciones del cursor
USE IN clientes
*probando odbc
MESSAGEBOX("Probando odbc",64,"Atencion")
oclientes=CREATEOBJECT("cursoradapter")
osqldata.psqlejecutar(_screen,"3",_screen,oclientes,"consultag","clientes","fabrica.dbo.clientes","select * from fabrica.dbo.clientes order by id")
CURSORSETPROP("Buffering",5,"clientes")
SELECT clientes
BROWSE
USE IN clientes
SELECT clientes
*grabando los cambios en el cursor (modificados, nuevos, eliminados)
LOCAL osqldata as sqldata OF sqldata.sqldata
osqldata=CREATEOBJECT("sqldata.sqldata")
osqldata.psqlcomienzo(_screen,"11")
osqldata.psqlcomtran(_screen,"11")
osqldata.psqlgrabar(_screen,"11",_screen,"clientes")
osqldata.psqlfintran(_screen,"11")
osqldata.psqlfinal(_screen,"11")
WAIT "Grabado." WINDOW NOWAIT
Página 15 de 17
*envios de varios comandos en una sola sentencia
*realizando consulta sobre la segunda conexión (consulta) para ser utilizado en vistas o estadisticas.
LOCAL osqldata as sqldata OF sqldata.sqldata
osqldata=CREATEOBJECT("sqldata.sqldata")
osqldata.psqlcomienzo(_screen,"2")
*en este select se muestra todos los clientes que tienen direccion duplicada
osqldata.psqlejecutar(_screen,"2",_screen,oclientes,"consulta","clientes","","select * from fabrica.dbo.clientes where direccion in (select direccion from fabrica.dbo.clientes group by direccion having
count(direccion)>=2)")
SELECT clientes
BROWSE
*cerrando el cursor
USE IN clientes
@mult1 int, @mult2 decimal(10,8),@mult3 date,@mult4 char, @mult5 datetime, @result decimal(10,8)
OUTPUT AS SELECT
@result = @mult2
ENDTEXT
OUTPUT AS SELECT
@result = 8
ENDTEXT
osqldata.psqlcomienzo(_screen,"2")
osqldata.psqlparametros(_screen,"2","inicializar")
osqldata.psqlparametros(_screen,"2",agregar","@mult1","i","entrada",10,0,"10")
osqldata.psqlparametros(_screen,"2",agregar","@mult2","f","entrada",10,8,"22,55887766")
osqldata.psqlparametros(_screen,"2","agregar","@mult3","d","entrada",0,0,DTOC(DATE()))
Página 16 de 17
osqldata.psqlparametros(_screen,"2","agregar","@mult4","c","entrada",20,0,"hola mundo")
osqldata.psqlparametros(_screen,"2","agregar","@mult5","t","entrada",0,0,TTOC(DATETIME()))
osqldata.psqlparametros(_screen,"2","agregar","@result","f","salida",10,8,"")
*una vez creado el procedimiento pueden quitar el * a las dos lineas siguientes
osqldata.psqlejecutar(_screen,"2",,,"procedimiento",,,"fabrica.dbo.sp_test")
MESSAGEBOX( osqldata.psqlparametros(_screen,"2","resultado","@result"))
osqldata.psqlparametros(_screen,"2","finalizar")
otro metodo
vresult=5
ocomando=CREATEOBJECT("cursoradapter")
osqldata.psqlejecutar(_screen,"1",_screen,ocomando,"comando","comando","","exec fabrica.dbo.sp_test2 ?vresult" )
osqldata.psqlfinal(_screen,"2")
Página 17 de 17