PDA

Ver la Versión Completa : Realizar calculos y buscar número mayor en DBGrid


lujurock
06-11-2008, 00:32:34
Hola. Estoy intentando programar a partir de un DBGrid con 4 columnas y cada una de ellas contiene alrededor de 19.000 datos numericos. Mi necesidad es poder encontrar el máximo valor en cada una de las columnas y tambien realizar calculos entre dos columnas, pero no consigo dar con el codigo.

Agradeceria mucho alguna ayuda u orientacion.

Aqui una imagen para que se hagan una idea de como va:

http://www.imaxenes.com/imagen/dbgrid1oq10wr.jpg.html

Rockin
06-11-2008, 10:46:23
Para buscar el registro mayor, puedes recorrer la columna con un for o un while de la siguiente manera:


var
maximo_valor: float;

begin
maximo_valor:= StrToFloat(DBGrid.Cells[columnavalor,1]);

for i:= 2 to numregistros do
begin

//esto para comprobar el valor máximo
If (StrToFloat(DBGrid.Cells[columnavalor,i]) > maximo_valor) then
begin
maximo_valor:= StrToFloat(DBGrid.Cells[columnavalor,i]);
end; //del If

//para operar entre dos columna

StrToFloat(DBGrid.Cells[columnaoperando1,i - 1]) "signo operacion" StrToFloat(DBGrid.Cells[columnaoperando2,i - 1])

end; // del for

//esto es para calcular la ultima fila debido a que hemos llegado hasta i - 1

StrToFloat(DBGrid.Cells[columnaoperando1,i]) "signo operacion" StrToFloat(DBGrid.Cells[columnaoperando2,i])

end;




Yo uso el DBGrid de TMS, con el que trae delphi será parecido.
Los tipos de datos los adaptas como tu veas mejor.

Espero que te valga.

Neftali [Germán.Estévez]
06-11-2008, 11:27:03
a partir de un DBGrid con 4 columnas y cada una de ellas contiene alrededor de 19.000 datos numericos. Mi necesidad es poder encontrar el máximo valor en cada una de las columnas y tambien realizar calculos entre dos columnas, pero no consigo dar con el codigo.

Creo que el enfoque que le estás dando a cómo solucionar el problema es incorrecto. Piensa que el DBGrid no es más que una "ventana" a los datos reales que tienes en la tabla o query.
Así que en mi opinión deberías hacer las búsquedas sobre la tabla/query, no sobre el control, ya que segun como lo tengas configurado ni siquiera estás viendo en el Grid todos los datos, sino una parte o porción de ellos.

Realiza la busqueda del dato con un LOCATE, FINDKEY o similar sobre el dataset.

Rockin
06-11-2008, 12:36:37
Es mejor buscar en el dataset y hacer las operaciones sobre el. Pero como ha preguntado lo del gridpor eso lo he hehcho.

Sobre el dataset es mejor un select que un locate.

Saludos.

Caro
06-11-2008, 13:45:31
Hola, para buscar el mayor no recorrería ni el DBGrid ni el DataSet, lo haría con otra consulta que me de el Max de las 4 columnas y tendría las mismas condiciones que la consulta que se muestra en el DBGrid.


OtroQuery.Close;
OtroQuery.Sql.Text := 'select Max(campo1), MAX(campo2) From tabla';
OtroQuery.Open;


Y si tienes que hacer calculos sobre tus columnas, podrías crearte un campo calculado.

Saluditos

Rockin
06-11-2008, 14:16:25
Tambien podria ordenar la consulta por el campo de modo descendente.


select valor from tablar order by valor desc


Hay varis formas, pero a lo mejor tiene que mostrar el grid por algo.

Saludos.

