Dynamics 365独自の言語! X++入門講座《基本的なSQLの書き方》

みなさまこんにちは。黒木です。
 
前回のブログでX++の概要、基礎をご紹介しました。今回はX++の特徴ともいえるSQLの書き方についてご紹介します。 

ソースコードにSQLを書くとは?

前回のブログでもご紹介しましたが、X++はコード上でSQLを書けば簡単にデータベースの操作ができるのが特徴です。
 
具体的にどういうことかというと、下記のようなプログラムになります。

public class Sample
{
    public static void Main()
    {
        TableA tableA;

        select firstonly tableA;
        str field1 = tableA.column1;
    }
}

 
5行目でint型やstr型と同じく変数宣言をし、7行目でtableAのレコード一件目をselectしています。そして、8行目で取得したレコードのculumn1というカラムの値をfield1に格納しています。
 
図に表すとこんなイメージです。
 

 
既にお気づきの方もいるかと思いますが、この時点でX++の癖の強さが出ています。firstonlyとは? * from抜けてない? その疑問についても、このブログで解説していきます!

SELECT文

ここからは一般的なSQL(Microsoft SQL Server)を例に解説していきます。まずはこちらのSQLです。

SELECT top 1 *
FROM tableA
JOIN tableB
ON tableA.RecId = tableB.RecId
AND tableA.column1 > 10
ORDER BY tableA.column1 ASC, tableA.column2 DESC

 
これをX++に変換すると…
select firstonly tableA // select firstonly * from tableAでも可
order by tableA.column1 asc, tableA.column2 desc
join tableB
where tableA.RecId == tableB.RecId
&& tableA.column1 > 10;

こうなります。
 
SQLを書く上で大きく違う点は、order byの位置と結合条件の書き方の2つです。
 
X++でテーブルを結合したデータで並び替えの指定を行う場合、結合条件の前で指定します。なのでこの場合だと3行目と4行目の間でorder byを宣言してもOKです。また、group byも同じく結合条件の宣言前に記載する必要があります。
 
ついorder byは後ろに書きたくなりますが、この順番を間違えると;(セミコロン)がないよ(意訳)というエラーが出ます。X++触りたての頃にこのエラーで苦しめられたのも、今ではいい思い出です。
 
asc(昇順)、desc(降順)で指定します。指定がない場合、自動的に昇順に並び替えになります。
 
そして結合条件ですが、X++では「on」は使わず、whereを使用します。これは他の命令分でも共通です。条件を付け加えるときは&&で追加していきます。

UPDATE文

続いてはUPDATE文の紹介です。通常のSQLは、こう書きます。

UPDATE tableA
SET column1 = 1
WHERE tableA.RecId = 12345678

 
X++のSQLでは、こうなります。
ttsbegin;
select forupdate tableA
  where RecId == 12345678;
tableA.column1 = 1;
tableA.update();
ttscommit;

updataの時は処理の前後にttsbegin、ttscommitが必要です。大きく違うところは、「select」と「set」の記載があるかないかくらいです。ここはあまり癖の強さが出ていません。
 
ちなみに、先ほどからサンプルコードで登場しているRecIdというカラム。これもX++の特徴の1つです。RecIdはテーブル作成時に自動的に生成されるカラムで、そのテーブルにおいてキーになるカラムです。
 
これがとても便利で、単体テストを行うときに1行だけデータを変えたい、なんて時にUPDATE文でお世話になりました。

INSERT文

通常のSQLは、こうなります。

INSERT INTO tableA (column1, column2)
VALUES(1, 'aaa')

 
X++のSQLでは、こうなります。
ttsbegin;
tableA.culumn1 = 1;
tableA.colimn2 = 'aaa';
tableA.insert();
ttscommit;

insertでもupdataと同じく、処理の前後にttsbegin、ttscommitが必要です。

DELETE文

通常のSQLは、こうなります。

DELETE tableA

 
X++のSQLでは、こうなります。
ttsbegin;
delete_from tableA;
ttscommit;

DELETE文は、一般的なSQLとさほど変わりはないですね。もちろんこのサンプルプログラムを実行するとデータ全削除になるので、特定のレコードのみ削除する場合は「where」で条件を指定してください。

まとめ

いかがでしたでしょうか? 今回はX++におけるSQLの書き方をご紹介しました。
 
X++のことについて、まだまだ語りたいことがあるので随時ブログにあげていく予定です! それでは、また。
 
 
 
 
《関連記事》

記事をシェア
MOST VIEWED ARTICLES