みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
FileMaker初心者です。
MS Accessで簡単にレイアウトやレポートを作成したりVBAもそう複雑でなければ扱えます。
環境はFM12Pro、Win7。
会員を対象としたイベントの出欠確認のレイアウトを作りたいと考えています。
テーブルとフィールドは以下の通り。
※各テーブルは同名のフィールドでリレーションされているものとする。
◎イベントテーブル
イベント番号
イベント名
日付
◎出欠テーブル
イベント番号
会員番号
予約と出席(2つのチェックボックス)
◎会員テーブル
会員番号
氏名
退会区分(これが1以上だと退会者)
レイアウトとしては、
画面の上部にイベント番号、イベント名、日付。
その下にポータルとして、
出欠テーブル::会員番号
会員テーブル::氏名
出欠テーブル::予約と主席のチェックボックス
が並ぶという感じかと思います。
質問①この時、ポータルに新規レコードを入力していく形にした場合、会員番号が重複しないように制限をかけたいのですが、どのようにすれば良いでしょうか?
質問②本当は、ポータルにレコードを追加していく形ではなく、退会区分が1未満の会員をすべて一覧表示した上で、予約や出席のチェックを付けるということがしたいのですが、どのようにすれば良いでしょうか?
※将来的には、予約にチェックが入っている人だけ表示したり、出席となった人だけ表示したり、会員番号や氏名で検索して該当する人だけ表示するということがしたいです。
質問1ではなく、
質問2の方法にすれば重複の問題も無くなりますね。
その方法は
会員テーブルで退会区分1以外を検索
出欠テーブルで会員テーブルをインポート
インポートした対象レコードのイベント番号に全置換で入力
これをスクリプトにして、
イベントテーブルで、新規レコード・イベント番号入力後に実行すればいいでしょう。
ポータルフィルタで
予約入力で、予約しない会員はポータルから除くように出来ます。
Offline
ご回答ありがとうございます。
以下の部分、一行毎のスクリプトステップの形で教えて頂けませんでしょうか。
その方法は
会員テーブルで退会区分1以外を検索
出欠テーブルで会員テーブルをインポート
インポートした対象レコードのイベント番号に全置換で入力
スクリプト
変数を設定[$no ; イベントテーブル::イベント番号]
レイアウト切り替え[会員テーブル]
検索実行(退会区分の1を対象外に)
レイアウト切り替え[出欠テーブル]
レコードのインポート(会員テーブルの会員番号フィールド)
フィールド内容の全置換[出欠テーブル::イベント番号 ; $no]
レイアウト切り替え[イベントテーブル]
これをイベントテーブルのレイアウトで、
新規レコード作成、イベント番号入力後に実行します。
試されるときは必ずバックアップを取ってからですね。
Offline
できました。ありがとうございます。
レコードを抽出してからインポートすると、そのレコードだけをインポートすることができるんですね。
ところで、このスクリプトを繰り返し実行すると、その分だけ、同じレコードが重複して記録されてしまうと思うのですが、予約や出席にチェックが入ったレコードは残したまま、それと重複しないように改めて会員番号を取得したい場合にはどうしたら良いでしょうか。
会員一覧を改めて取得する必要性と言えば、一旦、一覧を取得した後で、新しい会員が登録されたとか、退会から復活したとか、新たに退会になった会員が出たとかいうことが考えられます。
実際に運用するときにはレイアウトに以下の動作をする三つのボタンを配置しようかと考えています。
1.会員一覧取得(現在のイベント番号を持っているレコードを全て削除した後、このイベントに対応する会員番号を取得しなおす)
2.会員一覧更新(予約や出席にチェックがあるレコードだけ残し、それ以外の会員番号を取得しなおす)
3.会員一覧最適化(予約や出席にチェックがないレコードを削除する)
この中の2を行なうのに良い方法がありましたらお教えください。
2.会員一覧更新(予約や出席にチェックがあるレコードだけ残し、それ以外の会員番号を取得しなおす)
以下のページを参考に重複したレコードに印を付ける仕組みを作り、新たに一覧を追加してから、重複しているレコードを削除することで目的を達成できました。
情報の検索とソート
http://www.filemaker.co.jp/help/html/no … tml#561507
あと、これはこれで一応、決着したわけですが、最初に質問をした「ポータルに新規レコードを入力する際に、会員番号が重複しないように制限する方法」もよろしければご教授願います。
新たに一覧を追加してから、重複しているレコードを削除する
レコードを作り、それから不要分を削除。
とするより最初から不要分を作らないように考えた方がいいと思いますよ。
その方法の一例です
出欠テーブルで、イベント番号で検索
関連レコードへ移動で会員テーブルで出欠テーブルと同じ会員番号を抽出
対象外のみを表示
退会レコードを対象外に絞り込み
これで出欠テーブルとの差分が抽出されますから、
これをインポート。
3.会員一覧最適化(予約や出席にチェックがないレコードを削除する)
これも、先に書いた通り削除をさけるべきでしょう。
一例です
イベントテーブルに退会以外の全会員を表示するポータルを作り、
予約者をクリックで、出欠テーブルにレコードを作る。
スクリプトとボタンで可能ですね。
ポータルに新規レコードを入力する際に、会員番号が重複しないように制限する方法
出欠テーブルでテキストフィールドを作り、
入力値の自動化・計算式・既存値置換えとして、その計算式を
イベント番号 & 会員番号
とします。
このフィールドを入力値の制限・常時としてユニークとします。
これで重複が作られませんが、その動きにちょっと癖があります。
それがいやなら、トリガを使ってスクリプトで重複の監視でしょうか。
Offline
有効会員ポータルの「予約・出席」ラジオボタンで選択入力するだけで、出欠テーブルに新規レコード自動作成・自動登録する案。
無駄なレコードが発生しないので管理が非常に楽です。
●サンプル「イベント出欠管理帳.fmp12」 → http://yahoo.jp/box/LDBZbb
Offline
ご回答ありがとうございます。
最初から不要分を作らないように考えた方がいいと思いますよ。
その方法の一例です
...
こちらの方が断然スマートで良いですね。非常に参考になりました。
出欠テーブルでテキストフィールドを作り、入力値の自動化・計算式・既存値置換えとして、その計算式を
イベント番号 & 会員番号とします。
このフィールドを入力値の制限・常時としてユニークとします。
やってみたつもりですが、重複する会員番号を入力しても隣のフィールドに移動できたり、前後のレコードに移動できたりしてしまい希望するような感じでは無かったです。
一応、枠外を二回クリックしたり、レイアウトを変えようとすると
値を必要とするように定義されていますが、このレイアウトでは利用できません。このフィールドの値を割り当てるために、他のレイアウトを使用してください。
というメッセージは出るので「レコード復帰」を選べば保存はされませんが、「OK」を押したら重複した値のまま保存されてしまいました。
トリガを使ってスクリプトで重複の監視でしょうか。
できたら詳しくお教え願います。
ポータルで入力して新規レコード作成では、いろいろ面倒なことが有りますね。
イベントテーブルに退会以外の全会員を表示するポータルを作り、
予約者をクリックで、出欠テーブルにレコードを作る
これを考えられたらいかがでしょう。
Offline
有効会員ポータルの「予約・出席」ラジオボタンで選択入力するだけで、出欠テーブルに新規レコード自動作成・自動登録する案。
無駄なレコードが発生しないので管理が非常に楽です。
Hiroさん、ありがとうございます。
サンプルファイルを見せて頂いて非常に勉強になりました。
特に「照合フィールドの値に関係なく」リレーションを結べるという概念が抜けていたので、目から鱗が落ちました。
恐らく、この形態が自分が最初に思い描いていた形にかなり近いものかと思います。
そこで追加で質問させてください。
送って頂いたファイルの「イベント」レイアウトに、検索用のフィールドを追加して、そのフィールドによって会員番号や氏名でフィルタリングをしたいと思います。
試してみた方法は、
「イベント」テーブルに「検索用」フィールドを作りグローバル格納にする。
「イベント」レイアウトにこのフィールドを配置する。
「有効会員」ポータルのレコードのフィルタ設定に以下の計算式の記載する。
Case (
IsEmpty ( イベント::検索用 ) ; 1;
PatternCount ( 有効会員::氏名 ; イベント::検索用 )>=1 ; 1;
PatternCount ( 有効会員::会員番号 ; イベント::検索用 )
) and 有効会員::退会区分 < 1
ただし、このままだと「検索用」フィールドに値を入力しただけではフィルタリングはされず、前後のレコードに移動したときに正常にフィルタリングされます。
この状態から値を入力してEnterを押したタイミングで正常にフィルタリングされるようにするには、どの様にしたらよろしいでしょうか?
また、もしもっと良い方法がありましたらお教えください。
ポータルで入力して新規レコード作成では、いろいろ面倒なことが有りますね。
イベントテーブルに退会以外の全会員を表示するポータルを作り、
予約者をクリックで、出欠テーブルにレコードを作るこれを考えられたらいかがでしょう。
チポさん、ありがとうございます。
おそらくHiroさんが送ってくださったサンプルがそれを実現しているようなので、この方法を元に考えようかと思います。
そこで追加で質問させてください。
送って頂いたファイルの「イベント」レイアウトに、検索用のフィールドを追加して、そのフィールドによって会員番号や氏名でフィルタリングをしたいと思います。試してみた方法は、
「イベント」テーブルに「検索用」フィールドを作りグローバル格納にする。
「イベント」レイアウトにこのフィールドを配置する。
「有効会員」ポータルのレコードのフィルタ設定に以下の計算式の記載する。Case (
IsEmpty ( イベント::検索用 ) ; 1;
PatternCount ( 有効会員::氏名 ; イベント::検索用 )>=1 ; 1;
PatternCount ( 有効会員::会員番号 ; イベント::検索用 )
) and 有効会員::退会区分 < 1ただし、このままだと「検索用」フィールドに値を入力しただけではフィルタリングはされず、前後のレコードに移動したときに正常にフィルタリングされます。
【自動更新のポイントは】
×「検索用」フィールドを作りグローバル格納にする
↓
○標準の非グローバル・フィールドにする。 索引が取れることが自動更新のポイント。
【フィルターの式は】
有効会員::退会区分 < 1
and
(
IsEmpty(イベント::検索用)
or
PatternCount(有効会員::会員番号;イベント::検索用)
or
PatternCount(有効会員::氏名;イベント::検索用)
)
サンプルにアップデート補修して再アップしておきます。
●アップデート版サンプル「イベント出欠管理帳.fmp12」 → http://yahoo.jp/box/LDBZbb
Last edited by Hiro (2014-10-25 02:30:15)
Offline
Hiroさん、ありがとうございます。
うまくフィルタリングが動作しました。
ただ、半角数字を入力してEnterを押したときは問題ないのですが、全角ひらがな等を入力してEnterを押すと改行されてしまいます。
これは仕様でしょうか?
また、この現象を回避するにはどの様にしたら良いでしょうか?
また、これを更に拡張して、「表示選択」フィールドによる絞り込みを追加してみました。
行なった手順は以下の通り。
「イベント::表示選択」をグローバル格納から通常格納に。
「有効会員」ポータルのフィルタ設定を以下の様に設定。
※一行目は現在は退会扱いでも過去のイベントに出席している場合を考慮しています。
If ( 有効会員::退会区分 < 1; 1; PatternCount ( 出欠 2::予約と出席 ; "出席" ))
and
(
IsEmpty(イベント::検索用)
or
PatternCount(有効会員::会員番号;イベント::検索用)
or
PatternCount(有効会員::氏名;イベント::検索用)
)
and
(
If ( IsEmpty( イベント::表示選択);1;0)
or
PatternCount ( イベント::表示選択 ; "予約" ) and PatternCount ( 出欠 2::予約と出席 ; "予約" )
or
PatternCount ( イベント::表示選択 ; "出席" ) and PatternCount ( 出欠 2::予約と出席 ; "出席" )
)
結果は、絞り込みは行なわれますが、表示選択のチェックボックスをクリックしただけでは駄目で、欄外を一度ワンクリックする必要が有るようです。
これをチェックボックスをクリックした瞬間に表示を変える方法はあるでしょうか?
また、これよりより良い方法がありましたらお教えください。
次の質問です。
送って頂いたサンプルでは「有効会員」ポータルの「出欠 2::予約と出席」がラジオボタンになっておりますが、予約を取り消したい場合が考えられるので、チェックボックスに変えたいと思っております。
この場合も、新たに予約もしくは出席にチェックを入れると「出欠 2」に新しいレコードが作成されますが、その後で、双方のチェックを外すと、結局「予約と出席」が空の意味のないレコードが残ることになるかと思います。
これをスクリプトで消すとしたら、どのタイミングで、どのようなスクリプトを実行するのが良いでしょうか。
次の質問です。
現在のレイアウトに、現在のイベントの予約数と出席数を表示したいと思いました。
そこで「出欠」テーブルに以下のフィールドを作りました。
予約 計算 from出欠、= PatternCount(予約と出席;"予約")
出席 計算 from出欠、= PatternCount(予約と出席;"出席")
予約数 修正 = 予約合計
出席数 修正 = 出席合計
これをレイアウトに配置したところ、思ったような結果は出たのですが、チェックをクリックして変更した段階では数値は変わらず、変更後に欄外をクリックして始めて数値が変化しました。
これをチェックをクリックした時点で数値を変えるにはどうしたら良いでしょうか?
また、これを更に発展させて、この予約数と出席数を、「イベント」テーブルに新たに作った同名のフィールドに保存する仕組みを作りたいと考えています。
これは、このレイアウトとは別にイベント一覧のレイアウトを作り、イベント名の横に予約数と出席数を表示させたいからです。
この場合、数値に変化があったタイミングで値の代入を行なったらよいかと思いますが、スクリプトトリガは何に対してどのタイミングで設定したら良いでしょうか?
質問が多くなってしまいましたが、よろしくお願いします。
半角数字を入力してEnterを押したときは問題ないのですが、全角ひらがな等を入力してEnterを押すと改行されてしまいます。
これは仕様でしょうか?
また、この現象を回避するにはどの様にしたら良いでしょうか?
数値フィールドとテキストフィールドの仕様です。それぞれの入力特性の違いからその理由を考えてみて下さい。
また、これを更に拡張して、「表示選択」フィールドによる絞り込みを追加してみました。
行なった手順は以下の通り。
「イベント::表示選択」をグローバル格納から通常格納に。
「有効会員」ポータルのフィルタ設定を以下の様に設定。
※一行目は現在は退会扱いでも過去のイベントに出席している場合を考慮しています。
If ( 有効会員::退会区分 < 1; 1; PatternCount ( 出欠 2::予約と出席 ; "出席" ))
and
(
IsEmpty(イベント::検索用)
or
PatternCount(有効会員::会員番号;イベント::検索用)
or
PatternCount(有効会員::氏名;イベント::検索用)
)
and
(
If ( IsEmpty( イベント::表示選択);1;0)
or
PatternCount ( イベント::表示選択 ; "予約" ) and PatternCount ( 出欠 2::予約と出席 ; "予約" )
or
PatternCount ( イベント::表示選択 ; "出席" ) and PatternCount ( 出欠 2::予約と出席 ; "出席" )
)
「出欠」ポータルのリレーションは、「イベント番号」ただひとつの照合条件に変更されたので、
「表示選択」のフィルター式は、単純に、
IsEmpty(イベント::表示選択)
or
FilterValues(イベント::表示選択;出欠::予約と出席)<>""
だけで良いでしょう。
結果は、絞り込みは行なわれますが、表示選択のチェックボックスをクリックしただけでは駄目で、欄外を一度ワンクリックする必要が有るようです。
これをチェックボックスをクリックした瞬間に表示を変える方法はあるでしょうか?
また、これよりより良い方法がありましたらお教えください。
「欄外を一度ワンクリック」してレコード確定するのはFM入力の基本的仕様です。
「クリックしただけ」にしたいなら、OnModifyトリガでレコード確定を仕掛けます。
送って頂いたサンプルでは「有効会員」ポータルの「出欠 2::予約と出席」がラジオボタンになっておりますが、予約を取り消したい場合が考えられるので、チェックボックスに変えたいと思っております。
この場合も、新たに予約もしくは出席にチェックを入れると「出欠 2」に新しいレコードが作成されますが、その後で、双方のチェックを外すと、結局「予約と出席」が空の意味のないレコードが残ることになるかと思います。
これをスクリプトで消すとしたら、どのタイミングで、どのようなスクリプトを実行するのが良いでしょうか。
一度作成したレコードでいくらデータを消去してもレコード自体は削除できません。
削除する対象レコードを指定して削除するスクリプトを組んで、有効会員ポータル内設置のボタンから実行します。
現在のレイアウトに、現在のイベントの予約数と出席数を表示したいと思いました。
そこで「出欠」テーブルに以下のフィールドを作りました。
予約 計算 from出欠、= PatternCount(予約と出席;"予約")
出席 計算 from出欠、= PatternCount(予約と出席;"出席")
予約数 修正 = 予約合計
出席数 修正 = 出席合計
これをレイアウトに配置したところ、思ったような結果は出たのですが、チェックをクリックして変更した段階では数値は変わらず、変更後に欄外をクリックして始めて数値が変化しました。
これをチェックをクリックした時点で数値を変えるにはどうしたら良いでしょうか?
イベント・テーブル側のみに「予約数」と「出席数」計算フィールドを作るだけで良いです。
・「予約数」の式は、
PatternCount(List(出欠::予約と出席); "予約")
・「出席数」の式は、
PatternCount(List(出欠::予約と出席); "出席")
また、これを更に発展させて、この予約数と出席数を、「イベント」テーブルに新たに作った同名のフィールドに保存する仕組みを作りたいと考えています。
これは、このレイアウトとは別にイベント一覧のレイアウトを作り、イベント名の横に予約数と出席数を表示させたいからです。
この場合、数値に変化があったタイミングで値の代入を行なったらよいかと思いますが、スクリプトトリガは何に対してどのタイミングで設定したら良いでしょうか?
こちらの方式ではそもそもそのような問題は生じません。
上記諸点修正したアップデートサンプルを再々アップしておきます。説明詳細代わりにご確認ください
●アップデート版サンプル「イベント出欠管理帳.fmp12」 → http://yahoo.jp/box/LDBZbb
Offline
Hiroさんへ
サンプルファイルありがとうございました。
非常に参考になりました。
これに関して二つほど質問があります。
質問1:
「レコード確定スクリプト」は以下の様になっております。
レコード/検索条件確定[]
フィールドへ移動[]
二行目の「フィールドへ移動」は何のために存在しているのでしょうか。
試しに二行目を消したうえで幾つかの操作をしてみたのですが、違いが分りませんでした。
質問2:
「トリガスクリプト」というスクリプトが、レイアウト設定のイベント「OnRecordLoad」に設定されているのは理解できるのですが、「会員::一時イベント番号」フィールドのイベント「OnObjectEnter」にも設定してあるのはなぜでしょうか?
質問1:
「レコード確定スクリプト」は以下の様になっております。
レコード/検索条件確定[]
フィールドへ移動[]
二行目の「フィールドへ移動」は何のために存在しているのでしょうか。
試しに二行目を消したうえで幾つかの操作をしてみたのですが、違いが分りませんでした。
おっと、二行目の「フィールドへ移動[]」は設置スクリプトを間違いました。
「トリガスクリプト」の二行目へ設置したつもりでした。移動ください。
質問2:
「トリガスクリプト」というスクリプトが、レイアウト設定のイベント「OnRecordLoad」に設定されているのは理解できるのですが、「会員::一時イベント番号」フィールドのイベント「OnObjectEnter」にも設定してあるのはなぜでしょうか?
トリガによる発火は抜け穴もあるので、万一の場合に備え、手動の発火ボタンとして「会員::一時イベント番号」参照フィールドを流用設定しています。
「イベント番号」と「一時イベント番号」の常時同期は、このソリューションのカナメであり必須要件ですから、その安全対策です。
Offline
おっと、二行目の「フィールドへ移動[]」は設置スクリプトを間違いました。
「トリガスクリプト」の二行目へ設置したつもりでした。移動ください。
なるほど、そういうことでしたか。
ところで、この「フィールドへの移動」には、移動するべきフィールド等のオプションが指定されていなかったのですが、オプションを指定せずこのスクリプトステップを実行した場合、どのような効果があるのでしょうか?
あるいは、指定し忘れでしょうか? その場合、どこのフィールドを指定するのが適切でしょうか?
質問2については理解しました。
レコード/検索条件確定[]というステップがなかった時代に、代りに
フィールドへ移動[]という指定なしの使い方をしてただけで、今は特にそれを使う意味はないんじゃないかな。
フィールドへ移動[ ](移動先無指定) は、フィールドからカーソルを外したい時の常套手段です。
フィールドボタンで代入後、カーソルをそのままフィールド内に残しておくと、何かの拍子に書き換えてしまう恐れがあるので・・・。
Offline
フィールドへ移動[ ](移動先無指定) は、フィールドからカーソルを外したい時の常套手段です。
フィールドボタンで代入後、カーソルをそのままフィールド内に残しておくと、何かの拍子に書き換えてしまう恐れがあるので・・・。
なるほど、そういうことなんですね。
Hiroさん、ありがとうございました。
あと、チポさん、scripterさんも返信をくれてありがとうございました。
Hiroさんへ、もしご覧になっていたら教えて頂きたいことがあります。
サンプルファイルの中で、ポータルに表示されている各行の「取消」ボタンを押すと、該当するレコードを削除するスクリプトが動くわけですが、その後、ポータル内のスクロール位置が先頭に戻ってしまいます。
できたら、スクロール位置は変えたくないのですが、それは可能でしょうか?
有効会員ポータルのアクティブ・ポータル行番号を変数に控えておき、
元のレイアウトに戻ってきた時に、初行にリセットされた行を変数値まで移動させます。
補修サンプルを再度アップしておきます。
●最新アップデート・サンプル「イベント出欠管理帳.fmp12」 → http://yahoo.jp/box/LDBZbb
Offline
Hiroさん、ありがとうございます。
サンプル、非常に参考になりました。
今回教えて頂いたことについては、それに近いところまでは思い至っていたのですが、適切なスクリプトステップの組み合わせを発見するまでには至れていませんでした。
おそらく自力で試行錯誤していたら、解答が得られるまで相当な時間を要していたと思います。助かりました。
ところで、こういうテクニック的なことが載っているオススメの書籍とか、「FileMakerで開発するならこれだけは読んでおいた方が良いよ」といった書籍はあるでしょうか?
一応、FileMaker Training Seriesは購入して、例題を一通りなぞるようなことはやったのですが。
Pages: 1
[ Generated in 0.008 seconds, 10 queries executed - Memory usage: 680.5 KiB (Peak: 729.41 KiB) ]