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 25-04-2008
Nereida Nereida is offline
Miembro
 
Registrado: abr 2008
Posts: 34
Poder: 0
Nereida Va por buen camino
Problemas con un dbgrid

Tengo un dbgrid asociado a un ibtable, que tiene la propiedad rowselect a TRUE.
Lo que me gustaria hacer es que se seleccione la fila que yo le indique. Me explico: quiero que si doy un alta o hago una modificación (q hago desde un formulario a parte), el registro que haya añadido/modificado, se seleccione en el dbgrid.
Creo que no estaba en otro hilo, pero no lo sé seguro, por lo que si está pido disculpas.

Gracias y saludos
Responder Con Cita
  #2  
Antiguo 25-04-2008
Avatar de jcarteagaf
[jcarteagaf] jcarteagaf is offline
Miembro Premium
 
Registrado: abr 2006
Ubicación: La Paz, Bolivia
Posts: 651
Poder: 19
jcarteagaf Va por buen camino
Ese es el comportamiento normal de un dbgrid, adicionalmente puedes colocar la propiedad Always show select tambien a true. En tu pantalla de adicion/edición no estas recorriendo el dataset? por ejemplo para totalizar algo...

Saludos.
Responder Con Cita
  #3  
Antiguo 25-04-2008
Nereida Nereida is offline
Miembro
 
Registrado: abr 2008
Posts: 34
Poder: 0
Nereida Va por buen camino
Cita:
Empezado por jcarteagaf Ver Mensaje
Ese es el comportamiento normal de un dbgrid, adicionalmente puedes colocar la propiedad Always show select tambien a true. En tu pantalla de adicion/edición no estas recorriendo el dataset? por ejemplo para totalizar algo...

Saludos.
He probado con eso, pero me selecciona solo el último registro.
Gracias.

Saludos
Responder Con Cita
  #4  
Antiguo 25-04-2008
Avatar de Caro
*Caro* Caro is offline
Moderadora
 
Registrado: jul 2004
Ubicación: Cochabamba, Bolivia
Posts: 2.544
Poder: 22
Caro Va por buen camino
Hola Nereida, puedes talvez utilizar la función Locate de tu ibTable, para hacer la busqueda y lo situa donde lo encuentra, sobre un campo X.

Ejemplo

Código Delphi [-]
 ibtable.locate('codigo',EditCODIGO.Text,[loPartialKey]);

O si sabes la fila donde se encuentra, también puedes usar RecNo.

Código Delphi [-]
 ibtable.RecNo := NumeroFila;

Saluditos
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar.

Última edición por Caro fecha: 25-04-2008 a las 14:26:17.
Responder Con Cita
  #5  
Antiguo 25-04-2008
Nereida Nereida is offline
Miembro
 
Registrado: abr 2008
Posts: 34
Poder: 0
Nereida Va por buen camino
Cita:
Empezado por Caro Ver Mensaje
Hola Nereida, puedes talvez utilizar la función Locate de tu ibTable, para hacer la busqueda y lo situa donde lo encuentra, sobre un campo X.

Ejemplo


Código Delphi [-]
ibtable.locate('codigo',EditCODIGO.Text,[loPartialKey]);





O si sabes la fila donde se encuentra, también puedes usar RecNo.


Código Delphi [-]
ibtable.RecNo := NumeroFila;





Saluditos
También lo probé y no va, aunque puede que sea pq en la tabla si que lo encuentra, pero el dbgrid es el que tiene que seleccionarlo, vamos que eso va independientemente de la tabla.
La fila no la sé, ya que por ejemplo una inserción que he hecho, en el dbgrid aparece por la mitad.

Gracias por tu paciencia y por ayudarme

Saludos
Responder Con Cita
  #6  
Antiguo 25-04-2008
Avatar de jcarteagaf
[jcarteagaf] jcarteagaf is offline
Miembro Premium
 
Registrado: abr 2006
Ubicación: La Paz, Bolivia
Posts: 651
Poder: 19
jcarteagaf Va por buen camino
Que operaciones haces despues de hacer el Tabla.post? no tienes algo en el evento afterpost?
Responder Con Cita
  #7  
Antiguo 25-04-2008
Nereida Nereida is offline
Miembro
 
Registrado: abr 2008
Posts: 34
Poder: 0
Nereida Va por buen camino
Cita:
Empezado por jcarteagaf Ver Mensaje
Que operaciones haces despues de hacer el Tabla.post? no tienes algo en el evento afterpost?
No he puesto nada, la verdad. Tengo que poner alguna cosa???
Responder Con Cita
  #8  
