4

フィールドタイプを ftFloat から ftBCD に変換するにはどうすればよいですか?

私は試した

for i := 0 to FDataSet.FieldCount - 1 do begin
      if FDataSet.Fields.Fields[i].DataType = ftFloat then begin
           FDataSet.Fields.Fields[i].DataType := ftBCD;
      end;
end;

しかし、私はエラーが発生します

[DCC Error]  E2129 Cannot assign to a read-only property

ftFloat のすべてのデータセット フィールドを ftBCD に変換する方法はありますか?

4

3 に答える 3

7

DataType は読み取り専用です。DataType 用に作成された Tfield のプロパティです。これは、DefaultFieldClasses: array[TFieldType] of TFieldClass DB を使用して Fielddefs から行われます。DataType を変更する必要がある場合は、フィールドを解放し、必要に応じて別のフィールドを作成する必要があります。以下に、これを行う方法の例を示します。

type
  TMyFieldInfo = Record
    FieldName: String;
    Size: Integer;
    DataType: TFieldType;
    FieldKind: TFieldKind;
  end;

type
  TFA= Array of TMyFieldInfo;

 Procedure GetFields(DS:Tdataset;var FA:TFA);
  var
    I: Integer;
  begin
    SetLength(FA, DS.FieldCount);
    for I := 0 to DS.FieldCount - 1 do
    begin
      FA[I].FieldName := DS.Fields[I].FieldName;
      FA[I].DataType := DS.Fields[I].DataType;
      FA[I].Size := DS.Fields[I].Size;
      FA[I].FieldKind := fkdata;
    end;
  end;

  Procedure SetFields(DS:Tdataset;var FA:TFA);
  var
    I: Integer;
    F:TField;
  begin
    DS.Fields.Clear;
    for I := Low(FA) to High(FA) do
    begin
      F := DefaultFieldClasses[FA[I].DataType].Create(DS);
      With F do
      begin
        FieldName := FA[I].FieldName;
        FieldKind := FA[I].FieldKind;
        Size := FA[I].Size;
        DataSet := DS;
      end;
    end;

  end;


procedure TForm6.Button1Click(Sender: TObject);
var
   L_FA: TFA;
   I:Integer;
begin
    MyDS.Open;  // open to get the Fielddefs.
    GetFields(MyDS,L_FA);
    MyDS.Close;  // close to be able to change the fields
    for I := Low(L_FA) to High(L_FA) do
      begin
         if L_FA[i].DataType = ftFloat then
            L_FA[i].DataType := ftBCD;
      end;
    SetFields(MyDS,L_FA);
    MyDS.Open;
end;
于 2014-09-11T08:40:12.693 に答える
1

別の方法は次のとおりです。

まず、テーブルを次のようなファイルにダンプする必要があります

ADOQuery.SaveToFile('C:\1.xml');

次に、フィールドの説明を見つけます。次のようになるとしましょう。

<s:datatype dt:type='float' dt:maxLength='8' rs:fixedlength='true' rs:maybenull='true'/>

次のように、他のタイプの説明に置き換えます。

<s:datatype dt:type='number' rs:dbtype='currency' dt:maxLength='25' rs:precision='25' rs:fixedlength='true' rs:maybenull='true'/>

次のように、このファイルを再度ロードする必要があります。

ADOQuery.LoadFromFile('C:\1.xml');
于 2014-12-01T02:27:19.223 に答える
0

いいえ!データフィールドを作成したら、それを変更することはできません! これは、Filedtype を割り当てることは、列挙型のプロパティを変更するだけではないためです。各フィールド タイプは特定のクラスです: TintegerField など...

したがって、TList を文字列にできないのと同じ理由で、FieldType を変更することはできません。

あなたは何をしようとしていますか?

イェンス・ボリスホルト

于 2014-09-11T07:21:21.780 に答える