Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Problemas con duplicacion de datos (https://www.clubdelphi.com/foros/showthread.php?t=65514)

mentor 21-12-2009 14:29:18

Problemas con duplicacion de datos
 
Hola utilizo fibplus con firebird 2.1.3 en d2007, tengo un sistema de punto de ventas en red con mas de 6 maquinas, algunas veces tengo problema cuando un usuario esta facturando, y el otro tambien al mismo tiempo, es que el detalle de una venta aparece en la otra, no se cuando pasa, por que en el evento before post preguno si ya existe ese registro si existe vuelvo a crear, hay alguna manera de bloquear un registro maestro detalle cuando esta en edicion o algo por el estilo. espere expresarme bien, desde ya les agradesco

look 21-12-2009 15:08:58

Cita:

Empezado por mentor (Mensaje 349255)
Hola utilizo fibplus con firebird 2.1.3 en d2007, tengo un sistema de punto de ventas en red con mas de 6 maquinas, algunas veces tengo problema cuando un usuario esta facturando, y el otro tambien al mismo tiempo, es que el detalle de una venta aparece en la otra, no se cuando pasa, por que en el evento before post preguno si ya existe ese registro si existe vuelvo a crear, hay alguna manera de bloquear un registro maestro detalle cuando esta en edicion o algo por el estilo. espere expresarme bien, desde ya les agradesco

creo que deberias utlilizar transacciones

Código Delphi [-]
      if not (Database1.InTransaction) then Database1.StartTransaction;
      try

/////proceso normal de grabar datos
///// aqui haces un procedimiento que te calcule el siguiente num.
              Database1.Commit;
      except
        ON E: EXCEPTION DO
        BEGIN
              database1.rollback;
              APPLICATION.MESSAGEBOX( PCHAR( 'Error de SQL'+E.MESSAGE ), 'Error ',MB_ICONSTOP );
              exit;
        END;
      end;

marcoszorrilla 21-12-2009 15:10:07

Lo que ocurre es que estás repitiendo el número del apunte, porque cuando llegas al evento BeforePost de la cabecera ya tienes varias líneas que se han mezclado con las del otro equipo que está emitiendo el mismo número.

Yo por el momento para estos casos lo que hago es dar a cada usuario un número y este número lo multiplico por 10.

Ejemplo:útlima factura = 500
Empieza a realizar una factura el usuario número 6

500+6*10=560

Este es el número de factura provisional que permanece hasta que pulse el botón de alta, entonces si el último número es el 500, se le suma 1 y se da de alta la cabecera 501, acto seguido en el evento AfterPost por ejemplo se hace un "Update" de todas las líneas que pasarán de 560 a 501.

Esperemos otras ideas.

Un Saludo.

mentor 22-12-2009 13:07:07

estoy haciendo de la sgte manera cabeceraventa y detalleventa, al crear nueva factura genero el ultimonumer + 1, y en before post compruebo otravez el ultimo n + 1 y guarda la cabecera, luego voy insertando los detalles, en la cabecera tengo un campo id_estado que cuando imprimo cambia de valor, que hago que no se pueda mas editar ni eliminar la factura, y las factura cargo por usuario, osea mediante un procedimiento almacenado con parametros, y pruebo y pruebo parece que va a andar bien, pero resulta que hoy ya me paso otravez que volvio a cruzarse los detalles, ahh y el campo id_estado coloco en otro dataset como maestro detalle y lo actualizo cada vez que hay cambio en la tabla cabecera venta evenalert, sera que estoy haciendo algo mal o una idea por favor


La franja horaria es GMT +2. Ahora son las 00:25:43.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi