Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 02-10-2006
bitbow bitbow is offline
Miembro
 
Registrado: jul 2006
Posts: 366
Poder: 21
bitbow Va camino a la fama
Smile Una duda?

Dices que tu factura ya vienen con el folio de echo aqui se manejan igual, pero para que una tabla para guardar los folios, yo lo que hago es usar un id auntoinc para el identificador, un id_folio para las notas foliadas y seriarlas segun se ocupen en cada caja y un campo referencia en el cual se almacena el folio de factura en caso de que se emita una por esa venta, como no se que folio pudiera llegar a ocupar en determinado momento pues simplemente a la hora de facturar el usuario escribira el folio de la factura y lo guarda de esta forma no tengo que bloquear nada, bueno no soy un experto es esto de la facturacion y tal ves este mal pero asi es como vi que funcionaria mejor y no creo que al usuario le de un ataque por escribir unos numeros.

Saludos.
Responder Con Cita
  #2  
Antiguo 02-10-2006
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 26
maeyanes Va por buen camino
Yo estoy trabajando en un sistema de inventarios, donde los números consecutivos los genera la aplicación, basándome en una tabla de control. Cuando más de un cliente trata de guardar un registro nuevo, primero verifico si el número que voy a usar no está ya usado, si es así, obtengo un número nuevo y lo uso. Todo esto con un Trigger Before Insert de la tabla.

Ahora, desde la aplicación, al momento de guardar el registro lo hago mediante un repeat..until de esta forma:

Código Delphi [-]
repeat
  Stored := True;
  try
    DataSet.Post;
  except
    on E: EIBInterBaseError do
    begin
      // Si existe DeadLock, cambio a False Stored para repetir la inserción...
      Stored := not E.SQLCode = -901; 
      if Stored then // Si Stored sigue siendo verdadero, la excepción fue otra y la relanzo...
        raise
    end
  end
until
  Stored;

El código no es exactamente el mismo, pero con esto resolví el problema de los DeadLock...

Espero te sirva...


Saludos...
Responder Con Cita
  #3  
Antiguo 07-10-2006
Avatar de AGAG4
AGAG4 AGAG4 is offline
Miembro
 
Registrado: ago 2004
Ubicación: Los Mochis, Sinaloa, México
Posts: 1.420
Poder: 24
AGAG4 Va por buen camino
Cita:
Empezado por maeyanes
Yo estoy trabajando en un sistema de inventarios, donde los números consecutivos los genera la aplicación, basándome en una tabla de control. Cuando más de un cliente trata de guardar un registro nuevo, primero verifico si el número que voy a usar no está ya usado, si es así, obtengo un número nuevo y lo uso. Todo esto con un Trigger Before Insert de la tabla.

Ahora, desde la aplicación, al momento de guardar el registro lo hago mediante un repeat..until de esta forma:

Código Delphi [-]repeat Stored := True; try DataSet.Post; except on E: EIBInterBaseError do begin // Si existe DeadLock, cambio a False Stored para repetir la inserción... Stored := not E.SQLCode = -901; if Stored then // Si Stored sigue siendo verdadero, la excepción fue otra y la relanzo... raise end end until Stored;


El código no es exactamente el mismo, pero con esto resolví el problema de los DeadLock...

Espero te sirva...


Saludos...
Gracias maeyanes, pero uso algo muy similar al tuyo con la diferencia que uso el While..do, me imagino que después del Post que tienes viene un Commit, pues se te puede presentar que al pasar el Post en ese mismo instante se apague la PC ó marque los errores tradicionales de Windows, vas a dejar bloqueado el registro hasta que le des un ShutDown a Firebird, espero nunca te suceda esto, pero en el mundo de la informatica todo puede esperarse... Gracias por tu consejo.
__________________
"Hemos aprendido a volar como los Pájaros, y a nadar como los Peces, y todavía No aprendemos a vivir como Hermanos". Martin Luther King
Responder Con Cita
  #4  
