Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 21-07-2003
Newbie Newbie is offline
Miembro
 
Registrado: jul 2003
Ubicación: Veracruz, México
Posts: 30
Poder: 0
Newbie Va por buen camino
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
Responder Con Cita
  #2  
Antiguo 21-07-2003
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
En el evento BeforeInsert del Ttable o Tquery pones:

SysUtils.Abort;


Un Saludo.
Responder Con Cita
  #3  
Antiguo 22-07-2003
Newbie Newbie is offline
Miembro
 
Registrado: jul 2003
Ubicación: Veracruz, México
Posts: 30
Poder: 0
Newbie Va por buen camino
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.
Responder Con Cita
  #4  
Antiguo 22-07-2003
Ruben_Cu Ruben_Cu is offline
No confirmado
 
Registrado: oct 2003
Ubicación: Mariel, Cuba
Posts: 271
Poder: 0
Ruben_Cu Va por buen camino
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
Responder Con Cita
  #5  
Antiguo 22-07-2003
Newbie Newbie is offline
Miembro
 
Registrado: jul 2003
Ubicación: Veracruz, México
Posts: 30
Poder: 0
Newbie Va por buen camino
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
Responder Con Cita
  #6  
Antiguo 22-07-2003
Newbie Newbie is offline
Miembro
 
Registrado: jul 2003
Ubicación: Veracruz, México
Posts: 30
Poder: 0
Newbie Va por buen camino
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
Responder Con Cita
  #7  
Antiguo 22-07-2003
Ruben_Cu Ruben_Cu is offline
No confirmado
 
Registrado: oct 2003
Ubicación: Mariel, Cuba
Posts: 271
Poder: 0
Ruben_Cu Va por buen camino
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
Responder Con Cita
  #8  
Antiguo 22-07-2003
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
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.
Responder Con Cita
  #9  
Antiguo 22-07-2003
Avatar de Cabanyaler
Cabanyaler Cabanyaler is offline
Miembro
 
Registrado: jun 2003
Ubicación: País Valencià
Posts: 339
Poder: 21
Cabanyaler Va por buen camino
Smile

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;
__________________
El meu país és tan petit, que des de dalt d'un campanar es pot veure el campanar veí.
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


La franja horaria es GMT +2. Ahora son las 19:23:55.


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