子テーブルまるごとコピーしたい

 
この人の見積もり内容をコピーして顧客名と担当者名だけ変えたい でもAppSheetのアクションだと親テーブルのレコードしかコピーしてくれない… そんな悩みを解決する記事を発見!
これ!kさんありがとうございます!
【楽々設定!】Refで紐ついたデータを一括でコピーする方法
本記事はノーコードアプリ開発について全く知らなかった著者が独学で勉強し、ここ大事!と感じた部分を記事にまとめています。 Refで紐つけた子テーブルの情報も一括で親テーブルにコピーする方法が知りたい人 appsheetのコピーアクションの基礎を学びたい人 Add a new row to another...のアクションボタンの使い方がわかる Execute an action...のアクションボタンの使い方がわかる 今回の記事は データのコピーについて です。 こちらの記事で作成した見積書作成アプリを色々といじっている時に、 一度作った見積書を明細込みで一括でコピーしたいな・・ と思いました。 この方法なら読者の皆さんに自信を持ってオススメできる のでぜひ参考にしていただければと思います(^^) それでは勉強していきましょう! まず本記事内容について再度確認します。 この方法はデータタイプRefでリレーションをもたせているテーブル間において 親テーブルと子テーブルのデータを一括でコピーする方法 についてまとめています。 上図のように appsheetに用意されているコピーアクション単体では、実装は不可能 です・・ それを無理やり叶えよう!というのが本記事です(^^) 具体的な手順ですが、以下の流れで実装が可能です。 親テーブルのデータを親テーブルにコピーするアクションをつくる(アクション1) 子テーブルのデータを子テーブルにコピーするアクションをつくる(アクション2) アクション2の設定を親テーブルに移動させる(アクション3) アクション1とアクション3をグループ化する 検証に用いたデータですが、以下の設定です。 ID:Key値 見積書番号:見積書作成アプリのため設定 image:ブログ記事内容を分かりやすくするために設定 Related 見積もり詳細s:Ref関係を結んだ時に自動で生成されるVirtual column 合計金額:見積もり詳細で登録した金額の合算 ID:Key値 見積もりID:見積書テーブルとRef関係を結ぶカラム 品目:本記事では説明は省略(品目テーブルを参照するカラム) 価格:本記事では説明は省略(品目テーブルを参照するカラム) 個数:品目の個数を入力するカラム それでは順番に説明していきます(^^) まず、親テーブルと子テーブルのデータをコピーするアクションをそれぞれつくります。 作り方は以下の流れを参考にしてください。 親テーブルにデータをコピーするアクションを作成する Behaviorペイン→Actionタブから新規アクションを作成します。 赤枠を参考にして親データをコピーするアクションを作成します。 赤枠部分を参考にコピーするカラムの設定を行います。 ID(Key値)にはUNIQUEID()、その他のカラムは入力されているカラム値 で大丈夫です(^^) 子テーブルにデータをコピーするアクションを作成する 子テーブルにも同じコピーアクションを作成します。 子テーブルのデータをコピーするアクションなので、参照テーブルの設定を間違えないように! 赤枠部分を参考にコピーする内容を設定します。 見積書ID(Refを結んでいるカラム)には以下の関数を入力 してください。 any(select(見積書[ID],[_rownumber]=max(見積書[_rownumber]))) この構文の意味するところは 見積書テーブル(親テーブル)に登録されている最も新しいデータのID(Key値)を取得する です。 親データをコピーする際、 ID(Key値)は新規で取得 されます。 その コピーされた最新のデータがこれから子テーブルに紐つけたいデータそのもの なので、 そのIDの値を見積りIDに送る必要があります。 よく分からなければ構文のコピーで大丈夫です(^^) any(select(見積書 [ID],[_rownumber]=max(見積書[_rownumber])))の構文は、 どんなアプリでも同じ形を取る ので、 親テーブルのテーブル名 と Key値のカラム を変更してお使いください(^^) 次にやることとしては 子テーブルに作成したアクションボタンを親テーブルに移動させる これをやってみたいと思います。 このアクションは設定が少し複雑なので、説明をリストにまとめました。 For a record of this table:アクションボタンを設定したいテーブル Do this:Execute an
 
やってみたらカンタンだった!
せっかくなのでこれも参照して組み込んだ! データ投入と同時に強制的にシンクさせる方法!
 
ちなみにちょっといじってこんな感じにした!
強制的にシンクする&その注文(親テーブル)のフォーム画面に遷移する関数
MAXROWを使って作成日時が一番最新の注文のフォームに飛ぶっていう感じ
コピーしたあと内容を差し替えることを想定するとこれがベターな気がする!
 
 
ちなみに最後の
にするとそのフォームに移動するだけになるので、強制的に同期するのが鬱陶しい時にはこっちもあり🐜
 

 
この一連のアクションで分かりづらいのはやはり execute an action on a set of rows
テーブルをまたいだアクションの実行。この部分かなと
自分なりにまとめると
 
Action name
  • これはそのままアクションの名前
For a record of this table
  • アクションを実行するテーブル
  • どのテーブル起点にするか っていう考えでよろしいかと
Do this
  • execute an action on a set of rows
  • 紐付いたテーブルの関連する行に対してアクションを実行しますよってやつかなと
Referenced Table
  • アクションが実行されるテーブルを選ぶ
  • 今回は注文詳細をコピーする必要があるので注文詳細テーブルを指定する
Referenced Rows
  • アクションを実行する対象の行の条件をここで指定する
  • 今回の件で言えば、注文と紐付いた注文詳細を全てコピーするので SELECT(注文詳細[ID注文],[ID注文]=[_THISROW].[ID注文]) で、この注文に紐付いた注文詳細全てに対してアクションを実行することができることになる
  • ただ注文と注文詳細をRefでくっつけた時に自動で出来上がる [Related 注文詳細s]が、SELECT(注文詳細[ID注文],[ID注文]=[_THISROW].[ID注文])と同義なので、[Related 注文詳細s]でもOK!!
Referenced Action
  • 子テーブルに対して行うアクションを指定する
  • なので子テーブル(今回で言えば注文詳細テーブル)で予めアクションを作っておく必要がある
  • 子テーブルに作っておくアクションは注文詳細をコピーするアクション
 
ここさえわかればそれ以外のアクションはそんなに難しいことはないかも!?
 
 
最後に実際に動かしてみた!どんな動きになるか動画で!