Firebird 2.1、DevArtおよびDelphi 2010のDBExpressドライバーを使用しています。Delphi2006で動作していたレポートの一部が動作を停止し、「算術例外、数値オーバーフロー、または文字列の切り捨て」が発生したことを示すエラーメッセージが表示されました。私のコードのこの時点でエラーが発生しました:
cds.Data := dsProvider.Data;
エラーの原因となった場所をSQLステートメントで見つけました。
iif(ytd.hPayType <> -1,t.sCode, 'NET') sPayType
T.sCodeはVarchar(10)フィールドです。私の結論は、クエリがdsProviderにデータを返し、dsProvider.Dataがcds.Dataに渡されると、cdsコンポーネントが最初に受け取った値に基づいてフィールド幅を設定するということです。「iif」をCASEステートメントに変更すると、同じエラーメッセージが表示されます。私はこれを行うことで問題を回避することができました:
CAST(iif(ytd.hPayType <> -1,t.sCode, 'NET') AS varchar(10)) sPayType
これはCASTなしのDelphi2006で機能していたため、新しい動作はTClientDatasetの更新によるものと思われます。古い、より寛容な行動をとることは素晴らしいことです。苦情なしにこれを受け入れるようにClientDatasetを構成する方法はありますか、それともiifおよびCASEステートメントに基づく文字列の結果をCASTするようにユーザーに指示する必要がありますか?