Dynamics NAV で OData を使用する


2018年6月のPowerBI勉強会で「Dynamics NAV のデータを Power BI で見る」という事例をクララオンライン株式会社の内田さんが発表してくださったので、技術的な観点から実際の設定手順などを書いてみます。

前提:Dynamics NAV 2017のサーバーを立てる必要があります。こう書くとハードルが高そうですが、AzureでNAVインストール済の仮想マシンをデプロイするだけです。詳細手順はこちらの記事「Azureで仮想マシンを作成しNAV2017を触ってみる(改定版)」をご参照ください。

前提の前提:上の前提のリンク先の記事でも触れていますが、Azureで仮想マシンを立てるにはAzureのサブスクリプションが必要です。初回限定(?)で2万円の無料枠付きでサブスクリプションを契約できます。詳細手順はこちらの記事「Azureのサブスクリプションを契約する(改定版)」をご参照ください。

前提の前提の前提:Azureのサブスクリプションを契約するには先にOffice365のアカウントを作っておく事をお勧めします。なくてもAzureのサブスクリプションを契約することはできますが、Power BIやるならOffice 365がほぼ必須ですので作っておきましょう。1ヶ月のFreeTrialが簡単に申し込めます。詳細手順は「US版office365のFreeTrialを申し込む」をご参照ください。(US版である必要は無いので適宜読み替えて日本版で申し込んでもOKです。)

ではNAV2017を立てて仮想マシンにリモートデスクトップ接続した所から始めます。

まずはDynamics NAVを起動します。普通にスタートメニューから起動してください。  

NAV2017が起動します。各種機能は右上の検索窓「Search(Ctrl+F3)」から呼び出せます。

ODataを利用できるようにするには「Web Service」という機能を実行します。検索窓に「Web」と入力すると「Web」を含むメニューが表示されますので「Web Service」をクリックします。

Web Serviceの一覧が表示されました。ザックリ言うと、公開されているAPIの一覧が表示されています。今回は2行目の「Sales Order」を例に実機を動かしてみます。右端の列に「OData V4 URL」列があり、「Http://NAV2017DEMO:7048/NAV/…」と表示されています。「Http://」以降は順にNAVサーバーのマシン名、ポート番号、NAVのサービスインスタンス名なので冒頭の「前提」でDynamics NAVサーバーを作った時の作り方によって若干名前が変わりますので細かい違いは気にしなくてよいです。この「Http://…」はハイパーリンクになっているのでクリックします。

おっと、何も表示されません。。実は初期設定ではODataサービスが無効になっているため、以下のような画面が表示されます。

では、ODataサービスを有効化してみましょう。

と、、その前に、WindowsServerマシンでIEを使うと都度都度以下のようなメッセージが表示されるのは面倒なので、先にこれを回避します。

サーバーマネージャーを立ち上げて、、

左側でLocal Serverを選んで右側で赤枠内の右側の青文字をクリックします。

Administratorで実行する限り、セキュリティーのチェックが掛からないようにします。赤枠内のラジオボタンをOffにしてOKを押します。(実運用環境や実データが入ったテスト環境などではNGですが、今回はサンプルデータしか入っていなのでこの方法を取ります。)

これで都度都度ポップアップが表示されるのを回避する設定が完了しました。

さて、ここからが本題です。ODataの利用を可能にします。メニューから「Dynamics NAV 2017 Administration」ツールを起動します。似たアイコンが多いので要注意です。アイコンの背景が白で左上に歯車マークのものを選んでください。

以下のような画面が表示されます。これがNAVのサーバーインスタンスを設定する画面です。左側の「Microsoft Dynamics NAV (Local)の左側の「>」アイコンをクリックします。

ツリーが展開されます、と言っても一つだけですが。「NAV」を選択します。この「NAV」はNAVサーバーインスタンスです。(1個だけ「NAV」とあるのでわかりづらいですが、、実プロジェクトだとここに「Live」とか「UAT」とか「DEV」といったNAVサーバーインスタンスが並ぶイメージです。)
左側でNAVサーバーインスタンス(今回は「NAV」)を選ぶと中央にそのNAVサーバーインスタンスの設定が表示されます。色々な設定が表示されていますが、今回のお目当てはODataなので「OData Service」のセクションを展開します。赤枠右側の「v」をクリックします。

セクションが展開されます。(本当はNAVの世界ではセクションではなく「タブ」と言いますが、全く「タブ」感が無くて伝わりづらいので今回は「セクション」と表記します。)
ここで下線部の「Enable OData Service」のチェックがOFFになっていることが分かります。この状態ではOData Serviceが利用できません。ここをONにするにはまず「Edit」ボタンをおします。

