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.

Otra de bloqueo con Twebdatsource

Foro público de Xailer en español
Responder
PEDRO DE LEON RODAS[3]
Mensajes: 266
Registrado: Mar Oct 28, 2008 4:41 am

Otra de bloqueo con Twebdatsource

Mensaje por PEDRO DE LEON RODAS[3] »

Estimados amigos, saludos.
Estoy tratando de implementar los bloqueos de registro con Twebdatsource.
En otra linea me han dado respuestas positivas, pero eso es cuando actualizo
el registro.
Ahora, lo que pretendo es controlar la asiganacion de folios en un modulo de
facturacion.
Les explico:
Con TMariaDBDataSource me funciona perfectamente bien.
Ejemplo de como lo hago con TMariaDBDataSource
AppData:Base:Execute("SET AUTOCOMMIT=0") /////// Empiezo a hacer una
transaccion y a la vez empieza a bloquear el registro
AppData:base:BeginTrans()
Toma=AppData:Base:Query("Select FOLIO_FACTURA,id from
parametros where tienda='"+AppData:Nombre_tienda+"' FOR UPDATE ") ////
Con esto hago que otro usuario no pueda consultar el folio hasta que libere
la transaccion
Toma:lOpen=.t.
::FACTURA:Value=Toma:FOLIO_FACTURA //// Aqui tomo el folio que
voy a grabar en mi tabla e imprimir en la factura
Toma:Edit()
Toma:FOLIO_FACTURA=Toma:FOLIO_FACTURA+1 //// Aqui aumento el
numero de factura
Toma:Update()
AppData:Base:CommitTrans()
AppData:Base:Execute("SET AUTOCOMMIT=1") ////// Aqui libero el
bloqueo.
En el metodo de Twebdatsource, uso
AppData:Base:BulkExecute({"Update productos set
FOLIO_FACTURA=FOLIO_FACTURA+1 where tienda='"+AppData:Nombre_tienda+"'
" } ) ////// Aqui me funciona el Bloqueo
Pero quiero antes de esto tomar el folio que para poder grabarlo en mi tabla
e imprimirlo.
Si lo hago de la siguiente manera, al querer usarlo con otro usuario a la
vez (Y esto ya lo probé con 2 pcs) no funciona, pues si tengo el folio 10,
ese mismo folio lo toman los usuarios.
Toma=AppData:Base:Query("Select FOLIO_FACTURA,id from parametros where
tienda='"+AppData:Nombre_tienda+"' FOR UPDATE ") //// Con esto hago que
otro usuario no pueda consultar el folio hasta que libere la transaccion
Toma:lOpen=.t.
::FACTURA:Value=Toma:FOLIO_FACTURA //// Aqui tomo el folio que
voy a grabar en mi tabla e imprimir en la factura
AppData:Base:BulkExecute({"Update productos set
FOLIO_FACTURA=FOLIO_FACTURA+1 where tienda='"+AppData:Nombre_tienda+"'
" } ) ////// Aqui me funciona el Bloqueo
Ya agote todos mis recursos de conocimiento y me rindo.
Por su atencion, gracias.
PEDRO DE LEON RODAS[3]
Mensajes: 266
Registrado: Mar Oct 28, 2008 4:41 am

Otra de bloqueo con Twebdatsource

Mensaje por PEDRO DE LEON RODAS[3] »

Correccion.
AppData:Base:BulkExecute({"Update parametros set
FOLIO_FACTURA=FOLIO_FACTURA+1 where tienda='"+AppData:Nombre_tienda+"'
" } ) ////// Aqui me funciona el Bloqueo
hgarciaj
Mensajes: 107
Registrado: Jue Sep 23, 2010 12:44 am

Otra de bloqueo con Twebdatsource

Mensaje por hgarciaj »

Pedro:
En mis aplicaciones he tenido el mismo problema aunque usando ADS, sin embargo creo que el incremento en el número de factura no se debe hacer al principio sino al final, ya que aunque bloquees el commit() muchas veces no se hace sino hasta que el buffer está completo, así­ que cuando estoy seguro de que voy a grabar el registro entro en un ciclo while .t. preguntando por el folio e incrementando hasta que no exista. Espero te ayude a resolver el problema.
Saludos
Héctor García
Gabo
Mensajes: 104
Registrado: Mié Oct 27, 2010 1:36 am

Otra de bloqueo con Twebdatsource

Mensaje por Gabo »

Pedro
Esto es lo que yo hago. Al presionar el boton de cobrar en un punto de venta que funciona en 10 sucursales con TWebDS. y hasta este momento no he tenido ningun problema. Hice lo mismo que tu. tenia el sistema funcionando al 100 con TMySQL. y lo pase a TWebDS.
hice unos cambios para usar BulkExecute y con esto funciona perfecto. Al igual que tu controlo el consecutivo en una tabla aparte
Sinceramente no entiendo el porque tienes que bloquear la tabla eso lo hace el servidor de manera automatica. He leido a razon de tu post el uso de "bloqueo" en mysql y no lo recomiendan los "expertos". Pero tus razones has de tener para que quieras usar bloqueos

//------------------------------------------------------------------------------
METHOD GrabarVentas() CLASS TModTPV
LOCAL cCmdQuery, nFolVentas, oKardex, lAplicado, nn, cLockTables
LOCAL nSubTotal, nDescuentos, nTotal, nIVA, nImporteIVA, nTotalIVA, aBulkExecute
IF ! AppData:oMySqlDSMain:Connect()
MsgStop( "NO ES POSIBLE REALIZAR LA CONEXION CON EL SERVIDOR DE DATOS (MySQL)" , "SoftAdmin" )
RETURN .F.
ENDIF
lAplicado := .F.
nSubTotal := 0
nDescuentos:= 0
nTotal := 0
WaitOn( "Grabando venta en servidor..", "GRABANDO", "Saving_48")
BEGIN SEQUENCE // EMPIEZA EL BUCLE DE CAPTURA DE ERROR
aBulkExecute:= { "START TRANSACTION" }
AppData:oMySqlDSMain:BulkExecute( aBulkExecute )
::oSQLFolios:Refresh()
nFolVentas:= ::oSQLFolios:fol_ventas + 1
::oSQLFolios:Edit()
::oSQLFolios:fol_ventas:= nFolVentas
::oSQLFolios:Update()
::cFolioVenta:= STRZERO(nFolVentas,10)
::oSQLVentas:AddNew()
::oSQLVentas:id_empresa := AppData:cIDCompany
::oSQLVentas:id_caja := AppData:cNumDeCaja
::oSQLVentas:id_turno := AppData:cNumDeTurno
::oSQLVentas:fecha_venta := AppData:dFechaDeVentas
::oSQLVentas:dat_bitacora:= Date()
::oSQLVentas:hrs_bitacora:= Time()
::oSQLVentas:folio_ventas:= ::cFolioVenta
::oSQLVentas:Update()
WITH OBJECT ::oSQLDetalle
:oDataSource:= AppData:oMySqlDSMain
:cSelect := "SELECT * FROM det_ventas "+;
"WHERE id_empresa='" + AppData:cIDCompany + "' AND " + ;
"folio_ventas='" + ::cFolioVenta + "' AND " + ;
"id_caja='" + AppData:cNumDeCaja + "' AND 0"
IF :lOpen
:Close()
ENDIF
:lOpen:= .T.
END WITH
::oDSClone:GoTop()
DO WHILE ! ::oDSClone:Eof()
IF ::oDSClone:ID_TALLA = NIL
oKardex:= MovtoEnKardex():New( AppData:cIDCompany, ;
::oSQLEstacion:id_almacen, ;
"62" + ::cFolioVenta, ;
AppData:dFechaDeVentas, ;
"", ;
::oDSClone:ID_ITEM, ;
"", ;
::oDSClone:CANTIDAD, ;
0, ;
::oDSClone:PRECIO )
oKardex:AplicarMovimiento()
oKardex:Limpiar()
lAplicado:= .T.
ELSE
oKardex:= MovtoEnKardex():New( AppData:cIDCompany, ;
::oSQLEstacion:id_almacen, ;
"62" + ::cFolioVenta, ;
AppData:dFechaDeVentas, ;
"", ;
::oDSClone:ID_ITEM, ;
::oDSClone:ID_TALLA, ;
::oDSClone:CANTIDAD, ;
0, ;
::oDSClone:PRECIO )
oKardex:AplicarMovimiento()
oKardex:Limpiar()
lAplicado:= .T.
ENDIF
::oDSClone:Skip()
ENDDO
RECOVER
aBulkExecute:= { "ROLLBACK" }
AppData:oMySqlDSMain:BulkExecute( aBulkExecute )
WaitOff()
MsgStop( "HA OCURRIDO UN ERROR EN SERVIDOR AL APLICAR LA VENTA.."+ CRLF +;
"VUELVA APLICARLO DENTRO DE UNOS MINUTOS..", "Error de Conexión" )
RETURN .F.
END SEQUENCE
aBulkExecute:= { "COMMIT" }
AppData:oMySqlDSMain:BulkExecute( aBulkExecute )
WaitOff()
RETURN NIL

Saludos
PEDRO DE LEON RODAS[3]
Mensajes: 266
Registrado: Mar Oct 28, 2008 4:41 am

Otra de bloqueo con Twebdatsource

Mensaje por PEDRO DE LEON RODAS[3] »

Gracias Gabriel, por tu ayuda.
Voy a hacer unas pruebas con la forma en que me indicas.
Saludos.
"Gabriel Ornelas" escribió en el mensaje de
noticias:538fc4a2$[email=1@svctag-j7w3v3j....]1@svctag-j7w3v3j....[/email]
Pedro
Esto es lo que yo hago. Al presionar el boton de cobrar en
un punto de venta que funciona en 10 sucursales con TWebDS.
y hasta este momento no he tenido ningun problema. Hice lo
mismo que tu. tenia el sistema funcionando al 100 con
TMySQL. y lo pase a TWebDS.
hice unos cambios para usar BulkExecute y con esto funciona
perfecto. Al igual que tu controlo el consecutivo en una
tabla aparte
Sinceramente no entiendo el porque tienes que bloquear la
tabla eso lo hace el servidor de manera automatica. He leido
a razon de tu post el uso de "bloqueo" en mysql y no lo
recomiendan los "expertos". Pero tus razones has de tener
para que quieras usar bloqueos
//---------------------------------------------------------- --------------------
METHOD GrabarVentas() CLASS TModTPV
LOCAL cCmdQuery, nFolVentas, oKardex, lAplicado, nn,
cLockTables
LOCAL nSubTotal, nDescuentos, nTotal, nIVA, nImporteIVA,
nTotalIVA, aBulkExecute
IF ! AppData:oMySqlDSMain:Connect()
MsgStop( "NO ES POSIBLE REALIZAR LA CONEXION CON EL
SERVIDOR DE DATOS (MySQL)" , "SoftAdmin" )
RETURN .F.
ENDIF
lAplicado := .F.
nSubTotal := 0
nDescuentos:= 0
nTotal := 0
WaitOn( "Grabando venta en servidor..", "GRABANDO",
"Saving_48")
BEGIN SEQUENCE // EMPIEZA EL BUCLE DE CAPTURA DE ERROR
aBulkExecute:= { "START TRANSACTION" }
AppData:oMySqlDSMain:BulkExecute( aBulkExecute )
::oSQLFolios:Refresh()
nFolVentas:= ::oSQLFolios:fol_ventas + 1
::oSQLFolios:Edit()
::oSQLFolios:fol_ventas:= nFolVentas
::oSQLFolios:Update()
::cFolioVenta:= STRZERO(nFolVentas,10)
::oSQLVentas:AddNew()
::oSQLVentas:id_empresa := AppData:cIDCompany
::oSQLVentas:id_caja := AppData:cNumDeCaja
::oSQLVentas:id_turno := AppData:cNumDeTurno
::oSQLVentas:fecha_venta := AppData:dFechaDeVentas
::oSQLVentas:dat_bitacora:= Date()
::oSQLVentas:hrs_bitacora:= Time()
::oSQLVentas:folio_ventas:= ::cFolioVenta
::oSQLVentas:Update()
WITH OBJECT ::oSQLDetalle
:oDataSource:= AppData:oMySqlDSMain
:cSelect := "SELECT * FROM det_ventas "+;
"WHERE id_empresa='" +
AppData:cIDCompany + "' AND " + ;
"folio_ventas='" + ::cFolioVenta
+ "' AND " + ;
"id_caja='" +
AppData:cNumDeCaja + "' AND 0"
IF :lOpen
:Close()
ENDIF
:lOpen:= .T.
END WITH
::oDSClone:GoTop()
DO WHILE ! ::oDSClone:Eof()
IF ::oDSClone:ID_TALLA = NIL
oKardex:= MovtoEnKardex():New( AppData:cIDCompany,
;
::oSQLEstacion:id_almacen, ;
"62" +
::cFolioVenta, ;
AppData:dFechaDeVentas, ;
"", ;
::oDSClone:ID_ITEM,
;
"", ;
::oDSClone:CANTIDAD, ;
0, ;
::oDSClone:PRECIO
)
oKardex:AplicarMovimiento()
oKardex:Limpiar()
lAplicado:= .T.
ELSE
oKardex:= MovtoEnKardex():New( AppData:cIDCompany,
;
::oSQLEstacion:id_almacen, ;
"62" +
::cFolioVenta, ;
AppData:dFechaDeVentas, ;
"", ;
::oDSClone:ID_ITEM,
;
::oDSClone:ID_TALLA, ;
::oDSClone:CANTIDAD, ;
0, ;
::oDSClone:PRECIO
)
oKardex:AplicarMovimiento()
oKardex:Limpiar()
lAplicado:= .T.
ENDIF
::oDSClone:Skip()
ENDDO
RECOVER
aBulkExecute:= { "ROLLBACK" }
AppData:oMySqlDSMain:BulkExecute( aBulkExecute )
WaitOff()
MsgStop( "HA OCURRIDO UN ERROR EN SERVIDOR AL APLICAR LA
VENTA.."+ CRLF +;
"VUELVA APLICARLO DENTRO DE UNOS MINUTOS..",
"Error de Conexión" )
RETURN .F.
END SEQUENCE
aBulkExecute:= { "COMMIT" }
AppData:oMySqlDSMain:BulkExecute( aBulkExecute )
WaitOff()
RETURN NIL
Saludos
Responder