Antiguo 25-04-2008
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
Pregunto : Estarás utilizando dos DataSet's (TTable o TQuery ...) diferentes, y/o dos DataSource's diferentes, uno para la visualización del DBGrid, y otro(s) diferentes para la adición/edición del registro en cuestión ??
__________________
Piensa siempre en positivo !
Responder Con Cita
  #9  
Antiguo 25-04-2008
Avatar de jcarteagaf
[jcarteagaf] jcarteagaf is offline
Miembro Premium
 
Registrado: abr 2006
Ubicación: La Paz, Bolivia
Posts: 651
Poder: 19
jcarteagaf Va por buen camino
Nereida:
Revisando la sección de Acceso a bases de datos encontre este post tuyo

Me parece que usas un grid para mostrar tus datos mediante un IBQuery y luego lo añades o editas en otra pantalla usando un IBTable (estoy en lo correcto?). En caso de ser asi seguramente al terminar la operación de adición/edicion haces un refresh y eso hace que pierdas el puntero del registro adicionado/editado. Por favor corrigeme si estoy equivocado.

En caso de que fuera asi te sugiero hacer lo siguiente:

Usa un TIBQuery para acceder a los datos, puedes colocar un datasource que relacione el grid y el TIBQuery en la pantalla de navegación y otro datasource que relacione el mismo TIBQuery (deberas usar File|Use unit para referenciar a la pantalla del grid) con los componentes dbEdits.

Es decir 3 componentes:
IBQuery1 -> apunta a tus datos
Datasource1.Dataset = IBQuery1
dbgrid1.datasource = datasource1

Datasource2.dataset = Pantallagrid.ibquery1
dbedit1.datasource = datasource2
...
dbeditn.datasource = datasource2

Espero que te solucione el problema (si es que entendi bien tu diseño).

Saludos
Responder Con Cita
  #10  
Antiguo 25-04-2008
Nereida Nereida is offline
Miembro
 
Registrado: abr 2008
Posts: 34
Poder: 0
Nereida Va por buen camino
Cita:
Empezado por jcarteagaf Ver Mensaje
Nereida:
Revisando la sección de Acceso a bases de datos encontre este post tuyo

Me parece que usas un grid para mostrar tus datos mediante un IBQuery y luego lo añades o editas en otra pantalla usando un IBTable (estoy en lo correcto?). En caso de ser asi seguramente al terminar la operación de adición/edicion haces un refresh y eso hace que pierdas el puntero del registro adicionado/editado. Por favor corrigeme si estoy equivocado.

En caso de que fuera asi te sugiero hacer lo siguiente:

Usa un TIBQuery para acceder a los datos, puedes colocar un datasource que relacione el grid y el TIBQuery en la pantalla de navegación y otro datasource que relacione el mismo TIBQuery (deberas usar File|Use unit para referenciar a la pantalla del grid) con los componentes dbEdits.

Es decir 3 componentes:
IBQuery1 -> apunta a tus datos
Datasource1.Dataset = IBQuery1
dbgrid1.datasource = datasource1

Datasource2.dataset = Pantallagrid.ibquery1
dbedit1.datasource = datasource2
...
dbeditn.datasource = datasource2

Espero que te solucione el problema (si es que entendi bien tu diseño).

Saludos
Mejor te explico el diseño otra vez, ya que cambié algunas cosas debido a lo que me recomendaron:
En mi primer formulario, tengo un dbgrid (entre otros componentes, pero este es el que nos interesa). Mi dbgrid está relacionado con un ibtable (podría haber usado un query pero preferí el table pq como soy una novata, asi distingo entre las consultas y lo que es la tabla en sí).
Por otra parte, cuando doy un alta, se abre un nuevo formulario cuyos registros están relacionados con un ibquery. Una vez los guardo, actualizo el ibtable. Es decir, en el dbgrid, una vez he dado un alta o hecho una modificación si que me la muestra correctamente. El problema es que me selecciona el registro del dbgrid que "quiere" (la programación de los objetos me cuesta entender como se ha hexo).

Muchisimas gracias, de veras
Responder Con Cita
  #11  
Antiguo 25-04-2008
Avatar de jcarteagaf
[jcarteagaf] jcarteagaf is offline
Miembro Premium
 
Registrado: abr 2006
Ubicación: La Paz, Bolivia
Posts: 651
Poder: 19
jcarteagaf Va por buen camino
Nereida, ahora si entendi tu problema:

1. Usas un IBTable para mostrarlo en el grid
2. Usas una forma aparte para añadir un registro mediante un IBQuery
3. Al añadir un nuevo registro...mocos!!!, el grid muestra lo que quiere.

