Forguncy(フォーガンシー)で見積管理システムを作ってみました!(5)
Excel関数もグラフも使えて画面も変更できる、ノンプログラミングWebシステム開発ツール「Forguncy(フォーガンシー)」。
前回に引き続き、見積管理システムを作ります。
↓↓ 前回の記事はこちら ↓↓
今回は、リストビューの空白領域に罫線を引くことができないか、以前作成した「簡単な見積管理システム」を用いて検討してみました。
リストビュー設定では、エクスポート時には空行を追加し罫線を設定することができますが、それ以外では空行を設定することができないようです。
「簡単な見積管理システム」で見積書を表示すると、リストビューを用いた明細部分には空白領域がありました。
このままでは、印刷イメージとして違和感があります。
そこで、リストビューを使わずにデータ一覧を表示させる方法を調査したところ、以下の2つの方法がありました。
- 通常のセルに配列数式とOdata関数を組み合わせて表示する方法
- 通常のセルに配列数式とリストビューを組み合わせて表示する方法
通常セルなら罫線を自由に設定することができます。
配列数式はExcelの配列数式をForguncyがサポートしています。
それぞれの方法を使って、見積書の空白領域に罫線を引いてみたいと思います。
配列数式とOdata関数を組み合わせて表示する方法
Odata関数は、Forguncy固有の関数であり、数式タブの「Odata生成ツール」を利用することで簡単に構築することができます。
エクスポート時はレポート機能を使用したいため、以前作成した見積書ページはエクスポート用のページとして残すこととし、先ずは「見積書」ページを複製します。
ページ名を右クリックして「複製」をクリックし、ページ名を「見積書プレビュー (Odataと配列数式)」とします。
明細部分のリストビューを解除し、セルの結合や罫線の設定をすることで体裁を整えます。
「費目」の列(費目の全領域)を選択し、数式タブの「Odata生成ツール」をクリックします。
対象テーブルを選択し、選択タブでは「フィールドの取得」を選択、フィールドを指定します。
クエリータブでは「見積No」フィールドがページ上の見積書No.と等しく設定します。
「OK」をクリックすると、数式バーにOdata関数が入りました。
このままでは、レコードのない行にエラーが発生するので「IFERROR」を用いて回避します。
「単価」「数量」「補足」それぞれにも同様の手順で以下の数式を入力します。
費目:=IFERROR(ODATA("見積詳細?$select=費目&$filter=見積No eq "&IF(ISBLANK(AB3),"null","'"&AB3&"'")),"")
単価:=IFERROR(ODATA("見積詳細?$select=単価&$filter=見積No eq "&IF(ISBLANK(AB3),"null","'"&AB3&"'")),"")
数量:=IFERROR(ODATA("見積詳細?$select=数量&$filter=見積No eq "&IF(ISBLANK(AB3),"null","'"&AB3&"'")),"")
補足:=IFERROR(ODATA("見積詳細?$select=補足&$filter=見積No eq "&IF(ISBLANK(AB3),"null","'"&AB3&"'")),"")
入力したら、Enterではなく、Shift+Enterとすることで配列数式になります。(以下のように数式が{}で囲まれます)
「No.」列には先頭行には「1」を入力、2行目以降には「=IF((費目セル)="","",(1つ上のNoセル)+1)」を入力し、「金額」列には「=IF((費目セル)="","",(単価セル)*(数量セル))」を入力します。
これで、テーブルデータの一覧を表示する数式が設定できました。リストビューは使っていません。
デバッグを開始して確認してみます。
レコードデータはあるけれど、フィールドデータが空の場合、「0」が入っています。(補足列)
解消しようとIF関数など入れてみましたが、うまくいきませんでした。
苦肉の策ですが、見積入力画面に補足入力欄を設け、補足データが空の場合に半角スペースを入れるよう、コマンドを追加します。また、リストビュー上から編集もできるので、ここにも数式を加えます。
もう一度、デバッグを開始して確認してみます。
うまく解消できました。
次に、行数が超えた場合、つまり複数ページになる場合を考えます。
2ページ目以降、表示データの開始レコードを変更するためには、Odata生成ツールの中でクエリーを加えます。
IDは登録した順であるため、連続であるとは限りません。
そこで、以下を加えます。
- 明細部分に非表示列を追加し、テーブルのIDを表示する。(①)
- 非表示領域に、明細に表示しているレコードの後尾IDを取得する。(②)
- 非表示領域に、明細に表示する先頭IDの初期値を「0」とする。(③)
- 「ID」~「補足」までのOdata関数にクエリーを追加する。(ID>先頭ID)
- 「ID」~「補足」までのOdata関数に並べ替えを追加する。(ID昇順)
- ページ遷移と見せるためのボタンを追加する。(⑤)
- ページ遷移の右ボタン「▶」には、後尾IDを先頭IDに移し、後尾IDが空欄または最大ID(④)と等しい場合には、「▶」ボタンを無効に、さらにページ遷移の左ボタン「|◀」を有効にするコマンドを設定する。
- ページ遷移の左ボタン「|◀」には、先頭IDを「0」に戻し、「▶」ボタンを有効、「|◀」ボタンを無効にするコマンドを設定する。
- ページ遷移の左ボタン「|◀」はセル型の設定で「無効」にする。
- ページロード時のコマンドで、後尾IDが空白や最大IDと等しい場合はページ遷移の右ボタン「▶」を無効にする。
ページ遷移の左ボタンでは、先頭ページに戻ります。
1ページずつ戻るには、見積書No.ごとに連番を設けるといいかと思います。
デバッグを開始して確認します。
1ページ目
2ページ目
実際にページは遷移していませんが、明細部分の値が変わり、ページが切り替わったように見えます。ですが、見積金額がページそれぞれの合計になっていました。
「見積詳細」テーブルに数式フィールドを追加して「金額」フィールドを作成してみましたが、Odata生成ツールでは「金額」フィールドの合計値を出すことができませんでした。
これを修正するには、結局リストビューの利用が簡単でしょうか。
ということで、非表示領域に「見積詳細」テーブルのリストビューを作成し、数式フィールド「金額」を連結、見積書フォーム内の小計欄を「=SUM(AY29)」(AY29=「金額」フィールドの行テンプレート)と変更することで解決できました。
配列数式とリストビューを組み合わせて表示する方法
先ほどの「見積書プレビュー (Odataと配列数式)」ページを複製します。
ページ名を右クリックして「複製」をクリックし、ページ名を「見積書プレビュー(リストビューと配列数式)」とします。
明細部分の数式を消去します。
非表示領域に「見積詳細」テーブルのリストビューを作成します。
「費目」の列(費目の全領域)を選択し、数式バーに「=IFERROR(IF(ROW(E22:K42)<ROW(E22)+$AY$22,AX28,""),"")」と入力します。(AY22=データ数、AX28=「費目」フィールドの行テンプレート)
入力したら、Enterではなく、Shift+Enterとすることで配列数式になります。(以下のように数式が{}で囲まれます)
「単価」「数量」「補足」それぞれにも同様の手順で以下の数式を入力します。
単価:=IFERROR(IF(ROW(L22:O42)<ROW(L22)+$AY$22,AY28,""),"")
数量:=IFERROR(IF(ROW(P22:R42)<ROW(P22)+$AY$22,AZ28,""),"")
補足:=IFERROR(IF(ROW(W22:AG42)<ROW(W22)+$AY$22,BA28,""),"")
これで、テーブルデータの一覧を表示する数式が設定できました。
合計金額は、リストビューから抽出する場合、クエリー条件によって変動するため、ページロード時のコマンドにおいて、初期のリストビューから抽出した合計金額を見積書の小計欄に挿入します。
デバッグを開始して確認してみます。
1ページ目
2ページ目
配列数式とOdata関数を組み合わせた場合と同じ結果を得ることができました。
「PDF出力」ボタンに設定している「PDFエクスポート」コマンドでは、エクスポートするページを以前使用した「見積書」とします。
以上、テーブルデータの一覧を2通りの方法で通常セルに表示させることができ、データのない空白行に罫線を引くことができました。
Odata関数は難しく感じましたが、生成ツールを利用すれば簡単に構築でき、テーブルにクエリーを使用しない分都合が良いケースがあるかと思います。
リストビューを用いる場合は、ページ遷移コマンドにある「遷移先ページのクエリー結果と並べ替えのキャッシュを削除する」にチェックを入れることで、必要に応じてクエリー条件をリセットすることを忘れないようにする必要があります。
いかがでしたでしょうか。
また今後も便利な機能を探っていきたいと思います。