みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
お世話になります。
タイトルの通り、アカウントごとに表示するレコードを分けたいです。
そもそも、下記の要件が実現可能なのかどうか、ご教示お願いいたします。
・情報を持たせるテーブルは一つとしたい。
※アカウント別にテーブルを作成し、それぞれのテーブルに対象レコードを作成するのは不可。
・Ctrl+Fなど、ショートカットは全て使用可能としたいため、検索ボタンにスクリプトを仕込むのは不可。
※数万レコード発生する想定のため、検索時に常時計算が走るのも避けたい。
・計算式でアクセス権限を設定し〈アクセス権がありません〉の表示になるのは避けたい。
※FMの特性である、自由度の高い検索やエクスポートの機能は使いたい。
初回ログインを設定し、グローバル「アカウント名」フィールドに、アカウント情報を保持する想定です。
理想は、情報を保持するテーブルと、各アカウントごとに閲覧するテーブルが存在し、
閲覧テーブルに仮想で、対象レコードのみを参照させるというイメージなのですが、
FMで実現する方法を思いつかず、そもそも可能なのか?も含めて知りたいです。
環境は、FM19 Windowsです。
ずっとコメントが付かないので私の思いつく限りの方法を。
今ちょっと検証ができないため、ダメだった場合はご容赦下さい。
まず確認ですが、どのレコードを誰が見られるか はどのように判定するのでしょうか。
ここでは仮に、情報保持テーブルに「閲覧権限ユーザー」フィールドがあり、そこに権限があるアカウント名が記録されているものとします。
①レコードにアクセス権を設定する方法
〈アクセス権がありません〉の表示を避ける方法として、何かしらの条件で一度レコードの検索をする方法を聞いたことがあります。
レイアウト表示時のトリガーに検索するスクリプトをつけておき、全件がHITするような条件でいいので検索をするようにします。
すると、そのレイアウトに移動する際には必ずその検索が行われ、アクセス権がないレコードは自動的に対象外となるはずです。
Ctrl + F等で検索した場合も、アクセス権がないレコードは自動的に対象外となるはずです。
②リレーションを使って制限をする方法
まず、グローバル「アカウント名」フィールドのみのテーブル(仮にアカウント情報テーブル)を作成します。
それと別に情報保持テーブルがある状態で、情報保持テーブルには「閲覧権限ユーザー」フィールドがあるとします。
[アカウント情報テーブル]-[情報保持テーブル] とリレーションをし、リレーション条件として
アカウント情報テーブルの「アカウント名」フィールドと情報保持テーブルの「閲覧権限ユーザー」フィールドを=で結びます。
その上で、レイアウトのテーブルオカレンスを [アカウント情報テーブル]-[情報保持テーブル] にします。
そうすれば検索されても自分の権限のレコードしか出ないかと思います。
以上2点ですが、ご要望と違う解決でしたらすいません。
Offline
・計算式でアクセス権限を設定し〈アクセス権がありません〉の表示になるのは避けたい。
この辺りがレスが付かない理由のひとつかなと。
MTKさんも書かれていますがアクセス権セット(レコードのカスタムアクセス権)を利用すれば
検索・リレーションなどではアクセス権のないレコードは表示されませんので簡単です。
標準機能を阻害せずに実装できるのがアクセス権セットです(標準機能ですから)。
どこの情報が元か分かりませんが、変な計算式でなければ(アカウント名程度では)パフォーマンスは著しく落ちたりしません。
注意する点は[全レコードを表示]は検索ではないのでアクセス権のないレコードがみっともないことになります。
とはいえ全レコードを表示する場面というのはそれほどないのでカスタムメニューでメニューから消したり、
ステータスツールバーを消すなどで利用できなくしておけば良いでしょう。
どうしても使わせたいならボタンやカスタムメニューの置き換えで主キーでの検索にでもしておけば良いです。
命名規則が整っていればテーブル毎に主キーのフィールド名が違うこともないでしょうから、
主キーに値があるレコードの検索スクリプトは共通化も容易です。
あれこれ構造やインタフェースをこねくり回すよりおすすめです。
Last edited by Moz (2020-11-09 13:30:46)
Offline
> 理想は、情報を保持するテーブルと、各アカウントごとに閲覧するテーブルが存在し、
> 閲覧テーブルに仮想で、対象レコードのみを参照させるというイメージ
デカルト積のリレーションでいいのでしょうが、アカウントごとにテーブルを存在するのでしたら、構造として矛盾します。
情報を保持するテーブルで、普通にレイアウトを作り、閲覧編集をさせればいいと思います。
一つ問題は、
> ・計算式でアクセス権限を設定し〈アクセス権がありません〉の表示になるのは避けたい。
でしょうが、これが必ず出てしまう状況が、Mozさんの指摘にもある、全レコードを表示です。これを、カスタムメニューで、適当なフィールドで "*" を検索(実際には全レコードを検索するはずですが、アクセス権を反映します)させる動作へ変更するのと、各スクリプトで配慮しておく、という対策で十分なはずです。(テーブルごとにアクセス権が異なり、制限がかかっている関連レコードを参照しているのでしたら、どうしようもないですが)
Offline
Pages: 1
[ Generated in 0.008 seconds, 9 queries executed - Memory usage: 516.16 KiB (Peak: 521.07 KiB) ]