PickUp 投稿記事

Forguncy(フォーガンシー)で見積管理システムを作ってみました!(5)

Forguncy(フォーガンシー)で見積管理システムを作ってみました!(5)

Excel関数もグラフも使えて画面も変更できる、ノンプログラミングWebシステム開発ツール「Forguncy(フォーガンシー)」。

前回に引き続き、見積管理システムを作ります。

↓↓ 前回の記事はこちら ↓↓

今回は、リストビューの空白領域に罫線を引くことができないか、以前作成した「簡単な見積管理システム」を用いて検討してみました。

リストビュー設定では、エクスポート時には空行を追加し罫線を設定することができますが、それ以外では空行を設定することができないようです。

「簡単な見積管理システム」で見積書を表示すると、リストビューを用いた明細部分には空白領域がありました。

このままでは、印刷イメージとして違和感があります。

御見積書

そこで、リストビューを使わずにデータ一覧を表示させる方法を調査したところ、以下の2つの方法がありました。

  • 通常のセルに配列数式とOdata関数を組み合わせて表示する方法
  • 通常のセルに配列数式とリストビューを組み合わせて表示する方法

通常セルなら罫線を自由に設定することができます。

配列数式はExcelの配列数式をForguncyがサポートしています。

それぞれの方法を使って、見積書の空白領域に罫線を引いてみたいと思います。

配列数式とOdata関数を組み合わせて表示する方法

Odata関数は、Forguncy固有の関数であり、数式タブの「Odata生成ツール」を利用することで簡単に構築することができます。

エクスポート時はレポート機能を使用したいため、以前作成した見積書ページはエクスポート用のページとして残すこととし、先ずは「見積書」ページを複製します。

ページ名を右クリックして「複製」をクリックし、ページ名を「見積書プレビュー (Odataと配列数式)」とします。

複製

明細部分のリストビューを解除し、セルの結合や罫線の設定をすることで体裁を整えます。

「費目」の列(費目の全領域)を選択し、数式タブの「Odata生成ツール」をクリックします。

領域を選択した状態で数式を入力します

対象テーブルを選択し、選択タブでは「フィールドの取得」を選択、フィールドを指定します。

フィールドの取得

クエリータブでは「見積No」フィールドがページ上の見積書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とすることで配列数式になります。(以下のように数式が{}で囲まれます)

{=IFERROR(ODATA("見積詳細?$select=費目&$filter=見積No eq "&IF(ISBLANK(AB3),"null","'"&AB3&"'")),"")}

「No.」列には先頭行には「1」を入力、2行目以降には「=IF((費目セル)="","",(1つ上のNoセル)+1)」を入力し、「金額」列には「=IF((費目セル)="","",(単価セル)*(数量セル))」を入力します。

テーブルデータ一覧

これで、テーブルデータの一覧を表示する数式が設定できました。リストビューは使っていません。

デバッグを開始して確認してみます。

御見積書デバッグ

レコードデータはあるけれど、フィールドデータが空の場合、「0」が入っています。(補足列)

解消しようとIF関数など入れてみましたが、うまくいきませんでした。

苦肉の策ですが、見積入力画面に補足入力欄を設け、補足データが空の場合に半角スペースを入れるよう、コマンドを追加します。また、リストビュー上から編集もできるので、ここにも数式を加えます。

設定値に半角スペース

もう一度、デバッグを開始して確認してみます。

御見積書

うまく解消できました。

次に、行数が超えた場合、つまり複数ページになる場合を考えます。

2ページ目以降、表示データの開始レコードを変更するためには、Odata生成ツールの中でクエリーを加えます。

IDは登録した順であるため、連続であるとは限りません。

そこで、以下を加えます。

