Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 20-06-2012
Nicolas_2011 Nicolas_2011 is offline
Miembro
 
Registrado: sep 2011
Posts: 59
Poder: 7
Nicolas_2011 Va por buen camino
Red face 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!

Responder Con Cita
  #2  
Antiguo 20-06-2012
Avatar de movorack
[movorack] movorack is offline
Miembro
 
Registrado: feb 2007
Ubicación: Bogotá - Colombia
Posts: 1.048
Poder: 12
movorack Va camino a la fama
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;
__________________
Buena caza y buen remar... http://mivaler.blogspot.com
Responder Con Cita
  #3  
Antiguo 21-06-2012
Nicolas_2011 Nicolas_2011 is offline
Miembro
 
Registrado: sep 2011
Posts: 59
Poder: 7
Nicolas_2011 Va por buen camino
Red face

Cita:
Empezado por movorack Ver Mensaje
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).
Responder Con Cita
  #4  
Antiguo 21-06-2012
Avatar de movorack
[movorack] movorack is offline
Miembro
 
Registrado: feb 2007
Ubicación: Bogotá - Colombia
Posts: 1.048
Poder: 12
movorack Va camino a la fama
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.
__________________
Buena caza y buen remar... http://mivaler.blogspot.com
Responder Con Cita
  #5  
Antiguo 23-06-2012
Nicolas_2011 Nicolas_2011 is offline
Miembro
 
Registrado: sep 2011
Posts: 59
Poder: 7
Nicolas_2011 Va por buen camino
Cita:
Empezado por movorack Ver Mensaje
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.
Responder Con Cita
  #6  
Antiguo 26-06-2012
Nicolas_2011 Nicolas_2011 is offline
Miembro
 
Registrado: sep 2011
Posts: 59
Poder: 7
Nicolas_2011 Va por buen camino
Cita:
Empezado por movorack Ver Mensaje
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!!?
Responder Con Cita
  #7  
Antiguo 26-06-2012
Avatar de movorack
[movorack] movorack is offline
Miembro
 
Registrado: feb 2007
Ubicación: Bogotá - Colombia
Posts: 1.048
Poder: 12
movorack Va camino a la fama
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.
__________________
Buena caza y buen remar... http://mivaler.blogspot.com
Responder Con Cita
  #8  
Antiguo 26-06-2012
Nicolas_2011 Nicolas_2011 is offline
Miembro
 
Registrado: sep 2011
Posts: 59
Poder: 7
Nicolas_2011 Va por buen camino
Cita:
Empezado por movorack Ver Mensaje
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
Responder Con Cita
  #9  
Antiguo 26-06-2012
Avatar de movorack
[movorack] movorack is offline
Miembro
 
Registrado: feb 2007
Ubicación: Bogotá - Colombia
Posts: 1.048
Poder: 12
movorack Va camino a la fama
Cita:
Empezado por Nicolas_2011 Ver Mensaje
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;
__________________
Buena caza y buen remar... http://mivaler.blogspot.com
Responder Con Cita
  #10  
Antiguo 26-06-2012
Nicolas_2011 Nicolas_2011 is offline
Miembro
 
Registrado: sep 2011
Posts: 59
Poder: 7
Nicolas_2011 Va por buen camino
Cita:
Empezado por movorack Ver Mensaje
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!
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
¿Como calcular un campo basado en otro campo de otra fila (registro)? AzidRain MySQL 9 19-12-2011 12:34:42
Could not convert variant of type (Null) into type (Integer) Alejo15x Varios 2 30-11-2010 18:35:50
Sql que no retorna datos me da error:invalid variant type conversion bezaig SQL 6 17-03-2010 09:58:53
Insertar en un campo tipo BLOB un Variant adebonis Varios 1 23-03-2009 19:22:45
Database Desktop, Type Mismatch Expression en campo fecha fjolivares SQL 1 19-01-2005 14:45:53


La franja horaria es GMT +2. Ahora son las 02:11:34.


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