ME DUPLICA VALE

ME DUPLICA VALE

Postby jbrita » Sun Apr 03, 2016 5:29 pm

Hola amigos, necesito su ayuda y es urgente:
Les cuento, tengo un sistema de Punto ventas en una ferreteria, resulta que cuando graban los vendedores al mismo tiempo, toma la venta el mismo numero
le puse un campo de hora, y la diferecia es en segundo y muchas veces la hora es igual por ejemplo: por ejemplo si graban tres vendedores la hora minuto y segundo sonb iguales y ahi es el problema:
trabajo con tdolphin y asi rescato el numero de vale:


cPara:=xServer:Query( "SELECT * FROM parametro Where ma_codi = '"+"VALE"+"'" )
If cPara:LastRec() > 0
nVale:=cPara:ma_nume
Endif
cPara:End()
-------------------------------


y para grabar
aCampos := { 'ma_nume' }
aValues := { nVale+1}
aWhere := "ma_codi= '"+"VALE"+"'"
xServer :Update( "parametro", aCampos, aValues, aWhere )


alguna ayuda se los agradeceria y me urge muchisimo
jbrita
 
Posts: 486
Joined: Mon Jan 16, 2006 3:42 pm

Re: ME DUPLICA VALE

Postby Antonio Linares » Sun Apr 03, 2016 8:57 pm

Podrias usar GetTickCount() en vez de Seconds()

Es muy dificil (casi imposible) que coincidan en GetTickCount()
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41314
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: ME DUPLICA VALE

Postby armando.lagunas » Mon Apr 04, 2016 6:39 pm

Saludos:

Code: Select all  Expand view

-------------------------------
cPara:=xServer:Query( "SELECT * FROM parametro Where ma_codi = '"+"VALE"+"'" )
If cPara:LastRec() > 0
    nVale:=cPara:ma_nume

    // actualiza de inmediato el campo VALE con (nValor + 1) y te quedas con el numero que ya tienes almacenado en la variable nVale hasta que lo utilices al grabar

   aCampos := { 'ma_nume' }
   aValues := { nVale+1}
   aWhere := "ma_codi= '"+"VALE"+"'"
   xServer :Update( "parametro", aCampos, aValues, aWhere )
Endif
cPara:End()
-------------------------------
 


con esto si hay otro terminal que quiera el numero nuevo de vale, ya esta actualizado...

me evite muchos dolores de cabeza con esto.

saludos
SkyPe: armando.lagunas@hotmail.com
Mail: armando.lagunas@gmail.com
User avatar
armando.lagunas
 
Posts: 346
Joined: Mon Oct 05, 2009 3:35 pm
Location: Curico-Chile

Re: ME DUPLICA VALE

Postby joseluisysturiz » Tue Apr 05, 2016 12:49 am

Yo he resuelto ese problema colocando el campo maestro de forma auto-incremente...lo guardo y luego se lo asigno a los detalles de la factura o documento principal, saludos... :shock:
Dios no está muerto...

Gracias a mi Dios ante todo!
User avatar
joseluisysturiz
 
Posts: 2064
Joined: Fri Jan 06, 2006 9:28 pm
Location: Guatire - Caracas - Venezuela

Re: ME DUPLICA VALE

Postby jbrita » Tue Apr 05, 2016 1:29 pm

Jose Luis me podrias dar un ejemplo por favor te lo agradeceria mucho

saludos
jbrita
 
Posts: 486
Joined: Mon Jan 16, 2006 3:42 pm

Re: ME DUPLICA VALE

Postby joseluisysturiz » Tue Apr 05, 2016 3:06 pm

Te explico que hago, primero el campo clave del master de factura, que contiene el numero del documento, lo hago CAMPO CLAVE, AUTO-INCREMENT, esto es cuando creo la tabla y defino los campos.
Cuando grabo los datos master del documento obtengo el numero que se haya asignado automaticamente de la siguiente manera:

Code: Select all  Expand view

   IF lNew // SE COLOCA DESPUES QUE SE HAYA EJECUTADO EL INSERT AUTOMATICO PARA OBTENER NUMERO REGISTRO
      oQryId := TDolphinQry():New( "SELECT last_insert_id() AS nId", oDatos:oConex ) // OBTENGO EL NUMERO DEL REGISTRO RECIEN CREADO
      aVar[1] := oQryId:nId // NUM.ID AUTO-INCREMENT // COMO ES UN VALOR UNICO, LO PASO A UNA var
   ENDIF
 


