Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   salto de registros al cancelar insert (https://www.clubdelphi.com/foros/showthread.php?t=45213)

fcobanda 26-06-2007 17:46:06

salto de registros al cancelar insert
 
Hola, tengo un problema el cual ya me tiene echo bolas, ya que toda la vida e usado el evento onnewrecord y ahora ecuentro algo que me saca de onda.
Voy a tratar de explicar lo que esta pasando.

- estoy trabajando con delphi 5 e interbase 6.0
- tengo una aplicacion mdi con una forma en la cual esta un jvpagacontrol con varios tabs.
- en un tab tengo un wwdbgrid(ya usado antes y funcionionando en otras aplicaciones)
- el dbgrid esta conectado a un ibdataset con un 'select * from ordenes order by no_orden descending' el ibdataset tiene todos los campos como persistentes. esta tabla es la principal ya que de ella dependen todas las tablas que se muestran en los demas tabs, por lo que se muestra para consulta y busqueda
- el ibdataset 'ordenes' tiene un onnewrecord el cual se asignan valores por default a vaiors campos para que el usuario los pueda ver y hacer o no cambios sobre ellos.
-EL PROBLEMA.
- estar en el grid y con la barra de navegacion presionar la tecla de insert' funciona como debe ser, ya que me coloca un registro en blanco y listo para capturar informacion.
- inmediatamente sin hacer nada de captura presiona la tecla 'cancel' cancela la insercion anterior pero al regresar al grid mueve aproximadamente un pagina el registro original. esto trae como consecuencia confusion al usuario y errores de captura por no poner atencion de que no es el mismo registro sobrel el que estaba posicionado antes.
despues de varios 3 dias de debug, que me mandaba a otros lados que no correspondian a lo que estaba haciendo llegue al evento 'onnewrecord' y al desactivarlo funciona bien, alguien tiene idea que esta pasando?

de antemano gracias a los que se toman la molestia de leerme y doblemente si tienene alguna sugerencia de lo que me esta pasando.

vtdeleon 27-06-2007 02:15:37

Que haces en ese evento?
Podrias usar otro evento? AfterInsert o algo parecido?

Saludos

fcobanda 27-06-2007 16:21:40

inicializo campos
 
no puedo hacerlo en afterinsert, ya que los campos que se inicializan se deben mostrar al usuario para no capturarlos y o modificarlos. y el evento afterinsert se dispara antes de que se ponga el status de 'dsinsert', por lo tanto no se pueden inicializar campos.

vtdeleon 27-06-2007 17:14:38

Creo que podrias usar el evento OnstateChange y verificar el estado en que está el Dataset (dsinsert, dsEdit,...)

fcobanda 03-07-2007 20:24:58

sigo la huella despues del cancel
 
le segui la huella con mensajes y debug para ver que hace despues del cancel y solo cambia de status y regresa a un registro mas atras del actual, aproximadamte una pagina completa del grid que usa.

ginobili20 16-05-2017 15:45:36

Tengo un problema parecido... lo pudiste solucionar??

ecfisa 16-05-2017 19:49:36

Hola.
Cita:

Empezado por ginobili20 (Mensaje 516704)
Tengo un problema parecido... lo pudiste solucionar??

La última vez que fcobanda pasó por aquí fue por marzo del 2012, así que te propongo una posible solución capturando el evento OnClick de los botones del TDBNavigator.

Ejemplo:
Código Delphi [-]
...
type
  TDBNavigator = class( DBCtrls.TDBNavigator );

  TForm1 = class( TForm )
    tuDataSet: TIBDataSet;
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    DBNavigator1: TDBNavigator;
    ...
    procedure FormCreate(Sender: TObject);
    procedure tuDataSetNewRecord(DataSet: TDataSet);
    
  private
    FBookmark: TBookmark;
    procedure DBNavigatornbInsertClick( Sender: TObject );
    procedure DBNavigatornbCancelClick( Sender: TObject );
  public
  end;

...

implementation  

procedure TForm1.FormCreate( Sender: TObject );
begin
  DBNavigator1.Buttons[nbInsert].OnClick := DBNavigatornbInsertClick;
  DBNavigator1.Buttons[nbCancel].OnClick := DBNavigatornbCancelClick;
  FBookmark := nil;
end;

procedure TForm1.DBNavigatornbInsertClick( Sender: TObject );
var
  nv: TDBNavigator;
begin
  nv := TDBNavigator(TControl(Sender).Parent);

  if Assigned( FBookmark ) then
  begin
    nv.DataSource.DataSet.FreeBookmark( FBookmark );
    FBookmark := nil;
  end;
  FBookmark := nv.DataSource.DataSet.GetBookmark;
  if Assigned( nv.DataSource ) and ( nv.DataSource.State <> dsInactive ) then
  begin 
    if Assigned( nv.BeforeAction ) then nv.BeforeAction(nv, nbInsert);
    nv.DataSource.DataSet.Insert;
    if Assigned( nv.OnClick ) then nv.OnClick( nv, nbInsert);
  end;

end;

procedure TForm1.DBNavigatornbCancelClick( Sender: TObject );
var
  nv: TDBNavigator;
begin
  nv := TDBNavigator( TControl( Sender ).Parent );
  if Assigned( FBookmark ) then
    nv.DataSource.DataSet.GotoBookmark( FBookmark );
end;

procedure TForm1.tuDataSetNewRecord( DataSet: TDataSet );
begin
  //...
end;
Es importante decirte que esta opción funcionará en el caso de un TIBDataSet, que es el caso que inicia este hilo, pero no lo hará con DataSets unidireccionales ( v.gr.: TSQLDataSet ) ya que estos últimos no soportan el uso de Bookmarks.

Saludos :)

ginobili20 16-05-2017 20:57:22

Hola gracias, lo resolvi mas rudimentariamente:

Código Delphi [-]
procedure TForm1.DBGridRenglonesMouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var Coordenadas: TGridCoord;
begin
  Coordenadas := DBGridRenglones.MouseCoord(X,Y);
  DBGridRenglones.SetActiveRow(Coordenadas.Y-1);
  with TStringGrid(DBGridRenglones) do
  begin
    Row := Coordenadas.Y;
    Col := Coordenadas.X;
    SetFocus;
  end;
end;
Por si a alguno le sirve...


La franja horaria es GMT +2. Ahora son las 14:58:36.

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