Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 06-12-2007
Puberta Puberta is offline
Miembro
 
Registrado: oct 2007
Ubicación: Estado de México
Posts: 47
Poder: 0
Puberta Va por buen camino
Question DBGrid

Tengo problemas con un DBGrid.

Lo que intento hacer es que mediante un DBGrid, el cual esta relacionado a un Query inserto nuevos registros en una tabla, hasta aquí todo esta bien, pero cuando intenté realizar pruebas me di cuenta que el dbgrid permite agregar cuantos registros deseé.....

Tengo de dos opciones:

1. Permitir que el usuario solo agregue un registro, pero entonces ¿cómo bloqueo el DBgrid para que solo inserte un registro?.

2. Permitir que el usuario ingrese cuantos registros deseé, pero entonces como es que detectaría que se a presionado la tecla de dirección (Down), porque al hacer esto le tengo que mandar 2 valores que el usuario desconoce y no pueden ser nulos.

Espero me halla dado a entender y que alguien me pueda ayudar.
Responder Con Cita
  #2  
Antiguo 06-12-2007
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
Tal como lo veo, estas enfocando mal la escopeta.

El asunto no tiene que ver con el dbGrid, sino con el DataSet asociado. Te darás cuenta si ves los eventos del query (y su ayuda): OnNewRecord, BeforeInsert, AfterInsert.

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #3  
Antiguo 06-12-2007
Puberta Puberta is offline
Miembro
 
Registrado: oct 2007
Ubicación: Estado de México
Posts: 47
Poder: 0
Puberta Va por buen camino
Perdon Jachguate, pero no me sale.

Lo que pasa es que si lo hago en OnNewRecord me pone el mismo valor en cada nuevo registro y no debe ser así, cada registro debe tener sus propios valores.

Intenté en el evento OnKeyPress, es decir que me detectará si presionaba la tecla de dirección(down) me apareciera una ventana con un mensaje X, pero no me queda...la pregunta del millon es ¿Delphi detectá el código ascci de las teclas de dirección?, porque de ser afirmativa la respuesta indica que no escribi el código correcto.
Responder Con Cita
  #4  
Antiguo 06-12-2007
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
Cita:
Empezado por Puberta Ver Mensaje
Perdon Jachguate, pero no me sale.

Lo que pasa es que si lo hago en OnNewRecord me pone el mismo valor en cada nuevo registro y no debe ser así, cada registro debe tener sus propios valores.
Eso es fácil, por ejemplo:

Código Delphi [-]
procedure TForm1.Query1NewRecord(parametros);
begin
  Query1CAMPO1.AsInteger := random(100);
end;

Lo que quiero decir con esto, es que te pone el mismo valor en cada registro porque vos estas programandolo de ese modo... si queres un valor diferente en cada registro, pues es tu tarea que así suceda... al final de cuentas, vos sos el programador... ¿no?

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #5  
Antiguo 06-12-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Hay 2 temas distintos.

Para controlar los valores "por defecto", ya lo ha dicho el compañero jachguate.

Para controlar el número de inserciones:

Podrías utilizar una variable global de la ventana usada a modo de contador.
En el evento AfterPost, incrementas esa variable.
En el evento OnNewRecord, miras el valor de esa variable, y si es mayor a uno, cancelas la edición:
Código Delphi [-]
procedure TForm1.DAtasetNewRecord(...);
begin 
   If (Inserciones > 0)  // tu contador numérico
      and not (PermitirMasDeUna)  // en algún sitio debes controlar la
 // permisividad de insertar más de uno o no, aquí lo tienes en cuenta
   then
   begin
      ShowMessage('No se permite más de una inserción');
      Dataset.Cancel; // abortamos la creación de este registro
      sysutils.Abort; // salimos de este procedimiento.
  end;
  // si se permite más de una inserción, o es la primera:
  // - dar valores a los campos que sean a continuación


end;

Espero haya entendido tu pregunta. Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #6  
Antiguo 08-12-2007
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
Cita:
Empezado por Lepe Ver Mensaje
En el evento OnNewRecord, miras el valor de esa variable, y si es mayor a uno, cancelas la edición:
En realidad esa verificación, yo la haría en el evento BeforeInsert.

Otra cosa... si el comportamiento por defecto cuando ocurre una excepción es mostrar un mensaje... ¿por qué no simplemente elevar una excepción?

Código Delphi [-]
if (FInserciones > 0) then
  raise Exception.Create('Error: solamente se le permite insertar un registro!');

Comento también que en el evento AfterPost ya no hay forma de saber si se estaba insertando o editando un registro... a menos que se conserve ese valor en una variable. Lo comento porque el mencionado evento se dispara tanto si se insertaba como si se modificaba un registro.

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #7  
Antiguo 09-12-2007
Puberta Puberta is offline
Miembro
 
Registrado: oct 2007
Ubicación: Estado de México
Posts: 47
Poder: 0
Puberta Va por buen camino
Tengo el evento onNewRecord, en este hago una consulta a la tabla y traigo el ultimo valor de este, por lo que pongo como clave principal el resultado del query mas 1