Como ya tengo el numero del documento master...ahora grabo los detalles..asociandolos con ese numero, y listo...espero te sirva, cualquier duda estoy a la orden...saludos...gracias... :shock:
Dios no está muerto...

Gracias a mi Dios ante todo!
User avatar
joseluisysturiz
 
Posts: 2064
Joined: Fri Jan 06, 2006 9:28 pm
Location: Guatire - Caracas - Venezuela

Re: ME DUPLICA VALE

Postby jbrita » Wed Apr 06, 2016 2:14 pm

Jose Luis, mira ando medio lento, podrias hacerme un ejercio basico ya que yo lo hago asi

cPara:=xServer:Query( "SELECT * FROM parametro Where ma_codi = '"+"RESERVA"+"'" )
If cPara:LastRec() > 0
nReserva:=cPara:ma_nume
Endif
cPara:End()

aCampos := { 'ma_nume' }
aValues := { nReserva+1}
aWhere := "ma_codi= '"+"RESERVA"+"'"
xServer :Update( "parametro", aCampos, aValues, aWhere )

como seria esto con mi tabla de parametro

saludos
jbrita
 
Posts: 486
Joined: Mon Jan 16, 2006 3:42 pm

Re: ME DUPLICA VALE

Postby joseluisysturiz » Wed Apr 06, 2016 3:16 pm

JBrita, buen dia, no entiendo que es lo que no entiendo, como te comente anteriormente a mi forma de controlar la numeracion el juego esta en la definicion del campo clave del master de facturas o documento que sea que lleve detalles, por eso pongo el ejemplo de una FACTURA o ALBARAN como le llaman algunos.

Si estas usando MYSQL, cuando crees tu TABLA por el metodo que sea, el campo clave que controlara la numeracion consecutiva del documento, le activas la opcion de auto-increment, este campo debe ser de tipo INT, asi no hara falta que controles numero de documento si no cada vez que grabes el MASTER el mismo mysql colocara numero del documento y ese numero lo puedes obtener de la forma que te comente en el mensaje anterior con last_insert_id(), le asignas ese valor a una variable y cuando grabes los detalles del documento, es decir los registros que contiene el documento, en la tabla de detalles debes tener un campo asociado al campo clave del master, pues a ese campo le asignas el valor que te devuelva last_insert_id(), asi queda asociado cada detalle al numero del master. Espero no haberte enredado mas, cualquier duda, estoy a la orden, gracias...saludos... :shock:
Dios no está muerto...

Gracias a mi Dios ante todo!
User avatar
joseluisysturiz
 
Posts: 2064
Joined: Fri Jan 06, 2006 9:28 pm
Location: Guatire - Caracas - Venezuela

Re: ME DUPLICA VALE

Postby carlos vargas » Wed Apr 06, 2016 4:36 pm

Usar un autoincremental para el numero de factura no es para nada recomendable.
creo que lo adedcuado es usar transacciones, y un campo que mantega el ultimo numero de factura, al estar en una transaccion todo el proceso esta protegido incluido el nuevo numero de factura.
uso tdolphin, y unos metodos propios de grabacion, y una funcion para obtener el nuevo numero de factura.

tengo una tabla control con un campos que son los contadores de documentos. en el caso de la venta es CONT_FACT.

Code: Select all  Expand view

FUNCTION IncContador( cCampo )
   LOCAL nContador := 0

   IF oServer:Execute( "UPDATE CONTROL SET " + cCampo + " = " + cCampo + " + 1" )
      nContador := oServer:QueryScalar( "SELECT " + cCampo + " AS CONTADOR FROM CONTROL LIMIT 1" )
      IF HB_IsNil( nContador )
         nContador := 0
      ENDIF
   ENDIF

RETURN nContador
 


Code: Select all  Expand view


