
みなさまこんにちは。黒木です。
前回のブログではX++におけるSQLの書き方を紹介しましたが、今回はSQLの書き方応用編をご紹介します!
前回のブログはこちらです。
Dynamics 365独自の言語! X++入門講座《基本的なSQLの書き方》
SELECT文
1 2 3 4 5 6 |
while select tableA where tableA.column1 == 'aaa' { tableA.column2 = 'bbb'; } |
まずは基本のSELECTからご紹介します。
上記のプログラムはtableA.column1にaaaが入っているレコードの件数分ループを回すという処理になります。ループ内では取得したレコードのカラムの値操作などをすることも可能です。
この処理は現場でよく使っていました。もちろんorder byなどと組み合わせてつかうことも可能です。組み合わせる場合は、1行目のtableAの後ろに書くのもポイントです。
UPDATE文
1 2 3 4 5 6 |
ttsbegin; update_recordset tableA setting column1 = 'aaa' where column2 = 'xxx'; ttscommit; |
上記のコードはcolumn2=’xxx’に当てはまるレコード全てを対象に、column1にaaaで更新をかけるといった処理になります。大量のレコードに更新をかける時は前回紹介したUPDATE文よりこちらの方がパフォーマンスがよくなります。
もう一つ、違ったコードの書き方をご紹介します。
1 2 3 4 5 6 7 8 9 |
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文
1 2 |
delete_from tableA where tableA.column1 == 'sss'; |
いままでの傾向を見れば、なんとなくどういう処理になるのかは推測がつくのではないでしょうか。上記ではcolumn1にsssが登録されているレコードのデータを削除する処理を行っています。
こちらもupdate_recordsetと同じく、条件に当てはまるレコードのデータを全件削除する時は、こちらの方が良いかと思います。
結合条件
続いて結合条件についてご紹介します。
1 2 3 |
select firstonly tableA outer join tableB where tableA.column1 == tableB.columnA; |
outer joinはテーブル同士を外部結合するときに使用します。X++ではright outer join は存在せず、left outer join = outer joinとなるのでご注意ください。
1 2 3 |
select firstonly tableA notexists join tableB where tableA.column1 == tableB.columnA; |
このプログラムですと、tableA.columnAとtableB.columnAの値が合致するものを対象外にするという意味合いになります。
まとめ
いかがでしたでしょうか?
ここまで分かれば、X++でSQLを書くのには困らない……はずです! 次回はメソッドや構造体についてご紹介しようと思います。
それでは、また。
《関連記事》
- 今注目を浴びるDynamics 365! 現場経験者による概要まとめ
- Dynamics 365独自の言語! X++入門講座《変数の宣言と分岐、繰り返し処理》
- Dynamics 365独自の言語! X++入門講座《基本的なSQLの書き方》

