Está en la página 1de 17

Manual de referencia de la clases sqldata, y sqldata2

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

Ambas clases pueden ser utilizadas juntas

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)

Y en la nube , por ejemplo AZURE

No sirven los conectores .net

deben descargar e instalar, en cada pc el correspondiente driver OLEDB , ODBC (32 y 64 bits)

sqldata usa OLEDB,

sqldata2 usa ODBC

sqldata y sqldata2 tienen los mismos metodos

windows 2000,xp,vista,7,8,8.1,10,11,servidores 2000,2003,2008,2008r2,2012,2012r2,2016,2019 32 y 64 bits

compatible también para VFPA 10 (32 y 64 bits)

para activar las conexiones remotas de una pc a otra pc servidor con windows y sql server de cualquier version

1° deben activar en el sql server , permitir conexiones remotas en el servidor


2° en cada pc servidor deben abrir el puerto del Firewall de windows o del antivirus que usen o del rooter
3° instalar en cada pc cliente el driver del motor que usen

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.

Se puede crear índices de fox

Diseñada por Germán Fabricio Valdez

Diseño de las bases de datos

Las tablas que la base de datos contiene deben poseer.

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

*puede ver el motivo por la cual no se conecta al servidor en %appdata%\sqldata\sqldataerrorconexion.txt

*presionando control+Y se insertan registros en un browse

*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).

*Es importante que todos los campos tengan un valor predeterminado.

*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

*Debe respetarse las minusculas de la llamada a la clase.

*Use las clase visuales VCX, y deben usar SET CLASSLIB TO SQLDATA

*Utilice el metodo load del formulario para las consultas

*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

Servidor Remoto y Servidor Local

maestro-esclavo transaccional (bidireccional)

sqldata se configura muy sencillamente

ejemplo

*creación del entorno de conexión una primera conexion via ado a sql server (no se modifica)

LOCAL osqldata as sqldata OF sqldata.sqldata

osqldata=CREATEOBJECT("sqldata.sqldata")
Página 2 de 17
osqldataload=CREATEOBJECT("custom")

osqldata.psqlcargar(_screen,"1",osqldataload)

*y las cadenas para acceder al servidor

LOCAL osqldata as sqldata OF sqldata.sqldata

osqldata=CREATEOBJECT("sqldata.sqldata")

osqldata.psqlcadena(_screen,"1","sql2022","localhost\sql2022e","sa","colon.1618","spanish","read uncommitted","fabrica",”mas opciones”,”1433”)

mas opciones y puerto son opcionales

mas opciones se separan por punto y coma ;

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

administracion de imagenes en servidore

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

ejemplo para 2 imagenes en la tabla "clientes" en el servidor

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

y para otra imagen 2

thisform.oimagen.Picture = clientes.imagenA2

thisform.oimagen.Pictureval = clientes.imagenD2

y para otra nueva imagen 3

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

LOCAL osqldata as sqldata OF sqldata.sqldata

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)

**********************************************************************************

* para borrar la foto actual , en otro boton colocan este codigo

varchivo=""

vextension=""

vmodo="borrar"

valias="clientes"

************************************************************************

osqldata.psqlimagenr(_screen,"1",thisform,valias,vmodo,vnumimagen,varchivo,vextension)

**********************************************************************************

se puede imprimir, antes de guardar la modificacion , o despues

el limite maximo de caracteres de la imagen o del archivo, no debe superar los 16 megas

Detalle de cada método de la clase sqldata y sqldata2

Nombre y Forma de uso Ejemplo


descripción
Crear instancia LOCAL osqldata as sqldata OF sqldata.sqldata LOCAL osqldata as sqldata OF sqldata.sqldata
de la clase. osqldata=CREATEOBJECT("sqldata.sqldata") osqldata=CREATEOBJECT("sqldata.sqldata")
Solo es
necesario una
instancia al
principio de
cada modulo o
método.
Psqlcargar. Osqldataload=CREATEOBJECT("custom") Osqldataload=CREATEOBJECT("custom")
Crea todas las psqlcargar(objeto screen,"numero o nombre de conexión", psqlcargar(_screen,"1",osqldataload)
propiedades y Osqldataload) para formulario de nivel superior debe colocarse un nombre
clases en la propiedad name del servidor ejemplo superior y usar
necesarios para
asi en el load del formulario
el entorno de
psqlcargar(_screen.superior,"1",osqldataload)
desarrollo.

