Tá funkcia/event funguje. Len je treba Castnúť funkciu v rámce SELECT.
Napríklad:
Potom sa dá čítať Field.AsBcd a aj Field.AsAnsiString.
Ak sa necastne, dá sa čítať len Field.AsAnsiString.
Ano, protoze FireDAC s nastavenim
AOutput.AsNumber pouzije datovy typ
SQLITE_TEXT s konverzi na hodnotu s desetinnou teckou. V datasetu se pak o tom UDF sloupci (bez toho
::DataType hintu) vi pouze to ze je typu
SQLITE_TEXT. Tudiz pro nej FireDAC vyrobi
TStringField a hodnoty ve storage jsou s desetinnou teckou (a pokud mas system nastaveny jinak nez na tecku,
AsBcd selze).
Ty vracis hodnotu pres
AOutput.AsString (taktez datoveho typu
SQLITE_TEXT) s desetinnym separatorem ze systemu (coz Ti tim padem zfunkcni
AsBcd). Na stejny problem jako na zacatku vsak v tomto pripade narazis pokud v SQL prikazu pouzijes typecast typu
AS [rslt::Numeric(30,0)] (FireDAC pro takovy sloupec ocekava hodnoty s teckou).
Zaverem, v tomto pripade bych se snazil spis prizpusobit a pro konverzi hodnot techto sloupcu na BCD pouzil fixne desetinnou tecku, tedy vytvoril bych napr. helper (cimz se dostanes k implementaci toho co jsem
predtim radil):
type
TFieldHelper = class helper for TField
public
function AsBCD(const Format: TFormatSettings): TBcd;
end;
implementation
{ TFieldHelper }
function TFieldHelper.AsBCD(const Format: TFormatSettings): TBcd;
begin
if not (Self is TStringField) then
Result := GetAsBCD
else
Result := StrToBcd(GetAsString, Format);
end;
Pouziti pak:
var
Value: TBcd;
Settings: TFormatSettings;
begin
Settings := TFormatSettings.Create;
Settings.DecimalSeparator := '.';
Value := FDQuery1.Fields[0].AsBCD(Settings);
end;
Nakonec, ono by vraceni hodnoty s carkou z te UDF mohlo mit negativni vliv napr. pri ukladani hodnoty do sloupce s affinity
NUMERIC.