お世話になります。
Delphi11.3 ENTで開発を行っております。
JSONで取得したデータをFDMemTableにデータを登録する際に、次の様にデータ型を判定して登録を行おうとしておりますが、
「'TFieldType' と 'TGeneratorFieldType' には互換性がありません」とエラーになってしまいます。
function TDMSample.InitializeMaster: Boolean;
var
// データJSONValue
resJval, recJval: TJSONValue;
// 対象MemTable
mem: TFDMemTable;
fdf: TFieldDef;
val: TJSONValue;
:::中略:::
for var j := 0 to TJSONArray(resJval).Count-1 do
begin
// 配列の1要素を取り出す
recJval := TJSONArray(resJval).Items[i];
// 対象MemTableのフィールド数分繰り返し
for var k := 0 to mem.FieldDefs.Count-1 do
begin
// FieldDefs
fdf := mem.FieldDefs[k];
// JSONから値を取得
val := recJval.FindValue(fdf.Name);
if Assigned(val) then
begin
// データ型判定
case fdf.DataType of
ftString: mem.FieldByName(fdf.Name).AsString := val.ToString;
ftInteger: mem.FieldByName(fdf.Name).AsInteger := val.Value.ToInteger;
end;
end;
end;
end;
確かに、ftStringはTGeneratorFieldTypeにもTFieldTypeにも存在している模様ですね。
そこで、case文の中を
TFieldType(ftString): mem.FieldByName(fdf.Name).AsString := val.ToString;
TFieldType(ftInteger): mem.FieldByName(fdf.Name).AsString := val.ToString;
の様に型キャストするとエラーは消えましたが、対応としては正しいでしょうか。
// データ型判定
case fdf.DataType of
Data.DB.ftString: mem.FieldByName(fdf.Name).AsString := val.ToString;
Data.DB.ftInteger: mem.FieldByName(fdf.Name).AsInteger := val.Value.ToInteger;
end;
ではだめでしょうか。外していたらすいません。
mamさん
いつも有難うございます。
正しく判定できる様になりました。※自分が投稿した型キャストの方法ですと何故か型を正しく判定できませんでした。
しかしながら不思議なのは、同一ソース内で、Data.DBが、「未定義の識別子」でエラーになる場合があります。
Data.DBが見えなくなってしまう事象は発生しなくなりました。
どうやら、with FDMemTable1 do・・・の中にData.DBを記述してしまうと「未定義の識別子」が発生してしまう模様です。
※根本的な原因は掴み切れてはおりませんが、お蔭様で数日悩んでいた事が解決できましたので、解決済にはさせて頂きます
ツイート | ![]() |