サブテーブル間を計算して、別のサブテーブルに登録

対象プラグイン名
計算式プラグイン

ご相談・ご質問の内容
見積計算ソフトにサブテーブルが3つアプリ内にあります。
サブテーブル1とサブテーブル2は入力用です。
上記2つのサブテーブルに入力された組み合わせ分、サブテーブル3に行を追加したいです。
それぞれのサブテーブルに登録されているデータは下記のイメージになります。
ご教授頂きたいです。よろしくお願いいたします。

(入力)サブテーブル1(使用材料)
格納データ
材料名
クラフト紙
ラミネート

(入力)サブテーブル2(見積枚数)
格納データ
枚数
1000枚
2000枚

(出力)サブテーブル3(材料代)
格納データ
枚数、材料名
1000枚、クラフト紙
1000枚、ラミネート
2000枚、クラフト紙
2000枚、ラミネート

テーブルが材料代ということで他に金額等があると思いますが、わかる部分だけ。
テーブル1,テーブル2を組合わせて、テーブル3(材料代)のデータを作ります。

編集画面

横並びプラグインでテーブルを横並び表示

  • (出力)サブテーブル3(材料代)
    • 枚数T
    • 材料名T

計算式プラグイン設定

テーブル(材料代)計算式

LET(
  maisu,  JSON_P(OTVAL(見積枚数)),   // 枚数取込
  zairyo, JSON_P(OTVAL(使用材料)),   // 材料取込
  rows,   ARRAY(),                   // 出力用
  wk,     ARRAY_MAP(maisu,m,         // 外側回
            ARRAY_MAP(zairyo,z,      // 内側回
              FSET(rows, ARRAY(rows,
                DIC(
                  "枚数T", DIC_ITEM(m,"枚数"),
                  "材料名T", DIC_ITEM(z,"材料名")
                )
              ))
            )
          ),
  TABLE_DATA(rows)
)

フォルトンに計算式の解説をしてもらいました

:puzzle_piece: 各部分の解説

変数 内容 説明
maisu JSON_P(OTVAL(見積枚数)) 「見積枚数」テーブルを配列として取得
zairyo JSON_P(OTVAL(使用材料)) 「使用材料」テーブルを配列として取得
rows ARRAY() 出力結果を格納するための空配列
wk ARRAY_MAP(...) 2重ループ処理(結果は使わない)
TABLE_DATA(rows) 最終的に作った配列をテーブル形式に変換

:repeat_button: 2重ループの動き

ARRAY_MAP(maisu,m,
  ARRAY_MAP(zairyo,z,
    FSET(rows, ARRAY(rows,
      DIC("枚数T",DIC_ITEM(m,"枚数"),"材料名T",DIC_ITEM(z,"材料名"))
    ))
  )
)
  1. 外側 (maisu):見積枚数テーブルの各行を m として処理
  2. 内側 (zairyo):使用材料テーブルの各行を z として処理
  3. 組み合わせ生成
    m(枚数)と z(材料)を組み合わせて、1行の辞書(DIC)を作成

結果はこのような形になります:

枚数T 材料名T
枚数1 材料A
枚数1 材料B
枚数2 材料A
枚数2 材料B

:brain: 関数のポイント

関数 説明
OTVAL() 他テーブルの値を取得
JSON_P() JSON文字列を配列化
ARRAY() 空配列を生成
ARRAY_MAP() 各要素に対して繰り返し処理
FSET() 配列に要素を追加
DIC() 辞書(オブジェクト)を作成
DIC_ITEM() 辞書内の指定項目の値を取得
TABLE_DATA() 配列をテーブル形式データに変換

:white_check_mark: この式の最終結果

  • 出力テーブルには、見積枚数テーブルと使用材料テーブルの全組み合わせ行が生成されます。
  • 組み立てたデータは「TABLE_DATA」で出力し、
    他のフィールドに「テーブル型」で設定すれば、そのまま一覧表示できます。
「いいね!」 1

お世話になります。

早速実装したところ、思った通りの結果を得る事が出来ました。
すぐ、サブテーブルを変更した際に連動して再計算してくれる所は感動です!

フォルトンも活用させて頂きます!!

ご教授頂きありがとうございました!

「いいね!」 1

このトピックは最後の返信から 60 分が経過したので自動的にクローズされました。新たに返信することはできません。