チェックONして「Save」を押します。

内容が保存されました。サービスを再起動しないと有効にならないよ、と言われています。ここでいう「サービス」はNAV サーバーインスタンスそのものを指しています。

左側の枠で「NAV」の上の「Microsoft Dynamics NAV (Local)」をクリックします。すると中央の枠に「NAV」が表示されます。(実プロジェクトだとここに「Live」とか「UAT」とか「DEV」とかが表示されます。つまり、NAVサーバーの一覧が表示されます。)
中央の枠で「NAV」を選択し右下の「Restart」を押します。

再起動するかの確認ダイアログが表示されますので「OK」を選択します。これでNAVサーバーが再起動されます。

ちなみに、再起動前にNAVの画面を開いていると(クライアントアプリを起動していると)以下のメッセージが表示されます。セッションがある状態で再起動するとセッションが切られますのでこういうメッセージが表示されます。気にせずOKを押して消せばよいです。

さて、再起動後に改めてNAVを起動します。前述の手順で再度Web Serviceのページに行き、2行目のSales OrderのOData V4 URLのリンクをクリックします。

ユーザー認証を要求されたらユーザー名とパスワードを入れて認証を通します。リモートデスクトップでWindowsServerにサインインしたときのユーザーIDとパスワードでOKです。

今度はエラー画面ではなく、以下のような画面が表示されました。一度開いてみましょうか。Openボタンを押します。

メモ帳で開くと以下のようなデータが表示されます。json形式で記述されたSalesOrder(受注伝票)のデータの一覧です。この形式をnotepadで見るのはつらいですね。。

保存してみましょう。Save asを選択し、、

適当な場所に保存します。

json形式のファイルを見るツールは色々あるかと思いますが、手っ取り早くExcelで見てみます。Excelを起動してリボンの「データ」タブから「データの取得」>「ファイルから」>「JSONから」を選択。

先ほど保存したjsonファイルを指定します。

こんな感じで取り込まれました。(「Excelで見る」と書きましたが、実態はPower Queryです。)
Valueの「List」をクリックします。

何行も表示されましたが1行目の「Record」をクリックします。

以下のようにデータが表示されます。これは1件目の受注伝票ヘッダーです。例えば、伝票番号は101005でOrderDate(注文日)は2019/1/10で、DueDate(期日)は2019/1/31です。

本当でしょうか?NAV側からデータを見てみましょう。Sales Order機能を呼び出します。検索窓で「Sales Order」と入力し「Sales Orders」のリンクをクリック。

一覧のNo.=101005を選択して「View(照会)」ボタンを押します。

Order Date, Due DateがExcel上で見たデータと一致することが分かります。つまり、先ほどのSales OrderのjsonファイルにはNAVのSales Orderのデータが格納されています。

ちなみにWeb Serviceの画面を右にスクロールすると「OData V4 URL」の右に「OData URL」が表示されます。何が違うのでしょうか?
実はリンクとプロトコルが違います。

NAV Administration ツールの「OData Service」セクションには「Enable V3 Endpoint」と「Enable V4 endpoint」の2種類があります。それぞれ、「OData URL」と「OData V4 URL」に対応します。チェックOFFにするとOFFにした側のODataサービスは利用できません。

さて、Web Serviceの画面に戻ります。サンプルのNAVデータベースではWebServiceが8つしかありません。本当にたったこれだけでしょうか? 実は簡単に追加できます。リボンの「New」を押してみます。

新規で行追加できます。

例えばObjectType = ’Page’ とし、Object ID = ’31’ を選んで、、

Service Nameを適当に(例えばItemsに)決めて「View List」をクリックします。(余談ですが、NAVには保存ボタンが無いので、明示的にコミットするために「View List」ボタンを使っています。)

すると、URLが自動的に作成されます。

マウスオーバーするとURLが見れます。ページ31の名称である「Object Name」ではなく、Service Nameである「Items」がURLに含まれている点に注意です。APIで呼び出すときのパラメータは「Items」になります。(「Item List」ではありません。)

試しにItemsのリンクをクリックしてファイルを開いてみましょう。

こんな感じのデータが表示されます。一つ目の品目は「1000:Bicycle」のようです。

とまあ、こんな感じでコーディングすることもなく割と簡単にNAVのデータをODataを使って取り出すことができることが分かりました。

次回はいよいよ、ODataを使ってPowerBIからNAVのデータを見てみたいと思います。

オマケ:DynamicsNAVの導入プロジェクト事例はこちらをご覧ください。

2件のコメント

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です