【Excelアドイン】データの書き戻し機能を使用してみる

[Sharperlight](https://sharperlight.jp/)においては、データソース（データベース、Excelワークシート、APIエンドポイント等）からデータを抽出するというのが原則ですが、書き戻し(Writeback)許可を設定することでデータソースへのデータの書き戻し(Writeback)を行うことができます。
今回は、Excelアドインを使用して、シート上のデータをデータベースに書き戻してみようと思います。
### データベース／テーブルの準備 ###
既存の試験データベースにLedger（帳簿）テーブルなるものを作成しました。このテーブルに対してExcelワークシートのデータを書き込んでいきたいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/203e3fb5-63eb-f08b-c6ac-7bb4b8f4a220.png)
### データモデルの準備 ###
まずSharperlightがデータソースと対話できるようにデータモデルを作成します。
この試験データベースに対しては既にデータモデルを作成していたので、今回追加したテーブルの情報だけを反映させたいと思います。
[Sharperlight](https://sharperlight.jp/)アプリケーションメニューから**スタジオ**を起動します。
`フォルダ`アイコンで対象データモデルを探します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/bde5108c-6e69-69a5-c3c6-aba971787931.png)
`Tools`メニューのサブメニュー`Studio Connection`メニューを選び、正しく対象データベースに接続されているかを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/34c1ba56-b7e2-8db0-4666-f08680f3e066.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/cf1ebaee-d563-74e4-fe0a-7ed0a719be0e.png)
確認が済んだら'Schema'メニューの`Import Tables`メニューを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/f94cdb0e-76f4-9b22-0009-56ad7728ebba.png)
`Get Tables`ボタンをクリックすると、接続しているデータベースからスキーマ情報が読み込まれます。既にデータモデルに読み込まれているテーブルについては赤色で表示され、まだ読み込まれていない新しいテーブルについては黒色で表示され、チェックも入った状態になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/3e176bbb-6dba-946d-a7dc-be1f5d0779fd.png)
`OK`ボタンを押すと、チェックの入ったテーブルの情報がデータモデルにインポートされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/4d93f36c-1b0a-6b06-82f1-d6107e6fdd5a.png)
新しくインポートされたテーブルは、`All Tables`ノードの下に表示されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/06ceb97d-bf14-05e6-2f14-4463c290f145.png)
このままでは、クエリビルダ等からは見えない設定なので、新しいテーブル**Ledger**テーブルを`Table Display`ノードへ移動させます。ドラッグ＆ドロップで移動できます。
`Table Display`ノードに移動した**Ledger**テーブルを選択すると、右側にテーブルのプロパティ一覧が表示されます。その中から`Allow Table Writeback`プロパティを探し出し、**True**を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/8588e404-3809-1d45-7bfe-d508d0ccaa31.png)
これでこのテーブルにはデータの書き戻しを行うことができるようになりました。これは単にこのテーブルには書き戻しができるよ～っていう許可であり、他にもユーザー単位で許可／未許可の設定を行うこともできます。
あと`Description`プロパティに**帳簿**と日本語で記入します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/eb48252f-6616-20ce-21ab-b9f18d2aa442.png)
今度は、**Ledger**テーブルをダブルクリックすると中央にはフィールド一覧が表示され、そのフィールドを選択するとそのフィールドのプロパティが右側に表示されるようになります。それぞれのフィールドの`Description`プロパティを日本語に置き換えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/c0c8f35a-14b4-2d43-b943-dbec7ea750d9.png)
全て終わったら`OK`ボタンでデータモデルを保存します。
### データの準備 ###
Excelワークシート上にこのようなデータを準備します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/6520cf47-b41f-c076-1043-d697e4eae63b.png)
列名は、データモデルのフィールドDescriptionと合わせておくといいですよ。
### 書き戻し定義の作成 ###
では書き戻しの定義を行います。Sharperlight Excelアドインのリボンから書き戻しを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/25b6cdfe-0ba7-8052-1e54-cf5010dcf785.png)
書き戻し定義ダイアログが表示されます。`製品`には先ほどのデータモデルを、`テーブル`には先ほどの帳簿テーブルを選びます。
下部`フィールド`タブに帳簿テーブルのフィールド一覧が表示されます。ここでExcelシート上のデータとフィールドのマッピングを行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/e7405fa3-0e54-1cb9-db5f-1eaed62591bc.png)
`コード`フィールドの入力テキストフィールドを選択した状態で、Excelシートのテーブル内をダブルクリックします。すると自動マッピング機能が働き、このようなメッセージが表示されます。`Yes`ボタンを押して先に進みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/0a5cb9f2-4e03-694b-76df-cfe9baff251a.png)
データテーブルの列名とデータモデルのDescriptionが一致する場合のみマッピングが設定されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/6e8acb10-0961-6d71-35ed-9e515c000211.png)
マッピングが設定されていないフィールド、たとえば`請求`に対しては、その入力テキストフィールドを選択した状態で、Excelシート上の`請求額`列をダブルクリックします。すると先ほどと同じメッセージが表示されるので、今度は`No`ボタンを選択します。そうすることで個々のフィールドのマッピングを行うことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/63ab6876-9b3a-02bc-c237-57ef7e8e36ab.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/7ad82e07-e990-429f-e3b8-a493b10ff3a5.png)
`Id`フィールドは、IDENTITYフィールドなのでIdがデータベースによって自動算出されるのでマッピングは不要です。
Idの左横に星印が付いていますね。これはSharperlightエンジンがこの列のデータをガイドとして使用し、どの行までデータが存在するかをチェックするためのものです。しかし、この機能はマッピングがされていないフィールドには設定できません。よって今回は`コード`フィールドにこの機能を設定します。`コード`フィールドを選択して右クリックメニューから**ドライバー**を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/96b4e308-5a22-bdb0-cf16-2b4514bd0d6a.png)
最後に書き戻し名に**帳簿**と入力します。`閉じる`ボタンで定義を保存すると、この名前で保存されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/f2b40bdf-6a37-88b0-b9b0-2b8956212d77.png)
これで定義は完了。
### 検証 ###
`プレビュー`ボタンを押して、マッピングの設定どおりエンジンが正しくデータを拾っているかチェックしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/6d1101f3-1193-5fb0-c523-5281375c1317.png)
プレビューとログが表示されます。ログをみると分かりますが、書き込みは行われていません。この機能はあくまでも正しくデータが拾われているかのチェックのみです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/b4766514-7fed-bca5-4ec1-da8d899b7e7d.png)
`検証`ボタンは、プレビューなしのデータ収集チェックです。ログだけが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/e4cd59d5-25d8-2560-af9f-8038d985054d.png)
以上で上手くデータが拾えていることが確認できたので、`実行`ボタンで書き戻しを実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/d9d3b115-2439-784c-4fed-6da4f6ac9d09.png)
ログが表示され、正しく実行されたことが分かりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/d1b9fef1-93fc-8302-4369-5d6ea94df3e8.png)
データベーステーブルを確認してみます。正常に書き込みが行われていました。:thumbsup_tone1:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/e9653d43-84b3-bc95-5e7e-b2873c90a47f.png)
### データの更新と追加 ###
Excelシート上のデータを更新します。
最下行にコード **S011** という新しいレコードを追加します。またコード **S006** のレコードの入金額と残高を更新します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/da30d4e4-c98f-8818-ce1d-45dd7f63e5a3.png)
この状態で再度書き戻しを実行すると、新しいレコードは追加され、変更があったレコードは更新されます。
### 書き戻しボタンの作成 ###
今回は、書き戻しダイアログを開いて`実行`ボタンを押すのではなく、ボタンを追加して書き戻しを実行します。
ボタンを配置したい位置のセルを選択した状態でSharperlightリボンの**ボタン**->**書き戻し**->**mdWriteBack**を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/d380506b-9c74-944f-7c62-88be49c75869.png)
書き戻し定義一覧が表示されるので、今回作成した定義 **帳簿** を選択し、`OK`ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/e7332b7a-9d55-b0c6-09ee-02fdeada5506.png)
書き戻し専用のボタンが追加されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/231b61c0-0ff4-1608-b083-6dfb76171e55.png)
ではこのボタンを押して書き戻しを実行します。
早速データベースをチェック、正しく更新することができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/095fd6d7-e145-a2cc-211f-d7f3a2b09e09.png)

では、失礼します。