Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 08-06-2004
chele chele is offline
Miembro
 
Registrado: feb 2004
Posts: 83
Poder: 21
chele Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 08-06-2004
Avatar de __marcsc
__marcsc __marcsc is offline
Miembro
 
Registrado: may 2003
Ubicación: Girona
Posts: 577
Poder: 22
__marcsc Va por buen camino
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.
Responder Con Cita
  #3  
Antiguo 08-06-2004
chele chele is offline
Miembro
 
Registrado: feb 2004
Posts: 83
Poder: 21
chele Va por buen camino
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

Última edición por __marcsc fecha: 08-06-2004 a las 18:31:53. Razón: uso de etiqueta delphi ;)
Responder Con Cita
  #4  
Antiguo 08-06-2004
chele chele is offline
Miembro
 
Registrado: feb 2004
Posts: 83
Poder: 21
chele Va por buen camino
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 ....
Responder Con Cita
  #5  
Antiguo 08-06-2004
Avatar de __marcsc
__marcsc __marcsc is offline
Miembro
 
Registrado: may 2003
Ubicación: Girona
Posts: 577
Poder: 22
__marcsc Va por buen camino
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.
Responder Con Cita
  #6  
Antiguo 08-06-2004
Avatar de __marcsc
__marcsc __marcsc is offline
Miembro
 
Registrado: may 2003
Ubicación: Girona
Posts: 577
Poder: 22
__marcsc Va por buen camino
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?
Responder Con Cita
  #7  
Antiguo 08-06-2004
chele chele is offline
Miembro
 
Registrado: feb 2004
Posts: 83
Poder: 21
chele Va por buen camino
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 ....
Responder Con Cita
  #8  
Antiguo 08-06-2004
chele chele is offline
Miembro
 
Registrado: feb 2004
Posts: 83
Poder: 21
chele Va por buen camino
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;

Última edición por __marcsc fecha: 08-06-2004 a las 18:32:28. Razón: uso de etiqueta delphi ;)
Responder Con Cita
  #9  
Antiguo 08-06-2004
Avatar de __marcsc
__marcsc __marcsc is offline
Miembro
 
Registrado: may 2003
Ubicación: Girona
Posts: 577
Poder: 22
__marcsc Va por buen camino
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

Última edición por __marcsc fecha: 08-06-2004 a las 18:41:08.
Responder Con Cita
  #10  
Antiguo 08-06-2004
chele chele is offline
Miembro
 
Registrado: feb 2004
Posts: 83
Poder: 21
chele Va por buen camino
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 ???
Responder Con Cita
  #11  
Antiguo 08-06-2004
Avatar de __marcsc
__marcsc __marcsc is offline
Miembro
 
Registrado: may 2003
Ubicación: Girona
Posts: 577
Poder: 22
__marcsc Va por buen camino
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...
Responder Con Cita
  #12  
Antiguo 08-06-2004
chele chele is offline
Miembro
 
Registrado: feb 2004
Posts: 83
Poder: 21
chele Va por buen camino
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.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 17:42:00.


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
Copyright 1996-2007 Club Delphi