y en todas las funciones donde diga _screen


se reemplaza por _screen.superior

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.

Psqlejecutar osqldata.psqlejecutar(_screen, "1",_screen,, "comando", "comando", "", "set


para enviar languaje 'spanish'")
comandos.
Psqlejecutar osqldata.psqlcomienzo(_screen,"2")
para ejecutar
procedimientos osqldata.psqlparametros("inicializar")
almacenados osqldata.psqlparametros("agregar","@mult1","i","entrada",10,0,"10")
osqldata.psqlparametros("agregar","@mult2","f","entrada",10,2,"22,55")
osqldata.psqlparametros("agregar","@mult3","d","entrada",0,0,DTOC(DATE()))
osqldata.psqlparametros("agregar","@mult4","c","entrada",20,0,"hola mundo")
osqldata.psqlparametros("agregar","@mult5","t","entrada",0,0,TTOC(DATETIME()))
osqldata.psqlparametros("agregar","@result","i","salida",10,0,"")

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

Psqlestado. osqldata.psqlestado(objeto screen,"numero o nombre de IF osqldata.psqlestado(_screen,"1")=.f.


Se utiliza para conexión") MESSAGEBOX("Error al conectarse",64,"Atención")
verificar la osqldata.psqlestado(objeto screen,"numero o nombre de RETURN
conexión conexión",.T.) ENDIF
inicial al devuelve falso si no hay conexión y true si la hay
servidor SQL
Psqlcomtran. osqldata.psqlcomtran(objeto screen,"numero o nombre de osqldata.psqlcomtran(_screen,"1")
Se utiliza para conexión")
iniciar una
transacción. Es
necesaria para
psqlgrabar
Psqlfintran. osqldata.psqlfintran(objeto screen,"numero o nombre de osqldata.psqlfintran(_screen,"1")
Finaliza la conexión")
transacción
abierta con
psqlcomtran
Psqlcomando. osqldata.psqlcomando(objeto screen,"numero o nombre de osqldata.psqlcomando(_screen,"1",”set language ‘spanish’”)
Envia comandos conexión",”comando sql”)
directamente al
servidor osqldata.psqlcomando(objeto screen,"numero o nombre de
conexión",”comando sql”,,.T.) envia el comando y si hay error
continua

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

osqldata.psqlconsulta(objeto screen,"numero o nombre de


conexión",”consulta sql”,numero de consulta)
siempre genera una tabla llamada “temporal”
si la consulta trae muchos select pueden indicar que numero
quieren ver del 2 en adelante o -1 para indicar el ultimo, o
-2 para indicar traer todos

osqldata.psqlconsulta(objeto screen,"numero o nombre de


conexión",”consulta sql”,,.T.)
si hay un error no se genera la tabla temporal

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)

en este modo unicamente puede ocurrir que halla servidores


que cierren la conexión por inactividad y que otros
reconecten, entonces
debe especificarse un tiempo de reenvio de configuracion
que por defecto son 5 minutos
osqldata.psqlcerrar(_screen,"1","manual”,,10)

después de un tiempo de inactividad desde el ultimo comando


enviado al servidor pasado 5 minutos psqlcomienzo controlara
que los bucles de conexión y transaccion esten en 0 0 ambos.

Puede especificar otro tiempo


osqldata.psqlcerrar(_screen,"1","manual”,,,13)
osqldata.psqlcerrar(_screen,"1","automatico”,,,13)
osqldata.psqlcerrar(_screen,"1","mantener”,,,13)

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)

este método puede ser necesario para combinar un sistema


hecho con otra técnica que necesite si o si mantener siempre
la conexión activa para no perder la configuración enviada al
servidor y asi evitar el cierre por inactividad o la
reconexión del servidor.

Psqlinternet osqldata.psqlinternet(_screen,"1","automatico") osqldata.psqlinternet(_screen,"1","automatico")


desconecta el esto se mantiene para compatibilidad con versiones
cursor del anteriores, siempre debe ser automatico
servidor y lo
reconecta
cuando va a
grabar cambios

Ejemplo de uso de todas las funciones.

SET STATUS OFF


SET ECHO OFF
SET TALK OFF
SET NOTIFY OFF
SET NOTIFY CURSOR OFF
SET CONSOLE OFF
SET TEXTMERGE ON
SET DELETED ON
Página 11 de 17
SET DATE TO DMY
SET CENTURY ON
SET NULL ON
SET NULLDISPLAY TO "sin datos"
SET POINT TO ","
SET HOURS TO 24
SET SECONDS ON
SET ESCAPE OFF
SET SYSMENU OFF
SET STRICTDATE TO 0
*aqui debe ir el set path to para que busque la clase y la licencia y todo lo que necesite sus programas
SET CLASSLIB TO sqldata &&linea necesaria para usar sqldata.vcx,vct en lugar de la dll
SET talk off

*configurando el evento para atrapar errores


ON ERROR do perror WITH ERROR( ), MESSAGE( ), PROGRAM( ), LINENO( )
ON SHUTDOWN quit

*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

*esta configuracion acelera todos los comandos notablemente, va antes de psqlestado


*envie comandos de configuracion despues de conectarse al motor separados por ; (punto y coma)
osqldata.psqlcomandoscon(_screen,"1","sp_dboption fabrica, N'autoclose', N'false'",.T.) &&antes sql server 2018 R2 y anteriores

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

hasta aquí todo el código va en el prg de inicio del programa


_______________________________________________________________________________________________________________________

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

*iniciando la conexion con psqlcomienzo


LOCAL osqldata as sqldata OF sqldata.sqldata
osqldata=CREATEOBJECT("sqldata.sqldata")
osqldata.psqlcomienzo(_screen,"1")
vfecha=null
vfecha={15/12/2012}
osqldata.psqlcomando(_screen,"1","update fabrica.dbo.clientes set fnacimiento=?vfecha where id=1")

*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

*desconectando el cursor de la red


*osqldata.psqlcursorcon(_screen,"1",_screen,"clientes","desconectar") &&ejemplos de desconecxiones y conexiones manuales
*osqldata.psqldesconectar(_screen,"1") && un ejemplo de desconexion del servidor y como se vuelve a conectar al grabar

ors=osqldata.psqlrs(_screen,"clientes") &&saber el recordset de ado asociado a un cursor

*grabando los cambios en el cursor (modificados, nuevos, eliminados)


LOCAL osqldata as sqldata OF sqldata.sqldata
osqldata=CREATEOBJECT("sqldata.sqldata")
osqldata.psqlcomienzo(_screen,"1")
osqldata.psqlcomtran(_screen,"1")
osqldata.psqlgrabar(_screen,"1",_screen,"clientes")
osqldata.psqlfintran(_screen,"1")
osqldata.psqlfinal(_screen,"1")
WAIT "Grabado." WINDOW NOWAIT

*refrescando el registro para obtener el id de cada registro nuevo insertado.


LOCAL osqldata as sqldata OF sqldata.sqldata
osqldata=CREATEOBJECT("sqldata.sqldata")
SELECT clientes

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

osqldata.psqlcancelara(_screen,"1",_screen,"clientes",cursorgetprop(“adobookmarck”,”clientes”)) &&solo el registro actual

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

*grabando los cambios en el cursor (modificados, nuevos, eliminados)


LOCAL osqldata as sqldata OF sqldata.sqldata
osqldata=CREATEOBJECT("sqldata.sqldata")
osqldata.psqlcomienzo(_screen,"3")
osqldata.psqlcomtran(_screen,"3")
osqldata.psqlgrabar(_screen,"3",_screen,"clientes")
osqldata.psqlfintran(_screen,"3")
osqldata.psqlfinal(_screen,"3")
WAIT "Grabado." WINDOW NOWAIT

USE IN clientes

MESSAGEBOX("especificando solamente la tabla",64,"Atencion") && se especifico la base de datos en la cadena


*especificando la base de datos en la cadena de sql, no es necesario ponerla en la consulta
oclientes=CREATEOBJECT("cursoradapter")
osqldata.psqlejecutar(_screen,"11",_screen,oclientes,"consultag","clientes","clientes","select * from clientes order by id")
CURSORSETPROP("Buffering",5,"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

*realizando una segunda consulta para ser grabada posteriormente (consultag).


LOCAL osqldata as sqldata OF sqldata.sqldata
osqldata=CREATEOBJECT("sqldata.sqldata")
osqldata.psqlejecutar(_screen,"1",_screen,,"consultag","clientes","fabrica.dbo.clientes","select * from fabrica.dbo.clientes order by id")
CURSORSETPROP("Buffering",5,"clientes")

*enviando un comando al sql con psqlejecutar


LOCAL osqldata as sqldata OF sqldata.sqldata
osqldata=CREATEOBJECT("sqldata.sqldata")

osqldata.psqlejecutar(_screen,"1",_screen,,"comando","comando","","set language 'spanish'")

*envios directos de comandos al sql


osqldata.psqlcomando(_screen,"1","set language 'spanish'")

Página 15 de 17
*envios de varios comandos en una sola sentencia

TEXT TO vcomando noshow


UPDATE fabrica.dbo.clientes
SET direccion='los andes 1155' WHERE id=6;
UPDATE fabrica.dbo.clientes
SET telefono='44442' WHERE id=7
ENDTEXT

LOCAL osqldata as sqldata OF sqldata.sqldata


osqldata=CREATEOBJECT("sqldata.sqldata")
osqldata.psqlejecutar(_screen,"1",_screen,,"comando","comando","",vcomando)

*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

*en la bases de datos fabrica creen el siguiente procediemto


TEXT TO vprocedimiento noshow
CREATE PROCEDURE [dbo].[sp_test]

@mult1 int, @mult2 decimal(10,8),@mult3 date,@mult4 char, @mult5 datetime, @result decimal(10,8)
OUTPUT AS SELECT

@result = @mult2
ENDTEXT

TEXT TO vprocedimiento2 noshow


CREATE PROCEDURE [dbo].[sp_test2]
@result decimal(10,8)

OUTPUT AS SELECT

@result = 8
ENDTEXT

*enviando parametros de entrada y salida al servidor


*siempre deben especificar el nombre de la variable igual a la de SQL
*deben usar los tipos de datos en minuscula que los pueden sacar de AFIELD()
*siempre deben especificar la longitud de los caracteres
*siempre deben especificar 0 o cualquier valoer en longitud de fecha y fechashoras
*los numeros decimales y enteros deben especificar longitud y decimales igual que en sql
*los valores de los parametros de entrada se ingresan en formato caracter
*los valores de los parametros de salida se muestran en formato caracter
*no se puede especificar tipo de datos cursor de salida

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")

LOCAL osqldata as sqldata OF sqldata.sqldata


osqldata=CREATEOBJECT("sqldata.sqldata")
MESSAGEBOX(osqldata.psqlacercade())

PROCEDURE PERROR o prg


LPARAMETER merror, mess, mprog, mlineno

LOCAL osqldata as sqldata OF sqldata.sqldata


osqldata=CREATEOBJECT("sqldata.sqldata")
osqldata.psqlerror(_screen) &&este comando es muy importante incluirlo en el prg que llama ON ERROR, al principio antes de mostrar cualquier
mensaje al usuario

MESSAGEBOX("Ocurrio un error."+mess+". Modulo:"+mprog+"N° de linea"+ALLTRIM(STR(mlineno,10,0))+", reintente",64,"Atencion")

Página 17 de 17

También podría gustarte