Когда у меня есть ClientDataset с полями datetime и decimal (5,2), Delphi 10.4 не может отображать их в TDBGrid, возникает исключение convert.
Я подготовил небольшой тестовый проект, чтобы показать эту ошибку (мои настоящие данные поступают из SQL Server, хотя я могу получить ту же ошибку, заполнив Clientdataset вручную).
procedure TForm1.FormCreate(Sender: TObject);
var ClientDataset: TClientDataset;
Datasource: TDatasource;
DBGrid: TDBGrid;
begin
ClientDataset := TClientDataset.Create(Self);
ClientDataset.FieldDefs.Add('Id', ftInteger);
ClientDataset.FieldDefs.Add('Date', ftDateTime);
ClientDataset.FieldDefs.Add('Decimal', ftBCD, 2);
ClientDataset.FieldDefs.Find('Decimal').Precision := 5;
ClientDataset.CreateDataSet;
Datasource := TDatasource.Create(Self);
Datasource.Dataset := ClientDataset;
ClientDataset.Insert;
ClientDataset.FieldValues['id'] := 1;
ClientDataset.FieldValues['Date'] := Now;
ClientDataset.FieldValues['Decimal'] := 7.55;
ClientDataset.Post;
ClientDataset.Insert;
ClientDataset.FieldValues['id'] := 2;
ClientDataset.FieldValues['Date'] := Now;
ClientDataset.FieldValues['Decimal'] := 8.2;
ClientDataset.Post;
DBGrid := TDBGrid.Create(Self);
DBGrid.Parent := Self;
DBGrid.Align := alClient;
DBGrid.Datasource := Datasource;
end;
Возникает это исключение: '8200@' is not a valid integer value
Десятичное число (18,2) не имеет этой проблемы, если я прокомментирую строку ClientDataset.FieldDefs.Find('Decimal').Precision := 5;
, то ошибки не возникнет.
Кроме того, если нет поля datetime, то ошибка также не возникает. Это нормально работает:
procedure TForm1.FormCreate(Sender: TObject);
var ClientDataset: TClientDataset;
Datasource: TDatasource;
DBGrid: TDBGrid;
begin
ClientDataset := TClientDataset.Create(Self);
ClientDataset.FieldDefs.Add('Id', ftInteger);
ClientDataset.FieldDefs.Add('Decimal', ftBCD, 2);
ClientDataset.FieldDefs.Find('Decimal').Precision := 5;
ClientDataset.CreateDataSet;
Datasource := TDatasource.Create(Self);
Datasource.Dataset := ClientDataset;
ClientDataset.Insert;
ClientDataset.FieldValues['id'] := 1;
ClientDataset.FieldValues['Decimal'] := 7.55;
ClientDataset.Post;
ClientDataset.Insert;
ClientDataset.FieldValues['id'] := 2;
ClientDataset.FieldValues['Decimal'] := 8.2;
ClientDataset.Post;
DBGrid := TDBGrid.Create(Self);
DBGrid.Parent := Self;
DBGrid.Align := alClient;
DBGrid.Datasource := Datasource;
end;
Как вы думаете, можно ли это исправить, не заменяя все мои десятичные (5,2) поля на десятичные (18,2)?
ОБНОВЛЕНИЕ. Это проблема, специфичная для ClientDataset. Если я открою те же данные в TADOQuery или TFDMemTable (с точно такими же полями datetime и decimal (5,2) BCD), Delphi 10.4 покажет DBGrid без каких-либо проблем.
Проблема также специфична для DBGrid. Нет проблем с отображением этих полей в DBEdits.
TFDMemTable
? - person Olivier   schedule 04.08.2020