Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Problema: type variant en campo a calcular (https://www.clubdelphi.com/foros/showthread.php?t=79270)

Nicolas_2011 20-06-2012 15:20:25

Problema: type variant en campo a calcular
 
Buenas foreros vengo con un problema q no eh podido resolver el tema es el siguiente tengo un detalle de compras (una grilla) en la cual van el nombre del producto a compra el precio la cantidad y el subtotal. esta grilla se carga atravez de un boton seleccionar q se encuentra en un listado de productos en dicho boton seleccionar al apretarlo deberia calcular el subtotal de la grilla el codigo lo tengo algo asi(solo la parte q refiere a mi problema:

Código Delphi [-]
procedure Tflistadoproducto.bseleccionarClick(Sender: TObject); 
begin 
DBsubtotal.Text := FloatToStr(cant*Fmodulo.Qproducto['precio']); 
Fmodulo.Tdetallefactura ['Subtotal'] := StrToFloat(DBsubtotal.Text); 
end;


y el error que tira dice esto en tiempo de ejecucion..
cannot access filed "subtotal" as type variant.


Ayuda por favor!:(


movorack 20-06-2012 17:01:43

Cuando tratas de obtener el valor de un campo de esta manera TQuery["NOMBRECAMPO"], estás forzando un typecast a variant.

Intenta llamando los campos con el tipo de dato que corresponde Fields.FieldByName("").AsXXXXX

Código Delphi [-]
procedure Tflistadoproducto.bseleccionarClick(Sender: TObject); 
begin   
  Fmodulo.Tdetallefactura.Fields.FieldByName('Subtotal').AsFloat := cant * Fmodulo.Qproducto.Fields.FieldByName('precio').AsFloat; 
  DBsubtotal.Text := Fmodulo.Tdetallefactura.Fields.FieldByName('Subtotal').AsString;
end;

Nicolas_2011 21-06-2012 02:36:32

Cita:

Empezado por movorack (Mensaje 435651)
Cuando tratas de obtener el valor de un campo de esta manera TQuery["NOMBRECAMPO"], estás forzando un typecast a variant.

Intenta llamando los campos con el tipo de dato que corresponde Fields.FieldByName("").AsXXXXX

Código Delphi [-]procedure Tflistadoproducto.bseleccionarClick(Sender: TObject); begin Fmodulo.Tdetallefactura.Fields.FieldByName('Subtotal').AsFloat := cant * Fmodulo.Qproducto.Fields.FieldByName('precio').AsFloat; DBsubtotal.Text := Fmodulo.Tdetallefactura.Fields.FieldByName('Subtotal').AsString; end;

Muchas gracias amigo con esa linea logre reflejar el producto seleccionado en la grilla(detalle) ahora una pregunta mas.. al intentar insertar OTRO producto con el mismo id de factura me salta un error diciendo:
Sql error: duplicate entry '91' (es el id de la factura) for key id_fc_2 ( el id_fc es la clave primaria de la tabla factura pero ese .._2 nose de donde sale).

movorack 21-06-2012 15:07:00

Revisa la estructura de las tablas en el motor. Lo mas probable es que id_fc_2 sea un constraint que creó autiomaticamente.

Si persiste el error haz un paso a paso para identificar el momento del error y poder revisar las estructuras o el código necesario.

Nicolas_2011 23-06-2012 18:11:28

Cita:

Empezado por movorack (Mensaje 435760)
Revisa la estructura de las tablas en el motor. Lo mas probable es que id_fc_2 sea un constraint que creó autiomaticamente.

Si persiste el error haz un paso a paso para identificar el momento del error y poder revisar las estructuras o el código necesario.


Nuevamente gracias, de despistado olvide que en la tabla detalles la fk de factura estaba como unica. Muchas gracias. :D

Nicolas_2011 26-06-2012 15:40:28

Cita:

Empezado por movorack (Mensaje 435651)
Cuando tratas de obtener el valor de un campo de esta manera TQuery["NOMBRECAMPO"], estás forzando un typecast a variant.

Intenta llamando los campos con el tipo de dato que corresponde Fields.FieldByName("").AsXXXXX

Código Delphi [-]procedure Tflistadoproducto.bseleccionarClick(Sender: TObject); begin Fmodulo.Tdetallefactura.Fields.FieldByName('Subtotal').AsFloat := cant * Fmodulo.Qproducto.Fields.FieldByName('precio').AsFloat; DBsubtotal.Text := Fmodulo.Tdetallefactura.Fields.FieldByName('Subtotal').AsString; end;

Amigo espero q lea esto ya que al parecer eres el unico que me supo entender digo esto porque intentando pedirle idea a un profesor le mostre las lineas de codigo. y me las cambio a las q vos me habias dado. diciendo ¿porque tan largo? lo 'acorto' y resulta que no andaba asique tuve q hacerlo de nuevo como vos me explicaste. en fin la duda que le plantee no me la aclaro. espero puedas entenderme

al poder cargar varios productos en la grilla(detallesfactura) cada uno tiene su subtotal (cantidad*precio) ahora... en la tabla facturacompra tengo el campo 'monto total' el cual obviamente se llenara sumando todos los subtotales de la grilla... no logro hacerlo..
me ayudas por favor!!?
:confused:

movorack 26-06-2012 15:57:50

Lo del profesor me deja sin palabras.

Para totalizar, hay varias formas de hacer eso.

- Ir sumando los valores de subtotal en una variable que mostrarás como totalizado y actualizarás en cada operación de adición, edición o resta.
- Recorrer el dataset en cada actualización del detalle para calcular subtotal
- Hacer un SUM con SQL si ya está en la DB (Select SUM(VALOR) from DetFactura where x = y and z > a)

Explora una opción y dices que problemas específicos tienes.

Nicolas_2011 26-06-2012 16:22:07

Cita:

Empezado por movorack (Mensaje 436035)
Lo del profesor me deja sin palabras.

Para totalizar, hay varias formas de hacer eso.

- Ir sumando los valores de subtotal en una variable que mostrarás como totalizado y actualizarás en cada operación de adición, edición o resta.
- Recorrer el dataset en cada actualización del detalle para calcular subtotal
- Hacer un SUM con SQL si ya está en la DB (Select SUM(VALOR) from DetFactura where x = y and z > a)

Explora una opción y dices que problemas específicos tienes.

Bien yo habia comenzado.. con la ultima opcion pero la deje a medias.. habia creado un nuevo Query (Qtotal) con su Dataset(dsttotal) y en la propiedad SQL del qtotal puse esto

Código SQL [-]
SELECT SUM (detalle_factura.Subtotal) AS total
 FROM
detalle_factura, factura_compra, producto
where 
detalle_factura.id_producto = producto.id_producto and 
detalle_factura.id_fc = factura_compra.id_fc and
detalle_factura.id_fc like :fact



Pero Luego no se como seguir ja :o

movorack 26-06-2012 16:58:29

Cita:

Empezado por Nicolas_2011 (Mensaje 436037)
Bien yo habia comenzado.. con la ultima opcion pero la deje a medias..

Código SQL [-]
SELECT SUM (detalle_factura.Subtotal) AS total
 FROM
detalle_factura, factura_compra, producto
where 
detalle_factura.id_producto = producto.id_producto and 
detalle_factura.id_fc = factura_compra.id_fc and
detalle_factura.id_fc like :fact

No veo porque la consulta la debas hacer uniendo a la tabla factura_compra ni a la de producto. con la siguiente sentencia ya obtendrias el resultado de total.

Código SQL [-]
SELECT SUM (Subtotal) AS total
FROM detalle_factura
WHERE detalle_factura.id_fc like :fact

No se porque usas un like, esto podría traerte valores incorrectos. mejor busca el valor exacto.

El problema de esta solución (solo la menciono) es que debes ir por cada inserción y/o actualización a la DB a obtener un resultado que en teoría ya tienes en memoria. generando una carga innecesaria. Para efectos del ejercicio que estás realizando es funcional y no genera ningun problema. pero cuando se trata de muchas estaciones, redes extensas y demás. Detalles como estos hacen diferencia.

Otra posible solución que te planteaba es recorrer el dataset para calcular el resultado. Una función como esta puede servir.

Código Delphi [-]
function ObtTotal(pDataSet : TDataSet; pCampTot : string) : Extended;
  var
    lResult : Extended;
    lBookMark : TBookmark;
begin
  lResult := 0;
  lBookMark := pDataSet.GetBookmark;
  try
    pDataSet.First;
    while not pDataSet.Eof do
    begin
      try
        try
          lResult := lResult + pDataSet.Fields.FieldByName(pCampTot).AsFloat;
        finally
          pDataSet.Next
        end;
      except
        Result := -1;
      end;
    end;
  finally
    if pDataSet.BookmarkValid(lBookMark) then
      pDataSet.GotoBookmark(lBookMark);
    Result := lResult;
  end;
end;

Nicolas_2011 26-06-2012 17:16:37

Cita:

Empezado por movorack (Mensaje 436043)
No veo porque la consulta la debas hacer uniendo a la tabla factura_compra ni a la de producto. con la siguiente sentencia ya obtendrias el resultado de total.

Código SQL [-]SELECT SUM (Subtotal) AS total FROM detalle_factura WHERE detalle_factura.id_fc like :fact


No se porque usas un like, esto podría traerte valores incorrectos. mejor busca el valor exacto.

El problema de esta solución (solo la menciono) es que debes ir por cada inserción y/o actualización a la DB a obtener un resultado que en teoría ya tienes en memoria. generando una carga innecesaria. Para efectos del ejercicio que estás realizando es funcional y no genera ningun problema. pero cuando se trata de muchas estaciones, redes extensas y demás. Detalles como estos hacen diferencia.

Otra posible solución que te planteaba es recorrer el dataset para calcular el resultado. Una función como esta puede servir.

Código Delphi [-]function ObtTotal(pDataSet : TDataSet; pCampTot : string) : Extended; var lResult : Extended; lBookMark : TBookmark; begin lResult := 0; lBookMark := pDataSet.GetBookmark; try pDataSet.First; while not pDataSet.Eof do begin try try lResult := lResult + pDataSet.Fields.FieldByName(pCampTot).AsFloat; finally pDataSet.Next end; except Result := -1; end; end; finally if pDataSet.BookmarkValid(lBookMark) then pDataSet.GotoBookmark(lBookMark); Result := lResult; end; end;

Muy bien estudiare esa posible solicucion ya que varias cosas de las planteaste no manejo. de todas formas entienda o no, me sirva o no. muchas gracias por tu tiempo!


La franja horaria es GMT +2. Ahora son las 22:36:03.

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