Facturas con consecutivos con acceso a varias terminales

Re: Facturas con consecutivos con acceso a varias terminales

Postby JoseAlvarez » Tue Sep 14, 2021 2:11 pm

VictorCasajuana wrote:Vale, me había confundido. Pensaba que el bloqueo que comentabas al principio ( 0 en el campo lógico ) lo utilizabas cuando un usuario, por ejemplo, abría una ficha para modificar los datos, para que el resto de usuarios no pudiesen modificar dicha ficha o al menos saber de su edición por otro usuario.
Lo que expones es correcto, pero ya es a nivel de transacciones dentro de un proceso automático el cual no está controlado por el usuario.



La idea de usar campo logico con valores de 1 y 0 es del colega Armando Lagunas... seguro tambien funciona, es cuestion de probar todas las sugerencias y te quedes con la que mejor se adapte a tu caso.

Saludos y un abrazo.
"Los errores en programación, siempre están entre la silla y el teclado..."

Fwh 19.06 32 bits + Harbour 3.2 + Borland 7.4 + MariaDB + TDolphin

Carora, Estado Lara, Venezuela.
User avatar
JoseAlvarez
 
Posts: 726
Joined: Sun Nov 09, 2014 5:01 pm

Re: Facturas con consecutivos con acceso a varias terminales

Postby JoseAlvarez » Tue Sep 14, 2021 2:19 pm

Si lo que deseas es controlar el acceso manualmente, voy a preparar un ejemplo de como lo hago y lo cuelgo aca en el foro, me ha funcionado muy bien tambien... al tenerlo listo lo posteo... (tomando en cuenta lo que dices que no has llegado a buen puerto con esto de los bloqueos). voy a preparar un ejemplo bien simple que sirva de base...
"Los errores en programación, siempre están entre la silla y el teclado..."

Fwh 19.06 32 bits + Harbour 3.2 + Borland 7.4 + MariaDB + TDolphin

Carora, Estado Lara, Venezuela.
User avatar
JoseAlvarez
 
Posts: 726
Joined: Sun Nov 09, 2014 5:01 pm

Re: Facturas con consecutivos con acceso a varias terminales

Postby VictorCasajuana » Wed Sep 15, 2021 3:46 pm

Al final he dado con lo que buscaba, darle nombre a los conceptos que tenía en mente. Como siempre, la lectura te da las respuestas. Estos son los patrones de diseño más adecuados a lo que estaba buscando:

https://martinfowler.com/eaaCatalog/opt ... eLock.html
https://martinfowler.com/eaaCatalog/pes ... eLock.html

Otro libro para leer del gran Martin Fowler: https://martinfowler.com/books/eaa.html

Espero que a más gente le despeje la duda o al menos le de nombre a patrón de diseño que utiliza, que no es poco. :D

Salud!
--------
¿ Y porque no ?
¿ And why not ?
User avatar
VictorCasajuana
 
Posts: 194
Joined: Wed Mar 28, 2018 4:38 pm
Location: Vinaròs

Re: Facturas con consecutivos con acceso a varias terminales

Postby Adolfredo Martinez » Wed Sep 15, 2021 5:39 pm

Hola amgios del forum.

He ido aprendiendo de todos ustedes, también he leído documentación. Pero tengo otra inquietud:
Como seria en un browse donde hay una relacion de clientes, y al seleccionar un registro, se va para una rutina donde hace cálculos y luego imprime una factura. Si el mismo cliente otra terminal lo selecciona, como hacemos para que la otra terminal quede en espera, mientras la otra la desocupe. Como este código que encontré de Mr Rao.
Code: Select all  Expand view

#include "fivewin.ch"

//----------------------------------------------------------------------------//
STATIC oCn1
function Main()

   local oRs, oDlg, oFont, oBrw

 FWCONNECT oCn1 HOST "localhost" USER "Adolfredo" PASSWORD "1234567"  DB "indfundacion"  PORT 3307

   if oCn1 == nil
      return nil
   endif

   oRs   := oCn1:RowSet( "SELECT ID,FIRST,CITY,AGE FROM customer" )

   DEFINE FONT oFont NAME "TAHOMA" SIZE 0,-14
   DEFINE DIALOG oDlg SIZE 600,500 PIXEL TRUEPIXEL FONT oFont ;
      TITLE "MARIADB LOCKED EDIT"

   @ 60,20 XBROWSE oBrw SIZE -20,-20 PIXEL OF oDlg ;
      DATASOURCE oRs AUTOCOLS ;
      CELL LINES NOBORDER FASTEDIT

   WITH OBJECT oBrw
      :nEditTypes    := EDIT_GET
      :CreateFromCode()
   END



   @ 10,20 BTNBMP PROMPT "LockedEdit" SIZE 150,40 PIXEL OF oDlg FLAT ;
      ACTION LockedEdit( oBrw )

   ACTIVATE DIALOG oDlg CENTERED
   RELEASE FONT oFont

return nil

//----------------------------------------------------------------------------//

static function LockedEdit( oBrw )

   local oRsMain, oRsEdit, oRec, nWait,oCn

   oRsMain  := oBrw:oDbf
   oCn      := oRsMain:oCn
   nWait    := oCn:QueryResult( "SHOW SESSION VARIABLES LIKE 'innodb_lock_wait_timeout'" )[ 2 ]
 
   oCn:Execute( "SET SESSION innodb_lock_wait_timeout = 1" )
   oCn:BeginTransaction()

   MsgRun( "Reading Record", "WAIT", { || ;
      oRsEdit := oCn:RowSet( "SELECT * FROM customer WHERE ID = ? FOR UPDATE", { oRsMain:ID } ) ;
      } )


   if oCn:nError == 0
      oCn:Execute( "SET SESSION innodb_lock_wait_timeout = " + cValToChar( nWait ) )
      oRec  := TDataRow():New( oRsEdit )
 
      oRec:Edit()---------------------------------------->Aquí debe irse para la rutina de calculo e impresión de Factura

       Calculo( oBrw, oRsContribu  )

     oCn:CommitTransaction()
      oRsMain:ReSync()
      oBrw:RefreshCurrent()
   else
      oCn:RollBack()
      oCn:Execute( "SET SESSION innodb_lock_wait_timeout = " + cValToChar( nWait ) )
      ? "Record is locked by other user"
   endif
   oBrw:SetFocus()

return nil

//----------------------------------------------------------------------------//
 //----------------------------------------------------------//
FUNCTION Calculo( oBrw, oRsContribu  )
//----------------------------------------------------------//

msginfo("Modulo de Calculo e impresion de Factura")


RETURN( NIL)

 
Adolfredo Martinez
 
Posts: 95
Joined: Fri Feb 15, 2019 1:37 pm
Location: Aracataca-Colombia

Previous

Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 56 guests