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
In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.
Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.
Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.
BLOQUEO DE TABLAS
-
- Mensajes: 266
- Registrado: Mar Oct 28, 2008 4:41 am
-
- Mensajes: 1831
- Registrado: Mar Oct 11, 2005 9:53 am
BLOQUEO DE TABLAS
Veo que es mas complicado con SQL, yo al menos sigo con mi DBF, y lo que
hago es justo antes de que se grabe un documento, tengo una DBF con los
folios, bloqueo la DBF, leo el folio actual y le sumo uno, lo grabo, hago
commit, y desbloqueo, asi el que mande segundo, tiene que esperar y a pesar
que tengo un cliente con casi 80 terminales de ventas no se me duplican
folios.
Saludos.
Ramón Zea
Móvil.: 993-231.62.29
Tel./Fax: 993-353-46-73
www.zeasoftware.com.mx
soporte@zeasoftware.com.mx
zeasoftware@hotmail.com
Aliado FACTURAXION
"PEDRO DE LEON RODAS" escribió en el mensaje de
noticias:510d9403$[email=1@svctag-j7w3v3j....]1@svctag-j7w3v3j....[/email]
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
hago es justo antes de que se grabe un documento, tengo una DBF con los
folios, bloqueo la DBF, leo el folio actual y le sumo uno, lo grabo, hago
commit, y desbloqueo, asi el que mande segundo, tiene que esperar y a pesar
que tengo un cliente con casi 80 terminales de ventas no se me duplican
folios.
Saludos.
Ramón Zea
Móvil.: 993-231.62.29
Tel./Fax: 993-353-46-73
www.zeasoftware.com.mx
soporte@zeasoftware.com.mx
zeasoftware@hotmail.com
Aliado FACTURAXION
"PEDRO DE LEON RODAS" escribió en el mensaje de
noticias:510d9403$[email=1@svctag-j7w3v3j....]1@svctag-j7w3v3j....[/email]
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
Ramón Zea
Móvil: 01-993-231-62-29
ramonzea@yahoo.com
zeasoftware@hotmail.com
zeasoft.movil@hotmail.com
http://www.paginasprodigy.com/zeasoftware/
Móvil: 01-993-231-62-29
ramonzea@yahoo.com
zeasoftware@hotmail.com
zeasoft.movil@hotmail.com
http://www.paginasprodigy.com/zeasoftware/
- Carlos Ortiz
- Mensajes: 873
- Registrado: Mié Jul 01, 2009 5:44 pm
- Ubicación: Argentina - Córdoba
- Contactar:
BLOQUEO DE TABLAS
Me parece que te complicaste de más, pegale una mirada a NextVal de
MySql y te olvidás de la correlatividad de comprobantes.
Aquí hay algo de documentación.
http://www.microshell.com/database/mysq ... -nextval-f unction-to-get-sequence-in-mysql/
Inclusive hay un ejemplo de como armar unas funciones dentro del motor
para que él se encargue de esos pseudo sequence.
Por otro lado el tema del bloqueo de tablas es muy engorroso y cuando te
tocan clientes con muchas terminales haciendo lo mismo ni te cuento.
Carlos
MySql y te olvidás de la correlatividad de comprobantes.
Aquí hay algo de documentación.
http://www.microshell.com/database/mysq ... -nextval-f unction-to-get-sequence-in-mysql/
Inclusive hay un ejemplo de como armar unas funciones dentro del motor
para que él se encargue de esos pseudo sequence.
Por otro lado el tema del bloqueo de tablas es muy engorroso y cuando te
tocan clientes con muchas terminales haciendo lo mismo ni te cuento.
Carlos
@dbfarma
www.dbfarma.com.ar
www.dbfarma.com.ar