Cita:
QModelosId_Modelo.value := Query.Field[0].value + 1;
QModelosId_Marca.value := DBMarca.Text;
pero el problema es que al poner el dataset en modo de inserción si me manda los valores
pero sólo al primer registro y si el usuario presionaba el tabulador o la tecla de dirección (down) me agregaba más lineas obvimente con los campos vacios, por lo que opte por bloquear el DBGrid....intenté en el evento onKeyDown y si funciona pero me bloquea el dataset y solo me deja agregar un registro.

Cita:
IF (key in [VK_DOWN, VK_TAB, VK_UP]) then key := 0;
No tengo idea porque cada vez que agrego algo al dataset afecta todo mi código que anteriormente estaba bien, es decir hacia lo que requería que hiciera.
Responder Con Cita
  #8  
Antiguo 09-12-2007
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
No entiendo.
Si lo que se quiere es que el usuario coloque unos datos, por ejemplo en un edit y este, esta vacío, por que no estipular un simple mensaje diciendo que este tiene que contener datos?, lo mismo se puede hacer con cualquier otro componente, para que complicarse con la base de datos, datasets u otros?.
No se.
Saludos
Responder Con Cita
  #9  
Antiguo 10-12-2007
Puberta Puberta is offline
Miembro
 
Registrado: oct 2007
Ubicación: Estado de México
Posts: 47
Poder: 0
Puberta Va por buen camino
ok. mire tengo un formulario que muestra todas las marcas de los automoviles que hay en la empresa, este formulario también contiene un DBgrid con todos los modelos de esa marca, es decir... marca Chevrolet y el DBgrid contiene los modelos Corvette, Malibu, Astra, Chevy, etc.

Mi intención es que el usuario escriba directamente sobre el DBGrid, si presiona el boton 'Nuevo' entonces ingresa una linea con el ID del modelo y el ID de la marca, el usuario sólo tiene que escribir el modelo pero, si el usuario presionaba el Tabulador o la Tecla de Dirección se agregaba una lina más pero ya con todos los campos vacios.

El problema es que me permite agregar un registro solo una vez porque después me muestra el error 'El dataset no esta en modo Edit o Insert'.
Responder Con Cita
  #10  
Antiguo 10-12-2007
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
Bueno no se la razón, pero me parece mas cómodo usar un edit para pasar o actualizar los datos.
De todos modos, viendo tu explicación, me parece mas correcta la explicación de jachguate , por el uso del dataset o del componente de enlace, puede ser el table o el query, da igual.
Algo asi:
Código Delphi [-]
If (Table.State = dsEdit) or (Table.State = dsInsert) then
     begin
Por otro lado, si te da error después de actualizar, osea que solo te permite una actualización, es por que o cierras la tabla o la sentencia esta duplicada o no la vuelves a colocar en edición.
Revisa el código, si es posible mejor lo pones por aqui, para verlo.
Saludos
Responder Con Cita
  #11  
Antiguo 11-12-2007
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
Hola

La comprobación podes abreviarla así:

Código Delphi [-]
  if Table1.State in dsEditModes then
  begin
    ..

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #12  
Antiguo 11-12-2007
Puberta Puberta is offline
Miembro
 
Registrado: oct 2007
Ubicación: Estado de México
Posts: 47
Poder: 0
Puberta Va por buen camino
No lo hago con un edit porque simplemente me pidieron que todo se manejara desde un DBgrid, estoy de acuerdo que todo sería más sencillo, pero no me queda otro remedio.

Es muy tonto, lo que hacia es que cuando editaba o agregaba un registro cambiaba los estados de las columnas (ID_MODELO e ID_MARCA) del DBGrid en modo de solo lectura:

Cita:
FPMarcas.DBGrid.Fields[0].ReadOnly := True;
FPMarcas.DBGrid.Fields[2].ReadOnly := True;
y cuando guardaba los cambios agregaba la siguiente linea, no sé en que afecte
Cita:
FPMarcas.DBGrid.ReadOnly.True;
Sinceramente no encontré como corregir todo esto, así que simplemente agregue al evento OnKeyDown

Cita:
IF (key in [VK_DOWN, VK_TAB, VK_UP, VK_LEFT, VK_RIGHT]) Then key := 0;
para que el usuario no tenga la posibilidad de moverse entre columnas asi como evitar las dos primeras lineas que eran las que que generaban el error.

Alguién me puede decir que hacia mal?
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Pasar lineas de in dbgrid a otro dbgrid look OOP 3 21-09-2007 23:16:29
PickList DBGrid (Pregunta acerca de los DBGRID) lazarous Varios 1 10-01-2006 09:53:12
Como extraer datos de un DBgrid a otro DBgrid mickey Conexión con bases de datos 13 29-01-2004 05:05:30


La franja horaria es GMT +2. Ahora son las 17:16:45.


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