lujurock
07-11-2008, 01:50:33
Rockin. muchas gracias por tu respuesta. creo que estamos con versiones diferentes de delphi o yo soy muy novato en esto, ya que el primer error que me aparece en el codigo que me enviaste es la propiedad Cells (DBGrid.Cells, la unica propiedad parecida es DBGrid.Columns[] y en el parentesis acepta un solo valor de la forma [1] no [1,1] ). Yo uso delphi 2006, y para llamar al archivo excel que se muestra en el dbgrid uso un ADOConnection, un ADOTable y un DataSource. Te agradeceria mucho si me aclaras esto. saludos.

Neftali [Germán.Estévez]
07-11-2008, 11:35:22
...creo que estamos con versiones diferentes de delphi o yo soy muy novato en esto, ya que el primer error que me aparece en el codigo que me enviaste es la propiedad Cells (DBGrid.Cells, la unica propiedad parecida es DBGrid.Columns[]

El problema es que esa propiedad está en el DBGrid de la TMS (que te ha dicho que es el que él utiliza), pero no en el Grid estandard.

Hola, para buscar el mayor no recorrería ni el DBGrid ni el DataSet, lo haría con otra consulta que me de el Max de las 4 columnas y tendría las mismas condiciones que la consulta que se muestra en el DBGrid.

Si no necesitas posicionarte en el registro, sólo encontrar el valor, Caro tiene razón. Si por el contrario necesitas posicionarte en ese registro hazlo sobre el mismo del DBGrid.

Rockin
07-11-2008, 13:30:10
Si tienes que recorrer el Grid por fuerza, prueba algo parecido a esto, te hablo de memoria.


var
maximo: tipodedatos;
resultado:tipodedatos;

begin
DataSet.First;

maximo:= dataset.FieldByName('campovalor').AsTipoDeDatos;

while not DataSet.First.eof do
begin

//esto es para calcular el valor maximo
IF (StrToTipoDatos(DBGRID..Fields[columnadelvalordelgrid].Text) > maximo) then
begin
maximo:= StrToTipoDatos(DBGRID..Fields[columnadelvalordelgrid].Text;
end;


//esto es para calcular el valor entre dos columnas

resultado:= StrToTipoDatos(DBGRID.Fields[columnaoperando1].Text) operacion StrToTipoDatos(DBGRID.Fields[columnaoperando2].Text) ;

DataSet.Next;

end;

ShowMessage(TipodatostoStr(maximo));




Al ir recorriendo el dataset el cursor va cambiando de registro en el Grid.

Prueba algo así.
Saludos.

lujurock
10-11-2008, 19:49:53
Muchas gracias por sus respuestas. sabe alguno de ustedes de donde puedo bajar el componente TMS DBGrid para Delphi 2006?

Neftali [Germán.Estévez]
11-11-2008, 11:16:22
sabe alguno de ustedes de donde puedo bajar el componente TMS DBGrid para Delphi 2006?

(1) Abrir explorador Web (sirve cualquiera, Firefox, Opera, Safari, hasta IE).
(2) Ir a la barra de direcciones (normalmente está en la parte superior).
(3) Escribir el siguiente texto. Tal como está y sin comillas:
"www.google.com"
(4) Pulsa la tecla RETURN o ENTER.
(5) Aparecerá un cuadro de texto en la parte central de la ventana.
(6) Escribe en ese cuadro de texto esto (sin comillas): "Delphi TMS"
(7) Haz click en el botón de "Buscar".

P.D: Te hubieras ahorado 15 horas de espera.

lujurock
11-11-2008, 17:08:56
jajajajajajaj muy bien naftalina... ya lo habia hecho y tengo los componentes. muchas gracias a todos los que aportaron. un abrazo.

Caro
11-11-2008, 17:28:16
........muy bien naftalina...

:confused:

Saluditos

lujurock
11-11-2008, 17:29:53
:confused:

Saluditos


Me referia a neftali

Neftali [Germán.Estévez]
12-11-2008, 11:05:17
Me referia a neftali

Se me había quedado por un momento cara de "repelente de polillas (http://es.wikipedia.org/wiki/Naftalina)".:o:o