Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 19-08-2010
Avatar de jafera
jafera jafera is offline
Miembro
 
Registrado: may 2007
Ubicación: Llagostera (Girona)
Posts: 582
Poder: 18
jafera Va por buen camino
Cambio de valor de un campo en un grid

Hola de nuevo a todos.

Aprovechando vuestro "savoir faire" que dirian los franceses, os planteo otra duda que me ha surgido al trabajar con un JVDBGrid.

Tal y como comenté en mi anterior post, estoy trabajando con un grid que se llena mediante una tabla, todo esto en firebird 1.5.

Los datos de este grid son filtrados por un id del maestro, lógico claro, en los registros de este grid solo puede haber uno con un campo que se llama ACTUAL y que contenga el valor "S", este valor siempre es el último del grid.

Cuando añado un nuevo registro automaticamente le pone valor S al campo ACTUAL (onnewrecord), pero en el evento beforepost tengo puesto lo siguiente:

Código Delphi [-]
 
If Camions_Aux.State in [dsInsert] then
        begin
                Actual_S.Close;
                Actual_S.ParamByName('ID_CAMIO').AsInteger := F_ModulDades.Camions_AuxID_CAMIO.Value;
                Actual_S.ParamByName('ID').AsInteger:=F_ModulDades.Camions_AuxID.Value;
                Actual_S.Open;
                if Actual_S.RecordCount > 0 then
                begin
                        ShowMessage('Només es pot asignar el camió a un parc');
                        Camions_AuxACTUAL.Value := 'N';
                end;
        end;

El motivo del state es para que no actue si estoy modificando un dato que no sea ACTUAL.

Bueno despues de soltar el lastre mi pregunta.

Puedo poner ACTUAL a S pero en el registro anterior al nuevo?, tal y como tengo el código actualmente me pone a S el ultimo registro y yo quisiera poner a S el penultimo.

Gracias a todos y saludos

Josep
Responder Con Cita
  #2  
Antiguo 19-08-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

No me queda bién en claro si la 'S' la guardás en el maestro o el detalle, pero suponiendo que sea
sobre la tabla detalle, podrías hacer:

Código Delphi [-]
procedure TForm1.IBDataSetDetalleAfterPost(DataSet: TDataSet);
begin
  with IBDataSetDetalle do
  begin
    Prior;  // ir al anterior
    Edit;   // modo edición
    FieldByName('Campo_a_ponerle_la_S').AsString:= 'S';
    Post;   // guardar
  end;
end;

Saludos.

Última edición por ecfisa fecha: 19-08-2010 a las 19:29:18.
Responder Con Cita
  #3  
Antiguo 19-08-2010
Avatar de jafera
jafera jafera is offline
Miembro
 
Registrado: may 2007
Ubicación: Llagostera (Girona)
Posts: 582
Poder: 18
jafera Va por buen camino
Buenas ecfisa, a ver si lo he entendidobien, yo coloco el codigo aqui, lo he insertado en el código que ya tenia yo puesto en el evento

Código Delphi [-]
 
procedure TF_ModulDades.Camions_AuxAfterPost(DataSet: TDataSet);
var Pos:TBookmark;
begin
        Pos := Camions_Aux.GetBookmark;
        IBTBombers.CommitRetaining;
        Camions_Aux.Close;
        Camions_Aux.Open;
        Camions_Aux.GotoBookmark(Pos);
        with Camions_Aux do
        begin
                Prior;
                Edit;
                Camions_AuxACTUAL.Value:= 'N';
                Post;
        end;
        Camions_Aux.FreeBookmark(Pos);
end;

El resultado es que hace el cambio a "N" pero entra en un bucle sin fin que tengo que cancelar

Que es lo que hago mal?

En el before post tengo esto

Código Delphi [-]
procedure TF_ModulDades.Camions_AuxBeforePost(DataSet: TDataSet);
begin
        If Camions_Aux.State in [dsInsert] then
        begin
                Actual_S.Close;
                Actual_S.ParamByName('ID_CAMIO').AsInteger := F_ModulDades.Camions_AuxID_CAMIO.Value;
                Actual_S.ParamByName('ID').AsInteger:=F_ModulDades.Camions_AuxID.Value;
                Actual_S.Open;
                if Actual_S.RecordCount > 0 then
                begin
                        ShowMessage('Només es pot asignar el camió a un parc');

                        //Camions_AuxACTUAL.Value := 'N';
                end;
        end;
