Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Problemas con un dbgrid (https://www.clubdelphi.com/foros/showthread.php?t=55748)

Nereida 25-04-2008 11:14:04

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 :)

jcarteagaf 25-04-2008 12:14:42

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.

Nereida 25-04-2008 14:18:33

Cita:

Empezado por jcarteagaf (Mensaje 282537)
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

Caro 25-04-2008 14:23:34

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

Nereida 25-04-2008 14:58:02

Cita:

Empezado por Caro (Mensaje 282551)
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 :D

jcarteagaf 25-04-2008 15:23:10

Que operaciones haces despues de hacer el Tabla.post? no tienes algo en el evento afterpost?

Nereida 25-04-2008 15:30:15

Cita:

Empezado por jcarteagaf (Mensaje 282563)
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???

gluglu 25-04-2008 15:31:48

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 ??

jcarteagaf 25-04-2008 15:35:57

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

Nereida 25-04-2008 15:50:47

Cita:

Empezado por jcarteagaf (Mensaje 282566)
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

jcarteagaf 25-04-2008 15:58:38

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.

Nereida 25-04-2008 16:06:45

Cita:

Empezado por jcarteagaf (Mensaje 282578)
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.

gluglu 25-04-2008 16:07:04

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.

Nereida 25-04-2008 16:19:15

Cita:

Empezado por gluglu (Mensaje 282583)
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

gluglu 25-04-2008 16:31:35

Podrías poner aquí el código en cuestión, y así podremos ayudarte mejor .... :o

Seguro que tiene solución. No desesperes ! :)

Nereida 25-04-2008 16:39:49

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 :D

jcarteagaf 25-04-2008 16:51:02

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;

jcarteagaf 26-04-2008 14:39:17

Nereida, ¿como te fue?, ¿lo solucionaste?, me quede intrigado si implementaste lo que te sugeri....

Saludos.

Nereida 28-04-2008 09:13:07

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 :D

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


La franja horaria es GMT +2. Ahora son las 16:58:00.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi