Club Delphi  
    Paypal   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

Coloboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 31-03-2012
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.572
Poder: 27
egostar Va camino a la fama
Alberto

¿Te interesa saber lo que resulta en Delphi4 ?

Si te interesa, lo instalo para hacer la prueba.

Saludos
Responder Con Cita
  #2  
Antiguo 31-03-2012
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 28
Delphius Va camino a la fama
¿Y no será que el problema está en la traducción de un TBCD al Variant? De la ayuda leo que existen estas funciones sobrecargadas:

Código Delphi [-]
procedure VarFMTBcdCreate(var aDest: Variant; const ABcd: TBcd); overload;
function VarFMTBcdCreate: Variant; overload;
function VarFMTBcdCreate(const ABcd: TBcd): Variant; overload;
function VarFMTBcdCreate(const AValue: string, Precision, Scale: SmallInt): Variant; overload;
function VarFMTBcdCreate(const AValue: Double; Precision: SmallInt = 18; Scale: SmallInt = 4): Variant; overload;

Pero en tu código tu haces simplemente esto:

Código Delphi [-]
V := VarFMTBcdCreate (149.88)

Por lo que utilizas esta:
Código Delphi [-]
function VarFMTBcdCreate(const AValue: Double; Precision: SmallInt = 18; Scale: SmallInt = 4): Variant;

Si tu idea es tener una representación TBCD desde un Double, ¿porqué no directamente emplear DoubleToBCD?. Nos evitamos trabajar con el Variant en formato TBCD:

Código Delphi [-]
function DoubleToBcd( const aValue: Double): TBcd; overload;
procedure DoubleToBcd( const aValue: Double, var bcd: TBcd; overload;

En el TFMTBCDField cuando uno trabaja con el AsCurrency internamente hace las conversiones desde el Double. Por ejemplo, al leer la propiedad se invoca a GetAsCurrency:

Código Delphi [-]
function TFMTBCDField.GetAsCurrency: Currency;
begin
  Result := GetAsFloat;
end;

Lo que se vé que utiliza al tipo Double para hacer el trabajo:

Código Delphi [-]
function TFMTBCDField.GetAsFloat: Double;
var
  bcd: TBcd;
begin
  if not GetValue(bcd) then
    Result := 0
  else
    Result := BcdToDouble(bcd);  
end;

Por tanto.

Hasta el momento yo no he utilizado Variant. Me manejo con las propiedades AsTipoConcreto, como en este caso el que tu dices, AsCurrency. De todas formas a tener en cuenta esto.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #3  
Antiguo 31-03-2012
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 28
Delphius Va camino a la fama
Aunque también se ha de tener ciertos cuidados si resulta ser que el problema estuviera en todas las funciones sobrecargadas que listé antes.

Si uno escribe en la propiedad AsCurrency tiene lugar esto:

Código Delphi [-]
procedure TFMTBCDField.SetAsCurrency(Value: Currency);
var
  VMax, VMin: Variant;
  FValue: TBcd;
begin
  CurrToBcd(Value, FValue, MaxBcdPrecision, MaxBcdScale);
  if FCheckRange then
  begin
    VMax := VarFMTBcdCreate(FMaxValue, Self.Precision, Self.Size);
    VMin := VarFMTBcdCreate(FMinValue, Self.Precision, Self.Size);
    if (Value < VMin) or (Value > VMax) then
      BcdRangeError(Value, VMin, VMax);
  end;
  SetData(@FValue, False);
end;

Como se ve, si para el el campo se ha definido un rango se va a intentar comparar el valor contra el máximo y mínimo variant TBCD. Si esta versión sobrecargada sufre del mismo problema se nos viene abajo todo.

Al, Ya me hiciste poner en true mi propiedad ModeParanoid.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #4  
Antiguo 31-03-2012
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.618
Poder: 32
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Eliseo: No es tan urgente averiguar si pasa lo mismo en Delphi 4.

Marcelo: Miraré de nuevo esas funciones y comento luego.

Muchas gracias a ambos.
__________________
Tras casi seis años de trabajar para una empresa alemana como desarrollador Delphi, se vieron forzados a dejarme ir (temas presupuestales). Así que ahora estoy abierto a escuchar nuevas ofertas.
Responder Con Cita
  #5  
Antiguo 31-03-2012
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 28
Delphius Va camino a la fama
Cita:
Empezado por Al González Ver Mensaje
Eliseo: No es tan urgente averiguar si pasa lo mismo en Delphi 4.

Marcelo: Miraré de nuevo esas funciones y comento luego.

Muchas gracias a ambos.
No tienes que agradecer amigo. Ya tenía Delphi abierto así que no me costaba darme un tiempo a hacer esa prueba.
Menos mal que abriste el hilo porque estoy utilizando justamente la clase TFMTBDCDField que internamente todo pasa por el AsCurrency y ese SetAsCurrency ya me dio cosa.

Que yo recuerde no tuve problemas, pero si el defecto está presente en todo el uso del Variant TBDC es posible que truene en cualquier lado y momento.
Mantenos informados.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #6  
Antiguo 24-04-2012
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 28
Delphius Va camino a la fama
¿Al, tuviste tiempo como para ver a que va el error o algunas novedades?

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #7  
Antiguo 24-04-2012
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.618
Poder: 32
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Hola Marcelo.

No he tenido tiempo de ver a detalle el problema (hoy se me fue la mitad del día buscando una casa de empeños que aceptara relojes Relic).

En su momento, para salir del paso, redefiní el método GetAsVariant en una clase interpuesta:

Código Delphi [-]
Function TFmtBCDField.GetAsVariant :Variant;
Begin
  { NOTA: Esta redefinición resuelve defecto presentado en Delphi 7 y
    otras versiones anteriores a la 2007, relacionado con la división y
    multiplicación de variantes BCD con valores Currency
    (http://www.clubdelphi.com/foros/showthread.php?t=78225). }

  Result := Inherited GetAsVariant;

  { Evitamos que el valor devuelto sea variante de tipo BCD,
    sustituyéndolo por un variante de tipo Currency }
  If Not VarIsNull (Result) Then
    Result := System.Currency (Result);
End;

Eso me basta para el proyecto en cuestión, dado que todos los campos FmtBCD que utilizo son para cantidades monetarias. En otros casos, quizá podría añadirse a ese mismo If una verificación de la propiedad Currency (de tipo Boolean y que solamente tiene impacto en el formato de despliegue).

De todas formas, tengo los fuentes de Delphi 7 y 2007, así que sólo es cosa de encontrar un hueco de tiempo (un hueco sin preocupaciones "primitivas") para echar una mirada en las funciones involucradas y encontrar la diferencia, es decir, esa corrección que evidentemente trae Delphi al menos desde la versión 2007.

¿Los demás han podido adelantarse a ver algo de esto?

Saludos.
__________________
Tras casi seis años de trabajar para una empresa alemana como desarrollador Delphi, se vieron forzados a dejarme ir (temas presupuestales). Así que ahora estoy abierto a escuchar nuevas ofertas.
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
Premium, A mi me lo quitan tambien? poliburro La Taberna 16 06-01-2009 00:00:52
Currency to float david duarte Varios 2 14-11-2006 16:53:22
Error dando formato a un TFMTBCDField HiroProtagonist Conexión con bases de datos 7 18-05-2006 00:46:04
Error de Currency Epunamun OOP 2 05-12-2005 23:41:25
Como cambiar TBcdField a TFMTBcdField Ricardo Alfredo Varios 0 31-12-2004 16:07:55


La franja horaria es GMT +2. Ahora son las 19:32:02.


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