Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 04-08-2005
Loviedo Loviedo is offline
Miembro
 
Registrado: dic 2004
Posts: 214
Poder: 0
Loviedo cantidad desconocida en este momento
Transaciones IBX

Tengo dos tablas (master/detail).
Utilizo Delphi7,Firebird 1.5, e IBQuery.
Mi problema es que no puedo insertar más de un registro(Detail),
porque no se confirman los datos hasta que realizo el Commit,
y es entónces cuando se incrementa el código familia.
No puedo individualizarlos porque va todo dentro de la misma
transación. Pienso en una transación anidada, pero no se como
hacerla y si es permitida.

Código Delphi [-]
procedure TFFicha.aceptarClick(Sender: TObject);
var
  codigoficha: integer;
begin
  if not (FDM.IBT1.InTransaction) then
    FDM.IBT1.StartTransaction;
  try
   codigoficha := FDM.codigosFICHA.AsInteger;
   FDM.PFICHA.StoredProcName:= 'ALTAFICHA';
   FDM.PFICHA.Parambyname('mcod').asinteger:=codigoficha;
   FDM.PFICHA.Parambyname('mnombre').asstring:=uppercase(nombre.text);
   FDM.PFICHA.Parambyname('mapell').asstring:=uppercase(apellidos.Text);
   FDM.PFICHA.Parambyname('mfecha').asdatetime:=fecha.date;
   // Guarda familia
   if not FDM.FamiliaT.IsEmpty then
     begin
       FDM.FamiliaT.First;
       while not FDM.FamiliaT.Eof do
         begin
           FDM.PFamilia.StoredProcName:='P_ALTAFAMILIA';
           FDM.PFamilia.ParamByName('mCod').value := codigoficha;
           FDM.PFamilia.ParamByName('mCodf').value:= FDM.CodigosFAMILIA.AsInteger;
           FDM.PFamilia.ParamByName('mNom').value:= FDM.FamiliaTNombre.text;
           FDM.PFamilia.ParamByName('mApell').value := FDM.FamiliaTApellidos;
           FDM.PFamilia.ExecProc;
           FDM.Incrementa.StoredProcName:='P_INCFAMILIA';//Incrementa el código familia
           FDM.Incrementa.ExecProc;
           FDM.FamiliaT.Next;
         end;
     end;
   FDM.IBT1.Commit;
 except
   FDM.IBT1.Rollback;
 end;
end;
saludos y Gracias anticipadas.
Responder Con Cita
  #2  
Antiguo 04-08-2005
Avatar de kalimero
kalimero kalimero is offline
Miembro
 
Registrado: may 2003
Ubicación: Alicante
Posts: 289
Poder: 22
kalimero Va por buen camino
Hola.

¿Podrias publicar el codigo del procedimiento almacenado 'P_INCFAMILIA?

Saludos
Responder Con Cita
  #3  
Antiguo 04-08-2005
Avatar de rastafarey
rastafarey rastafarey is offline
Miembro
 
Registrado: nov 2003
Posts: 927
Poder: 22
rastafarey Va por buen camino
Resp

No entiendo cual es tu problema. La tansaccion no termina hasta hacer commit o rollback.

Si tienes una integridada referencial entre master y detalles exister el registro relacionado con el master.

Primero ten cuidado con el procedimiento qu eincremnte el codigo. Me imagino que usas un generador ya que este no respeta las transacciones y asi te evitas codigos duplicados en un hanbiente multiusuario.

Te doy un ejemplo de como puedes hacer.

Master 1:
Lees el codigo del master
Asiganas los dados y ejecutas el master

Detalles 1 master 1
Asiganas los dados y ejecutas el detalle
Detalles 2 master 1
Asiganas los dados y ejecutas el detalle
y asi sucesivamente.

Igual para el master 2 y sus detalles.

Luego de todo esto puedes hacer el commit.

Pero tambien puedes hacer el commit despues de insertar el ultimo detalle de un master.
Asi puedes insertar todos los detalles que quieres a un master.

Pero una vez mas te recuerdo lo del control d etransacciones ay que si el codigo no lo controlar con un generador te puede dar un error de bloqueo muerto o conflitos de calves primarias.

Espero te sirva de ayuda.
__________________
Todo se puede, que no exista la tecnología aun, es otra cosa.
Responder Con Cita
  #4  
Antiguo 04-08-2005
Loviedo Loviedo is offline
Miembro
 
Registrado: dic 2004
Posts: 214
Poder: 0
Loviedo cantidad desconocida en este momento
Este es el procedimiento

Código Delphi [-]
Procedimiento P_INCFAMILIA
EGIN
  UPDATE codigos SET familia=familia+1;
END

El problema es que en el bucle, no se incrementa el 'FDM.CodigosFAMILIA.AsInteger' y me sale
violación clave primaria al insertar el siguiente registro.
'FDM.CodigosFAMILIA.AsInteger' se refresca después del commit.
Gracias.
Responder Con Cita
  #5  