Antiguo 07-10-2006
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 26
maeyanes Va por buen camino
Bueno, si hay un TransactionStart y un Commit o Rollback en caso de otro tipo de error, pero como este código es para guardar uno o más registros en sucesión, estos van afuera del código que puse...


Saludos...
Responder Con Cita
  #5  
Antiguo 07-10-2006
Avatar de AGAG4
AGAG4 AGAG4 is offline
Miembro
 
Registrado: ago 2004
Ubicación: Los Mochis, Sinaloa, México
Posts: 1.420
Poder: 24
AGAG4 Va por buen camino
No entendí esto
Cita:
Empezado por maeyanes
pero como este código es para guardar uno o más registros en sucesión, estos van afuera del código que puse...
Donde quiera que vaya el código del Post, en alguna parte le tienes que dar el commit.
Que componentes usas????
__________________
"Hemos aprendido a volar como los Pájaros, y a nadar como los Peces, y todavía No aprendemos a vivir como Hermanos". Martin Luther King
Responder Con Cita
  #6  
Antiguo 07-10-2006
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 26
maeyanes Va por buen camino
Lo que sucede es que en realidad tengo creado un tipo de framework para trabajar con objetos en lugar de registros...

Entonces, en lugar de hacer DataSet.Post, en realidad hago algo como Objeto.Store, entonces, internamente el método mencionado hace el manejo de las transacciones...

Ahora, cuando quiero manejar inserciones masivas, vamos a decirle así, por ejemplo tipo master-detail, lo que hago es iniciar una transacción, realizar el ciclo de inserciones (Objeto.Store) y al final el Commit o Rollback dependiendo de si todo estuvo bien u ocurrió un error.

Mi código es más o menos ásí:

Código Delphi [-]
var
  Objeto: TObjetoFrameWork;

begin
  Connection.StartTransaction;
  try
    for I := 0 to ListaObjetos.Count - 1 do // ListaObjetos es un TList
    begin
      Objeto := TObjetoFrameWork(ListaObjetos[i]);
      repeat
        Stored := True;
        try
          Objeto.Store
        except
          on E: EIBInterBaseError do
          begin
            // Si existe DeadLock, cambio a False Stored para repetir la inserción...
            Stored := not E.SQLCode = -901; 
            if Stored then // Si Stored sigue siendo verdadero, la excepción fue otra y la relanzo...
              raise
          end
        end
      until
        Stored
    end;
    Connection.CommitTransaction
  except
    Connection.RollbackTransaction
  end
end;

Espero que con esto te aclare mejor las cosas...



Saludos...
Responder Con Cita
  #7  
Antiguo 10-10-2006
ronalg ronalg is offline
Miembro
 
Registrado: may 2003
Ubicación: Sucre - Bolivia
Posts: 68
Poder: 24
ronalg Va por buen camino
Guardar lo que pides hasta que lo necesites

bueno no se si te servira, yo uso generadores, pero el cliente pide un numero, y lo guardo en el registro de windows, hasta que lo necesito, una simple variable de cod_factura en el regitro, si esta variable es vacia pido un nuevo numero al generador, si esta llena uso ese valos, si hay error no vacio la variable y si no lo hay la vacio y asi garantizo que aunque se corte la luz como esta en el registro de windows puedo rescatar el número que pedí.

Espero que te sirva
__________________
Saludos desde Sucre - Bolivia
"Si te lo puedes imaginar lo
puedes resolver" Pyriel
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Como darle información a mi base de Datos servicomp Firebird e Interbase 3 01-08-2006 18:56:22
como darle nuevos aspectos a un trackbar de delphi rls Varios 2 16-11-2005 21:26:31
Como darle color a un TListColumn? abracadabra OOP 4 15-07-2005 17:01:40
Tips: Como darle velocidad al IDE en D8 mamcx .NET 0 30-09-2004 18:09:45
Darle Vida a una IbQuery Rabata Conexión con bases de datos 6 16-09-2003 18:48:23


La franja horaria es GMT +2. Ahora son las 20:13:29.


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