テーブル変数に関する注意事項
AX2012では、X++でテーブル変数を複数のクエリで使いまわすと
AOSがクラッシュする場合がございます。
以下に問題が発生するプログラム例を用いて説明させて頂きます。
以下の例では、TestTable2というテーブル変数が2つのクエリで使用されています。
テーブル変数は、クエリを構成しているテーブル名を指定しているだけでなく、
データベースから取得した実際の値が格納されます。
このため、複数のクエリで同じテーブル変数を使用すると、予期せぬ問題が発生する可能性がございます。
(悪い例)
TestTable1 TestTable1,TestTable1_2;
TestTable2 TestTable2;
;
while select TestTable1
join TestTable2
order by TestTable1.Field1, TestTable1.Field2
where TestTable2.Field21 == TestTable1.Field1
{
select sum(IntField1) from TestTable1_2
where TestTable1_2.Field2 == TestTable1.Field2
join TestTable2
where TestTable2.Field21 == TestTable1_2.Field1
各クエリで使用するテーブル変数を、それぞれのクエリ用に別々に宣言して頂くことで
上記のような問題を回避することが可能です。
(修正例)
TestTable1 TestTable1,TestTable1_2;
TestTable2 TestTable2,TestTable2_2;
;
while select TestTable1
join TestTable2
order by TestTable1.Field1, TestTable1.Field2
where TestTable2.Field21 == TestTable1.Field1
{
select sum(IntField1) from TestTable1_2
where TestTable1_2.Field2 == TestTable1.Field2
join TestTable2_2
where TestTable2_2.Field21 == TestTable1_2.Field1