FUNCTION Fact_Grabar()
   LOCAL lGrabado := FALSE

   IF lCredito .and. nNumClie == 0
      MsgAlert( "El cliente no esta autorizado a facturar al credito.", "Alerta" )
      RETURN FALSE
   ENDIF

   TRY
      oServer:BeginTransaction()

      IF ( nNumFact := IncContador( "CONT_FACT" ) ) > 0
         IF !Fact_Imprimir()
            Throw( ErrorNew( "Error de impresión.", 0, 0, "Error en la Impresión de factura de venta." ) )
         ENDIF
         oServer:Insert2( "MFACTURAS", { { "NUM_FACT"  , nNumFact                   },;
                                         { "FECHA"     , dFecha                     },;
                                         { "TC"        , nTC                        },;
                                         { "CREDITO"   , lCredito                   },;
                                         { "PLAZO"     , nPlazo                     },;
                                         { "NUM_VEND"  , nNumVend                   },;
                                         { "NOM_VEND"  , cNomVend                   },;
                                         { "REFERENCIA", cReferencia                },;
                                         { "NUM_CLIE"  , nNumClie                   },;
                                         { "NOM_CLIE"  , cNomClie                   },;
                                         { "DIR_CLIE"  , cDirClie                   },;
                                         { "RUC_CLIE"  , cRucClie                   },;
                                         { "TEL_CLIE"  , cTelClie                   },;
                                         { "EXONERADO" , lExonerado                 },;
                                         { "TIPOPAGO"  , cTipoPago                  },;
                                         { "REFEPAGO"  , cRefePago                  },;
                                         { "NOTA"      , cNota                      },;
                                         { "PORCDESC"  , nPorcDesc                  },;
                                         { "SUBTOTAL"  , nSubTotal                  },;
                                         { "DESCUENTO" , nDescuento                 },;
                                         { "IVA"       , nImpuesto                  },;
                                         { "TOTAL"     , nTotal                     },;
                                         { "SALDO"     , IIf( lCredito, nTotal, 0 ) },;
                                         { "PAGADA"    , !lCredito                  },;
                                         { "ANULADA"   , FALSE                      } } )

         DETA->( DBGoTop() )

         DO WHILE !DETA->( Eof() )

            oServer:Insert2( "DFACTURAS", { { "NUM_FACT", nNumFact        },;
                                            { "NUM_PROD", DETA->NUM_PROD  },;
                                            { "NOM_PROD", DETA->NOM_PROD  },;
                                            { "UMEDIDA" , DETA->UMEDIDA   },;
                                            { "SERVICIO", DETA->SERVICIO  },;
                                            { "CANTIDAD", DETA->CANTIDAD  },;
                                            { "PRECIO"  , DETA->PRECIO    },;
                                            { "VALOR"   , DETA->VALOR     },;
                                            { "P_DESC"  , DETA->P_DESC    },;
                                            { "V_DESC"  , DETA->V_DESC    },;
                                            { "G_IVA"   , DETA->G_IVA     },;
                                            { "V_IVA"   , DETA->V_IVA     },;
                                            { "SERIAL"  , DETA->SERIAL    } } )

            IF !DETA->SERVICIO
               oServer:Execute2( "UPDATE PRODUCTOS SET EXISTENCIA=EXISTENCIA-%1 WHERE NUM_PROD=%2 LIMIT 1", { DETA->CANTIDAD, DETA->NUM_PROD } )
            ENDIF

            DETA->( DBSkip() )

         ENDDO

         IF nNumProf>0
            oServer:Execute2( "DELETE FROM DPROFORMAS WHERE NUM_PROF=%1", { nNumProf } )
            oServer:Execute2( "DELETE FROM MPROFORMAS WHERE NUM_PROF=%1", { nNumProf } )
         ENDIF

      ENDIF
      oServer:CommitTransaction()
      oQryFact:ReQuery()
      lGrabado := TRUE
   CATCH oError
      oServer:RollBack()
      ShowError( oError )
   END

   IF lGrabado
      oBrw:GoBottom()
      oBrw:Refresh()
   ELSE
      oBrw:Refresh()
   ENDIF

   DETA->( DBGoTop() )

RETURN lGrabado
 
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
User avatar
carlos vargas
 
Posts: 1683
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua

Re: ME DUPLICA VALE

Postby joseluisysturiz » Wed Apr 06, 2016 5:15 pm

