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

シェアする

  • このエントリーをはてなブックマークに追加
  • Evernoteに保存Evernoteに保存

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

テーブルAの内容を、丸ごと(もしくは一部を)テーブルBにコピーして、テーブルBで作業を行いたい場合があります。

つまり、ボタン一発でオリジナルへアンドゥが利く(元のデータへやり直しできる)環境づくりです。

例えば、伝票をテーブルAに入力して、そのコピー(テーブルB)で仕訳処理を行いたい場合や、社員にテーブルAを入力させて、アルバイトにテーブルBを触らせたりしたい場合です。

実はテーブルA自体をテーブルBにコピー(インポート)する方法も、あるにはあるのですが、これは「インスタントWEB」(IWP)では動きません

そのため、テーブル間コピーには色々な方法がありますが、今回のこの記事では「インスタントWEB」でも動作する方法(スクリプト作成)に特化します

インスタントWEBを使う場合、一発ボーンでコピー完了というコマンドはありませんが、これから説明するスクリプトの作り方を理解すれば、ボタン一発ボーンでコピーできるスクリプトは作れます。たぶん。

はじめに

さて、FileMakerでテーブル間のコピーを行う方法をググると「インポートすればいいんじゃね」とか「キーだけコピってリレーションでいけね?」とか「わざわざコピーする意味がわからん」といった、いささか投げやりというか、もう少し勉強しろ(ググれks)的な雰囲気が漂ってくるものばかりです。FileMakerのベテランさんも、十分に調べない教えて君に答えるのに疲れてるのだと思います。

でも、結構ググったし、本も2冊程度は買った、ファイルのインポートもリレーションも、言葉の意味はわかるんだけど、いまいちピンとこなくてうまくできない(私のような)方のために、若干くどいかもしれませんが、自分への復習もかねて説明したいと思います。ビール片手に気軽にお読みください。

ステップ・バイ・ステップで説明しますが、先にスクリプトのソースが見たいという「ルーク、ソースを使え」な人は、ページ下部をご覧ください

別テーブルのフィールドをコピーする際の基本概念

まず、「インスタントWEB(IWP)で動くコピー・スクリプトを作る」うえでの基本的な考え方としては、

  1. テーブルAを開いて、該当するレコードのフィールドから値をコピー
  2. テーブルBを開いて現在のレコードの該当フィールドに貼り付け

を全フィールド、全レコードぶん鬼のように繰り返すということです。Excelで例えるなら、

  1. 「シートA」を開いてセルを選んでコピー
  2. 「シート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」(コピー先)
    • フィールド名:「通し番号」(設定:数値)
    • フィールド名:「名前_確認後」(設定:テキスト)
    • フィールド名:「備考」(設定:テキスト)
【やりたいことの例】
  1. ボタンを押すとテーブルAにある「名前_確認前」フィールドを、まっさらなテーブルBの「名前_確認後」フィールドに、すべてコピー
  2. テーブルBで作業を行う
  3. 別の人に同じ作業をさせたいので、テーブル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)]

[詳しい説明に戻る]



スポンサーリンク
レクタングル(大)広告

シェアする

  • このエントリーをはてなブックマークに追加
  • Evernoteに保存Evernoteに保存
スポンサーリンク
レクタングル(大)広告