Solución:

1. Añade la unidad de laforma donde esta el grid a la pantalla de adición.
2. En tu forma de adición debes tener un datasource haz que apunte al IBTable de la forma del grid.
3. En la forma del grid pon lo siguiente en el boton Adición (o en el contro lque uses para llamar a tu forma de adicion):

Código Delphi [-]
IbTable1.Append;
if MiformaAdicion.Showmodal= mrok then
  IbTable1.Post
else
  IbTable1.cancel

Al tener 2 datasets diferente apuntando al mismo dato, nunca lograras coordinar la información. Por eso usa uno solo (IbTable en tu caso) para que al actualizar en un lado, se actualize automaticamente en el otro.

Ahora si espero haberte ayudado. Saludos.
Responder Con Cita
  #12  
Antiguo 25-04-2008
Nereida Nereida is offline
Miembro
 
Registrado: abr 2008
Posts: 34
Poder: 0
Nereida Va por buen camino
Cita:
Empezado por jcarteagaf Ver Mensaje
Nereida, ahora si entendi tu problema:

1. Usas un IBTable para mostrarlo en el grid
2. Usas una forma aparte para añadir un registro mediante un IBQuery
3. Al añadir un nuevo registro...mocos!!!, el grid muestra lo que quiere.

Solución:

1. Añade la unidad de laforma donde esta el grid a la pantalla de adición.
2. En tu forma de adición debes tener un datasource haz que apunte al IBTable de la forma del grid.
3. En la forma del grid pon lo siguiente en el boton Adición (o en el contro lque uses para llamar a tu forma de adicion):


Código Delphi [-]IbTable1.Append;
if MiformaAdicion.Showmodal= mrok then
IbTable1.Post
else
IbTable1.cancel





Al tener 2 datasets diferente apuntando al mismo dato, nunca lograras coordinar la información. Por eso usa uno solo (IbTable en tu caso) para que al actualizar en un lado, se actualize automaticamente en el otro.

Ahora si espero haberte ayudado. Saludos.
La informacion si que me sale bien, esta todo coordinado, mi problema es que el selector de registro del dbgrid no me señala al nuevo registro.
Me parece que te estoy mareando un poco, asi que lo siento.
Responder Con Cita
  #13  
Antiguo 25-04-2008
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
Si no quieres realmente modificar tu diseño (lo cual te recomiendo), lo que deberás de hacer es lo siguiente :

1. Antes de refrescar tu IBTable, grabas la clave de referencia en una variable auxiliar.
2. Refrescas tu IBTable (que no sé como lo harás...), porque si utilizas el IBTable.Refresh, deberás estar colocado sobre el registro en cuestión, y no haría falta toda esta discusión (creo yo).
3. Con un IBTable.Locate de la clave guardada, te vuelves a posicionar en el registro correcto.



Lo suyo, por supuesto, es trabajar con un diseño correcto, por eso te aconsejo lo que se está debatiendo.
__________________
Piensa siempre en positivo !
Responder Con Cita
  #14  
Antiguo 25-04-2008
Nereida Nereida is offline
Miembro
 
Registrado: abr 2008
Posts: 34
Poder: 0
Nereida Va por buen camino
Cita:
Empezado por gluglu Ver Mensaje
Si no quieres realmente modificar tu diseño (lo cual te recomiendo), lo que deberás de hacer es lo siguiente :

1. Antes de refrescar tu IBTable, grabas la clave de referencia en una variable auxiliar.
2. Refrescas tu IBTable (que no sé como lo harás...), porque si utilizas el IBTable.Refresh, deberás estar colocado sobre el registro en cuestión, y no haría falta toda esta discusión (creo yo).
3. Con un IBTable.Locate de la clave guardada, te vuelves a posicionar en el registro correcto.



Lo suyo, por supuesto, es trabajar con un diseño correcto, por eso te aconsejo lo que se está debatiendo.
Hice lo del locate como dije anteriormente pero aun asi no funciona, lo puse donde me dijiste pero sigue sin funcionarme
Estoy por dejarlo por caso perdido pq esto parece que no se vaya a solucionar y aún como me ayudais.

Saludos
Responder Con Cita
  #15  
Antiguo 25-04-2008
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
Podrías poner aquí el código en cuestión, y así podremos ayudarte mejor ....

Seguro que tiene solución. No desesperes !
__________________
Piensa siempre en positivo !

Última edición por gluglu fecha: 25-04-2008 a las 16:37:23.
Responder Con Cita
  #16  
