Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Desabilitar auto post al cambiar de renglon en grid (https://www.clubdelphi.com/foros/showthread.php?t=78764)

chartres 15-05-2012 21:36:56

Desabilitar auto post al cambiar de renglon en grid
 
Hola
Uso delphi 7, con dvexpress
tengo un cxgrid direccionado a un datasourse con un query

el caso esque tengo una columna tipo Checkbox donde selecciono renglones para editarlos, pero al cambiarme de renglon graba automaticamente los cambios del renglon modificado,

yo necesito poder grabar todos de jalon o cancelarlos, osea que no grabe nada hasta que yo le indique.

espero explicarme y alguien sepa como desactivar esa funcion.

gracias

ecfisa 15-05-2012 21:58:41

Hola chartres.

Podes usar el evento BeforePost del TDataSet:
Código Delphi [-]
procedure TForm1.DataSetBeforePost(DataSet: TDataSet);
var
  i: Integer;
begin
  for i:= 0 to DBGRid1.FieldCount-1 do
    if DBGrid1.Fields[i].IsNull then
      Abort;
end;

Saludos.

chartres 15-05-2012 22:25:31

Gracias, pero en este caso el valor lo asigno con el Checkbox
Checked asigno 1
uncheked asigno 0

no importa si esta null, lo que quiero esque no grabe asta hacerlo yo con un boton,
es un grid como un listado donde escojen que quieren y que no y al final dan grabar,
pero el grid al cambiar de renglon graba automaticamente el anterior.

y no qiero q grabe hasta yo desirselo con un boton

ecfisa 15-05-2012 22:35:26

Cita:

y no qiero q grabe hasta yo desirselo con un boton
Ahora está mas claro. Entonces podes hacer algo como:
Código Delphi [-]
...
var
  PostEnabled: Boolean = False;

procedure TForm1.btnGuardarClick(Sender: TObject);
begin
  PostEnabled:= True;
  DBGrid1.SetFocus
end;

procedure TForm1.DataSetBeforePost(DataSet: TDataSet);
begin
  if not PostEnabled then
    Abort;
  PostEnabled:= False
end;

Saludos.

MartinS 16-05-2012 04:29:53

Hola: Creo que es algo similar a lo que una vez me pasó y necesitaba.
Mirá este hilo.

Saludos.-

Neeruu 16-05-2012 15:22:56

Hola....


Por lo General yo en ese caso trabajo con cached...

O sea pongo el query en Cached... dejo el usuario haga los cambios que tiene que hacer y luego, cuando guarda realizo un ApplyUpdates. En caso de cancelar hago un CancelUpdates...

Ten en cuenta que un query en cached trabaja con los datos de forma local y una vez que aplicas los cambios recién se envían al servidor...


En caso que tengas varios querys en cached y tengas que aplicar los cambios... puedes hacerlo de la siguiente manera...

Código Delphi [-]
Try
  Transaccion.StarTransaction;

  if Qry1.UpdatesPending then //Esto devuelve si tiene cambios en cached pendientes de aplicar
     Qry1.ApplyUpdates;

  if Qry2.UpdatesPending then 
     Qry2.ApplyUpdates;

  if Qry3.UpdatesPending then 
     Qry4.ApplyUpdates;
  
  Transaccion.Commit;

  
Except
  Transaccion.RollBack;
end;

En tu caso:
Si presiona el boton grabar haces todos los applyupdates, si presiona el boton cancelar haces los cancelupdates;

Código Delphi [-]
  Qry1.CancelUpdates;
  Qry2.CancelUpdates;
  Qry3.CancelUpdates;

chartres 16-05-2012 20:45:48

Cita:

Empezado por Neeruu (Mensaje 432696)
Hola....


Por lo General yo en ese caso trabajo con cached...


Hola, revise esa opcion pero falto desir que yo uso AdoQuery y almenos no veo esa propiedad de cachedupdates, cosa que si tiene el Tquery normal.

Tambien trate con lo que desia arriba ecfisa de Abort ants del post, pero no me permitia cambiar al siguiente registro.

Como lo estoy intentando es manejando un dxMemData, un grid temporal donde cargo los registros de el query y despues que se modifican en el grid, reocorro registro por registro con un proceso y segun los cambios que haya los aplico al query,
funciona muy bien pero tiene inconvenientes, por ejemplo no esta sincronizado con el query, osea si sortean o filtran el grid, el query no se filtra y pues para pasar los cambios al query requiero aser varias validaciones por registro, que al final de cuentas oslo es trababjo mas.

gracias a todos por los comentarios..

roman 16-05-2012 20:56:47

Prueba poniendo la propiedad LockType del ADOQuery en ltBatchOptimistic. De cuerdo a la ayuda, debesusar entonces el método Updatebatch para grabar los cambios.

// Saludos

chartres 16-05-2012 22:41:33

Gracias roman, era lo que buscaba y algo me desia que no tenia porque ser tan dificil.

almenos asta ahorita funciono. no se si tenga sus puntos criticos.


La franja horaria es GMT +2. Ahora son las 09:29:00.

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