Sqldata y Sqldata2 v63 2020.08.02 FREE (maximo de registros)
hola grupo
link de descarga
sqldata
sqldata2
solo hay que hacer pocos cambios en el formulario.
-traer un cursor, modificarlos con instrucciones de vfox,y grabarlo
-luego aprenderan a optimizarlo
-puede convivir con dbf, y los motores a la vez
un nuevo parametro maxrk
esto hace que se traigan del servidor al cliente, solamente un maximo de registros,
similar a select TOP, pero sin espeficarlo
ejemplo
osqldata.psqlejecutar(_screen,"1",thisform,oclientes,"consultag","clientes","clientes","select * from clientes order by id",,,"maxrk50")
trae los primeros 50 registros
maxrk0 trae el cursor vacio
____________________
funciona para red local, internet servidores propios, y servidores de terceros
recomiendo que si tienen que migrar de dbf al servidor, usen sql server desde la version 2008 R2 SP2 en adelante,
permite multiples conexiones, por ejemplo sqlserver , y mysql, y distintos drivers de conexion
conectando un servidor a la vez, o varios
ventajas de sql server (la cual recomiendo)
*sql server tiene el tipo de dato "bit", que es para almacenar valores .T. y .F. , las demas bases de datos hay que cambiar todo a 1 y 0
*ademas del campo "money" que no existe en ninguna otro motor de base de datos
*hay muchas herramientas para sql server como reparador de base de datos, y otros
*pueden complementar con Visual Studio .NET y OFFICE
*pueden crear procedimientos almacenados complejos
*y todo es de microsoft
*hay versiones gratuitas y una version standar y otra enterpise.
ademas se pueden conectar a MICROSOFT AZURE en la web (desde vfp), donde se puede acceder desde varias sucursales, creando una VPN, o directamente
*tiene drivers para python , php, y otros
*el servidor de azure tiene precios gratis y accesibles, a medida que crece mas la empresa
*ademas que tiene todo el respaldo de MICROSOFT
*y otras grandes ventajas.
German Fabricio Valdez
pueden ir convirtiendo el proyecto por etapas, combinando dbf, con servidores de base de datos, por ejemplo sqlserver
sqldata2 corre en VFPA 2019.08.30 en adelante
mejoras
-los campos de tipo fechas, y image, blob, tienen que permitir nulos, ya que la clase, no permite fechas vacias, "0000-00-00", o "0000-00-00 00:00:00", de mariadb y mysql
-si hay fechas en formularios, que pueden quedar vacias, hay que convertirla a nulo antes de grabar, colocando este codigo en el valid del textbox, en formularios o grillas: this.value=IIF(ISBLANK(this.value),null,this.value), o claquier otro metodo
-para cambiar a valor nulo de un textbox presionen control+0
-los erres al conectarse se graban en %appdata%\sqldata o %appdata%\sqldata2, y se muestra
_______
Clase para Visual Foxpro, que permite conectarse a servidores remotos (sql server, mysql, mariadb, postgresql, firebird, oracle)
sqldata2 tiene las mismas funcionalidades que sqldata, y pueden trabajar juntas en el proyecto
la clase visual sqldata esta diseñada con cursoradapter via ADO (oledb,oledb-odbc)
la clase visual sqldata2 esta diseñada con cursoradapter via ODBC (unicamente)
pueden conectarse a base de datos en la nube (MICROSOFT AZURE, GOOGLE CLOUD, AMAZON WEB, y otros)
sqldata y sqldata2 ,tambien funcionan en Visual Foxpro Advanced de 64 bits
en ambos casos pueden usar los archivos VCX,VCT, en sus proyectos sin tener en cuenta la registracion de las dll
si la quieren registrar a la sqldata.dll (32bits o 64bits), lo pueden hacer
*Con la clase sqldata, gratuita, que he desarrollado, para la comunidad de FOX, podran acceder a servidores microsoft sql server, mysql, mariadb,postgreSQL,oracle,firebird,visual foxpro (32 bits), access y excel, facilmente, o si necesitan interactuar con otros motores a la vez
*la clase devuelve en las consultas al servidor, un cursor DBF, despues modifican el cursor, y cuando lo graban traduce
las modificaciones al server
Esta desarrollado forma nativa VFP9 SP2 para VFP9 SP2 , tambien permite compilar el proyecto en Visual Foxpro 8 SP1
resuelve muchos problemas de conexion en red local e internet
para ser usada en tecnica de programacion cliente-servidor.
además podran usar tecnicas para servidores de bases de datos distribuidos
esta version de la sqldata es compatible con las anteriores
pueden acceder a distintos servidores a la vez, del mismo motor o distintos
compatible con sql2000, sql2005, sql2008, y sql2008r2, sql2012, sql2014, sql2016, sql2017, sql2019 (express, estandar, developer, enterprise), mysql, mariadb, postgresql, firebird, oracle
windows 7,8,8.1,10(mayo 2020), (32 y 64 bits)
deben instalar el correspondiente sqlncli.msi de 32 o 64 bits en cada PC cliente para cada version SQL Server que utilicen
o el nuevo msoledbsql.msi 32 y 64bits, tambien los controladores odbc de mysql y mariadb, postgresql, oracle, firebird
se incluye un manual en word e instrucciones.txt , una base de datos de ejemplo en sql2014, varios prg, 4 formularios, 1 reporte, 1 base de datos de Visual Foxpro 2 tablas, 1 archivo de Access 2013, 1 de Excel 2013, y un proyecto con ejemplos
pueden usar la sqldata.dll (32 y 64 bits) y registrala en cada pc,
o la clase visual sqldata (vcx,vct)
______
*ejenplo de una grabacion de cabecera-detalle sin usar id, ejemplo (tipo,numero) o (documento)
*osqldata.psqlejecutar(_screen,"6",_screen,oclientes,"consultag","clientes","","select * from fabrica.clientes",,"tipo,documento","grabarid")
*ejemplo de una grabacion CABECERA-DETALLE, leer y grabar en mysql, mariadb, postgresql, sql server, oracle, utilizando campos ID para relacionar
*cree uan base de datos llamada fabrica
*luego cree una tabla llamada clientes
*id autoincremental primary key o serial, direccion, domicilio, telefono, fnacimineto, precio, confirma (boolean)
*y una tabla detalle con id autoincremental primary key o serial, idcliente int y cuota=int
*configuraciones de fox necesarias
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
SET DATE TO DMY
SET CENTURY ON
SET NULLDISPLAY TO "sin datos"
SET POINT TO ","
SET HOURS TO 24
SET SECONDS ON
SET ESCAPE OFF
SET CLASSLIB TO sqldata
*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 para una sexta conexión via a odbc mysql
LOCAL osqldata as sqldata OF sqldata.sqldata
osqldata=CREATEOBJECT("sqldata.sqldata")
osqldataload6=CREATEOBJECT("custom")
osqldata.psqlcargar(_screen,"6",osqldataload6)
LOCAL osqldata as sqldata OF sqldata.sqldata
osqldata=CREATEOBJECT("sqldata.sqldata")
osqldata.psqlcadena(_screen,"6","odbcsql-mysql","DRIVER={MySQL ODBC 8.0 ANSI Driver} ;SERVER=localhost; PORT=3306; MULTI_STATEMENTS=1; database=fabrica; OPTIONS=88082432","root","colon.1618","spanish","read uncommitted")
IF osqldata.psqlestado(_screen,"6")=.f.
MESSAGEBOX("Error al conectarse 6",64,"Atención")
RETURN
ENDIF
osqldata.psqlcerrar(_screen,"6","automatico") &&abre la conexion al servidor en psqlcomienzo y la cierra en psqlfinal los parametros son manual o automatico
osqldata.psqlinternet(_screen,"6","automatico") &&indica que la conexion es por internet
osqldata.psqlcache(_screen,"6","automatico") &&indica que se usara cache por cada consultac
____________ hasta aqui es la configuracion de la clase , se debe colocar en el prg de inicio por unica vez
____________ lo que sigue se puede poner en el load del formulario o en botones y otros
IF USED("clientes")
USE IN clientes &&es necesario que el cursor no exista antes de llamar a psqlejecutar
ENDIF
IF USED("detalle")
USE IN detalle &&es necesario que el cursor no exista antes de llamar a psqlejecutar
ENDIF
LOCAL osqldata as sqldata OF sqldata.sqldata
osqldata=CREATEOBJECT("sqldata.sqldata")
osqldata.psqlcomienzo(_screen,"6")
oclientes=CREATEOBJECT("cursoradapter")
osqldata.psqlejecutar(_screen,"6",_screen,oclientes,"consultag","clientes","","select * from fabrica.clientes") &&trae el cursor vacio
CURSORSETPROP("Buffering",3,"clientes") &&por defecto es buffering 5
RECCOUNT("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
odetalle=CREATEOBJECT("cursoradapter")
osqldata.psqlejecutar(_screen,"6",_screen,odetalle,"consultag","detalle","","select * from fabrica.detalle") &&trae el cursor vacio
CURSORSETPROP("Buffering",3,"detalle") &&por defecto es buffering 5
RECCOUNT("detalle")
osqldata.psqlfinal(_screen,"6")
SELECT clientes
APPEND BLANK
replace nombre WITH "German",;
direccion WITH "los andes",;
telefono WITH "444",;
fnacimiento WITH DATE(),;
precio WITH 10.20,;
confirma WITH .t.
SELECT detalle
APPEND BLANK
replace cuota WITH 2
SELECT clientes
IF NOT TABLEUPDATE(.t.)
MESSAGEBOX("No se grabaran los ultimos cambios",64,"Atencion")
TABLEREVERT(.t.)
ENDIF
SELECT detalle
IF NOT TABLEUPDATE(.t.)
MESSAGEBOX("No se grabaran los ultimos cambios",64,"Atencion")
TABLEREVERT(.t.)
ENDIF
*grabando los cambios en el cursor (modificados, nuevos, eliminados)
LOCAL osqldata as sqldata OF sqldata.sqldata
osqldata=CREATEOBJECT("sqldata.sqldata")
osqldata.psqlcomienzo(_screen,"6")
osqldata.psqlcomtran(_screen,"6")
osqldata.psqlgrabar(_screen,"6",_screen,"clientes")
SELECT clientes
REFRESH() &&refrescando el registro para obtener el id de cada registro nuevo insertado. la idea es ingresar el registro a la cabecera y varios al detalle
UPDATE detalle SET idcliente=
clientes.id WHERE idcliente=0 &&ahora con el id, lo agregamos a la tabla detalle
osqldata.psqlgrabar(_screen,"6",_screen,"detalle")
osqldata.psqlfintran(_screen,"6")
osqldata.psqlfinal(_screen,"6")
WAIT "Grabado." WINDOW NOWAIT
USE IN clientes
USE IN detalle
* fin del ejemplo con mysql, se destruye la clase en memoria al salir del programa (optativo)
LOCAL osqldata as sqldata OF sqldata.sqldata
osqldata=CREATEOBJECT("sqldata.sqldata")
osqldata.psqldesconectar(_screen,"6")
REMOVEPROPERTY(_screen,"sqlconnection6")
REMOVEPROPERTY(_screen,"sqldata6")
LOCAL osqldata as sqldata OF sqldata.sqldata
osqldata=CREATEOBJECT("sqldata.sqldata")
MESSAGEBOX(osqldata.psqlacercade())
PROCEDURE PERROR
LPARAMETER merror, mess, mprog, mlineno
LOCAL osqldata as sqldata OF sqldata.sqldata
osqldata=CREATEOBJECT("sqldata.sqldata")
osqldata.psqlerror(_screen)
MESSAGEBOX("Ocurrio un error."+mess+". Modulo:"+mprog+"N° de linea"+ALLTRIM(STR(mlineno,10,0))+", reintente",64,"Atencion")
RETURN TO MASTER