Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Problema al Insertar un Registro en una Tabla (https://www.clubdelphi.com/foros/showthread.php?t=90819)

Efren2006 11-09-2016 00:06:21

Problema al Insertar un Registro en una Tabla
 
Saludos

Estoy usando D2009 con Firebird 2.1,, hice un formulario para insertar registro en una tabla,,, En este formulario uso un DbGrid, componentes TIBDataset y unos botones para que el usuario seleccione que quiere hacer (Insertar, Editar, Eliminar,etc),, todo funciona bien , el problema es que por alguna razón que desconozco cuando el usuario trata de insertar un Registro y Cancela la operación el puntero de la tabla se va al ultimo registro mostrado del DbGrid... en vez de quedarse en el registro antes de realizar la operación ...

Alguien sabe porque sucede esto ?,, es una propiedad del TIBDataset ?? ,, del DbGrid ??

Gracias de Antemano

Casimiro Notevi 11-09-2016 02:04:47

Hay que ver tu código.

olbeup 12-09-2016 09:07:10

Puesto lo tienes bien facil, guarda donde esta el puntero actualmente y al cancelarlo que regrese donde estaba pasando el puntero guardado.


Un saludo.

Neftali [Germán.Estévez] 12-09-2016 10:10:53

¿Haces algo al cancelar con ese mismo Dataset?
¿Se está disparando algún evento cuando cancelas?

Coincide con Casimiro. Difícil saber qué puedes estar pasando sin ver el código.

Efren2006 15-09-2016 01:07:39

Gracias a Todos por los aportes...

Solo me pasa cuando trato de INCLUIR un registro y si el usuario cancela ejecuto el evento
Código Delphi [-]
CANCEL
.. se mueve,,

Estoy usando para incluir y editar los mismo eventos, la única diferencia es que por supuesto cuando le doy incluir uso en el Evento
Código Delphi [-]
onnewrecord
para inicializar algunos campos incluso los claves.

AgustinOrtu 15-09-2016 02:01:50

Cita:

ejecuto evento
No me quedo nada claro lo que haces. No deberia ser tu codigo el que invoca directamente a los eventos de los componentes/controles; los eventos estan para que el framework los invoque. Esto se conoce como Hollywood principle/Inversion de Control. Se reduce a basicamente "no me llames, yo te llamo", de ahi lo de "hollywood"

Copia y pega codigo real

ecfisa 15-09-2016 06:14:40

Hola Efren2006.
Cita:

Empezado por Efren2006 (Mensaje 508804)
...
Solo me pasa cuando trato de INCLUIR un registro y si el usuario cancela ejecuto el evento
Código Delphi [-]
CANCEL
.. se mueve
...

Es un comportamiento del TIBDataSet...

Una solución para tu caso es:
Código Delphi [-]
...
type
  TForm = class(TForm)
    IBDataSet1: TIBDataSet;
    ...
    procedure IBDataSet1AfterCancel(DataSet: TDataSet);
    procedure IBDataSet1BeforeInsert(DataSet: TDataSet);
    ...
   private
     FBookMark: Pointer; 
   ...

implementation

...
// TIBDataSet - BeforeInsert
procedure TForm.IBDataSet1BeforeInsert(DataSet: TDataSet);
begin
  FBookMark := DataSet.GetBookmark;
end;

// TIBDataSet - AfterCancel
procedure TForm.IBDataSet1AfterCancel(DataSet: TDataSet);
begin
  DataSet.GotoBookmark(FBookMark);
  DataSet.FreeBookmark(FBookMark)
end;
...

Saludos :)

Efren2006 16-09-2016 02:57:12

ecfisa

Es un comportamiento propio del Componente TIBDataSet ? .. por lo que me comentas no existe una propiedad o algo del componente que lo solucione ,, debo controlarlo manualmente como me comentas ?

Casimiro Notevi 16-09-2016 10:04:29

Si haces un insert/append es lógico que haga eso, aunque yo trabajo de otra forma.
Tú haces el dataset.insert, el usuario teclea y luego commig o cancel. Mi forma de trabajar es distinta:
El usuario pulsa en el botón de "nuevo", muestro un formulario, lo rellena, y luego si pulsa en 'aceptar', hago el insert en la tabla. Y si pulsa en 'cancelar' cierro el formulario. Como ves de esta forma no afecta en nada al dataset, y por lo tanto tampoco al datasource ni al dbgrid.

AgustinOrtu 16-09-2016 17:40:15

Cita:

Empezado por Casimiro Notevi (Mensaje 508843)
Si haces un insert/append es lógico que haga eso, aunque yo trabajo de otra forma.
Tú haces el dataset.insert, el usuario teclea y luego commig o cancel. Mi forma de trabajar es distinta:
El usuario pulsa en el botón de "nuevo", muestro un formulario, lo rellena, y luego si pulsa en 'aceptar', hago el insert en la tabla. Y si pulsa en 'cancelar' cierro el formulario. Como ves de esta forma no afecta en nada al dataset, y por lo tanto tampoco al datasource ni al dbgrid.

+1, yo utilizo el mismo concepto y me parece la forma mas correcta de trabajar

ecfisa 16-09-2016 18:17:21

Hola Efren2006.
Cita:

Empezado por Efren2006 (Mensaje 508840)
ecfisa

Es un comportamiento propio del Componente TIBDataSet ? .. por lo que me comentas no existe una propiedad o algo del componente que lo solucione ,, debo controlarlo manualmente como me comentas ?

Los componentes dbExpress, ADO y BDE no tienen ese comportamiento, pero no me animaría a afirmar que sea exclusivo del IBDataSet.

No conozco otro método que el que te expuse para evitar el desplazamiento visual del cursor en el DBGrid.

De todos modos, no estoy sugeriendote que sea una buena forma de trabajo, sólo te indiqué una solución al problema puntual que nos presentaste.

Saludos :)

Efren2006 16-09-2016 23:53:51

Entiendo ..

Gracias a todos por sus comentarios y acotaciones ... tomare los cambios y sugerencias necesarias para resolver el problema

Saludos


La franja horaria es GMT +2. Ahora son las 11:13:03.

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