①②③④⑤
  1. 明細部分に非表示列を追加し、テーブルのIDを表示する。(①)
  2. 非表示領域に、明細に表示しているレコードの後尾IDを取得する。(②)
  3. 非表示領域に、明細に表示する先頭IDの初期値を「0」とする。(③)
  4. 「ID」~「補足」までのOdata関数にクエリーを追加する。(ID>先頭ID)
  5. ID>先頭ID
  6. 「ID」~「補足」までのOdata関数に並べ替えを追加する。(ID昇順)
  7. ID昇順
  8. ページ遷移と見せるためのボタンを追加する。(⑤)
  9. ページ遷移の右ボタン「▶」には、後尾IDを先頭IDに移し、後尾IDが空欄または最大ID(④)と等しい場合には、「▶」ボタンを無効に、さらにページ遷移の左ボタン「|◀」を有効にするコマンドを設定する。
  10. 遷移コマンド右ボタン
  11. ページ遷移の左ボタン「|◀」には、先頭IDを「0」に戻し、「▶」ボタンを有効、「|◀」ボタンを無効にするコマンドを設定する。
  12. 遷移コマンド左ボタン
  13. ページ遷移の左ボタン「|◀」はセル型の設定で「無効」にする。
  14. ページロード時のコマンドで、後尾IDが空白や最大IDと等しい場合はページ遷移の右ボタン「▶」を無効にする。
  15. ページロード時のコマンド

ページ遷移の左ボタンでは、先頭ページに戻ります。

1ページずつ戻るには、見積書No.ごとに連番を設けるといいかと思います。

デバッグを開始して確認します。

御見積書1ページ目

1ページ目

御見積書2ページ目

2ページ目

実際にページは遷移していませんが、明細部分の値が変わり、ページが切り替わったように見えます。ですが、見積金額がページそれぞれの合計になっていました。

「見積詳細」テーブルに数式フィールドを追加して「金額」フィールドを作成してみましたが、Odata生成ツールでは「金額」フィールドの合計値を出すことができませんでした。

これを修正するには、結局リストビューの利用が簡単でしょうか。

ということで、非表示領域に「見積詳細」テーブルのリストビューを作成し、数式フィールド「金額」を連結、見積書フォーム内の小計欄を「=SUM(AY29)」(AY29=「金額」フィールドの行テンプレート)と変更することで解決できました。

配列数式とリストビューを組み合わせて表示する方法

先ほどの「見積書プレビュー (Odataと配列数式)」ページを複製します。

ページ名を右クリックして「複製」をクリックし、ページ名を「見積書プレビュー(リストビューと配列数式)」とします。

複製

明細部分の数式を消去します。

非表示領域に「見積詳細」テーブルのリストビューを作成します。

「費目」の列(費目の全領域)を選択し、数式バーに「=IFERROR(IF(ROW(E22:K42)<ROW(E22)+$AY$22,AX28,""),"")」と入力します。(AY22=データ数、AX28=「費目」フィールドの行テンプレート)

領域を選択した状態で数式を入力します

入力したら、Enterではなく、Shift+Enterとすることで配列数式になります。(以下のように数式が{}で囲まれます)

{=IFERROR(IF(ROW(E22:K42)<ROW(E22)+$AY$22,AX28,""),"")}

「単価」「数量」「補足」それぞれにも同様の手順で以下の数式を入力します。

単価:=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ページ目

1ページ目

御見積書2ページ目

2ページ目

配列数式とOdata関数を組み合わせた場合と同じ結果を得ることができました。

「PDF出力」ボタンに設定している「PDFエクスポート」コマンドでは、エクスポートするページを以前使用した「見積書」とします。

以上、テーブルデータの一覧を2通りの方法で通常セルに表示させることができ、データのない空白行に罫線を引くことができました。

Odata関数は難しく感じましたが、生成ツールを利用すれば簡単に構築でき、テーブルにクエリーを使用しない分都合が良いケースがあるかと思います。

リストビューを用いる場合は、ページ遷移コマンドにある「遷移先ページのクエリー結果と並べ替えのキャッシュを削除する」にチェックを入れることで、必要に応じてクエリー条件をリセットすることを忘れないようにする必要があります。

いかがでしたでしょうか。

また今後も便利な機能を探っていきたいと思います。