v18での事例を紹介。テンプレートのエクセルシートがあって、宛先などのセルにDBに登録されている値をセット、完成したエクセルシートを書き出す、という業務があり、シートの数が多いので面倒という案件があった。
これを4Dで解決するために、顧客からもらったエクセルシートをテンプレートとしてResourcesフォルダに置く、4D側でインポートしてセルの値をDBの値に置き換える、ことにした。4D View Proを使う。
手順の概要:
1)ViewProエリアのオブジェクトプロパティでon VP Readyイベントをチェック
on VP ReadyはVPエリアがロード完了したときに発生する。
2)ViewProエリアのオブジェクトメソッドにon VP Readyイベントハンドラを記述
//B01_vpJissiKakuninsho
//4D ViewProでエクセルシートを作成
C_LONGINT($frmEvnt)
$frmEvnt:=Form event code
Case of
: ($frmEvnt=On VP Ready)
//オンレディ
B01_vpJK_onVPReady
End case
3)VP IMPORT DOCUMENTを記述、テンプレートファイル名とコールバックメソッド名を指定
これでインポートが完了したときに指定したメソッドが実行される。ここでは「B01_vpJK_make」をコールバックメソッドに指定した。VP IMPORT DOCUMENTの3番目の引数$optionsに渡すのだが、$optionsはオブジェクト型。
//B01_vpJK_onVPReady
//20211217 wat
//オンレディ
C_TEXT($frmObjName)
$frmObjName:="vB01_vpJissiKakuninsho"
C_TEXT($templateFileName)
$templateFileName:="jissi_kakuninsho_tmp.xlsx"
// 外部からエクセルファイルを読み込む
C_OBJECT($options)
$options:=New object
$options.formula:=Formula(B01_vpJK_make )
$filePath:=Get 4D folder(Current resources folder)+$templateFileName
VP IMPORT DOCUMENT ($frmObjName;$filePath;$options)
4)コールバックメソッドを記述
ここでDBの値を取得してセルにセットしていく
//B01_vpJK_make
//VP IMPORT DOCUMENTのoptions.formulaで非同期呼び出し。
//ここでセルに値をセットしたり、テンプレートの情報を取得して4Dフィールドに表示したりする。
4D View Proは4DのWebエリアを拡張したView ProエリアにSpreadJSのライブラリを埋め込んだ実装となっている。このためフォームオブジェクトのローディングが4DのOnLoadイベントではまだロードがされていない可能性がある。それでViewProエリアにイベントが発生する仕組みになっている。さらにテンプレートをインポートする際にも一度処理がSpreadJSに渡るため、4D側は非同期処理が必要になる。このときは$optionsに与えたメソッドがコールバック関数として呼び出される、という仕組み。わかってしまえばコード量はそれほど多くない。