Antiguo 04-08-2005
Avatar de kalimero
kalimero kalimero is offline
Miembro
 
Registrado: may 2003
Ubicación: Alicante
Posts: 289
Poder: 22
kalimero Va por buen camino
Hola.
En mi opinion deberias llevar el incremento del Codfamilia fuera del procedimiento.Me refiero a que lo Incrementes tu por codigo

Saludos
Responder Con Cita
  #6  
Antiguo 04-08-2005
Avatar de rastafarey
rastafarey rastafarey is offline
Miembro
 
Registrado: nov 2003
Posts: 927
Poder: 22
rastafarey Va por buen camino
resp

Usa un generador.

Si el generador se llama gen_Id_familia

Haces Un select
Código SQL [-]
Select Gen_id(gen_Id_familia, 0) From rdb$datbase
Select Gen_id(gen_Id_familia, 1) From rdb$datbase
El primero te saca el valor actual
y el otro incrmente en uno.

y el error te ocurre ya que el valor se esta incrementando dentro del procedimiento y no fuera como te didjeron anteriormente.
__________________
Todo se puede, que no exista la tecnología aun, es otra cosa.
Responder Con Cita
  #7  
Antiguo 04-08-2005
Loviedo Loviedo is offline
Miembro
 
Registrado: dic 2004
Posts: 214
Poder: 0
Loviedo cantidad desconocida en este momento
Muchas gracias por las respuestas.
Me inclinaré por uno de los métodos indicados.
Saludos.
Responder Con Cita
  #8  
Antiguo 04-08-2005
Avatar de AGAG4
AGAG4 AGAG4 is offline
Miembro
 
Registrado: ago 2004
Ubicación: Los Mochis, Sinaloa, México
Posts: 1.420
Poder: 22
AGAG4 Va por buen camino
Recomiendo

Te Recomiendo usar la propiedad CachedUpdates en los IBDataSet sobre la realción maestro detalle que comentas, cuando guardes en vez de usar el POST lo cambias por CachedUpdates, y cuando vayas a aceptar la transacción primero Grabas el Detalle y posteriormente el Maestro, si me preguntas porque, te respondo asi me funcionó, que debería de ser primero el Maestro y después el Detalle y por último Aceptas la transacción....

Saludos....
Responder Con Cita
  #9  
Antiguo 05-08-2005
Loviedo Loviedo is offline
Miembro
 
Registrado: dic 2004
Posts: 214
Poder: 0
Loviedo cantidad desconocida en este momento
¡ ya lo conseguí !. No se si es muy ortodoxo pero...

Código Delphi [-]
   if not FDM.FamiliaT.IsEmpty then
     begin
       FDM.FamiliaT.First;
       while not FDM.FamiliaT.Eof do
         begin
           FDM.PFamilia.StoredProcName:='P_ALTAFAMILIA';
           FDM.PFamilia.ParamByName('mCod').value := codigoficha;
           FDM.PFamilia.ParamByName('mCodf').value:= FDM.CodigosFAMILIA.AsInteger;
           FDM.PFamilia.ParamByName('mNom').value:= FDM.FamiliaTNombre.text;
           FDM.PFamilia.ParamByName('mApell').value := FDM.FamiliaTApellidos.text;
           FDM.PFamilia.ParamByName('mEdad').value := FDM.FamiliaEDAD.asinteger;
           FDM.PFamilia.ParamByName('mDoc').value := FDM.FamiliaTDocumentos.asinteger;
           FDM.PFamilia.ParamByName('mSit').value := FDM.FamiliaTSituacion.asinteger;
           FDM.PFamilia.ParamByName('mParent').value := FDM.FamiliaTParentesco.Text;
           FDM.PFamilia.ExecProc;
           FDM.Incrementa.StoredProcName:='P_INCFAMILIA';
           FDM.Incrementa.ExecProc;
           FDM.codigos.Close;
           FDM.codigos.Open;
           FDM.FamiliaT.Next;
         end;
     end;
Gracias por todo.
Responder Con Cita
  #10  
Antiguo 05-08-2005
Avatar de rastafarey
rastafarey rastafarey is offline
Miembro
 
Registrado: nov 2003
Posts: 927
Poder: 22
rastafarey Va por buen camino
Resp

Recuerda que en un entorno mmulti usuraio si no usas generadores para el id primario te puede dar bloques muertos. o Conflitos de claves devido al control transacional.
__________________
Todo se puede, que no exista la tecnología aun, es otra cosa.
Responder Con Cita
  #11  
Antiguo 06-08-2005
Loviedo Loviedo is offline
Miembro
 
Registrado: dic 2004
Posts: 214
Poder: 0
Loviedo cantidad desconocida en este momento
Gracias por la ayuda. Usaré generadores. Lo que ocurre es que el tema refresh
no me funciona, y no he leido en el foro algo definitivo.
Saludos.
Responder Con Cita
Respuesta



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


La franja horaria es GMT +2. Ahora son las 22:58:03.


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