Antiguo 25-04-2008
Nereida Nereida is offline
Miembro
 
Registrado: abr 2008
Posts: 34
Poder: 0
Nereida Va por buen camino
Sigo con el diseño q os dije: un ibtable y un ibquery por separado
Asi que os voy a mostrar el código por separado para asi a ver si os aclarais ya que las expliaciones como habeis podido comprobar, no son lo mio


Código:
 
var
  varform:tform3;
begin
  inherited;
    main.MainForm.n_clie:=TRUE;
    varform:=tform3.create(self);
    try
      varform.Caption:='Nuevo Cliente';
      varform.IBQuery1.insert;
      varform.showmodal;
    finally
      varform.free;
      ibtable1.Refresh;
    end;
Ahi va el codigo del otro formulario:

Código:
 
procedure TForm3.FormCreate(Sender: TObject);
begin
      ibquery1.Insert;
end;
 
procedure TForm3.AceptarClick(Sender: TObject);
begin
      IBquery1.Post;
      IBquery1.close;
end;
Espero que asi se pueda entender mejor y me repito, muchas gracias
Responder Con Cita
  #17  
Antiguo 25-04-2008
Avatar de jcarteagaf
[jcarteagaf] jcarteagaf is offline
Miembro Premium
 
Registrado: abr 2006
Ubicación: La Paz, Bolivia
Posts: 651
Poder: 19
jcarteagaf Va por buen camino
Repito lo que dije:

Quita, borra, elimina el IBQuery, usa solo el IBTable, que ambas formas apunten al IBTable, entonces tu codigo cambia asi:

Código Delphi [-]
var
  varform:tform3;
begin
  inherited;
    main.MainForm.n_clie:=TRUE;
    varform:=tform3.create(self);
    try
      IBTable1.Insert;
      varform.Caption:='Nuevo Cliente';
      varform.showmodal;
    finally
      varform.free;
    end;

En la otra forma
1. No debes repetir el insert en el Ibquery1 (formcreate)

2.
Código Delphi [-]
procedure TForm3.AceptarClick(Sender: TObject);
begin
  formaanterior.IbTabla1.Post;
end;
Responder Con Cita
  #18  
Antiguo 26-04-2008
Avatar de jcarteagaf
[jcarteagaf] jcarteagaf is offline
Miembro Premium
 
Registrado: abr 2006
Ubicación: La Paz, Bolivia
Posts: 651
Poder: 19
jcarteagaf Va por buen camino
Nereida, ¿como te fue?, ¿lo solucionaste?, me quede intrigado si implementaste lo que te sugeri....

Saludos.
Responder Con Cita
  #19  
Antiguo 28-04-2008
Nereida Nereida is offline
Miembro
 
Registrado: abr 2008
Posts: 34
Poder: 0
Nereida Va por buen camino
Siento haber tardado tanto en contestar pero es que el trabajo lo estoy haciendo en unas prácticas que estoy haciendo en una empresa, por lo que no pude contestar en todo el fin de semana.
Por fin he podido hacerlo y como soy tan tozuda (las cosas como son) ha sido justo de la manera en la que yo decia pero con las ideas vuestras.
Eso si, no me habia fijado pero si que habia puesto dos INSERT en vez de uno, que despiste.
Lo que he hecho hace nada, ha sido declararme una variable global en la que almacenaba el código que introducia en el formulario que dije q solo era de añadir y modificar registros y guardar el registro.

El código que cambié fue el siguiente:

Código:
     varform.free;
      ibtable1.Refresh;
      IBTable1.Locate('cod_clie',main.MainForm.aux2,[lopartialkey]);
      dbgrid1.Refresh;
Parece que el Locate no funcionaba pq la tabla no la habia refrescado y si después de hacer la búsqueda, no refrescaba el dbgrid era normal que no me mostrara los datos correctamente. Ahora si que funciona y la verdad es que me siento genial pq pensaba que no lo lograría.

Gracias a los dos por tener tanta paciencia y ayudarme

Saludos a los dos, espero que hayais pasado un buen fin de semana

Última edición por Nereida fecha: 28-04-2008 a las 09:17:28.
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
Problemas con un DBGrid CFPA86 Varios 3 18-02-2008 16:59:38
Problemas Con Dbgrid nikotina Conexión con bases de datos 4 13-10-2006 17:43:16
Problemas con el DBGrid Shidalis Conexión con bases de datos 8 07-12-2005 15:53:50
Problemas con un dbgrid majosf Conexión con bases de datos 2 08-09-2005 13:27:14


La franja horaria es GMT +2. Ahora son las 00:36:08.


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