Ir al contenido


Foto

Cálculo tipo currency en un dbedit (no hay forma ¡¡¡¡buuuuaaaaa!!!!!)


  • Por favor identifícate para responder
26 respuestas en este tema

#1 Marcmiralles

Marcmiralles

    Advanced Member

  • Miembros
  • PipPipPip
  • 108 mensajes
  • LocationEspaña

Escrito 19 abril 2011 - 04:19

Hola Comunidad:

Tengo otro problema de novato que resolver.

En el formulario de facturas tengo varios dbedit que apuntan a un campo de tipo decimal (10,2) (mySQL 5) y al que le he puesto a true la propiedad currency, hasta aquí todo muy bonito ya que sale con el formato correcto y con la €.

Ahora el tema que me trae loco desde hace unos días es como le imputo el resultado del calculo de las líneas de la factura. Es decir, tengo un valor pongamos de 50,60 (Real o doble o Float) he probado con todos ellos i no hay forma de poner el valor al dbedit y luego guardarlo con un post. He probado a entrarlo desde dbeditsubtotal.field.ascurrency, desde dbeditsubtotal.text, desde QCabFact.fieldbyname('subtotal').asCurrency, etc y no hay forma de que me lo acepte, ¿como hago para poner este valor en el campo que está marcado como currency?, he probado mil formas y todas dan error. :embarrassed: :cry:

Gracias

Marc Miralles




  • 0

#2 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 19 abril 2011 - 04:58

Hola Marc.

Desde luego no entiendo que problema debería haber en un código del tipo :



delphi
  1. var Valor: Double;
  2. ...
  3. ...
  4. if not (QCabFact.State in [dsEdit, dsInsert]) then QCabFact.Edit;
  5. QCabFact.fieldbyname('subtotal').Value := Valor;
  6. QCabFact.Post;



¿ Nos puedes poner alguno de los códigos que has probado y los errores que te saltan ?.

Salutacions.
  • 0

#3 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 19 abril 2011 - 05:05

Por cierto, el error lo puedes tener en el evento OnChange del campo, en el evento AfterPost, etc. ...


  • 0

#4 Marcmiralles

Marcmiralles

    Advanced Member

  • Miembros
  • PipPipPip
  • 108 mensajes
  • LocationEspaña

Escrito 19 abril 2011 - 04:43

Gracias Marc, no he estado en el ordenador en todo el día. Voy a probar lo que me dices y te cuento. En las mil pruebas creo que hice algo parecido, y que me decía que el valor no era un float correcto, ya que al ser un currency lleva al € detrás. traté de pasarlo a float y a string (currtofloat y currtostr) y todo me daba error. Ahora estoy en la taller y no puedo hacer pruebas. Mañana las hago y cuento el resultado, a parte de poner el código y el error

Salut.

Marc Miralles.
  • 0

#5 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 19 abril 2011 - 07:55

Hola Marcmiralles,

No utilizo Lázarus por lo que no sabría si los mensajes de errores (mejor dicho, excepciones) son similares a los de Delphi. ¿Por casualidad el mensaje no es algo como "is not a valid floating point value"?
De ser así el problema está en el uso del símbolo decimal cuando lo escribes en el DBEdit y no en problema numérico o de conflicto de tipo.

Para ayudarte debemos conocer el error exacto y el código. No podemos estar adivinando donde está el problema.

Saludos,
  • 0

#6 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 20 abril 2011 - 02:22

Creo que intentas meter ese valor en el DBEdit.Text, lo cual no es muy correcto, deberias meterlo en el campo que muestra ese dbedit, usando "Campo.value:=" ó "Campo.AsFloat:=" tal como te comenta Marc.

Piensa que el dbedit muestra un texto sacado a partir del valor numerico (60.52 te lo muestra como "60,52 €", por ejemplo) y ese texto puede ser "read only" o dificil de manipular como poco, mientras que el campo al que apunta ese dbedit tiene su value que se puede manipular como una simple variable (y el dbedit ya se encargará de actualizar el texto por si mismo).
  • 0

#7 Marcmiralles

Marcmiralles

    Advanced Member

  • Miembros
  • PipPipPip
  • 108 mensajes
  • LocationEspaña

Escrito 20 abril 2011 - 09:45

Hola Marcmiralles,

