Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Recoreer un Grid (https://www.clubdelphi.com/foros/showthread.php?t=2190)

TelloClos 13-07-2003 02:31:27

Recorrer un Grid
 
Hola a Todos!

nuevamente por aquí...

tengo un objeto dggrid, al cual necesito recorrerlo en un momento determinado, desde la primera fila a la fila en la que actualmente me encuentro posicionado. al realizar este recorrido

debo ir comparando el valor de cierta columna( supongamos Nro. de documento) para ver si contiene el mismo valor que la misma columna de la fila en la que actualmente estoy posicionado.

mis dudas entre muchas son las siguientes:

-como puedo obetener la fila en la que actualmente estoy posicionado?

- como puedo hacer el recorrido del grid (se que puedo utilizar for o whiles , pero no se como ir avanzando el indice del grid)?

- al ir recorriendo cada fila como le indico al sistema que el valor de la columna que necesito, debe corresponder a la fila que actualmente estoy recorriendo?


cualquier salvavidas será bienvenido!

salu2!

marcoszorrilla 13-07-2003 12:40:46

Creo que si desarrollas esta idea te podrá servir:

Código:

procedure TForm1.Button1Click(Sender: TObject);
Var
nActualRow,nTotalRows:Integer;
Ret:String;
begin
Ret:=Chr(13);
ShowMessage(DbGrid1.Columns[0].Field.asString);

nActualRow:=TsTringGrid(DbGrid1).Row;
nTotalRows:=TsTringGrid(DbGrid1).RowCount;
ShowMessage('Fila Actual: '+IntToStr(nActualRow)+Ret+
'Total Filas: '+IntToStr(nTotalRows));
//Ir a la primera
Table1.MoveBy(-nActualRow);
end;

Un Saludo.

TelloClos 15-07-2003 17:57:53

gracias por la atención marcos!

mira intentamos realizar un rutina más o menos relacionada con los resultados que pretendemos obtener con las propiedades sobre los cuales he solicitado información

pero no nos esta funcionando

a considerar: la grid esta enlasada a un datasource , el cual a su vez toma los valores de un procedimiento almacenado, el cual esta concentado a obejto conexión que esta en comunicación con un motor de base de datos Sql Server 2000.
Todos los objetos exceptuando el DataSource son de la tecnologia ADO

expongo la rutina ejemplo a continuación:

for i := 1 to tstringgrid(dbgrid1).rowcount -1 do
begin
tstringgrid(dbgrid1).row := i;
dbgrid1.setfocus;
Vtotal := VTotal + dbgrid1.Columns[0].asinteger;
end;
showmessage(inttostr(Vtotal))

- lo que suecede en esta rutina es que el valor de la columna no se actualiza, es decir, simpre contiene el valor de la columna en la primera fila ( tstringgrid(dbgrid1).row = 1)


otra forma en que intentamos plantear esto pero optuvimos el mismo resultado fue:

tstringgrid(dbgrid1).col := 0;
for i := 1 to tstringgrid(dbgrid1).rowcount -1 do
begin
tstringgrid(dbgrid1).row := i;
dbgrid1.setfocus;
Vtotal := VTotal + dbgrid1.selectedField.value;
end;
showmessage(inttostr(Vtotal))


espero me puedan ayudar en algo sobre este problemilla !

roman 15-07-2003 18:54:39

Un par de comentarios.

Los componentes DBGrid no están hechos para "recorrerse". Lo que se recorre es el DataSet asociado.

Al comenzar el recorrido puedes obtner los datos de la fla actual con DataSet.FieldByName y recorrer el DataSet con DataSet.Next.

El que los DBGrid no estén hechos para recorrerse no es sólo un capricho mío. Los DBGrid son grids "virtuales", relamente no contienen todos los registros; de lo contrario tendrían que almacenar en memoria todo el contenido de una tabla, lo cual pueden ser miles, cientos de miles o millones de registros. El DBGrid controla el desplazamiento y va leyendo los registros conforme se necesite.

Acabo de hacer una pequeña prueba colcando un DBGrid con 15 filas visibles y no importa en que parte del recorrido me encuentre la propiedad RowCount es siempre 16 (una más de las filas visibles).

El otro comentario es que no debe hacerse un casting del estilo TStringGrid(DBGrid) ya que TStringGrid no es un ancestro de DBGrid (esto ya se discutió anteriormente). Lo correcto sería declarar un descendiente de TDBGrid, digamos TUPDBGrid y hacer el "casting" con él para acceder a las propiedades protegidas.

Pero aún así, está el problema que menciono antes. Hay una buena razón para que Borland haya decidido no publicar en TDBGrid propiedades como RowCount: Las filas son "virtuales", no existen sino que se van actualizando conforme nos vamos desplazando por el DataSet.

// Saludos

jachguate 15-07-2003 19:10:04

Yo creo que lo mas normal es hacer algo como:


Código:


Var
  Llave : String;

Begin
  Llave := dbGrid1.DataSource.DataSet.FieldByName('Llave').AsString;
  dbGrid1.DataSource.DisableControls;
  try
    with dbGrid1.DataSource.DataSet do
    Begin
      First;
      Suma := 0;
      While (not eof) and not (FieldByName('Llave').AsString = Llave) do
      Begin
        suma := Suma + FieldByName('CampoNumerico').AsFloat;
        Next;
      End;
      ShowMessage('Suma ' + FloatToStr(Suma));
    End;
  finally
    dbGrid1.DataSource.EnableControls;
  End;
End;

Hasta luego.

;)

roman 15-07-2003 19:13:59

