Dynamics 365独自の言語! X++入門講座《SQLの書き方応用編》

みなさまこんにちは。黒木です。
 
前回のブログではX++におけるSQLの書き方を紹介しましたが、今回はSQLの書き方応用編をご紹介します!
 
前回のブログはこちらです。
Dynamics 365独自の言語! X++入門講座《基本的なSQLの書き方》

SELECT文

while select tableA
	where tableA.column1 == 'aaa'
	
{
	tableA.column2 = 'bbb';
}

まずは基本のSELECTからご紹介します。
 
上記のプログラムはtableA.column1にaaaが入っているレコードの件数分ループを回すという処理になります。ループ内では取得したレコードのカラムの値操作などをすることも可能です。
 
この処理は現場でよく使っていました。もちろんorder byなどと組み合わせてつかうことも可能です。組み合わせる場合は、1行目のtableAの後ろに書くのもポイントです。

UPDATE文

ttsbegin;
update_recordset tableA
	setting 
		column1 = 'aaa'
	where column2 = 'xxx';
ttscommit;

上記のコードはcolumn2=’xxx’に当てはまるレコード全てを対象に、column1にaaaで更新をかけるといった処理になります。大量のレコードに更新をかける時は前回紹介したUPDATE文よりこちらの方がパフォーマンスがよくなります。
 
もう一つ、違ったコードの書き方をご紹介します。
ttsbegin;
while select forupdate tableA
	index column1
	where tableA.column2 == 'xxx'
{
	column1 = 'aaa';
	tableA.update();
}
ttscommit;

こういった書き方もできます。処理で得られる結果は、上記と同じになります。

INSERT文

INSERTについては、メソッドの紹介のみで留めておきます。
 
INSERT処理でも、insert_recordsetなるものが存在します。現場では 前回のブログ でご紹介したinsert();を使うことが圧倒的に多く、insert_recordsetを使う機会はあまりありませんでした。

DELETE文

delete_from tableA
	where tableA.column1 == 'sss';

いままでの傾向を見れば、なんとなくどういう処理になるのかは推測がつくのではないでしょうか。上記ではcolumn1にsssが登録されているレコードのデータを削除する処理を行っています。
 
こちらもupdate_recordsetと同じく、条件に当てはまるレコードのデータを全件削除する時は、こちらの方が良いかと思います。

結合条件

続いて結合条件についてご紹介します。

select firstonly tableA
outer join tableB
	where tableA.column1 == tableB.columnA;

outer joinはテーブル同士を外部結合するときに使用します。X++ではright outer join は存在せず、left outer join = outer joinとなるのでご注意ください。
select firstonly tableA
notexists join tableB
	where tableA.column1 == tableB.columnA;

このプログラムですと、tableA.columnAとtableB.columnAの値が合致するものを対象外にするという意味合いになります。

まとめ

いかがでしたでしょうか?
 
ここまで分かれば、X++でSQLを書くのには困らない……はずです! 次回はメソッドや構造体についてご紹介しようと思います。
 
それでは、また。
 
 
 
 
《関連記事》

記事をシェア
MOST VIEWED ARTICLES