No utilizo Lázarus por lo que no sabría si los mensajes de errores (mejor dicho, excepciones) son similares a los de Delphi. ¿Por casualidad el mensaje no es algo como "is not a valid floating point value"?
De ser así el problema está en el uso del símbolo decimal cuando lo escribes en el DBEdit y no en problema numérico o de conflicto de tipo.

Para ayudarte debemos conocer el error exacto y el código. No podemos estar adivinando donde está el problema.

Saludos,


El error que me da es:

Invalid argument index in format ""

y el código en cuestión (no es el definitivo sino el de prueba para conseguir meter el dichoso valor en el "*&%$"· DBEdit)


delphi
  1.       QAddLinVentas.post;
  2.       Subtotal :=StrToFloat(txtTotalArt.text); //Aquí hay el valor del calculo del precio del artículo * la cantidad (Dtos, iva, etc)
  3.       label7.caption := CurrToStr(subtotal); // para ver que valor tiene (es algo temporal en plan depurador)
  4.       QCabVentas.Edit;
  5.       //Subtotal := Subtotal + StrToCurr(txtPrecio.text);
  6.  
  7.       QCabVentassubtotal.Value := SubTotal; //El valor trato de meterlo directamente en el campo como me habéis dicho, antes tenía txtSubtotal.text := StrtoCurr(Subtotal); y me daba el mismo error.
  8.       QCabVentas.Post; 



Ayuda please, tiene que ser una cosa de las más tontas.

Saludos

Marc Miralles


  • 0

#8 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 20 abril 2011 - 10:40

Con que procedimiento obtienes el valor de:



delphi
  1. TextTotalArt.Text



De tu respuesta depende el poder afinar el resto del algoritmo de forma adecuada.

Saludos

  • 0

#9 Marcmiralles

Marcmiralles

    Advanced Member

  • Miembros
  • PipPipPip
  • 108 mensajes
  • LocationEspaña

Escrito 20 abril 2011 - 10:48

Con que procedimiento obtienes el valor de:



delphi
  1. TextTotalArt.Text



De tu respuesta depende el poder afinar el resto del algoritmo de forma adecuada.

Saludos



Ahora para las pruebas de esta forma:



delphi
  1. txtTotalArt.Text := FormatFloat('0.00',QArticulos.FieldByName('pvp').AsFloat)
  2. Saludos Marc Miralles


  • 0

#10 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 20 abril 2011 - 11:02

Lo ideal fuera pasarle directamente:



delphi
  1. Subtotal :=  QArticulos.FieldByName('pvp').AsFloat;
  2. TextTotalArt.Text := QArticulos.FieldByName('pvp').Text;
  3.  
  4. // o tambbién
  5.  
  6. TextTotalArt.Text := FloatToStr( SubTotal, '0.00')



Saludos.

PD: Si no lo quieres así, puedes ensayar a cambiar el formato  de una coma en vez del punto, solo por probar porque esto podría darte problemas de acuerdo a la configuración regional en otro PC.



delphi
  1. txtTotalArt.Text := FormatFloat('0,00',QArticulos.FieldByName('pvp').AsFloat)


  • 0

#11 Marcmiralles

Marcmiralles

    Advanced Member

  • Miembros
  • PipPipPip
  • 108 mensajes
  • LocationEspaña

Escrito 20 abril 2011 - 03:34



TextTotalArt.Text := FloatToStr( SubTotal, '0.00')


Hola Wilson:

Esta opción que me dices y que parece muy lógica devuelve este error al compilar:


Forms/tpv.pas(189,56) Error: Incompatible type for arg no. 2: Got "Constant String", expected "TFormatSettings"

¿alguna idea de porqué?

Saludos

Marc Miralles

  • 0

#12 Marcmiralles

Marcmiralles

    Advanced Member

  • Miembros
  • PipPipPip
  • 108 mensajes
  • LocationEspaña

Escrito 20 abril 2011 - 03:46

Hola Marc.

Desde luego no entiendo que problema debería haber en un código del tipo :



delphi
  1. var Valor: Double;
  2. ...
  3. ...
  4. if not (QCabFact.State in [dsEdit, dsInsert]) then QCabFact.Edit;
  5. QCabFact.fieldbyname('subtotal').Value := Valor;
  6. QCabFact.Post;



¿ Nos puedes poner alguno de los códigos que has probado y los errores que te saltan ?.

