Visual Foxpro + MySQL

Hola Experto siempre trabaje con Visual FoxPro y DBF Libres, a la hora de grabar sobre mis tablas solo hacia un go bottom y obtenía el ultimo registro +1 y grababa la información.
Después cree una tabla de parámetros para lo que era la facturación (Facturas, Boletas, Guías) bloqueaba el registro correspondiente le aumentaba el valor en 1 y desbloqueba con (RLOCK() y UNLOCK).
Nunca me preocupe por el tema de las transacciones y si es que no se completaba la operación correspondiente, por que casi no tuve problemas.
Ahora estoy comenzando a desarrollar en Visual Foxpro +MySQL.
Y lo primero que veo es que para traer la información de MySQL a Visual Foxpro tengo que crear una conexión, y luego de verificar que es exitosa, utilizar el SQLEXEC, para traer los datos almacenado en un cursor, hasta ahí todo bien, pero el problema es como hago para grabar esa información, hasta donde entiendo es así:
SQLEXEC(nCon,"Select * from Cliente","Tabla")
SELECT Tabla
CURSORSETPROP( [Buffering], 5 )
APPEND BLANK
...
...
SELECT MainTabla
Tableupdate(.t.)
CURSORSETPROP( [Buffering], 1 )
SQLEXEC(nCon,"Insert into Cliente (codcli,nomcli) values ("1","UNO")
Claro esta que los valores a agregar a la Tabla del MySQL los obtengo del Cursor "Tabla"
Pero lo que quiero es un ejemplo de como hacer una Factura con Cabecera y Detalle y que los datos se almacenen en las Tablas del MySQL y si hay un problema de cancele todo, porque mi confusión parte de que tendría primero que controlar que los datos se graben bien en el cursor de Cabecera de Factura y en el Cursor de Detalle de Factura, para luego controlar que estos datos que se han almacenado en los cursores pasen a la es Tablas del MySQL, estoy en lo correcto o es que me estoy confundiendo en este tema.

1 respuesta

1
Respuesta de
Hola amigo, bueno, vamos por parte, lo que ya estas aprendiendo de mysql y fox esta bien encaminado, te daré unos tips para que veas algunos consejos. Primero en mysql no existe go bottom seek locate etc, solo utilizaremos comandos sql puros, propondremos las dos tablas siguientes como ejemplo.
Faccab. Cabecera y facitems detalle de factura.
faccab       fac_cod  , fac_fecha,  fac_cliente, fac_total      
facitems      item_cod,   item_producto, item_cant, item_precio
Bueno, hay varias maneras de obtener el valor máximo de la factura antes de que grabes, por ej. así. Obtenemos el mayor valor actual del numero de factura de faccab y lo retornamos.
=sqlexec(xCon,"select max(fac_cod) as numeroFactura from faccab group by fac_cod","cursor")
Return(cursor.numeroFactura)
Pero la forma ideal es utilizar los campos autonuméricos, o sea cuando creas la tabla le defines como llave primaria (PORQUE) y la opción AUTOINCREMENT lo que hará el mysql es enumerarlo automáticamente cuando hagas la inserción, luego cuando insertas la cabecera obtenés el numero ultimo y eso lo guardas en el detalle, así.
Antes de comenzar con el ejemplo te hablo sobre las transacciones, las transacciones son posibles en mysql a partir de las versiones 4.x, pero para ello tus tablas tienen que ser del tipo INNODB, por que las tablas myIsam no soportan transacciones. Ok, aquí va
=sqlexec(xCon,"BEGIN")            &&abro una transaccion
if sqlexec(xCon,"insert into faccab set fac_fecha = '"+dtoc(variableFecha)+"', fac_clie="+str(xCodCLiente)+", fac_total = "+str(xTotal))>0
           =sqlexec(xControl,"SELECT LAST_INSERT_ID();","xDepCod")>0
           sele xDepCOD
           xDepCod = field(1)
           xDepCod = &xDepCod
           if sqlexec(xCon,"insert into facitems set item_cod="+str(xDepCod)+", item_proc='"+xCodigoProducto+"', item_cant="+str(xCantidad)+", item_precio="+str(xPrecio))>0
                 =sqlexec(xCon,"COMMIT")
                messagebox("Guardado satisfactoriamente")
          else
                   messagebox("Error al grabar el item, deshaciendo transaccion ")
                 =sqlexec(xCON,"Rollback")
          endif
else
       messagebox("Error al grabar la factura")
Endif
Como puedes ver aquí use la función last_insert para obtener de mysql cual fue el ultimo registro insertado, a diferencia del primer ejemplo que te di, luego el ejemplo es muy simple, no inicialice las variables que supongo entenderás porque, no es muy cómodo escribir en este editbox, bueno, si tienes dudas aun me avisas por favor.
Un saludo
Añade un comentario a esta respuesta
Añade tu respuesta
Haz clic para o
Escribe tu mensaje