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)
-   -   Desplazarse en un DBGrid (https://www.clubdelphi.com/foros/showthread.php?t=2386)

Newbie 21-07-2003 23:23:47

Desplazarse en un DBGrid
 
Qué tal !!!

Realmente no sabía dónde poner esta pregunta. Espero estar en el lugar indicado.

Resulta que tengo un DBGrid direccionado a una tabla de interbase. Lo que quiero hacer es permitir que el usuario se desplaze por el grid usando las teclas de dirección. Para eso no se tiene que programar nada, pero el problema viene porque al llegar al último registro y oprimir la tecla "Flecha abajo" se abre un nuevo registro, lo cual no debe ser permitido en la aplicación que estoy desarrollando.

Intenté poner una condición en la que preguntaba si el número de registro era igual al RecordCount de la tabla, en cuyo caso daba un "abort" y no se introducía un nuevo registro. Lo único malo de este procedimiento es que al ser tabla de interbase, el recordcounto no te dice realmente cuantos registros tiene la tabla, sino solamente los que están en el caché o búfer, lo que provoca que al llegar a cierta parte de la tabla, ya no puedo seguirme desplazando hacia abajo.

He pensado algunas maneras de hacerlo, pero si alguien sabe de una manera más simple, le agradeceré que la comparta conmigo.

Muchas gracias :)

marcoszorrilla 21-07-2003 23:30:53

En el evento BeforeInsert del Ttable o Tquery pones:

SysUtils.Abort;


Un Saludo.

Newbie 22-07-2003 02:25:30

Muchas gracias Marcos, funcionó de maravilla. Un favorsote más; Me podrías explicar qué es lo que hace exactamente esa orden, es decir a qué se refiere el "Sysutils" o si lo prefieres, dime en dónde puedo leer algo sobre eso.

De nuevo Gracias. :)

Ruben_Cu 22-07-2003 03:40:21

Hola Newbie y Marcos, un comentario, el ttable o el tquery al que le aplique el procedimiento abort en su evento BeforeInsert tal y como está declarado en el ejemplo no podrá ser usado para postear registros desde ningún otro control a través del ttable o tquery, si solo es para visualizar vale la propuesta de Marcos.
El SysUtils.pas es una unit de los fuentes de delphi que contiene un grupo de procedimientos y funciones utilitarias para el desarrollo de aplicaciones, entre ellas el procedimiento Abort que es el mismo que invocastes en tu ejemplo con el recordcount. En este caso podrias prescindir de declarar SysUtils.Abort; bastaría solo con Abort; para levantar la excepción silienciosa abortando la acción de insertar. Tambien pudieras, simplemente declarar la propiedad ReadOnly del DBGrid a true y de esta forma pudieras usar las TDataSet para introducir nuevos valores desde otros controles de la aplicación.
Espero haber ayudado
Saludos

Newbie 22-07-2003 03:54:12

Es verdad lo que dice Rubén. Al poner el Sysutils.Abort, no me deja insertar registros en mi tabla. Ahora lo que estoy tratando de encontrar es la manera de que el DBGrid cargue con la responsabilidad de saber si se encuentra en el último registro de la tabla o el query, de tal forma que, al ser el actual el último y oprimir la tecla "Flecha abajo", no mande el append a la tabla. Es que además de poder modificar los valores, tengo que permitir insertar nuevos registros, para lo cual utilizaré otros controles y no el DBGrid.

Lo que voy a hacer es lo siguiente:

Al abrir la tabla de interbase me iré al último registro y me regresaré al primero, con lo que me aseguraré que la tabla estará en memoria completamente.

Obtendré el recordcount de la tabla.

Cuando se presione la tecla "Flecha abajo" verificaré que el recNo sea menor al recordcount, y si no es así, cancelaré el append de la tabla.

Por último, cada vez que inserte un nuevo registro, iré actualizando la variable en la que guardo el recordcount.

Ya les avisaré la forma en la que lo hice, pero diganme. ¿Hay alguna otra forma de saber si el registro en el que te encuentras actualmente es el último? Está el EOF, pero creo que eso es después del último y al desplazarte por el grid hasta esa posición, te crea el append.

Hasta pronto :)

Newbie 22-07-2003 05:19:00

Por fin supe como hacerlo!!! :d

Me apoyé de una bandera, pero funciona como yo quería.

En el evento OnKeyDown del DBGrid pregunté si la tecla era "VK_down", en cuyo caso ponía la bandera a true y en el evento beforeinsert del TIBTable puse este código:

if band1 then
begin
band1:=false;
abort;
end;

¡Y listo! Cuando quiero desplazrme más abajo del último registro no me deja pero si me permite insertar.

¿Alguna idea para hacerlo más simple? Se agradecen sugerencias.

Hasta la vista :cool:

Ruben_Cu 22-07-2003 05:32:35

Hola Newbie, si en realidad vas a utilizar otros controles para agregar nuevos registros puedes hacerlo de esta manera:
Código:

procedure TForm1.TIBTableBeforeInsert(DataSet: TDataSet);
begin
        if dbgrid1.Focused then abort;
end;

Aquí no puedes insertar si el dbgrid tiene foco, o sea, si estas sobre él, al desplazarte a otros controles ya puedes insertar.
Saludos

marcoszorrilla 22-07-2003 08:09:16

Yo también utilizo banderas, pero no para estos casos, lo que te ha dicho Rubén es lo más conveniente.

La bandera yo la utilizo, cuando se borra en un detalle, me pregunta si deseo eliminar el registro o no, pero cuando elimino el maestro, como no quiero que me pregunte línea por línea si quiero eliminarlas o no, utilizo una bandera, que desactivo para que permite el borrado de todo el detalle.

Un Saludo Rubén y NewBie.

Cabanyaler 22-07-2003 10:41:36

Yo lo que utilizo para no poder insertar tuplas en datasets asociados a grids es el siguiente código:

Hay q adecuarlo a tu código y nombres de tablas, grids, etc...

/* En el evento KeyDown del Grid */
if (Key = VK_DOWN) or
((Key = VK_TAB) and
(RxDBGrid.SelectedIndex = RxDBGrid.Columns.Count - 1)) then
begin
DM.ADODataSet.DisableControls;
DM.ADODataSet.Next;
if DM.ADODataSet.EOF then
Key := 0
else
DM.ADODataSet.Prior;
DM.ADODataSet.EnableControls;
end;

Sort;


La franja horaria es GMT +2. Ahora son las 00:42:04.

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