Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   problema tdbgrid (https://www.clubdelphi.com/foros/showthread.php?t=11205)

chele 08-06-2004 17:37:41

problema tdbgrid
 
Buenas, tengo que hacer una cosa y no tengo ni idea, por mas que pienso no se me ocurre como hacerlo, a ver si me podeis dar la idea de pro donde tirar.

Es un tdbgrid con 3 campos.

A B C
500 100 100
500 100 300

A seria siempre el maximo.
B seria lo que queda de restar lo que pongo en C menos A menso B.

El unico valor que yo meto es C , A nunca cambia y B es el que me tiene que cambiar automatico.

La primera vez meto en C 100 entonces me queda B 400
La segunda vez meto en C 300 entonecs me queda en B 100

Cuadno meto una nueva va perfect, el problema es cuando meto por ejemplo una mas que sea 110, ahora la suma es 510 y no debe dejarme, ya que es mayor que A, el problema es como hago la suma, ya que si lo hago sobre el actual recordset me suma solo la fila, y si sumo por el total de datos de la base de datos tampoco por que el valor 110 todavia no se ha guardado ya que es erroneo y no me deja guardarlo ... uf no se si me explico.

El problema es que tengo que sumarlos dentro del tdbgrid antes de guardarlo en la base de datos, y yo hasta ahora hacia todos los calculos via base de datos y en este caso no puedo .... ¿alguna idea?.

Gracias anticipadas.

__marcsc 08-06-2004 17:47:21

Cita:

Empezado por chele
El problema es que tengo que sumarlos dentro del tdbgrid antes de guardarlo en la base de datos, y yo hasta ahora hacia todos los calculos via base de datos y en este caso no puedo .... ¿alguna idea?.

Gracias anticipadas.

Esta frase me hace dudar. A qué te refieres con que tienes que hacerlo en el Grid antes que en la base de datos?

A mi me parece un problema que puede resolverse fácilmente con los eventos OnValidate y OnChange de los campos de la tabla/query a la que está asociado el grid. Cuando estás trabajando de este modo, los datos con los que trabajas no están aún en la base de datos, al menos hasta que hagas el post de la tabla.

Saludos.

chele 08-06-2004 18:00:26

Yo ahora cuando cambio de columna hago unos calculos y le meti esto :

Código Delphi [-]
      while not qryautorizaciones.Eof do
      begin
      sumaimporte := sumaimporte + qryautorizacionesAutdto.value;
      sumaimporte1 := sumaimporte1 + qryautorizacionesDescMan.value;
      qryautorizaciones.next;
      end;

sumatotal := sumaimporte + sumaimporte1;


if (sumatotal - qryautorizacionesImporte1.value) > 0 then
raise exception.create('La cantidad autorizada supera la pendiente');

pero se me vuelve todo loco, esto es lo que quiero que haga pero se me vuelve loco el dbgrid

chele 08-06-2004 18:03:57

Necesito poder recorrer todo el dbgrid y sumar dos columnas, en mi caso sumar todo C

¿Como hago esto?. Por que si lo hago con la base de datos se me vuelve todo loco ....

__marcsc 08-06-2004 18:10:33

Hola,

pues como te comento, yo creo que lo mejor sería que utilizaras los eventos de campos. Eso solo lo puedes hacer si tienes los campos agregados estáticamente a la tabla.

Una vez has echo esto, tienes cuatro eventos disponibles para cada campo.

Cuando tu estás navegando por tu DBGrid, en realidad lo que ves es una copia (caché) de los datos físicos.

El evento OnValidate se dispara cuando se escribe un nuevo valor para un registro de los que tienes en tu caché. Dentro de este evento, como su nombre indica, puedes validar si los datos que tiene en este momento el campo son correctos o no. Si no lo son, puedes lanzar una excepción.

El evento OnChange se dispara cada vez que hay un nuevo valor en el campo. Si antes tenías un 100 y le pones un 200, se disparará este evento, pero posteriormente a OnValidate.

Por qué te meto todo este rollo de la caché? Pues porqué hasta que la tabla que contiene los campos no haga n post o confirmación del registro, estos datos solo están en la caché, no en la BD.

Yo creo que con esto puedes solucionar el problema :)