Completamente de acuerdo jachguate, todo el recorrido es en el dataset.

// Saludos

TelloClos 15-07-2003 19:27:34

Muuuuuuuchas Gracias!!!!

en primer lugar a roman, por la explicación conceptual del grid, que me aclaro bastante los conceptos con respecto al manejo de este objeto

y en segundo lugar a juan por el ejemplo entregado, con el cual el problema que habia planteado me funciono del 1.!

GRandes!!!!!!!!!

me han ayudado a ver la luz!

Saludos!!!

marcoszorrilla 15-07-2003 22:46:30

Veo que la pregunta en un principio no estaba bien formulada, porque no era recorrer la rejilla lo que pretendías, sino recorrer el DataSet y sumar ciertos registros.

Cosa que ya ha quedado perfectamente explicada por Román y JachGuate.

Un Saludo.

TelloClos 15-07-2003 22:49:39

la verdad es que en otros lenguajes , yo si recorria la grilla para obtener los valores de los campos, no sabia que en este lenguaje se recorria el conjunto de datos enlasado

saludos!

TelloClos 17-07-2003 18:46:29

Hola Nuevamente!

una pequeña dudilla.

este procedimiento de recorrido de la grilla sobre el cual les he consulta , lo tengo gatillado en el evento keypress de lagrilla, cuando es realizado sobre una columna especifica, ahora mi duda es de como hacer para volver a la posición de la grilla donde me encontraba al momento en que se ejecuto el procedimiento ( fila y columna)

De ante mano muchas gracias!.

delphi.com.ar 17-07-2003 18:51:37

Normalmente cuando recorro un DataSet, que tiene asociado controles visuales hago esto:
Código:

DataSet.DisableControls;
try
  Bookmark := DataSet.Bookmark;
  try
    DataSet.First;
    while not DataSet.EOF do begin
      ....
      DataSet.Next;
    end;
  finally
    DataSet.Bookmark := Bookmark;
  end;
finally
  DataSet.EnableControls;
end;

El DisableControls es para que los controles no reflejen el cambio de registro y el BookMark es para retornar a la posición anterior.

Comentario: Ten en cuenta que este código esta recorriendo el DataSet desde el primer registro, creo que esto tu no lo quieres.


Saludos!

frankmch 21-07-2003 07:44:49

no te compliques trabajando con el grid directamente, ya que no es un componente para hacer recorridos sobre la data puesta en el.
puedes probar mejor un recorrido sobre un MEMORYDATA de la coleccion de los RX y sincronizar tu resultado en el grid.
el memorydata trabaja igual que como si fueses recorriendo una tabla.

TelloClos 21-07-2003 23:23:18

gracias por las acotaciones!

permite el memory data editar las celdas?

salu2!

TelloClos 21-07-2003 23:34:18

donde puedo encontrar los rx no los puedo encontrar en la paleta de controles?

salud2!

delphi.com.ar 21-07-2003 23:44:25

Las RxLibs no vienen con Delphi, las tienes que bajar de sitios como Torry.net. Te cuento que te TRxMemoryData no es mas que un DataSet que se carga en memoria, no se cual es tu necesidad pero si solo quieres recorrer datos que son accesibles fácilmente desde la base de datos, no te recomiendo usarlo, a menos que necesites algo muy particular.

Saludos!

TelloClos 22-07-2003 00:32:34

Cita:

Posteado originalmente por delphi.com.ar
Las RxLibs no vienen con Delphi, las tienes que bajar de sitios como Torry.net. Te cuento que te TRxMemoryData no es mas que un DataSet que se carga en memoria, no se cual es tu necesidad pero si solo quieres recorrer datos que son accesibles fácilmente desde la base de datos, no te recomiendo usarlo, a menos que necesites algo muy particular.

Saludos!

igual es un poco complejo lo que quiero hacer , datos traido desde un procedimiento almacenado el cual procesa varias tablas para poder entregar el conjunto de datos resultado.
la forma en la que se utilizará esta consulta igual será requerida por varios usuarios a la ves ( 50 mas o menos), este control no presenta problemas de ese tipo, o algun problema con respecto a la cantidad de registros que se le puedan pasar?


salu2!

frankmch 22-07-2003 03:50:04

hola.

yo he trabajado con el memorydata y le he cargado mas de 8000 registros y no ha fallado, tambien los he cargado don data proveniente de varias tablas y similar cantidad de registros.
los he probado en cliente servidor y es muy util ya que al traerte una copia de la tabla al memory le quitas trabajo al server y evitas tambien tener un archivo en el cliente.
yo trabajo con este componente en client-server por cuestion de seguridad ya que procesamos todo en el cliente mediante un memory y asi evito acceder al server, y hacerlo cuando las transacciones estan completas.
se pueden recorrer igual que un dataset.
la unica posible limitante seria la memoria virtual que dispongas en ese momento, pero ojo, a mi nunca me ha dado problemas eso.
he hecho pruebas de este componente con 8000 registros o mas en una P2 corriendo sql server y win 2000 server y esto nunca me ha sucedido.

ademas al usar este componente evitas escribir en la bd y te podria permitir hacer una rutina de deshacer....

TelloClos 22-07-2003 16:19:35

ok. , muchas gracias, voy a estudiar el caso...

...pero eso si todavia no puedo encontrar este componente en torry.net no lo ubique, algún sitio donde lo pueda hallar?

salu2

frankmch 22-07-2003 17:56:24

en esta misma pagina, en la seccion componentes>coleeciones>rxlib

TelloClos 22-07-2003 18:02:36

gracias!:D


La franja horaria es GMT +2. Ahora son las 05:33:58.

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