Excel から REST API を経由して Wagby を操作する [2] CRUD 処理
最終更新日: 2020年6月9日
ここでは、もう一つの顧客モデル "customer1" を用意しました。図1のように日付型項目およびファイル型項目を追加しています。繰り返しコンテナも追加しています。ファイル型項目が存在するため、REST API で操作する場合、マルチパートフォームとして扱う必要があります。
ビルド後、アプリケーションを起動します。図2に示すサンプルデータを事前に登録しておきます。
REST API を利用するプログラム (VBA) が含まれる Excel ファイルを開きます。
このとき、Wagby アプリケーションは起動した状態としてください。Excel から HTTP 通信を行うためです。
はじめに、検索条件を指定せずに「検索」ボタンを押下します。
1件のデータが検索されます。一覧表示領域に表示するようにしました。
該当データの、任意のセルの値を変更することができます。ここでは電話番号を変更し、「更新」ボタンを押下します。カーソルのある行が対象となります。
確認ダイアログを表示するようにしています。「OK」を押下すると、変更用の REST API を呼び出します。
Webから対象データを再取得してみます。データが更新されていることがわかります。
データの新規登録を行います。今回、用意した顧客モデルは主キーに順序を使うようにしています。この場合、主キーの欄は空白とします。それ以外の項目に値を設定します。
今回のデモアプリケーションは、ファイルのアップロードには未対応です。ファイル型の欄は空白としてください。
カーソルのある行を対象とします。「登録」ボタン押下により、確認ダイアログが表示されます。「OK」を押下すると、登録用の REST API を呼び出します。
データ登録のタイミングで、主キーは自動採番されています。
Web画面から確認します。データが追加されていることがわかります。
データの削除を行います。対象行にカーソルを合わせ、「削除」ボタンを押下します。
削除確認ダイアログを表示するようにしています。「OK」を押下すると、データ削除のための REST API が呼び出されます。
ファイル型項目のダウンロードを行う機能を紹介します。ダウンロードしたいファイルにカーソルを合わせ、「ダウンロード」ボタンを押下します。
保存用ダイアログボックスが用意されます。「保存」ボタンを押下すると、ファイルがダウンロードされます。
このサンプルアプリケーションは、繰り返しコンテナ内のファイル型項目にも対応しています。
サンプルアプリケーションは、Excel VBA で記述されています。いくつかのポイントを説明します。
サンプルアプリケーションでは、今回の対象となる顧客モデルがファイル型項目を含んでいるため、マルチパートフォームで更新用APIを呼び出します。
サンプルアプリケーションでは、顧客モデルの "datetime1" 項目を日付時刻型としています。ここで、ExcelでJSONを扱うために用いている JSONLib というライブラリは(本ドキュメント執筆時点のバージョンでは)long値に対応していません。
そのため、サンプルアプリケーションでは replaceLongValue という関数を用意しました。VBAで利用できる正規表現ライブラリを用いて、数字型項目はダブルクォーテーショんで囲み、文字列表現としています。これによって JSONLib の制約を回避しています。
将来の JSONLib のバージョンアップで本制約が撤廃されたときには、このコードは不要になります。あるいは(このような制約のない)他のライブラリを使うという選択肢もあるかもしれません。開発者の判断でご対応ください。
ここで紹介したリポジトリ、サンプルデータ、サンプルアプリケーション(Excelファイル)一式をダウンロードできます。
ダウンロードしたプログラム (Excelマクロ) はログオンアカウント admin (パスワードはwagby) で接続するようになっています。
JSONLib を利用するためには、対象の Excel に jsonlib クラスモジュールをインポートする必要があります。
当ページでダウンロードできる Excel ファイルは既にインポート済みですので、こちらを編集する形での開発をお勧めします。
サンプルアプリケーションの動作
顧客モデルの拡張
Excelを起動する
検索
更新
登録
注意
削除
ダウンロード
VBAの説明
マルチパートフォームを使った更新
Sub updateOneData()
rownum = ActiveCell.Row
pkey = getPrimaryKey(rownum)
desc = getUpdateDataDescription(rownum)
If pkey = "" Or desc = "" Then
Exit Sub
End If
ok = MsgBox(desc & " を更新してよろしいですか?", vbOKCancel)
If ok = vbCancel Then
Exit Sub
End If
'--------------------------------------------------------------------
' 変数定義
'--------------------------------------------------------------------
Dim strJSON As String ' レスポンスで受け取るJSONデータ
Dim objJSON As Object ' レスポンスの JSON 文字列をパースした情報を格納
Dim strURL As String ' アクセス先URL
Dim data As String
data = createUpdateParameter(rownum)
'MsgBox (data)
'------------------------------------------------------------------
' 検索文字付きURLを作成する
'------------------------------------------------------------------
strURL = ModelId & "/edit/" & pkey
Dim contentType As String
contentType = "multipart/form-data; boundary=" & MultipartBoudary
Dim headerkey As New Collection
Dim headervalue As New Collection
headerkey.Add item:="Content-Type"
headervalue.Add item:=contentType, key:="Content-Type"
strJSON = callRest2(strURL, "PUT", data, headerkey, headervalue)
If strJSON = "" Then
Exit Sub
End If
strJSON = replaceLongValue(strJSON)
Set objJSON = parseJSON(strJSON)
If objJSON Is Nothing Then
Exit Sub
End If
If IsNull(objJSON.item("entity")) Then
Exit Sub
End If
setContentsP rownum - RowStart, objJSON.item("entity"), objJSON.item("entityp")
End Sub
Const MultipartBoudary As String = "----WebKitFormBoundary4biuCV4d9GMPOr5D"
long値の扱い
Function replaceLongValue(strJSON As String) As String
Dim items As Variant
items = Array("datetime1")
For Each itemstr In items
Set reobj = CreateObject("VBScript.RegExp")
With reobj
.Pattern = "(""" & itemstr & "_"":)([0-9]*),"
.Global = True
End With
strJSON = reobj.Replace(strJSON, "$1""$2"",")
Next
replaceLongValue = strJSON
End Function
注意
ダウンロード
お試しの前に
ワンポイント
セキュリティについての考慮点