FileMakerで別テーブルのレコードをIWPで全コピーするスクリプト

FileMaker Pro11のインスタントWEB(IWP)でテーブル間の全レコードをコピーするスクリプト

この記事は次のブログに引っ越しました。

FileMaker Pro11のインスタントWEB(IWP)でテーブル間の全レコードをコピーするスクリプト 19:20 FileMaker Pro11のインスタントWEB(IWP)でテーブル間の全レコードをコピーするスクリプトを含むブックマーク CommentsAdd Star テーブルAの内容を、丸ごと(もしくは一部を)テーブルBにコピーして、テーブルBで作業を行いたい場合があります。 つまり、ボタン一発でオリジナルへアンドゥが利く(元のデータへやり直しできる)環境づくりです。 例えば、伝票をテーブルAに入力して、そのコピー(テーブルB)で仕訳処理を行いたい場合や、社員にテーブルAを入力させて、アルバイトにテーブルBを触らせたりしたい場合です。 実はテーブルA自体をテーブルBにコピー(インポート)する方法も、あるにはあるのですが、これは「インスタントWEB」(IWP)では動きません。 そのため、テーブル間コピーには色々な方法がありますが、今回のこの記事では「インスタントWEB」でも動作する方法(スクリプト作成)に特化します。 インスタントWEBを使う場合、一発ボーンでコピー完了というコマンドはありませんが、これから説明するスクリプトの作り方を理解すれば、ボタン一発ボーンでコピーできるスクリプトは作れます。たぶん。 はじめに さて、FileMakerでテーブル間のコピーを行う方法をググると「インポートすればいいんじゃね」とか「キーだけコピってリレーションでいけね?」とか「わざわざコピーする意味がわからん」といった、いささか投げやりというか、もう少し勉強しろ(ググれks)的な雰囲気が漂ってくるものばかりです。FileMakerのベテランさんも、十分に調べない教えて君に答えるのに疲れてるのだと思います。 でも、結構ググったし、本も2冊程度は買った、ファイルのインポートもリレーションも、言葉の意味はわかるんだけど、いまいちピンとこなくてうまくできない(私のような)方のために、若干くどいかもしれませんが、自分への復習もかねて説明したいと思います。ビール片手に気軽にお読みください。 ステップ・バイ・ステップで説明しますが、先にスクリプトのソースが見たいという「ルーク、ソースを使え」な人は、ページ下部をご覧ください。 別テーブルのフィールドをコピーする際の基本概念 まず、「インスタントWEB(IWP)で動くコピー・スクリプトを作る」うえでの基本的な考え方としては、 テーブルAを開いて、該当するレコードのフィールドから値をコピー テーブルBを開いて現在のレコードの該当フィールドに貼り付け を全フィールド、全レコードぶん鬼のように繰り返すということです。Excelで例えるなら、 「シートA」を開いてセルを選んでコピー 「シートB」を開いてセルを選んでペースト を、全セルぶん鬼のように繰り返すマクロを作るということです。 コピー作業を行う上での基本を復習したいと思います。 スクリプトのステップ内でフィールドのデータを取得するには、「変数を設定」ステップで値の取得に"GetNthRecord()"関数を使います。"GetNthRecord()"内でフィールド名とレコード番号を指定すれば、該当するフィールドを取得できる便利な関数です。 ■テーブルAの10行目にある「フィールドA」列の値を取得して、変数"$iData"にセットしたい場合の例 変数を設定[ $iData; 値:GetNthRecord( テーブルA::フィールドA; 10 ) ] 逆に、フィールドに値を設定したい場合は「フィールド設定」ステップで、上記で取得した値をセットします。 ■変数"$iData"の値を、テーブルBの現在選択中の行(レコード)の「フィールドA」列にセットしたい場合の例 フィールド設定[ テーブルA::フィールドA; $iData ] さて、ここでのポイントは、コピーを行う時点で参照先のテーブルが表示そして選択されていないとコピーが正しく動きません。GetNthRecordの関数内でわざわざテーブル名を指定しているにもかかわらず、です。 同様にペースト(貼り付け)する時点で、対象となるテーブルが選択されていないと貼り付けられません。しかし「フィールド設定」ステップは現在選ばれているのテーブルに対して有効なので、当然といえば当然ですが。 そして、見落としがちなのがコピー作業中は両方のテーブルが表示されていないと行けません。つまり、「レイアウトの切り替え」ではダメなのです。 ウィンドウを切り替えてコピペするのではなく、擬似的なウィンドウを作って、2つを並べて、右から左へドラッグ&ドロップするイメージが近いかな。 ■例) テーブルAにあるフィールドAの値を、テーブルBのフィールドBにコピーする ウインドウを選択[名前:"テーブルAのウィンドウ"; 現在のファイル] 変数を設定[$sData; 値:GetNthRecord( テーブルA::フィールドA ; $iCount )] ウインドウを選択[名前:"テーブルBのウィンドウ";現在のファイル] 新規レコード/検索条件 フィールド設定[テーブルB::フィールドB; $sData] 【事前に作っておくもの】 テーブル名:「テーブルA」(コピー元) フィールド名:「通し番号」(設定:数値のシリアル番号でユニークな値) フィールド名:「名前_確認前」(設定:テキスト) テーブル名:「テーブルB」(コピー先) フィールド名:「通し番号」(設定:数値) フィールド名:「名前_確認後」(設定:テキスト) フィールド名:「備考」(設定:テキスト) 【やりたいことの例】 ボタンを押すとテーブルAにある「名前_確認前」フィールドを、まっさらなテーブルBの「名前_確認後」フィールドに、すべてコピー テーブルBで作業を行う 別の人に同じ作業をさせたいので、テーブルBをバックアップ(エクスポート)して、(1)に戻る 【具体的な作り方】 まず、事前に作っておくものとして、コピー元のテーブル(データ入り)と、コピー先のテーブル(空でOK)を作っておきます。ここでは、コピー元をテーブルA、コピー先をテーブルBとします。 この際の各テーブルに作るフィールドのフィールド名は同じにする必要はありませんが、どのフィールドをどのフィールドにコピーしたいかを把握しておいてください。 若干、無駄というかスキップできるステップもありますが、1行づつ何を行なっているか想像しながら見て下さい。 エラー処理[オン] #コピー元の準備 新規ウインドウ(Web上の仮想ウインドウ)[名前:"オリジナルのウィンドウ"] ウインドウを選択[名前:"オリジナルのウィンドウ"; 現在のファイル] レイアウトの切り替え[「テーブルAのレイアウト」(テーブルA)] 全レコードを表示 ##テーブルAからコピーするレコード数を取得 変数を設定[$iMax; 値:Get( 対象レコード数 )] レコード/検索条件/ページへ移動[最初の] #コピー先データの準備 新規ウインドウ(Web上の仮想ウインドウ)[名前:"コピー先のウィンドウ"] レイアウト切り替え[「テーブルBのレイアウト」(テーブルB)] ウインドウを選択[名前:"コピー先のウィンドウ";現在のファイル] ##コピー先のデータを全削除 全レコードを表示 対象レコード削除[ダイアログなし] レコード/検索条件/ページへ移動[最初の] #コピーの準備 ##カウンターを設定 変数を設定[$iCount; 値:1] ##コピー処理 Loop   Exit Loop If[$iCount>$iMax]   ウインドウを選択[名前:"オリジナルのウィンドウ"; 現在のファイル]   変数を設定[$sData; 値:GetNthRecord( テーブルA::名前_確認前 ; $iCount )]   ウインドウを選択[名前:"コピー先のウィンドウ";現在のファイル]   新規レコード/検索条件   フィールド設定[テーブルB::名前_確認後; $sData]   変数を設定[$iCount; 値:$iCount+1] End Loop ウインドウを閉じる[名前:"オリジナルのウィンドウ"; 現在のファイル] ウインドウを閉じる[名前:"コピー先のウィンドウ";現在のファイル] レイアウト切り替え[「テーブルBのレイアウト」(テーブルB)]