BLOQUEO DE TABLAS
Publicado: Sab Feb 02, 2013 11:32 pm
Saludos a todos y cada uno de este excelente foro.
Pongo un metodo de bloqueo de tablas con mysql.
Puesto que en uno de los proyectos que tengo instalado con unos clientes,
especificamente punto de venta.
Habia tenido el problema de que al generar el ticket en 2 o mas terminales
el sistema en algunas ocaciones(MUCHAS OCACIONES, JEJEJEJE) me daba el
mismo numero de folio.
Y haciendo las pruebas pude encontrar la solucion y es la que les comparto.
Este codigo lo he estado probando en 2 terminales y funciona perfectamente
bien, me da el folio que en verdad corresponde.
En un formulario tengo un boton llamado ultimo.
Ejecuto el formulario (YA COMPILADO) en las 2 terminales, y al mismo tiempo
pulso enter en el boton dandome el resultado correcto.
Posiblemente exista otro metodo que algunos de ustedes ya les funciona, pero
bueno, quiero aportar un poquito de lo mucho que he recibo en este foro.
Les comento que las tablas son transaccionales (InnoDB)
METHOD ultimoClick( oSender ) CLASS pruebas
Local cConsulta,nFolio_factura,cCursor
AppData:Base:Execute("SET AUTOCOMMIT=0")
AppData:Base:BeginTrans()
AppData:Base:Execute("Lock table pruebas WRITE,terminales
WRITE")
cCursor=AppData:Base:Query("Select id,terminal from terminales where
0" )
cCursor:Open()
cConsulta=AppData:Base:Query("Select numero from pruebas" )
cConsulta:Open()
nFolio_factura=cConsulta:Numero /// OBTENGO EL FOLIO ACTUAL O EL QUE
SIGUE COMO LO QUIERAN VER
AppData:Base:Execute("UPDATE pruebas set
numero=numero+1") /// ACTUALIZO EL FOLIO
* AppData:Base:Execute("Insert into terminales(terminal)
values ('"+AppData:nombre_pc+"') " ) /// AGREGO REGISTROS
cCursor:AddNew()
cCursor:Terminal=AppData:nombre_pc
cCursor:Update()
* Msginfo("Espero")
** AppData:Base:RollBackTrans() /// DESSASE TODO
** AppData:Base:Execute("UNLOCK TABLES") //
DESBLOQUEA TODAS LAS TABLAS
** ::Ultimo:Setfocus()
** Return .t.
AppData:Base:Execute("UNLOCK TABLES")
AppData:Base:CommitTrans()
AppData:Base:Execute("SET AUTOCOMMIT=1")
Msginfo(nFolio_factura)
RETURN Nil
Pongo un metodo de bloqueo de tablas con mysql.
Puesto que en uno de los proyectos que tengo instalado con unos clientes,
especificamente punto de venta.
Habia tenido el problema de que al generar el ticket en 2 o mas terminales
el sistema en algunas ocaciones(MUCHAS OCACIONES, JEJEJEJE) me daba el
mismo numero de folio.
Y haciendo las pruebas pude encontrar la solucion y es la que les comparto.
Este codigo lo he estado probando en 2 terminales y funciona perfectamente
bien, me da el folio que en verdad corresponde.
En un formulario tengo un boton llamado ultimo.
Ejecuto el formulario (YA COMPILADO) en las 2 terminales, y al mismo tiempo
pulso enter en el boton dandome el resultado correcto.
Posiblemente exista otro metodo que algunos de ustedes ya les funciona, pero
bueno, quiero aportar un poquito de lo mucho que he recibo en este foro.
Les comento que las tablas son transaccionales (InnoDB)
METHOD ultimoClick( oSender ) CLASS pruebas
Local cConsulta,nFolio_factura,cCursor
AppData:Base:Execute("SET AUTOCOMMIT=0")
AppData:Base:BeginTrans()
AppData:Base:Execute("Lock table pruebas WRITE,terminales
WRITE")
cCursor=AppData:Base:Query("Select id,terminal from terminales where
0" )
cCursor:Open()
cConsulta=AppData:Base:Query("Select numero from pruebas" )
cConsulta:Open()
nFolio_factura=cConsulta:Numero /// OBTENGO EL FOLIO ACTUAL O EL QUE
SIGUE COMO LO QUIERAN VER
AppData:Base:Execute("UPDATE pruebas set
numero=numero+1") /// ACTUALIZO EL FOLIO
* AppData:Base:Execute("Insert into terminales(terminal)
values ('"+AppData:nombre_pc+"') " ) /// AGREGO REGISTROS
cCursor:AddNew()
cCursor:Terminal=AppData:nombre_pc
cCursor:Update()
* Msginfo("Espero")
** AppData:Base:RollBackTrans() /// DESSASE TODO
** AppData:Base:Execute("UNLOCK TABLES") //
DESBLOQUEA TODAS LAS TABLAS
** ::Ultimo:Setfocus()
** Return .t.
AppData:Base:Execute("UNLOCK TABLES")
AppData:Base:CommitTrans()
AppData:Base:Execute("SET AUTOCOMMIT=1")
Msginfo(nFolio_factura)
RETURN Nil