ドロップダウンリストでレイアウト変更する [FileMaker]
ドロップダウンリストでレイアウト名を選択するとそのレイアウトに移動する方法を示します。スクリプトトリガを使用するのでFileMaker Pro 10以降が必要です。
1. レイアウト選択:レイアウト名の一覧をドロップダウンリストで表示するフィールド(グローバル)
2. このフィールドに、「LayoutChange」スクリプトを実行するスクリプトトリガをOnObjectExitで設定する。
3. 「LayoutChange」スクリプト
・レイアウト切り替え [ LayoutChange: :レイアウト選択 ]
レイアウトの指定で「計算によるレイアウト名」にしてフィールド「レイアウト選択」を指定する。「レイアウト選択」で選択された名前のレイアウトに移動する。あらかじめレイアウト名は値一覧の値と同じにする。
サンプルファイル LayoutChange.fp7のzip圧縮ファイル(08_LayoutChange.zip)をアップしておきますのでお試しください。Lhacaなどのアーカイバで解凍してご使用ください。
http://www001.upp.so-net.ne.jp/MedFiles/samples.html
1. レイアウト選択:レイアウト名の一覧をドロップダウンリストで表示するフィールド(グローバル)
2. このフィールドに、「LayoutChange」スクリプトを実行するスクリプトトリガをOnObjectExitで設定する。
3. 「LayoutChange」スクリプト
・レイアウト切り替え [ LayoutChange: :レイアウト選択 ]
レイアウトの指定で「計算によるレイアウト名」にしてフィールド「レイアウト選択」を指定する。「レイアウト選択」で選択された名前のレイアウトに移動する。あらかじめレイアウト名は値一覧の値と同じにする。
サンプルファイル LayoutChange.fp7のzip圧縮ファイル(08_LayoutChange.zip)をアップしておきますのでお試しください。Lhacaなどのアーカイバで解凍してご使用ください。
http://www001.upp.so-net.ne.jp/MedFiles/samples.html
GetNthRecordの使い方について [FileMaker]
新規レコードを作成時に、前のレコードのフィールド「B」の値をフィールド「A」に自動入力したいような場合があります。このような場合は、フィールド「A」のオプション、計算値の自動入力で以下の計算式を入れておきます。
GetNthRecord ( フィールド「B」; Get ( レコード番号 ) - 1 )
これで1つ前のレコード番号のフィールド「B」の値がフィールド「A」に入ります。
サンプルファイル 07_GetNthRecord.zipをアップしておきますのでお試しください。
http://www001.upp.so-net.ne.jp/MedFiles/samples.html
GetNthRecord ( フィールド「B」; Get ( レコード番号 ) - 1 )
これで1つ前のレコード番号のフィールド「B」の値がフィールド「A」に入ります。
サンプルファイル 07_GetNthRecord.zipをアップしておきますのでお試しください。
http://www001.upp.so-net.ne.jp/MedFiles/samples.html
新規の関連レコードを作成する2つの方法 [FileMaker]
新規の関連レコードを作成する場合、「このリレーションシップを使用して、このテーブルでのレコードの作成を許可」のチェックして作成する方法と、これを使わない方法があります。
レコードの作成を許可した場合は、ポータルの最下段に置いたボタンで関連する新規レコードが作成されます。それ以外の行ではすでに作成された関連レコードに移動します。レコードの作成を許可していない場合は、ポータル上のボタンはすでに作成された関連レコードに移動するだけ、新規レコードを作成する場合は関連レコード側で新規レコードを作成してから関連レコードに移動します。私は後者のほうが使いやすいと思います。
サンプルファイル 06_RelateRecord.zipをアップしておきますのでお試しください。
http://www001.upp.so-net.ne.jp/MedFiles/samples.html
レコードの作成を許可した場合は、ポータルの最下段に置いたボタンで関連する新規レコードが作成されます。それ以外の行ではすでに作成された関連レコードに移動します。レコードの作成を許可していない場合は、ポータル上のボタンはすでに作成された関連レコードに移動するだけ、新規レコードを作成する場合は関連レコード側で新規レコードを作成してから関連レコードに移動します。私は後者のほうが使いやすいと思います。
サンプルファイル 06_RelateRecord.zipをアップしておきますのでお試しください。
http://www001.upp.so-net.ne.jp/MedFiles/samples.html
FileMakerに入力したファイル名のファイルを開く [FileMaker]
FileMakerでPDFや画像ファイルや文書ファイルを管理したいとき、ファイル名を入力してあればボタンでそのファイルを開くことができます。サンプル名OpenFile.fp7のあるフォルダ内に"フォルダ名"で示すフォルダがあるものとします。このフォルダ内にファイルを入れます。Get(ファイルパス)でOpenFile.fp7のfull pathが得られるので、Get(ファイルパス)とファイル名で開くファイルのパスを合成しています。
[Macの場合]
path1 計算 非保存 Get(ファイルパス)
path2 計算 非保存 Substitute(path1; ["file:/"; ""]; ["/"; ":"]; [Get(ファイル名) & ".fp7";
フォルダ名 & ":" & ファイル名])
[ファイルを開くスクリプト]
AppleScriptを実行
set aFileName to cell "path2" of current record
tell application "Finder"
open file (aFileName as Text)
end tell
[Windowsの場合]
path1 計算(テキスト) 非保存 Get(ファイルパス)
path2 計算(テキスト) 非保存 Substitute(path1; Get(ファイル名) & ".fp7"; フォルダ名 & "/" & ファイル名)
[ファイルを開くスクリプト]
URLを開く[ダイアログなし, 「Path2」]
サンプルファイル 04_OpenFileMac.zipと05_OpenFileWin.zipをアップしておきますのでお試しください。
【お詫びと追記 2011/07/19】
上記記事を書いたあとでMacでもWindowsと同様に「URLを開く」でファイルが開くことが分かりましたのでお詫びして訂正します。ただし、MacではGet(ファイルパス)で得られる「file:/」で始まるパスではブラウザが開いてしまいます。そこで「file:/」を「file://」に置き換えるとファイルが開きます。Windowsでは「file:/」でも「file://」でもファイルが開きます。そこで、パスを「file://」で始まるようにするだけでMacでもWindowsでも同じように動作するようになりました。
サンプルファイル 13_OpenFile.zip(zip圧縮)をアップしておきますのでお試しください。
http://www001.upp.so-net.ne.jp/MedFiles/samples.html
[Macの場合]
path1 計算 非保存 Get(ファイルパス)
path2 計算 非保存 Substitute(path1; ["file:/"; ""]; ["/"; ":"]; [Get(ファイル名) & ".fp7";
フォルダ名 & ":" & ファイル名])
[ファイルを開くスクリプト]
AppleScriptを実行
set aFileName to cell "path2" of current record
tell application "Finder"
open file (aFileName as Text)
end tell
[Windowsの場合]
path1 計算(テキスト) 非保存 Get(ファイルパス)
path2 計算(テキスト) 非保存 Substitute(path1; Get(ファイル名) & ".fp7"; フォルダ名 & "/" & ファイル名)
[ファイルを開くスクリプト]
URLを開く[ダイアログなし, 「Path2」]
サンプルファイル
【お詫びと追記 2011/07/19】
上記記事を書いたあとでMacでもWindowsと同様に「URLを開く」でファイルが開くことが分かりましたのでお詫びして訂正します。ただし、MacではGet(ファイルパス)で得られる「file:/」で始まるパスではブラウザが開いてしまいます。そこで「file:/」を「file://」に置き換えるとファイルが開きます。Windowsでは「file:/」でも「file://」でもファイルが開きます。そこで、パスを「file://」で始まるようにするだけでMacでもWindowsでも同じように動作するようになりました。
サンプルファイル 13_OpenFile.zip(zip圧縮)をアップしておきますのでお試しください。
http://www001.upp.so-net.ne.jp/MedFiles/samples.html
関連レコードへ移動で関連レコードを前面に出したい−別ファイルと同一ファイルの比較− [FileMaker]
今更ながらですが、FileMaker Pro 7以後はマルチテーブル・マルチウインドウになり、きちんと指定しないと予期せぬ動作に遭遇することがあります。とくに、関連するテーブルが別ファイルの場合、「関連レコードへ移動」しても、FileMaker Pro 6以前とは異なり関連レコードが前面に出てこなくなりました。このケースを含めて、「関連レコードへ移動」をどのようにコントロールするかについてサンプルを作成しました。
1. 別ファイルの関連レコードを別ウインドウで開く
別ファイル(relate.fp7)の関連レコードは非表示の状態で開いています。そこで、あらかじめ別ファイルでウインドウ関連のスクリプトを実行しておくと、そのウインドウが前面に表示されます。ただし「最大表示」させると別ウインドウの表示ができませんのでそれ以外の表示(ウインドウの調整など)にします。その後「関連レコードへ移動」を実行します。元ファイル(base.fp7)のスクリプトを示します。
・スクリプト実行 [「ウインドウの調整」, ファイル「relate」]
・関連レコードへ移動 [テーブル: 「separate_relate」; 外部; 使用するレイアウト:「別ファイル関連テーブル」]
2. 同一ファイルの関連レコードを別ウインドウで開く
同一ファイルの関連レコードを別ウインドウで開くためには、関連レコードへ移動する際に新規ウインドウで開きます。関連レコードへ移動するたびに新規ウインドウができてしまうのを避けるには、はじめにそのウインドウを閉じておきます。元ファイル(base.fp7)のスクリプトを示します。
・ウインドウを閉じる [名前: ""same_relate; 現在のファイル]
・関連レコードへ移動 [テーブル: 「same_relate」; 使用するレイアウト:「same_relate_newwin」]
3. 同一ファイルの関連レコードを同一ウインドウで開く
これは現在開いているウインドウがそのまま使用されます。
・関連レコードへ移動 [テーブル: 「same_relate」; 使用するレイアウト:「same_relate_samewin」]
サンプルファイル base.fp7+relate.fp7(ZIP圧縮: 03_GoToRecord.zip)をアップしておきますのでお試しください。
http://www001.upp.so-net.ne.jp/MedFiles/samples.html
1. 別ファイルの関連レコードを別ウインドウで開く
別ファイル(relate.fp7)の関連レコードは非表示の状態で開いています。そこで、あらかじめ別ファイルでウインドウ関連のスクリプトを実行しておくと、そのウインドウが前面に表示されます。ただし「最大表示」させると別ウインドウの表示ができませんのでそれ以外の表示(ウインドウの調整など)にします。その後「関連レコードへ移動」を実行します。元ファイル(base.fp7)のスクリプトを示します。
・スクリプト実行 [「ウインドウの調整」, ファイル「relate」]
・関連レコードへ移動 [テーブル: 「separate_relate」; 外部; 使用するレイアウト:「別ファイル関連テーブル」]
2. 同一ファイルの関連レコードを別ウインドウで開く
同一ファイルの関連レコードを別ウインドウで開くためには、関連レコードへ移動する際に新規ウインドウで開きます。関連レコードへ移動するたびに新規ウインドウができてしまうのを避けるには、はじめにそのウインドウを閉じておきます。元ファイル(base.fp7)のスクリプトを示します。
・ウインドウを閉じる [名前: ""same_relate; 現在のファイル]
・関連レコードへ移動 [テーブル: 「same_relate」; 使用するレイアウト:「same_relate_newwin」]
3. 同一ファイルの関連レコードを同一ウインドウで開く
これは現在開いているウインドウがそのまま使用されます。
・関連レコードへ移動 [テーブル: 「same_relate」; 使用するレイアウト:「same_relate_samewin」]
サンプルファイル base.fp7+relate.fp7(ZIP圧縮: 03_GoToRecord.zip)をアップしておきますのでお試しください。
http://www001.upp.so-net.ne.jp/MedFiles/samples.html
Active tab名を取得するーその3ー [FileMaker]
Active tab名を取得する汎用スクリプトですが、タブコントロールが入れ子になっているとうまく取得できませんでした。ちょっと複雑な処理をして入れ子になったタブコントロールでもActive tab名を取得する汎用スクリプトができました。説明は煩雑すぎますのでSample ActiveTab2.fp7をみてください。実際の使い方は、
1. すべてのタブコントロールに名前をつける。タブ名をつけるにはインスペク/位置(FMP11)、タオブジェクト情報(FMP10以前)を利用する。
2. スクリプトインポートでこのファイル(ActiveTab2.fp7)から以下の3つのスクリプトをインポートする。
□各タブに親子フラグをたてる
□子タブに親タブ情報を付加する
□ActiveTabを取得する
3. レイアウト移動スクリプトに、スクリプト実行で「ActiveTabを取得する」を入れる。
4. 元に戻るスクリプトで、レイアウト切り替えの後に、オブジェクトへ移動[オブジェクト名;$$activetab]を加える。
サンプルファイル ActiveTab2.fp7(ZIP圧縮: 02_ActiveTab2.zip)をアップしておきますのでお試しください。
http://www001.upp.so-net.ne.jp/MedFiles/samples.html
1. すべてのタブコントロールに名前をつける。タブ名をつけるにはインスペク/位置(FMP11)、タオブジェクト情報(FMP10以前)を利用する。
2. スクリプトインポートでこのファイル(ActiveTab2.fp7)から以下の3つのスクリプトをインポートする。
□各タブに親子フラグをたてる
□子タブに親タブ情報を付加する
□ActiveTabを取得する
3. レイアウト移動スクリプトに、スクリプト実行で「ActiveTabを取得する」を入れる。
4. 元に戻るスクリプトで、レイアウト切り替えの後に、オブジェクトへ移動[オブジェクト名;$$activetab]を加える。
サンプルファイル ActiveTab2.fp7(ZIP圧縮: 02_ActiveTab2.zip)をアップしておきますのでお試しください。
http://www001.upp.so-net.ne.jp/MedFiles/samples.html
Active tab名を取得するーその2ー [FileMaker]
Active tab名を取得する方法を要約すると、LayoutObjectNamesでレイアウト上にあるすべてのオブジェクト名を取得、オブジェクト名を順番に取り出し、GetLayoutObjectAttribute ( $objectname ; "isFrontTabPanel" ) = 1となるものを変数$$activetabに設定することであった。
ここで、タブコントロールの中にタブコントロールを置いて入れ子にしてみる。たとえば、タブ名およびオブジェクト名をAAA, BBB, CCCのタブコントロールのBBBタブにddd, eee, fffのタブコントロールを置く。BBBのeeeを表示した状態でやってみると、GetLayoutObjectAttribute ( $objectname ; "isFrontTabPanel" )はBBB, eeeの2つがこの順番で1を返す。そこで、最後に得られたタブ名を$$activetabに設定すればオブジェクト移動に使えると思って作成したのが前回のサンプルである。
ところが、AAAまたはCCCを表示した状態でやってみると、AAA, eeeまたはeee, CCCがこの順序で1を返してしまう。つまり、入れ子になったタブコントロールはそれが表示されていない状態でも、前面にあるタブ名は1を返してしまう。これでは最後に得られたタブ名が現在表示されているタブとは限らないことになる。このため、前回のサンプルでは入れ子になったタブコントロールがあると正しく動作しない。
原因は分かったが、どのようにすれば汎用スクリプトができるか未解決。また考えてみる。
ここで、タブコントロールの中にタブコントロールを置いて入れ子にしてみる。たとえば、タブ名およびオブジェクト名をAAA, BBB, CCCのタブコントロールのBBBタブにddd, eee, fffのタブコントロールを置く。BBBのeeeを表示した状態でやってみると、GetLayoutObjectAttribute ( $objectname ; "isFrontTabPanel" )はBBB, eeeの2つがこの順番で1を返す。そこで、最後に得られたタブ名を$$activetabに設定すればオブジェクト移動に使えると思って作成したのが前回のサンプルである。
ところが、AAAまたはCCCを表示した状態でやってみると、AAA, eeeまたはeee, CCCがこの順序で1を返してしまう。つまり、入れ子になったタブコントロールはそれが表示されていない状態でも、前面にあるタブ名は1を返してしまう。これでは最後に得られたタブ名が現在表示されているタブとは限らないことになる。このため、前回のサンプルでは入れ子になったタブコントロールがあると正しく動作しない。
原因は分かったが、どのようにすれば汎用スクリプトができるか未解決。また考えてみる。
Active tab名を取得する [FileMaker]
2011/2/19に札幌で開催されたFileMakerスキルアップ・ワークショップで、Active tab名を取得する汎用スクリプトを提示しました。このとき、タブコントロール内にさらにタブコントロールがあっても正しく取得すると述べましたが、やはりだめでした。タブコントロール内が入れ子になっていない場合に正しく動作します。
【スクリプトの目的】
タブコントロールのあるレイアウトから別のレイアウトに移動した後、元に戻ってくると、デフォールトのタブに戻ってしまう。そこで、レイアウト移動時に現在表示されているタブコントロールのタブ名を取得して変数$$activetabに入れておき、戻ってきたときにこの変数名のオブジェクトに移動するようにすると、現在表示されているタブに戻ることができる。
【スクリプト「ActiveTabの取得」】
・変数を設定 [$$activetab; 値:""]
・変数を設定 [$objects; 値:Substitute ( LayoutObjectNames ( Get ( ファイル名 ) ; Get ( レイアウト名 ) ) ; [ "<¶" ; "" ] ; [ ">¶" ; "" ] ; [ ">" ; "" ] )]
・変数を設定 [$totalcount; 値:PatternCount ( $objects ; "¶" ) + 1]
・変数を設定 [$count; 値:1]
・Loop
・ 変数を設定 [$objectname; 値:Substitute ( MiddleValues ( $objects ; $count ; 1 ) ; "¶" ; "" )]
・ If [GetLayoutObjectAttribute ( $objectname ; "isFrontTabPanel" ) = 1]
・ 変数を設定 [$$activetab; 値:$objectname]
・ 変数を設定 [$count; 値:$count + 1]
・ Else
・ Exit Loop If [$count = $totalcount]
・ 変数を設定 [$count; 値:$count + 1]
・ End If
・End Loop
サンプルファイル ActiveTab.fp7(ZIP圧縮: 01_ActiveTab.zip)をアップしておきますのでお試しください。
http://www001.upp.so-net.ne.jp/MedFiles/samples.html
【スクリプトの目的】
タブコントロールのあるレイアウトから別のレイアウトに移動した後、元に戻ってくると、デフォールトのタブに戻ってしまう。そこで、レイアウト移動時に現在表示されているタブコントロールのタブ名を取得して変数$$activetabに入れておき、戻ってきたときにこの変数名のオブジェクトに移動するようにすると、現在表示されているタブに戻ることができる。
【スクリプト「ActiveTabの取得」】
・変数を設定 [$$activetab; 値:""]
・変数を設定 [$objects; 値:Substitute ( LayoutObjectNames ( Get ( ファイル名 ) ; Get ( レイアウト名 ) ) ; [ "<¶" ; "" ] ; [ ">¶" ; "" ] ; [ ">" ; "" ] )]
・変数を設定 [$totalcount; 値:PatternCount ( $objects ; "¶" ) + 1]
・変数を設定 [$count; 値:1]
・Loop
・ 変数を設定 [$objectname; 値:Substitute ( MiddleValues ( $objects ; $count ; 1 ) ; "¶" ; "" )]
・ If [GetLayoutObjectAttribute ( $objectname ; "isFrontTabPanel" ) = 1]
・ 変数を設定 [$$activetab; 値:$objectname]
・ 変数を設定 [$count; 値:$count + 1]
・ Else
・ Exit Loop If [$count = $totalcount]
・ 変数を設定 [$count; 値:$count + 1]
・ End If
・End Loop
サンプルファイル ActiveTab.fp7(ZIP圧縮: 01_ActiveTab.zip)をアップしておきますのでお試しください。
http://www001.upp.so-net.ne.jp/MedFiles/samples.html