Suerte.

__marcsc 08-06-2004 18:13:23

Cita:

Empezado por chele
Necesito poder recorrer todo el dbgrid y sumar dos columnas, en mi caso sumar todo C

¿Como hago esto?. Por que si lo hago con la base de datos se me vuelve todo loco ....

Cuando dices hacerlo con la base de datos te refieres por ejemplo a lanzar un "select sum"??

Puedes intentar tener otro DataSet ligado a la misma tabla física (o sea, a la misma a que apunta el DataSet con el que está enlazado el grid) y recorrer este DataSet. Te sirve?

chele 08-06-2004 18:19:03

Uf te entiendo pero no se como hacerlo te lo juro.

Me podrais poner un ejemplo sencillo y ya me baso en el, es uqe no entiendo como leer todos los datos desde el onvalidate.

Ahora mismo tengo el onvalidate del campo pero cuando hago la pasada leyendo otra vez se me vuelve todo loco ....

chele 08-06-2004 18:20:44

Mira he peusto esto ( no se como se pone para que aparesca el codigo separado en blanco sorry ) .

Código Delphi [-]
procedure TDataModule2.qryAutorizacionesDESCMANValidate(Sender: TField);
var percaaplicar : real;
    sumaimporte, sumaimporte1, sumatotal :extended;
begin


      while not qryautorizaciones.Eof do
      begin
      sumaimporte := sumaimporte + qryautorizacionesAutdto.value;
      sumaimporte1 := sumaimporte1 + qryautorizacionesDescMan.value;
      qryautorizaciones.next;
      end;

sumatotal := sumaimporte + sumaimporte1;


if (sumatotal - qryautorizacionesImporte1.value) > 0 then
raise exception.create('La cantidad autorizada supera la pendiente');      

end;

__marcsc 08-06-2004 18:34:51

Hola,

le echaré un vistazo, de momento te avanzo que para ver el código en Delphi puedes usar la etiqueta delphi

Recuerda que para cerrar la etiqueta debes hacerlo con el carácter "/" y no "\"

EDICIÓN:

Algunas cosillas...

Recuerda que dentro de los eventos de campo, el parámetro Sender es el propio campo que se está validando.

Otra cosilla: fíjate que recorres el mismo DataSet sobre el que lanzas los eventos de campos. Esto te irá mal porqué aún no has validado el campo que ya te desplazas sobre este mismo DataSet. Es decir, validas un campo de un registro concreto, pero a media validación, camibias de registro debido al bucle. Lo mejor sería que esta suma la realizaras via query o como te indicaba en el mensaje anterior. Es decir, colocar un nuevo TTable (o el que sea) que apunte a la misma tabla que la que tu ya tienes.

Saludos :)

chele 08-06-2004 18:46:44

Pero puedo hacer un query de datos que estan en cache ???

Es que necesito hacer la comprobacion sobre datos todavia no guardados, es decir todavia no hice el post por eso no creo que me valga hacer una query.

O puedo hacer un select count(campo) from *** donde *** sera la tblquery ???

__marcsc 08-06-2004 18:54:32

Hola de nuevo :)

utilizas actualizaciones diferidas? O el único registro que no está confirmado es el actual?

Porqué si no las utilizas, simplemente lanzas el query de lo que hay en la BD y le sumas lo que contiene tu registro actual, que es el único que no está actualizado...

chele 08-06-2004 18:58:05

Si eso lo pense pero la putada es que el problema es al modificar, y como no se que fila me esta modificando no se que fila tengo que cambiar.

Si tengo 10 filas y el cliente me modifica la fila 5 .... pues ya eso no me vale.

Ah y gracias por los intentos, a ver si lo sacamos jeje.


La franja horaria es GMT +2. Ahora son las 12:41:08.

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