Skip to content

Instantly share code, notes, and snippets.

@walney
Forked from Irwin1985/vfp_odbc_help.md
Created November 6, 2021 09:07
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save walney/a3297e51424cb382117ce8f03a4fe22d to your computer and use it in GitHub Desktop.
Save walney/a3297e51424cb382117ce8f03a4fe22d to your computer and use it in GitHub Desktop.

VFP_ODBC

Librería ligera para acceso a datos mediante ODBC

Patrocinada por

N|Solid

Características

  • Conexión a servidores mediante ODBC.
  • Uso nativo de la base de datos de Visual FoxPro (DBC)
  • Creación de cursores actualizables (Vistas Nativas) y de solo lectura.

Instalación

La librería consiste en un único PRG por lo tanto asegurate de incluirla en tu proyecto primero.

Luego en algún punto de tu PRG principal deberás cargar la clase en memoria.

SET PROCEDURE TO "VFP_ODBC" ADDITIVE

Como la librería trabaja con string de conexiones entonces no es mala idea que te crees una variable y almacenes tu string de conexión con los parámetros de acceso a tus datos.

LOCAL lcStringConnect
lcStringConnect = "Driver={MariaDB ODBC 3.1 Driver};Server=localhost;User=root;Password=1234;DATABASE=nation;PORT=3307;"

Es importante que especifiques la base de datos con la que piensas trabajar, esto es con la finalidad de crear la base de datos DBC en tu disco que únicamente servirá de contenedor para las conexiones y las vistas remotas.

El ejemplo anterior es para el caso concreto de MariaDB pero también tiene soporte para MySQL y SQL Server; la librería internamente tiene implementadas las subclases para FireBird, PostGreSQL y SQLite pero por ahora se encuentran sin soporte.

Creando una Conexión

Una vez que hayas creado tu variable con el string de conexión entonces ya es posible conectarte a tu servidor de base de datos con la siguiente línea de código:

LOCAL oCon
oCon = CREATEOBJECT("odbc", lcStringConnect)

Si todo marcha bien oCon ya debería contener la referencia a tu conexión, por lo tanto solo te queda abrir una tabla y jugar con ella.

Abriendo una tabla

Puedes abrir una tabla de modo lectura o escritura. La diferencia no tengo porque explicartela así que te muestro la línea de código más simple para abrir una tabla en modo escritura.

oCon.Use("clientes")

¿Bastante fácil verdad?, hemos abierto una tabla en modo escritura lo cual quiere decir que desde ya puedes hacer cualquier mantenimiento sobre dicha tabla y tras un TABLEUPDATE() o TABLEREVERT() podrás afectar sus filas hacia el servidor.

Muy bien, ahora estudiemos a fondo los parámetros del método Use().

Parámetros del método Use()

Con tan solo ejecutar oCon.Use("clientes") estamos omitiendo una lista de parámetros que la librería asume por defecto, la lista completa de parámetros son:

  • tcTableName: este es el único parámetro requerido ya que sin él no es posible saber qué tabla quieres abrir.
  • tcAlias: es opcional e indica el alias de tu tabla, en caso de estar vacío asume el nombre de la tabla.
  • tcMode: pasa una 'r' para readonly o solo lectura y una 'w' o vacío para modo escritura.
  • tcWhere: ¿tu tabla necesita abrirse con una condición o filtro? entonces envía tu filtro por aquí.
  • tnDataSession: ¿trabajas con sesiones privadas? pues especifícala aquí.
  • tcNoData: ¿quieres solo la estructura de la tabla? entonces envía 'no data' en este parámetro.

Flexibilidad de los parámetros

Los parámetros que te he mostrado no tienen por que ser enviados en el mismo orden. VFP_ODBC te permite ser holgazán y enviar solo los parámetros que necesites.

Veamos algunos ejemplos:

Quiero abrir una tabla rápido para guardar / eliminar filas

oCon.Use("clientes")

Ahí tienes tu tabla en modo escritura y con el mismo ALIAS().

Quiero abrir una tabla solo para consultar datos

oCon.Use("clientes", "r")

Ahí tienes tu tabla en modo lectura y con el mismo ALIAS().

Quiero abrir una tabla en modo escritura con un alias en específico

oCon.Use("clientes", "misClientes")

Ahí la tienes, una tabla actualizable cuyo ALIAS() es 'misClientes'

Quiero consultar el número de cuenta bancaria de un cliente dado

oCon.Use("clientes", "numeroCuenta = ?thisform.codigo_cliente")

Ahí la tienes, la tabla 'clientes' filtrada por el número de cuenta. Aquí asumo que la estás llamando desde un formulario en cuya propiedad 'codigo_cliente' tienes almacenado temporalmente el código del cliente que tienes en pantalla.

NOTA: si cambias tu propiedad 'codigo_cliente' y quieres actualizar tu vista solo haz un REQUERY() ¿Fácil verdad? :)

Quiero abrir una tabla de solo lectura con un alias particular y en una sesión privada de mi formulario

oCon.Use("clientes", "miListaDeClientes", "r", thisform.datasessionid)

Ahí la tienes, la tabla 'clientes' con el ALIAS() 'miListaDeClientes' en modo lectura y abierta solo para la sesión de tu formulario :)

Quiero una tabla o cursor vacío

oCon.Use("clientes", "no data")

En fin, ya vez que el orden de los parámetros NO IMPORTA, solo envía los que necesites y deja que la librería haga el trabajo sucio por ti.

Con esta librería serás tan productivo como lo eres con un cursor nativo actualizable, es decir, solo tienes que preocuparte de darle el tratamiento a tu vista o cursor con los comandos que conoces de toda la vida: LOCATE FOR, SELECT, GO TOP, RECNO(), REPLACE, APPEND BLANK, TABLEUPDATE(), TABLEREVERT(), REQUERY(), etc

Siempre tuve en mente tu productividad y por eso la he desarrollado de esta manera para que no tengas que estar escribiendo tus consultas en la forma que te lo pide tu servidor porque eso a la larga te traerá problemas de PORTABILIDAD.

NOTA: esta documentación seguirá creciendo así que te recomiendo que le pegues un ojo de vez en cuando ya que la librería apenas está naciendo.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment