Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Dando de alta un registro se modifica el anterior (https://www.clubdelphi.com/foros/showthread.php?t=82444)

jafera 07-03-2013 14:06:09

Dando de alta un registro se modifica el anterior
 
Hola a todos.

Ya se que el título puede que no sea el mejor pero es realmente lo que sucede.

Os explico:
Tengo dos tablas cabecera y lineas, las cuales se unen por un id unico.
Cuando doy de alta un registro en la tabla cabecera, adjunto codigo del boton:

Código Delphi [-]
 
procedure TF_Rebut.ToolButton1Click(Sender: TObject);
var id: integer;
begin
        ToolBar1.Visible := False;
        ToolBar2.Visible := True;
        Max_Id.Close;
        Max_Id.Open;
        if Max_IdMAX.Text = '' then
        begin
                id:=1;
        end
        else
        begin
                id := StrToInt(Max_IdMAX.Text)+1;
        end;
        F_ModulDades.Rebut.Append;
        F_ModulDades.RebutID_REBUT.Value := id;
        F_ModulDades.RebutDATA.Value := Date;
        F_ModulDades.RebutDATA.FocusControl;
end;

me hace una cosa muy extraña, modifica un parametro de la tabla detalle pero del registro en el que estoy situado antes de dar añadir.

No entiendo porque puede pasar ya que el nuevo id del nuevo recibo no tiene nada que ver con el id del detalle del ragistro donde estoy situado, entenderia que si los id son iguales, pudiera producirse un cambio así pero no es el caso, por ejemplo estoy situado en el registro 24 de 63 y al añadir doy de alta el registro 64 y se modifica el campo en el registro 24, cuando la tabla de detalles aun no tiene valores para el registro 64.

He puesto 50.000 puntos de interrupción pero no consigo aislar el error, si alguien ha sufrido un problema similar y lo ha resuelto o algun gurú tiene la bola de cristal en marcha y me puede adivinar la providencia pues se lo agradeceré enormemente.

Trabajo con D6 y FB1.5 (de momento) ya que ya he instalado DXE2 pero aún no he realizado los cambios a las aplicacioncillas.

Gracias

Josep

ecfisa 07-03-2013 16:35:31

Hola Josep.

Estuve leyendo tu mensaje y no logro visualizar de forma clara la situación.

¿ Que tipo de relación tenes establecida entre ellas, master/detail ?
¿ Existe algún evento asociado a la tabla cabecera que pudiera dispararse y modificar la tabla detalle ?
¿ Probaste cerrar la tabla detalle antes de ejecutar el código anterior ? (Tal vez te sirva para localizar donde se produce la modificación)

Saludos. :)

jafera 07-03-2013 17:41:25

Gracis Eliseo, tu siempre al rescate de los naufragos, (tendré que imaginarte con un bañador rojo y un salvavidas), bueno bromas a parte te comento:

Cita:

Empezado por ecfisa (Mensaje 456199)

Estuve leyendo tu mensaje y no logro visualizar de forma clara la situación.

¿ Que tipo de relación tenes establecida entre ellas, master/detail ?

Si es una relacion master/detalle (como si de una factura se tratara)

¿ Existe algún evento asociado a la tabla cabecera que pudiera dispararse y modificar la tabla detalle ?

Lo unico que hago es que una vez he terminado de entrar los datos de la cabecera estos se guardan con un post y ya puedo empezar a entrar los datos de las lineas.

¿ Probaste cerrar la tabla detalle antes de ejecutar el código anterior ? (Tal vez te sirva para localizar donde se produce la modificación)

La tabla detalle la tengo en autoedit:=True, probaré si poneiendola a False no ocurre.

Pero lo que me extraña es que el proceso de cambio en la tabla detalle de este valor "S" a "N", pase siempre este en el registro que esté, es decir que si hago el append en medio de la tabla tambien ocurre. Me lleva un poco de craneo.

Yo ya habia observado este comportamiento tiempo atrás pero no le daba importancia y pensaba que era yo que olvidava asignar el valor del campo a "S" ya que en cada nuevo registro vale "N".

Además puse una comprobación de que al salir del form si valia "N" me avisara, abortara y me obligaba a poner "S", con lo cual este valor al salir del recibo siempre era correcto.

Repito gracias por vuestro tiempo

Josep

ecfisa 07-03-2013 18:25:36

Cita:

Empezado por jafera (Mensaje 456206)
Gracis Eliseo, tu siempre al rescate de los naufragos, ...

Hola Josep.

Es todo un honor que me confundas con el maestro egostar, pero como hoy no anda por aquí, tendrás que conformarte con este aprendiz. :( :)

Ahora volviendo al tema:
Cita:

Empezado por jafera (Mensaje 456206)
La tabla detalle la tengo en autoedit:=True, probaré si poneiendola a False no ocurre.

No pareciera que la propiedad AutoEdit esté provocando la situación, me refería a que la tabla detalle permaneciera cerrada durante la escritura en la tabla maestro, por si algún evento "desapercibido" estuviera escribiéndola y así poder detectarlo.

De otro modo no concibo la situación, por que al guardar datos en la tabla maestra usando Append, no se modifica de forma automática ningún valor en la tabla detalle ya que la tabla maestro todavía no tiene ningún detalle asociado hasta el momento. Y más raro aún, que este modificando un registro que no esta ajustado a la relación maestro/detalle si esta fué correctamente establecida...

Aunque no es exáctamente el mismo caso, si estas trabajando con componentes IBX y estas usando CachedUpdates revisa este hilo: Problemas inserción de registros en IBDataset maestro-detalle y Foreign Key.

Saludos. :)

cloayza 07-03-2013 18:44:46

Amigo al mirar tú código veo que falta algo...

Código Delphi [-]
 
procedure TF_Rebut.ToolButton1Click(Sender: TObject);
var id: integer;
begin
        ToolBar1.Visible := False;
        ToolBar2.Visible := True;
        Max_Id.Close;
        Max_Id.Open;
        if Max_IdMAX.Text = '' then
        begin
                id:=1;
        end
        else
        begin
                id := StrToInt(Max_IdMAX.Text)+1;
        end;
        F_ModulDades.Rebut.Append;
        F_ModulDades.RebutID_REBUT.Value := id;
        F_ModulDades.RebutDATA.Value := Date;
        F_ModulDades.Rebut.Post;  {Guardar los datos del registro...}

        F_ModulDades.RebutDATA.FocusControl;
end;

Como estas tratando las transaciones...Recuerda poner ojo en ello...

Saludos cordiales

jafera 07-03-2013 18:47:39

Upps., me confundí...

Bueno al lio que es lo que vale, las pruebas realizadas hasta el momento son:

Puntos de interrupcion en todas las lineas que hacen referencia al campo F_ModulDades.RebutAuxCAMPIONAT.Value

Un addwatch con el campo como referencia y la sorpresa es que en el proceso de alta este valor vale "S" pero referenciado al registro anterior, que es lo que no logro entender

No veo en que momento me pasa de "S" a "N".

Sigo investigando

Saludos

jafera 07-03-2013 18:51:18

Gracias cloayza.

El post lo realizo mas tarde cuando acabo de insertar todos los datos en la cabecera, esto solo llena el id_rebut y la fecha de forma automatica, luego empiezo a poner datos de codigo de barras, ciudades, etc.

No se probaré si con un post y edit a continuacion no pasa.

Pruebo y comento

Saludos

cloayza 07-03-2013 18:54:39

Si es así como estas trabajando estaría bien como aparece mal principio...

Solo es que al ver el código pense que eso era todos los campos que estabas agregando...

Sería bueno que colocaras todo el código que usas para agregar el registro, talvez en alguna parte estes saltando de registro o realizando alguna cosilla que no has visto...:D

Saludos

jafera 07-03-2013 18:59:55

He probado con un post despues del ID y la fecha y zascas falla igual.

No hay problema en poner el codigo seran unas cuantas lineas de codigo pero lo haré.

Gracias

jafera 07-03-2013 19:17:44

Aqui va todo lo relacionado con el proceso de alta, en ningun momento hago referencia a la tabla auxiliar ya que hasta que la principal no se graba, el ID no tiene valor con lo cual no puedo relacionarlo

Código Delphi [-]
 
procedure TF_Rebut.ToolButton1Click(Sender: TObject);
var id: integer;
begin
        ToolBar1.Visible := False;
        ToolBar2.Visible := True;
        Max_Id.Close;
        Max_Id.Open;
        if Max_IdMAX.Text = '' then
        begin
                id:=1;
        end
        else
        begin
                id := StrToInt(Max_IdMAX.Text)+1;
        end;
        F_ModulDades.Rebut.Append;
        F_ModulDades.RebutID_REBUT.Value := id;         //aqui con el addwacth el valor es "S" pero no tiene que ser ya que no hay relacion
        F_ModulDades.RebutDATA.Value := Date;
        F_ModulDades.RebutDATA.FocusControl;
end;
                                                            //aqui con el addwacth el valor es "N" pero no tiene que ser ya que no hay relacion, aun no he dado ninguna alta

procedure TF_ModulDades.RebutAfterDelete(DataSet: TDataSet);
begin
        IBTRebuts.CommitRetaining;
end;
procedure TF_ModulDades.RebutAfterPost(DataSet: TDataSet);
begin
        IBTRebuts.CommitRetaining;
end;
procedure TF_ModulDades.RebutBeforePost(DataSet: TDataSet);
begin
        if RebutCODI_CLUB.Value = 0 then
        begin
                ShowMessage('Has de possar un club abans de gravar');
                F_Rebut.DBEdit21.SetFocus;
                Abort;
        end;
