FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
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!
__________________
"Todo lo que puede fallar, falla." Última edición por TelloClos fecha: 17-07-2003 a las 18:47:36. |
#2
|
||||
|
||||
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; |
#3
|
|||
|
|||
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 !
__________________
"Todo lo que puede fallar, falla." |
#4
|
||||
|
||||
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 |
#5
|
||||
|
||||
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;
__________________
Juan Antonio Castillo Hernández (jachguate) Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate |
#6
|
||||
|
||||
Completamente de acuerdo jachguate, todo el recorrido es en el dataset.
// Saludos |
#7
|
|||
|
|||
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!!!
__________________
"Todo lo que puede fallar, falla." |
#8
|
||||
|
||||
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. |
#9
|
|||
|
|||
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!
__________________
"Todo lo que puede fallar, falla." |
#10
|
|||
|
|||
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!.
__________________
"Todo lo que puede fallar, falla." |
#11
|
||||
|
||||
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; Comentario: Ten en cuenta que este código esta recorriendo el DataSet desde el primer registro, creo que esto tu no lo quieres. Saludos!
__________________
delphi.com.ar Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla. Última edición por delphi.com.ar fecha: 17-07-2003 a las 18:55:23. |
#12
|
|||
|
|||
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.
__________________
ing. frankmch |
#13
|
|||
|
|||
gracias por las acotaciones!
permite el memory data editar las celdas? salu2!
__________________
"Todo lo que puede fallar, falla." |
#14
|
|||
|
|||
donde puedo encontrar los rx no los puedo encontrar en la paleta de controles?
salud2!
__________________
"Todo lo que puede fallar, falla." |
#15
|
||||
|
||||
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!
__________________
delphi.com.ar Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla. |
#16
|
|||
|
|||
Cita:
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!
__________________
"Todo lo que puede fallar, falla." |
#17
|
|||
|
|||
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....
__________________
ing. frankmch |
#18
|
|||
|
|||
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
__________________
"Todo lo que puede fallar, falla." |
#19
|
|||
|
|||
en esta misma pagina, en la seccion componentes>coleeciones>rxlib
__________________
ing. frankmch |
#20
|
|||
|
|||
gracias!
__________________
"Todo lo que puede fallar, falla." |
|
|
|