end;

Gracias

Josep
Responder Con Cita
  #4  
Antiguo 19-08-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

No sé si será esto pero fijate el comentario sobre esta parte de tu código:

Código Delphi [-]
procedure TF_ModulDades.Camions_AuxAfterPost(DataSet: TDataSet);
var Pos:TBookmark;
begin
        Pos := Camions_Aux.GetBookmark;
        IBTBombers.CommitRetaining;
        Camions_Aux.Close;
        Camions_Aux.Open;
        Camions_Aux.GotoBookmark(Pos);
        with Camions_Aux do
        begin
                Prior;           // Un registro hacia atrás
                Edit;
                Camions_AuxACTUAL.Value:= 'N'; // Ahora estamos en el anteúltimo, no iba 'S' ?
                Post;
        end;
        Camions_Aux.FreeBookmark(Pos);
end;

Según te había entendido querías que el anteúltimo tuviera la letra 'S'.
Los bookmarks los podés evitar si despues de post hacés Next, retrocedemos un paso con Prior y volvemos a darlo con Next.

Código Delphi [-]
procedure TF_ModulDades.Camions_AuxAfterPost(DataSet: TDataSet);
begin
   with Camions_Aux do
   begin
     Close;
     Open; 
     Prior;           // Un registro hacia atrás
     Edit;
     Camions_AuxACTUAL.Value:= 'S'; 
     Post;
     Next;          // Volvemos al inicial
  end;
end;

Saludos.

Última edición por ecfisa fecha: 19-08-2010 a las 20:14:36.
Responder Con Cita
  #5  
Antiguo 19-08-2010
Avatar de jafera
jafera jafera is offline
Miembro
 
Registrado: may 2007
Ubicación: Llagostera (Girona)
Posts: 582
Poder: 18
jafera Va por buen camino
Buenas de nuevo, si puse "S" pero tiene que ser "N", "S" se quedará en el nuevo registro.

Yo no veo ninguna diferencia entre lo que he puesto yo en rojo y lo que me dices tu, igual me pierdo.

Saludos

Josep
Responder Con Cita
  #6  
Antiguo 19-08-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Probaste sacando los Bookmark ?

Saludos.
Responder Con Cita
  #7  
Antiguo 19-08-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Perdón jafera , a primera vista parecía que funcionaría, pero no es así.

Hice la prueba y se produce el ciclo infinito.

Es lógico por que el Post dentro del AfterPost dispara otro evento AfterPost y vuelve al evento y dispara otro y otro...


Es decir que vas a tener que buscar otra forma para la realizar la actualización.

¿ No podés hacer el cambio secuencialmente antes o después de guardar el nuevo registro ?



Saludos.

Última edición por ecfisa fecha: 19-08-2010 a las 20:45:55.
Responder Con Cita
  #8  
Antiguo 19-08-2010
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
Hola, una manera poco elegante seria desactivando el AfterPost y al final volverlo a activar :

Código Delphi [-]
procedure TForm1.IBDataSetDetalleAfterPost(DataSet: TDataSet);
begin
   IBDataSetDetalle.AfterPost := nil;

  with IBDataSetDetalle do
  begin
    Prior;  // ir al anterior
    Edit;   // modo edición
    FieldByName('Campo_a_ponerle_la_S').AsString:= 'S';
    Post;   // guardar
  end;

  IBDataSetDetalle.AfterPost := IBDataSetDetalleAfterPost;
end;

de todas maneras, creo que estudiandolo con detalle podrias sacar una solucion mas correcta, sin tener que usar los dos eventos del Beforepost y del AfterPost. Saludos
Responder Con Cita
  #9  
Antiguo 19-08-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola de nuevo.

Estube probando y lo solucione así:

Código Delphi [-]
procedure TF_ModulDades.Camions_AuxAfterPost(DataSet: TDataSet);
begin
   TF_ModulDades.AfterPost:= nil; // AfterPost desactivado.
   with Camions_Aux do
   begin
      Close;
      Open; 
      Prior;          
      Edit;
      Camions_AuxACTUAL.Value:= 'N'; 
      Post;
      Next;            
   end;
   TF_ModulDades.AfterPost:=Camions_AuxAfterPost; // AfterPost activado
end;

Saludos.
Responder Con Cita
  #10  
Antiguo 19-08-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Se me adelantó el amigo coso...

Pd.: Me alegra por que entonces no era tan mala la idea