Salutacions.


He añadido tu código dentro del programa y me salta la excepción :

EconverterrorEconverterror

Invalid argument index in format ""  :undecided: ¿Alguna idea?  ¿Que estoy haciendo mal?

Salut

Marc Miralles
  • 0

#13 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 20 abril 2011 - 04:23






TextTotalArt.Text := FloatToStr( SubTotal, '0.00')


Hola Wilson:

Esta opción que me dices y que parece muy lógica devuelve este error al compilar:


Forms/tpv.pas(189,56) Error: Incompatible type for arg no. 2: Got "Constant String", expected "TFormatSettings"

¿alguna idea de porqué?

Saludos

Marc Miralles


Ensaya con



delphi
  1. TextTotalArt.Text := FormatFloat('0.00',Subtotal)


  • 0

#14 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 21 abril 2011 - 12:54




TextTotalArt.Text := FloatToStr( SubTotal, '0.00')


Hola Wilson:

Esta opción que me dices y que parece muy lógica devuelve este error al compilar:


Forms/tpv.pas(189,56) Error: Incompatible type for arg no. 2: Got "Constant String", expected "TFormatSettings"

¿alguna idea de porqué?

Saludos

Marc Miralles


No utilizo la función FloatToStr, pero tiene todo el aspecto de algún error en el paso de los parámetros (según la ayuda de Delphi solo tiene un parámetro).

Personalmente utilizo la función FormatFloat :

TextTotalArt.Text := FormatFloat('0.00', SubTotal);

Salutacions.

  • 0

#15 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 21 abril 2011 - 12:59

Hola Marc.


Hola Marc.

Desde luego no entiendo que problema debería haber en un código del tipo :



delphi
  1. var Valor: Double;
  2. ...
  3. ...
  4. if not (QCabFact.State in [dsEdit, dsInsert]) then QCabFact.Edit;
  5. QCabFact.fieldbyname('subtotal').Value := Valor;
  6. QCabFact.Post;



¿ Nos puedes poner alguno de los códigos que has probado y los errores que te saltan ?.

Salutacions.


He añadido tu código dentro del programa y me salta la excepción :

EconverterrorEconverterror

Invalid argument index in format ""    ¿Alguna idea?  ¿Que estoy haciendo mal?

Salut

Marc Miralles


¿ En qué linea ?.

¿ En : QCabFact.fieldbyname('subtotal').Value := Valor; siendo SubTotal un campo Float y Valor una variable Double ?. La verdad es que no parece tener mucho sentido, ¿ seguro que no tienes más código en el evento OnChange del campo ?.

Aunque la verdad es que tampoco sé a que se refiere el error con lo del formato con una cadena vacía. ¿ Porqué no borras el campo persistente y lo vuelves a crear ?, no sea que te haya quedado alguna propiedad defectuosa.

Salutacions.
  • 0

#16 Marcmiralles

Marcmiralles

    Advanced Member

  • Miembros
  • PipPipPip
  • 108 mensajes
  • LocationEspaña

Escrito 21 abril 2011 - 05:30

Hola Marc.

¿ En qué linea ?.

¿ En : QCabFact.fieldbyname('subtotal').Value := Valor; siendo SubTotal un campo Float y Valor una variable Double ?. La verdad es que no parece tener mucho sentido, ¿ seguro que no tienes más código en el evento OnChange del campo ?.

Aunque la verdad es que tampoco sé a que se refiere el error con lo del formato con una cadena vacía. ¿ Porqué no borras el campo persistente y lo vuelves a crear ?, no sea que te haya quedado alguna propiedad defectuosa.

Salutacions.


Lo que te dije, lo que no me pase a mi, jejeje.

No, no hay código en ningún otro evento, de hecho quien hace todo ello es un botón y sólo hay código en el evento del click. He borrado los objetos varias veces, lo que no he probado como dices es a cargarme el campo persistente (no sabía que se llamaba así en Lazarus) .  Lo del formato así de la cadena vacía ¿no puede ser porqué le he dicho en las propiedades del campo que es de tipo currency? ¿no será algo de ZEOS?.

Snif, Snif.


Salut

Marc
  • 0

#17 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 22 abril 2011 - 12:09

¿ Puedes hacer y colgar un proyecto de prueba para que lo probemos ?, con un formulario basta.

