Hace un tiempo consulté acá y en varios foros sobre la manera correcta
de usar las transacciones desde VFP contra SQL Server. Si bien muchos me
dieron pautas, se me daba un problema que no tenía ninguna lógica.
Hasta que hoy, después de hacer enésimas pruebas, encontré la solución.
El tema pasa por esto:
Yo utilizo cursor adapters para manejar el acceso a datos remotos, via ODBC
Con ODBC es más fácil y requiere menos programación, bastante útil si no
se trabaja en capas y solamente se trabaja en una LAN.
Toda la literatura consultada y los consejos recibidos me indican que se
debe poner las transacciones en MANUAL, grabar en las diferentes tablas
y luego volver a ponerlas en AUTOMATICO. Y leyuendo la literatura se
entiende bien por qué.
Siguiendo ejemplos de libros y white papers yo hacía esto:
#define DB_TRANSMANUAL 2
#define DB_TRANSAUTO 1
sqlexec(nHandle, 'BEGIN TRANSACTION')
SQLSetProp(nHandle, "TRANSACTIONS", DB_TRANSMANUAL)
*** grabar las distintas tablas y luego
SQLSetProp(nHandle, "TRANSACTIONS", DB_TRANSAUTO)
Sin embargo, haciendo pruebas en las que a propósito introducía un
error, la cosa no funcionaba. Se grababan las tablas anteriores al error
y las tablas posteriores al mismo no. Lo cual hacía bastante insegura la
rutina e inútil todo el cuidado en programar las transacciones.
Hoy se me ocurrieron dos cosas:
a) en los cursor adapters poner la propiedad USETRANSACTIONS en .F.,
para que el CA no maneje las transacciones en forma automática.
b) en lugar de usar las variables precompiladas con define, como se ve
arriba, mandar directamente los números 2 para hacerlas manuales y 1
para volverlas a automáticas.
O sea: SQLSetProp(nHandle, "TRANSACTIONS",2) y SQLSetProp(nHandle,
"TRANSACTIONS",1)
Y por supuesto, asi, funcionó. Y aclaro que con SPT la cosa era igual y
se solucionó también.
El primer caso es porque no hice antes lo que tendría que haber hecho
desde el principio (en inglés se dice RTFM -read the f...g manual)
Pero lo del segundo caso, eso de usar los números en lugar de las
variables precompiladas, me deja perplejo. ¿será quizás un tema del
driver ODBC? Yo uso Windows 7 Ultimate y SQL Server 2008 Express RS 2
Si alguien tiene alguna respuesta, idea o precisa, se lo voy a agradecer.
Rafael Copquin