みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
点呼簿を作成しています
テーブル一つの単純なもので
ID 日付 名前 注意事項ID
といったフィールドがあります
別途注意事項テーブルをつくり、それに30のマスタを格納しておきます
点呼簿にそれをリレーションする注意事項IDを自動入力したいのですが
点呼簿の日付が変わるごとに、複数のレコードであっても同じ注意事項にして、
順番に表示(リレーションで)させていくにはどうやったらよいでしょうか?
点呼簿の注意事項IDが上記の条件がかわるごとにプラス1されて
30になると、また1からはじまるような計算式になるのでしょうか?
そのようなことはできますか?
1月1日 Aさん 注意事項1
1月1日 Bさん 注意事項1
1月2日 Aさん 注意事項2
という具合にしたいです
Offline
1月1日 Aさん 注意事項1
1月1日 Bさん 注意事項1
1月2日 Aさん 注意事項2
1月3日 Aさん 注意事項3
1月3日 Bさん
の様な場合、3日 Bさんはどうなるのですか。
Offline
その場合は
1月3日 Bさん 注意事項3
となります
連休で日付が飛んだ場合でも
1月3日 Bさん 注意事項3
1月10日 Aさん 注意事項4
1月10日 Bさん 注意事項4
としたいです
Offline
日付で自分以下への自己りレーションします。
リレーション先の日付で値一覧をつくり、ValueListItems() で値一覧の内容を取り出し、その数を数えればいいです。さらに、Mod() で処理します。
Offline
自己リレーション
日付 > 日付
日付の降順ソート指定
とすると直前の日付のレコードを参照できます。
Offline
>リレーション先の日付で値一覧をつくり、
レコードが増えていくと、動作にも支障がでますか?
Offline
チポさん
やってみましたが、すべて一番小さい日付が表示されてしまいます
元日付 < 自己リレ用日付
とすると、すべて次の日付が表示されます
この仕組自体がよく理解できていので
再度アドバイスおねがいします
Offline
何百万になれば、遅くなるかもしれません
Offline
単純に、1から30まで増えていき、30になったら1に戻るという計算フィールドを作成して
日付で自己リレーションして同じ日付は同じ数値になるようにすればいけそうな気がしてきましたが
どうでしょうか?
どのような計算式にしたらよいですか?
Offline
リレーションの設定で照合順を指定できます。
ヘルプのリンクです
http://www.filemaker.com/help/16/fmp/ja … ect_header
これで日付の降順ソート指定すると直前の日付を最初に照合します。
Offline
説明より、サンプルを見てください。
https://www.dropbox.com/s/vzeu7irtju0h1 … 7.zip?dl=0
Offline
チポさん
1/1
4/1
5/1
があったとして自己リレーションで表示させると1/1のは空欄
4/1と5/1には1/1がリレーションされます
不等号を逆にすると、すべて、次のレコードがリレーションされ
最後の5/1は空欄になってしまいます
Shinさん
サンプルありがとうございます
何百万になると遅くなるかもしてないということですが、
これは仕方ないことなんですかね
遅くなる、といっても使えないレベル、という意味でしょうから
トレードオフですね
Offline
リレーションでソート指定しましたか?
Offline
リレーションシップ編集の
レコードのソートにチェックして
日付を追加、降順ということですよね?
どちらのテーブルでも設定したり、片方だけやったりしたけど
前のレコードを表示することだけができません
次のレコードは表示させることができます
Offline
テーブル::日付 > テーブル 2::日付
日付の降順ソート指定
テーブル はデフォルトのテーブルです
テーブル 2 はデフォルトのコピーです
ソート指定はテーブル 2だけで十分です。
こうなっていますか?
Offline
なりました
どこかが間違っていたのでしょうね
前のレコードを表示させることはできましたが
これをつかいどうやってマスタをループ表示させたらよいのでしょうか?
Offline
自分なりの解決策を考えました
日付で自己リレーション
同日最小IDという計算フィールドを作成し、リレーションされた同じ日付の中からMIN()で最小のIDを求める
別途計算フィールドに、Mod( 同日最小ID -1;30)+1 とする
上記のようすると1~30まででループさせて表示させることはできました
レコードを削除したときには、そのレコードに設定されていた注意事項がスキップされたかたちになる、
ということ以外は不具合はなさそうに感じますが、みなさんが見た感じでは問題なさそうですか?
Offline
ID
がなんなのか分かりませんが、おそらくうまく行かないと思いますよ。
私の提案は、
直前の日付のレコードの注意事項番号に1を加えて、それが31になったら1に戻す。
という方法です。
Offline
私のものでは、どういうところがまずいですか?
IDはレコードのユニークキーです
適当にレコードを増やしていってもうまく動いているようですが、
気がついていない、後でおかしくなる要素があるということでしょうか?
チポさんの提案はifで31なら1とするんですか?
Offline
例を挙げてみましょう
> 同日最小IDという計算フィールドを作成し、リレーションされた同じ日付の中からMIN()で最小のIDを求める
> 別途計算フィールドに、Mod( 同日最小ID -1;30)+1 とする
このフィールドを Min とNoとします
ID 日付 名前 Min No
1 1/1 A 1 1
2 1/1 B 1 1
3 1/2 A 3 3
4
5 3〜6まで1/2とします
6
7 1/3 C 7 7
・・・・
この様に同一日付に複数のレコードがあると、Noが飛んでしまいますね。
私の方法は、
前レスの自己リレーションを使って、
Noの自動入力の計算式
Mod ( テーブル 2::No ; 30 ) + 1
これでいいでしょう。
テーブルで最初の日付のレコードに対処が必要かな。。
Offline
たしかにそのような欠点がありますね
アドバイス大変参考になりました
テーブルの最初のレコードだけは手入力でいれます(一度だけですので)
チポさんの方法を試させてもらいました
日付順に入力するときは問題ないようですが
日付 No
1/1 1
1/2 2
1/3 3
1/4 4
1/9 5
となっているときに
あとから 1/8 を入力すると、1/8 も No5 となってしまいます
すでに入力されている日付を後から追加した場合、つまり
1/4 を追加入力した場合は、Noは4になり問題ありません
いままでにない日付が追加された場合、この場合ですと
1/8 に対しては 6 にするようなことはできますか?
1/8 を入力したときに自己リレーションで返されるのが、一つ前の日付 1/4 となり
その No に +1 したものが計算されるので、そうなるのだと思います
再計算させて、1/8 を No5 に、1/9 を 6 にずらす、というのでは、その修正前に印刷したものとの
整合性がとれなくなるので(一度設定されたNo(注意事項)は変わってはいけない)少々まずいです
なにか対策法がありますでしょうか?
Offline
#15に、その答えは書いてありますよ。
その注意事項の運用順は、そんなに厳格に暈蝿する必要があるのですか。30項目の使い回しなので、日付の項目をみていけば、長い目で見れば均等になるはずですが。
Offline
ループ自体はそこまで厳格になる必要はないのですが、注意事項は毎日変わらないといけないので、
後から入力すると、同じ注意事項が連続することになるので困っています
#15 の自己リレーション・降順でやっていますが、このような症状になってしまいます
#15 を応用するということでしょうか?
Offline
一晩考えてみましたが
#21#23 の問題を
#15で解決する方法かわかりませ
繰り返しの質問になってしまいますが
注意事項は、1から30まできっちり順番にくる必要はありません(後から若い日付を入力するとズレますし)が
現状では連続した日付で連続した注意事項になってしまうので、それは困る、ということです
わがままですみません
Offline
そのような要望は先に書いていただかないと。。
私の方法では、途中の日付には対応できませんね。
Shinさんの方法か、
スクリプトで初出の日付か否かを判定して、番号を入力。
とかでしょうか。。
Offline
[ Generated in 0.008 seconds, 9 queries executed - Memory usage: 616.55 KiB (Peak: 633.46 KiB) ]