无法分配数据给客户端的数据集(Cannot assign data to client datase

2019-10-29 04:13发布

我使用TClientDataSet在我的Delphi应用程序来比较位于2个不同的数据库2个表之间的数据与本地数据分配。 事情我使用:

  • SpPlansQuery: TADOQuery -原始数据查询
  • PPUQuery: TADOQuery -改变了数据查询(使用比SpPlansQuery不同ADO连接)
  • ComparisonDataSet: TClientDataSet -数据集显示前面2个查询之间的唯一区别

我试图填补ComparisonDataSet如下(我严重减少我的代码以突出的问题):

procedure TComparisonSpPlanForm.RefillDataSet;
const
  // IMPORTANT: check that fields count in next 2 lines would be the same
  FieldsStr1 = 'Article_PPU;Contractor_S_PPU;Recipient_S_PPU;OrderNum_PPU;OrderNum2_PPU;OrdN_PPU;Title_PPU;Queue_PPU;KolSht_PPU;Weight1_PPU;Material_PPU;Drawing_PPU;Graph_PPU';
  FieldsStr2 = 'Title_1;Title_3;Title_4;num;inum;onum;Title;QNum;num_of;weight;Title_2;Drawing;Graph';
var
  Deleted: Boolean;
  FieldValues2: Variant;
  FieldValues1: Variant;
begin
  ComparisonDataSet.DisableControls;
  // clear ComparisonDataSet
  if ComparisonDataSet.Active then
    ComparisonDataSet.Close;
  ComparisonDataSet.CreateDataSet;
  // deleted records
  SpPlansQuery.First;
  while not SpPlansQuery.Eof do
  begin
    FieldValues1 := SpPlansQuery[ReplaceStr(FieldsStr1, '_PPU', '')];
    Deleted := not PPUQuery.Locate('ID', Integer(SpPlansQuery['PPONREC']), []);
    if Deleted then
    begin
      ComparisonDataSet.Append;
      // next string throws exception and this is a big problem
      ComparisonDataSet[ReplaceStr(FieldsStr1, '_PPU', '')] := FieldValues1; 
      ComparisonDataSet.Post;
    end;
    SpPlansQuery.Next;
  end;
  ComparisonDataSet.First;
  ComparisonDataSet.EnableControls;
end;

至于你可以猜到,ComparisonDataSet包含命名字段ARTICLEARTICLE_PPU和异常,并出现“无法转换变量类型(空)的成式(整数)”当我尝试赋值将发生ComparisonDataSet['ARTICLE'] 我知道这是因为我想直接到现场指定,但得到了同样的结果。

ARTICLE是具有20个字符长度的字符串字段。

任何人都可以点我如何将值分配给一个TClientDataSet领域没有得到错误?

正如下面的要求,这是我的字段定义:

ComparisonSpPlanUnit.dfm

object ComparisonDataSet: TClientDataSet
  Aggregates = <>
  FieldDefs = <
  ...
    item
      Name = 'ARTICLE'
      DataType = ftString
      Size = 20
    end>
  ...
  object ComparisonDataSetARTICLE: TStringField
    DisplayLabel = #1057#1090#1072#1090#1100#1103
    FieldName = 'ARTICLE'
  end
  ...
end

ComparisonSpPlanUnit.pas

ComparisonDataSetARTICLE: TStringField;

Answer 1:

在调试我发现,引发异常的内心深处源代码Data.DB模块,里面TStringField.SetVarValue程序,所以它似乎是一个错误。 可是我错了:更深层次的调试强调,异常的自动计算字段的计算期间提出。

所以我不得不改变我的其他功能:

procedure TComparisonSpPlanForm.ComparisonDataSetCalcFields(DataSet: TDataSet);
begin
  // comparing to Null is essential!
  if DataSet['Oper'] <> Null then
    case DataSet['Oper'] of
      0: DataSet['OperStr'] := 'insert';
      1: DataSet['OperStr'] := 'update';
      2: DataSet['OperStr'] := 'delete';
      else
        DataSet['OperStr'] := 'other';
    end
  else
    DataSet['OperStr'] := 'other';
end;

现在它的工作原理。



文章来源: Cannot assign data to client dataset