Saludos Carlos, podrias dar tu razon porque no es recomendable.?, es bueno saber opiniones y evitar futuros problemas con la data, todo es cuestion de punto de vista, tengo algunos modulos que hago algo como lo que dices, pero en mi caso me es mas conveniente el autoincrement para evitar el menos manejo de tablas, ademas que la facturacion esta en red y nunca habra un salto de numeracion, igual tu idea como te comente, la uso en otros modulos donde manejo menos consecutividad en la elaboracion de documento, es bueno que el colega vea varias opciones y que se escoja la que mas le parezca confiabel, practica y entendible, gracias, saludos... :shock:
Dios no está muerto...

Gracias a mi Dios ante todo!
User avatar
joseluisysturiz
 
Posts: 2064
Joined: Fri Jan 06, 2006 9:28 pm
Location: Guatire - Caracas - Venezuela

Re: ME DUPLICA VALE

Postby carlos vargas » Wed Apr 06, 2016 6:28 pm

voy ha hacer algo mejor,
este link es de walter in experto en sql firebird.tiene muchos post sobre sql, firebird y tecnicas de negocios.

https://firebird21.wordpress.com/

hay un post no recuerdo la direccion exacta que trata sobre este asunto de una manera detallada y clara.


salu2
carlos vargas
Last edited by carlos vargas on Wed Apr 06, 2016 6:31 pm, edited 1 time in total.
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
User avatar
carlos vargas
 
Posts: 1683
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua

Re: ME DUPLICA VALE

Postby joseluisysturiz » Wed Apr 06, 2016 6:31 pm

carlos vargas wrote:voy ha hacer algo mejor,
este link es de walter in experto en sql firebird.tiene muchos post sobre sql, firebird y tecnicas de negocios.

https://firebird21.wordpress.com/

salu2
carlos vargas


Gracias Carlos, leyendo el tema, saludos... :shock:
Dios no está muerto...

Gracias a mi Dios ante todo!
User avatar
joseluisysturiz
 
Posts: 2064
Joined: Fri Jan 06, 2006 9:28 pm
Location: Guatire - Caracas - Venezuela

Re: ME DUPLICA VALE

Postby joseluisysturiz » Wed Apr 06, 2016 8:27 pm

carlos vargas wrote:voy ha hacer algo mejor,
este link es de walter in experto en sql firebird.tiene muchos post sobre sql, firebird y tecnicas de negocios.

https://firebird21.wordpress.com/

hay un post no recuerdo la direccion exacta que trata sobre este asunto de una manera detallada y clara.


salu2
carlos vargas

Carlos, gracias por el link, de verdad hay temas muy buenos que ni idea existian, mas que todo en las configuraciones de las tablas, campos claves y demas temas relacionados...pero sin animo de polemicas, no encontre nada que me dijera porque no deberia usar el autoincrement en un master de documentos ni algo parecido, es lo que queria leer para orientarme y asi cambiar si es posible a un mejor metodo de trabajo, ya que aca lo mas importante es la veracidad y estabilidad de la data del cliente y la rapidez de nuestras aplicaciones, igual gracias por la sugerencia, saludos... :shock:
Dios no está muerto...

Gracias a mi Dios ante todo!
User avatar
joseluisysturiz
 
Posts: 2064
Joined: Fri Jan 06, 2006 9:28 pm
Location: Guatire - Caracas - Venezuela

Re: ME DUPLICA VALE

Postby carlos vargas » Thu Apr 07, 2016 5:49 pm

dejame ubicarlo (el post):-)
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
User avatar
carlos vargas
 
Posts: 1683
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua

Re: ME DUPLICA VALE

Postby carlos vargas » Fri Apr 08, 2016 6:14 am

aun no lo he encontrado, :-(, sigo buscando....
recuerdo qu ee lproblema es que usando autoinc como numero de factura bajo ciertas circunstancias no era recomendable.
aun asi esta info esta buena
https://firebird21.wordpress.com/2013/06/22/transacciones-optimistas-y-transacciones-pesimistas/
http://www.clubdelphi.com/foros/showthread.php?t=38872
mira este creo que es este:
http://blogs.msmvps.com/maxiaccotto/2008/03/16/como-generar-el-numero-de-nuestros-comprobantes-sin-morir-en-el-intento/
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
User avatar
carlos vargas
 
Posts: 1683
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 62 guests