end;
procedure TF_ModulDades.RebutNewRecord(DataSet: TDataSet);
begin
        RebutI1.Value := 'N';
        RebutI2.Value := 'N';
        RebutI3.Value := 'N';
        RebutI4.Value := 'N';
        RebutI5.Value := 'N';
        RebutTI1.Value := 0;
        RebutTI2.Value := 0;
        RebutTI3.Value := 0;
        RebutTI4.Value := 0;
        RebutTI5.Value := 0;
        RebutARBITRES.Value := 0;
        RebutIMPORT.Value := 0;
        RebutMATERIAL.Value := 0;
        RebutTOTAL_REBUT.Value := 0;
        RebutSUSPENSIO.Value := 'N';
        RebutASPIRANT.Value := 'N';
        RebutPREU_FIX.Value := 'N';
        RebutZONA.Value := 0;
        RebutTRANSP.Value :='N';
        RebutGRAVAT.Value :='N';
        RebutACUMULAT.Value :='N';
        RebutPREU_FIX.Value :='N';
        RebutCAMPIONAT.Value := IncrementsCAMPIONAT.Value;
        RebutFEINER.Value := IncrementsFEINER.Value;
        RebutDOS_SECTORS.Value := IncrementsDOS_SECTORS.Value;
        RebutI10.Value := IncrementsI10.Value;
        RebutID_USUARI.Value := F_Inici.Usuari;
        RebutCREA_REBUT.Value := ConfiguracioTIPUS_REBUT.Value;
end;
procedure TF_Rebut.ToolButton6Click(Sender: TObject);
begin
        If F_ModulDades.Rebut.State in [dsEdit,dsInsert] then
        begin
              If F_ModulDades.RebutSUSPENSIO.Value = 'N' then
              begin
                      F_ModulDades.RebutTI4.Value := 0;
                      F_ModulDades.RebutTI5.Value := 0;
                      If F_ModulDades.RebutIMPORT_2.Value <> 0 then
                      begin
                              F_ModulDades.RebutTOTAL_REBUT.Value:= F_ModulDades.RebutIMPORT_2.Value;
                      end
                      else
                      F_ModulDades.RebutTOTAL_REBUT.Value := StrToInt(DBEdit4.text) + F_ModulDades.RebutTI1.Value +     F_ModulDades.RebutTI2.Value +         F_ModulDades.RebutTI3.Value;
              end
              else
              If F_ModulDades.RebutSUSPENSIO.Value = 'S' then
              begin
                      If F_ModulDades.RebutI4.Value = 'S' then
                      begin
                              F_ModulDades.RebutTI4.Value := F_ModulDades.RebutIMPORT.Value / 2;
                              F_ModulDades.RebutTI5.Value := 0;
                              F_ModulDades.RebutTOTAL_REBUT.Value := F_ModulDades.RebutTI2.Value + F_ModulDades.RebutTI3.Value +          F_Moduldades.RebutTI4.Value;
                      end
                      else
                      If F_ModulDades.RebutI4.Value = 'N' then
                      begin
                              F_ModulDades.RebutTI4.Value := 0;
                              F_ModulDades.RebutTI5.Value := F_Moduldades.RebutARBITRES.Value * F_Moduldades.RebutI10.Value;
                              F_ModulDades.RebutTOTAL_REBUT.Value := F_ModulDades.RebutTI2.Value + F_ModulDades.RebutTI3.Value +          
F_Moduldades.RebutTI5.Value + F_ModulDades.RebutKM_TOTALS.Value * F_ModulDades.IncrementsPREU_KM.Value;
                      end;
              end;
              F_ModulDades.Rebut.Post;
        end;
        ToolBar2.Visible := False;
        ToolBar1.Visible := True;
        DBEdit1.Enabled := True;
end;

Saludos

jafera 08-03-2013 17:20:18

Solucionado.

El problemna estaba en este pedazo de código:

Código Delphi [-]
 
procedure TF_ModulDades.RebutI1Change(Sender: TField);
begin
        if RebutI1.Value = 'S' then
        begin
                RebutTI1.Value := RebutCAMPIONAT.Value;
        end;
        if RebutI1.Value = 'N' then
        begin
                if  F_Rebut.DBEdit1.Text <>'' then
                begin
                        F_Rebut.Posa_N.Close;
                        F_Rebut.Posa_N.UnPrepare;
                        F_Rebut.Posa_N.SQL.Text:= 'UPDATE RE0007 SET CAMPIONAT = ''N'' WHERE ID_REBUT =:ID_REBUT';
                        F_Rebut.Posa_N.ParamByName('ID_REBUT').AsInteger := RebutID_REBUT.Value; // aqui yo tenia StrToInt(DBEdit1.Text) y evidentemente DBEdit1.Text tenia como valor el registro anterior
                        F_Rebut.Posa_N.Prepare;
                        F_Rebut.Posa_N.Open;
                        RebutAux.Close;
                        RebutAux.Open;
                end;
        end;
end;

Gracias a todos por vuestro interés.

Josep


La franja horaria es GMT +2. Ahora son las 17:44:22.

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