Saludos.

Última edición por ecfisa fecha: 19-08-2010 a las 21:08:39.
Responder Con Cita
  #11  
Antiguo 20-08-2010
cloayza cloayza is offline
Miembro
 
Registrado: may 2003
Ubicación: San Pedro de la Paz, Chile
Posts: 915
Poder: 23
cloayza Tiene un aura espectacularcloayza Tiene un aura espectacular
Yo lo haria asi...
Código Delphi [-]
{Antes de Insertar un nuevo registro me voy al ultimo
y cambio su estado a 'N'}
procedure TForm1.Camions_AuxBeforeInsert(DataSet: TDataSet);
begin
     Camions_Aux.Last;
     Camions_Aux.Edit;
     Camions_AuxACTUAL.Value:= 'N';
     Camions_Aux.Post;
end;

{Si se cancelo la accion de insertar, restauro el valor del ultimo registro
a 'S'}
procedure TForm1.Camions_AuxAfterCancel(DataSet: TDataSet);
begin
      {Esto solo se debe hacer cuando Dataset.State=dsInsert} 
      if DataSet.State <> dsInsert then Exit;     

      Camions_Aux.last;
     Camions_Aux.Edit;
     Camions_AuxACTUAL.Value:= 'S';
     Camions_Aux.Post;
end;

{Para un nuevo registro le asigno el valor por defecto 'S'}
procedure TForm1.Camions_AuxNewRecord(DataSet: TDataSet);
begin
     Camions_AuxACTUAL.Value:= 'S';
end;

Espero te sirva...
Responder Con Cita
  #12  
Antiguo 20-08-2010
Avatar de jafera
jafera jafera is offline
Miembro
 
Registrado: may 2007
Ubicación: Llagostera (Girona)
Posts: 582
Poder: 18
jafera Va por buen camino
Gracias a todos de nuevo.

El último código de cloayza es el que mejor se me ha adaptado a mis necesidades, aunque he realizado ligeras variaciones de condicionado al borrar un registro o al modificarlo.

Saludos a todos

Josep
Responder Con Cita
  #13  
Antiguo 20-08-2010
Avatar de jafera
jafera jafera is offline
Miembro
 
Registrado: may 2007
Ubicación: Llagostera (Girona)
Posts: 582
Poder: 18
jafera Va por buen camino
Una duda de nuevo al mismo problema.
Cuando intento insertar un nuevo registro me lanza un error de stack overflow supongo por el código siguiente

Código Delphi [-]
 
procedure TF_ModulDades.Camions_AuxBeforeInsert(DataSet: TDataSet);
begin
        Camions_Aux.Last;
        Camions_Aux.Edit;
        Camions_AuxACTUAL.Value:= 'N';
        Camions_Aux.Post;
end;

Codigo el cual no se puede ejecutar ya que el registro que estoy insertando es el primero y no hay last.

Como puedo controlarlo?

Gracias

Josep
Responder Con Cita
  #14  
Antiguo 20-08-2010
Avatar de jafera
jafera jafera is offline
Miembro
 
Registrado: may 2007
Ubicación: Llagostera (Girona)
Posts: 582
Poder: 18
jafera Va por buen camino
Ya está, hoy vuelvo a tener el dia oscuro

Código Delphi [-]
If RecordCount > 0 then

Saludos

Josep
Responder Con Cita
  #15  
Antiguo 23-08-2010
cloayza cloayza is offline
Miembro
 
Registrado: may 2003
Ubicación: San Pedro de la Paz, Chile
Posts: 915
Poder: 23
cloayza Tiene un aura espectacularcloayza Tiene un aura espectacular
Que bueno saber que lograste solucionar tu problema, efectivamente el error que indicas se produce, con la correccion que indicas salvas el problema...

Un abrazo.
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Cambio de campo en una consulta jafera SQL 4 02-08-2010 16:50:56
Asignar el valor de un campo aggregate a un campo de la base TrUnkS Conexión con bases de datos 1 23-02-2010 05:17:42
¿Que valor tiene el Grid? Nelly Varios 3 14-04-2007 04:04:08
Cambio de tipo en campo berfer Firebird e Interbase 0 23-08-2006 18:45:34
UPDATE de un campo dependiendo del valor de un campo de otra tabla Javi2 SQL 5 18-04-2005 16:35:05


La franja horaria es GMT +2. Ahora son las 05:59:28.


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
Copyright 1996-2007 Club Delphi