La Web del Programador: Comunidad de Programadores
 
    Pregunta:  30638 - UTILIZAR LOS COMANDOS COMMIT Y ROLLBACK CON MYSQL
Autor:  Laura Núñez
Estoy haciendo un sistema en VFox que accesa una base de datos MYSQL, y necesito utilizar los comandos Commit y Rollback, pero como MySQL no es transaccional me graba cada cambio que hago.

Si alguien sabe como hacer para trabajar con estos comando le agradecería mucho la ayuda, traté con sqlsetprop() pero no me funciona.

  Respuesta:  Pedro Camargo
Te mando un ejemplo de como genero un nuevo registro o actualizo un registro, utilizando transacciones.
Espero se de tu ayuda.

If Empty( ThisForm.txt_nompa.Value )
MessageBox( 'Faltan Datos en Pantalla', 0+16, 'Aviso ...' )
ThisForm.txt_codpa.Setfocus
Return
Endif
nx = Sqlconnect( 'dns_misdatab' )
IF nx <= 0
MessageBox( 'Error de Conexión SQL.', 16, 'MAGNO Plus.' )
Return
Endif
nx1 = Sqlexec( nx, 'Select * From filepaga Where codem_f = ?cCodEmp And codpa_f = ?ThisForm.txt_codpa.Value', 'crssql' )
If nx1 < 0
MessageBox( 'Error en Sentencia SQL.', 16, 'MAGNO Plus.' )
Sqldisconn(1)
Return
Endif
If Reccount() = 0
nx1= Sqlexec( nx, 'Begin' )
nx1= Sqlexec( nx, 'Insert Into filepaga (codem_f,codpa_f,nompa_f,dirpa_f,telpa_f,ciupa_f,caspa_f,cdepa_f,tippa_f,'+;
'fpapa_f,fafpa_f,embpa_f) Values (?cCodEmp,?ThisForm.txt_codpa.Value,?ThisForm.txt_nompa.Value,'+;
'?ThisForm.txt_dirpa.Value,?ThisForm.txt_telpa.Value,?ThisForm.txt_ciupa.Value,?ThisForm.txt_caspa.Value,'+;
'?ThisForm.cmb_cdepa.Value,?ThisForm.cmb_tippa.Value,?ThisForm.cmb_fpapa.Value,?ThisForm.txt_fafpa.Value,'+;
'?ThisForm.chk_embpa.Value)' )
If nx1 < 0
MessageBox( 'Error en Sentencia SQL al Insertar en [FILEPAGA]', 16, 'MAGNO Plus.' )
nx1 = Sqlexec( nx, 'Rollback' )
Sqldisconnect(1)
Return
Endif
nx1= Sqlexec( nx, 'Commit' )
Else
nx1 = Sqlexec( nx, 'Begin' )
nx1 = Sqlexec( nx, 'Update filepaga Set nompa_f=?ThisForm.txt_nompa.Value,dirpa_f=?ThisForm.txt_dirpa.Value,'+;
'telpa_f=?ThisForm.txt_telpa.Value,ciupa_f=?ThisForm.txt_ciupa.Value,caspa_f=?ThisForm.txt_caspa.Value,'+;
'cdepa_f=?ThisForm.cmb_cdepa.Value,tippa_f=?ThisForm.cmb_tippa.Value,fpapa_f=?ThisForm.cmb_fpapa.Value,'+;
'fafpa_f=?ThisForm.txt_fafpa.Value,embpa_f=?ThisForm.chk_embpa.Value '+;
'Where codem_f = ?cCodEmp And codpa_f = ?ThisForm.txt_codpa.Value' )
If nx1 < 0
MessageBox( 'Error en Sentencia SQL al Actualizar en [FILEPAGA]', 16, 'MAGNO Plus.' )
nx1 = Sqlexec( nx, 'Rollback' )
Sqldisconnect(1)
Return
Endif
nx1 = Sqlexec( nx, 'Commit' )
Endif
Sqldisconnect(1)
MessageBox( 'AVISO.'+Chr(13)+'Registro Grabado OK.', 0+64, 'MAGNO Plus.' )

  Respuesta:  Raul Villaverde villaverde
Hola que tal ?
la version de Mysql 3.24.46a (o algo parecido, ultima disponible) ya soporta transacciones y la version 4.1 soportara procedimientos almacenados de hecho las ayudas disponibles que tienes, al instalar Mysql ya figuran las instrucciones BEGIN/COMMIT/ROLLBACK, hasta aqui las buenas noticias ahora un poco de las otras.
Tengo el mismo problema con VFP-Mysql hace un mes que estoy tratando de solucionarlo y no lo consigo, me acepta como validos el
BEGIN Y COMMIT pero me rechaza el ROLLBAK y no consigo que deshaga los cambios hechos sobre los registros.
He puesto preguntas en cuanto foro he encontrado pero nadie me responde sobre el tema, sinceramente estoy a punto de descartar la
conbinacion de trabajo VFP-Mysql y utilizar tablas de fox, te pido por favor si tenes alguna noticia sobre el tema, pudieras si no es mucha molestia ponerme al tanto.

Desde ya muchas gracias y lamento no haberte podido ayudar.

Raul Villaverde
[email protected]