Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Invalid class typecast (https://www.clubdelphi.com/foros/showthread.php?t=95149)

muli 08-04-2021 10:27:44

Invalid class typecast
 
Hola buenos dias, estoy totalmente desencajado con este error que me sale ahora en Delphi Rio, lo llevo usando desde Delphi 6 y nunca tuve ningún problema, resulta que cuando abro una consulta(query) recorro los campos del mismo y asigno propiedades de displayformat, trabajo con Firebird 2.5 y pongo el código en cuestión, antes no usaba la variable campo

Código Delphi [-]
Procedure TDatos.Query1AfterOpen(DataSet: TDataSet);
var
  n:Integer;
  Campo : String;

begin
  For N:=0 to Query1.FieldCount-1 Do
  Begin
    if Query1.Fields[n].DataType =  ftBCD then
    Begin
      (Query1.Fields[N] as tBCDfield).displayformat:='##,##0.00 €';
    End;
    Campo:=UpperCase(Query1.Fields[N].FieldName);
    if Campo='GRAVAME' then
    Begin
      (Query1.Fields[N] as tBCDfield).displayformat:='##,##0.00 %';
    End;
    if Campo='BONIFICACION' then
    Begin
      (Query1.Fields[N] as tBCDfield).displayformat:='##,##0.00 %';
    End;
  End;
end;

Garada 08-04-2021 14:27:12

Buenas.

No debes usar la misma clase que asignaría Delphi a esos campos.

Añade la consulta y los campos en diseño y echa un vistazo para averiguar que clase asigna a esos campos para que la uses en vez de tBCDfield
O revisa Query1.Fields[N].classname en tiempo de ejecución.

cloayza 08-04-2021 19:19:38

Coincido con el amigo Garada.

Te propongo lo siguiente:
Código Delphi [-]

Procedure TDatos.Query1AfterOpen(DataSet: TDataSet);
var
  i:Integer;
  Sufix:String;
begin
     For i:=0 to Query1.FieldCount-1 Do
     Begin
            Sufix:='€';
          if (Query1.Fields[i].Fieldname='GRAVAME' or Query1.Fields[i].Fieldname='BONIFICACION') then
             Sufix:='%'
          endif

          Case (Query1.Fields[i].DataType) Of
              ftSmallint:TSmallIntField(Query1.Fields[i]).DisplayFormat :='##,##0 '+Sufix;
              ftInteger :TIntegerField(Query1.Fields[i]).DisplayFormat  :='##,##0 '+Sufix;
              ftFloat   :TFloatField(Query1.Fields[i]).DisplayFormat   :='##,##0.00 '+Sufix;
          End;
     End;
end;
Saludos cordiales

muli 08-04-2021 20:08:23

Gracias por vuestras aportaciones. He visto que lo que antes era

tBCDfield ahora es tFMTBCDfield

Y en el DataType

ftBCD ahora es ftFMTBCD

Cambiando eso ya todo funciona como antes. El campo en la base de datos está definido como Numeric(15,2).

Saludos. a todos.


La franja horaria es GMT +2. Ahora son las 15:07:32.

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