Salutacions.
  • 0

#18 Marcmiralles

Marcmiralles

    Advanced Member

  • Miembros
  • PipPipPip
  • 108 mensajes
  • LocationEspaña

Escrito 22 abril 2011 - 02:29

¿ Puedes hacer y colgar un proyecto de prueba para que lo probemos ?, con un formulario basta.

Salutacions.



Voy a ello y lo subo. Está enlazado a una bd mySQL con 4 campos, también añado el código SQL para crearla

El primer campo currency al cambiar el valor deberís realizar la suma de éste más el segundo valor y lo debería guardar en el tercer campo.

A ver si con esto lo arreglamos

Gracias Marc y todos los demás.

Salut

Marc Miralles

Archivos adjuntos


  • 0

#19 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 23 abril 2011 - 02:41

Hola Marc.

¿ En que linea salta el error ?

1) importe := StrToFloat(DBEdit3.Text) + StrToFloat(DBEdit4.Text);
2) QPruebas.FieldByName('importe3').AsFloat:= importe;

Imagino que saltará en la primera línea, ya que parece inexplicable que pueda saltar en la segunda.

Como dices en otro mensaje, esta versión de Lazarus no identifica correctamente el separador de decimales en las cadenas. En cuyo caso será mejor que nos centremos en el otro hilo que tienes abierto, puesto que el problema no es del DbEdit.

Pero aunque ciertamente, seguro que hay alguna forma de corregir el error para que el StrToFloat funcione como debería, yo simplemente no lo utilizaría, puesto que no me parece la mejor forma de enfocar este cálculo.

DbEdit3 y DbEdit4 están enlazados a campos, por lo tanto es mucho más aconsejable realizar el cálculo directamente sobre los campos implicados.

Es decir, algo de este estilo :

QPruebas.FieldByName('importe3').AsFloat:= QPruebas.FieldByName('Base').AsFloat + QPruebas.FieldByName('IVA').AsFloat;

NOTA: Por cierto, una forma radical pero efectiva de solventar el problema de conversión, es  implementar tu propia función de conversión de cadenas a decimales. De  forma que ya no dependes de librerías externas con potenciales bugs como  el que te has encontrado.

Salutacions.
  • 0

#20 Marcmiralles

Marcmiralles

    Advanced Member

  • Miembros
  • PipPipPip
  • 108 mensajes
  • LocationEspaña

Escrito 23 abril 2011 - 02:49

Creo que intentas meter ese valor en el DBEdit.Text, lo cual no es muy correcto, deberias meterlo en el campo que muestra ese dbedit, usando "Campo.value:=" ó "Campo.AsFloat:=" tal como te comenta Marc.

Piensa que el dbedit muestra un texto sacado a partir del valor numerico (60.52 te lo muestra como "60,52 €", por ejemplo) y ese texto puede ser "read only" o dificil de manipular como poco, mientras que el campo al que apunta ese dbedit tiene su value que se puede manipular como una simple variable (y el dbedit ya se encargará de actualizar el texto por si mismo).


¡¡¡¡¡¡Por fin!!!!!!! :cheesy:
Pues en el ReadOnly del campo está todo el problema; ni siquiera me había dado cuenta, ya que se debe poner así al cambiar la propiedad Currency a True. Leñe, suerte que leyendo y releyendo y analizando el código que muestra la excepción  y que es el del formateo he visto que ponía readonly. Entonces he cambiado esta propiedad, la he puesto a false  y voila!!!!, todo bien.

Aquí está el código tal y como funciona de P.M.:


delphi
  1.       QCabVentassubtotal.ReadOnly:=false;
  2.       Subtotal := QCabVentassubtotal.Value+ StrtoFloat(txtTotalArt.text);
  3.       QCabVentas.Edit;
  4.       QCabVentas.fieldbyname('subtotal').Value := FormatFloat('0.00',subtotal);
  5.       QCabVentas.Post;
  6.       QCabVentassubtotal.ReadOnly:= true; 



Una tontería más de las que te hacen volver loco, sobre todo cuando empiezas con un lenguaje. Suerte que de Lazarus ya estoy loquito y perdidamente enamorado.  :kiss:



Gracias, a Todos por vuestro interés y ayuda

Marc Miralles
  • 0




IP.Board spam blocked by CleanTalk.