みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
顧客の計画書管理を作ろうと思っているのですが、メインのレイアウト画面に今月で計画作成日から5ヶ月、10ヶ月経過したものをお知らせのような形で表示させたいと思っています。
顧客計画書テーブルに氏名、書類作成日フィールドがあります。
現在の日付が20/10/1として
田中 19/5/5
田中 20/5/1
田中 20/8/20
鈴木 18/5/7
鈴木 19/12/1
鈴木 20/5/1
佐藤 19/11/8
佐藤 19/12/1
佐藤 20/5/10
今野19/5/10
今野19/12/22
というようなデータがあった時、各個人の計画書で作成日が最新のやつで今月(10月)で10か月又は5ヵ月経過する物だけピックアップする様な方法はないでしょうか?
鈴木 20/5/1
佐藤 20/5/10
今野19/12/22
↑今月(10月)ではこれらがお知らせに表示させた井
分かりにくい質問ですみません。よろしくお願いします。
各個人の最新を、2020/2/* 2019/7/* の日付で検索すればいいです。
または、逆の発送で、各計画書に、5ヶ月後、10ヶ月後の日付を持たせておいて、2020/5/* で検索してもいいでしょうね。
https://www.dropbox.com/s/b1isfq88muztj … 2.zip?dl=0
どちらにしても、個人ごとのテーブルを作るのが後々の運用にも楽になると思います。
Last edited by Shin (2020-05-28 10:20:45)
Offline
各個人の計画書で作成日が最新のやつで今月(10月)で10か月又は5ヵ月経過する物
顧客計画書テーブルに、基準日を指定するためのグローバルフィールドと
これをもとに上記条件に該当するかどうかを判定する計算フィールドを設けるのはどうでしょうか?
判定式は、例えば
If (
// 最終作成日の(最新の)計画書か?
GetAsDate ( ExecuteSQL ( "SELECT MAX(\"書類作成日\") FROM \"顧客計画書\" WHERE \"顧客名\"=?" ; "" ; "" ; 顧客名 ) ) = 書類作成日
and
// 今月で5ヶ月経過するか?
Date ( Month ( 書類作成日 ) ; 1 ; Year ( 書類作成日 ) ) ≤ Date ( Month ( g_抽出基準日 )-5 ; 1 ; Year ( g_抽出基準日 ) )
; 1
; 0
)
判定=1のレコードをメイン画面のポータルで表示します。
実装例です。
https://www.dropbox.com/s/7dip39f6f727q … fmp12?dl=0
【補足】
実装例では最新の計画書であるかの日付判定にSQLを利用していますが、計画書テーブルを顧客名で自己リレーションしてMAX()関数で求めても良いと思います。
Last edited by koeda (2020-05-27 09:58:40)
Offline
各レコードに日付から
Y * 12 + M
という計算フィールドを作ります。
計算・グローバル・繰り返しフィールドを作りその計算式
Year ( Get ( 日付 ) ) * 12 + Month ( Get ( 日付 ) ) - 5 * Get ( 計算式繰り返し位置番号 )
とすると、5ヶ月前、10ヶ月前の値が入ります。
これと、上記の計算フィールドとでリレーションすればその関連レコードが目的のレコードです。
蛇足 ;;;;
Y * 12 + M
これは年月が連続したシリアル値になります。
ちょっと見には、意味不明な値ですが、、
Offline
Offline
そうでした(^^ゞ
関数なんて使わず、リレーションとソートのオプション(降順)で最大値が取れるんでした。
うっかりです。
かせーさん、申し訳ありません。よりシンプルでスマートな方法を採用してください。
Offline
返信ありがとうございます。
もっとファイルメーカーを勉強したいとなと改めて実感しました。
知識不足すみません、いくつか質問をさせてください。
Shinさん返信ありがとうございます。
「各個人の最新を、2020/2/* 2019/7/* の日付で検索」と書かれてあるのですが、各個人の最新はどのように出すのでしょうか?。2020/2/*で検索すると山田さんの作成日が2020/2/1、2020/2/20の両方があった場合両方ともヒットするのではないでしょうか?添付されていたファイルをみさせて頂きましたが知識不足の私には理解できず・・申し訳ありません。教えて頂けると幸いです。
チポさん返信ありがとございます。
Y * 12 + Mこの計算式については新規で計算フィールドを作成し、この計算式を入力するだけでOKなのでしょうか?また計算フィールド、グローバルフィールド、繰り返しフィールドをそれぞれ新規で作成し、Year ( Get ( 日付 ) ) * 12 + Month ( Get ( 日付 ) ) - 5 * Get ( 計算式繰り返し位置番号 )を計算フィールドに入れ込めばOKなのでしょうか?よろしくお願いします。
koedaさん返信ありがとうございます。
是非参考にさせていただきたいと思います!
私の方法は、
新たに計算フィールドを作りその計算式
Year ( 書類作成日 ) * 12 + Month ( 書類作成日 )
とします。
さらに計算フィールドを作り、グローバル・繰り返し2回として、
その計算式を前記の通りにします。
リレーションを
上記のグローバルと計算フィールドとで設定して、
表示だけならポータルで、
対象レコードとするのなら、
スクリプトステップ
関連レコードへ移動
で目的のレコードを対象レコードとできます。
Offline
サンプルファイルがベストの方法でしょう。
日付を、5ヶ月前10ヶ月まえで検索する方法では、集計レイアウトを作って、氏名をキーにする小計パートで表示させるといいです。ソートは、氏名と日付を降順で。
Offline
Shinさん提供のサンプルに「メイン画面」を追加して、ポータルで表示するようにしてみました。
https://www.dropbox.com/s/pfblh62251smu … fmp12?dl=0
(5/29追記:Shinさんより著作権法に抵触する旨のご指摘をいただきましたので、取り下げます。申し訳ありませんでした。)
各個人の最新はどのように出すのでしょうか?
かせーさんの希望をかなえるためには、最新の作成日と作成日からの経過期間を算出する必要があります。
私がまどろっこしくSQLやら日付関数で行ったそれらの判定処理について、チポさんとShinさんがよりFileMakerらしいシンプルな解決を示してくださいました。
Shinさんのサンプルのフィールド顧客計画書::nextYMをよくご覧ください。
各個人の最新のレコードについてのみ、5ヶ月後/10ヶ月の経過した日付を月単位で換算しています。
なぜ最新のレコードについてのみ計算されるかと言えば、リレーションシップとそのオプション定義がそのカギです。
顧客計画書と顧客計画書2は顧客名でリレーションされ、さらに顧客計画書2::日付が降順でソートされています。
つまり顧客計画書2は、最新日付のレコードが最初に来るわけです。
たとえば、いま顧客計画書からみると、最初の
田中2019/5/5
のレコードからは、田中=田中でリレーションされている
田中2020/8/20
田中2020/5/1
田中2019/5/5
の3レコードが関連レコードとなります。
ここで顧客計画書2::日付でデータを参照すると、いま降順でソートされているので、最初のレコード2020/8/20が取得できます。
2019/5/5≠2020/8/20なので、田中2019/5/5のレコードは最新ではない、と分かります。
#リレーションシップにソートオプションを加えて最大/最新のレコードを取得する、というテクニックはよく使われます。
#私もよく使うテクニックなのに、今回は発想からすっかり抜け落ちました。お恥ずかしい(^^ゞ
さて、nextYMの計算式
Case (
日付[1] = 顧客計画書 2::日付[1] ; Year ( 日付[1] ) * 12 + Month ( 日付[1] ) + 5 * Get ( 計算式繰り返し位置番号 )
)
は、日付[1] = 顧客計画書 2::日付[1] 、つまりそれが最新のレコードならば、月数へのシリアル変換値を返す、という式ですから、
日付[1] ≠ 顧客計画書 2::日付[1] の場合は値が返らない、つまり空白ということになります。
だから2020/8/20=2020/8/20の行だけ、計算結果が入っています。
あとはこの計算結果を利用して、どのように表示するかですが、
メインのレイアウト画面に今月で計画作成日から5ヶ月、10ヶ月経過したものをお知らせのような形で表示させたい
という最初の希望がありましたので、メイン画面には他にもいろいろ表示したい情報があるのだろうと想像し、ポータルを利用してみました。
nextYMを利用して、フィルタの計算式で表示すべきレコードを決定しています。
もちろんShinさん#9の回答のように、集計レイアウトも可能です。
計画書一覧表のようなものを作成する場合は、そちらが便利でしょう。
Last edited by koeda (2020-05-29 19:15:36)
Offline
Shinさん、チポさん、koedaさん本当にありがとうございました。
皆さんの文章を読んで本当に勉強になりました。
またkoedaさん丁寧に説明して頂きありがとうございます。チンパンジーぐらいの脳みそしかない自分にもよくわかる説明でした。あとはnextYMの計算の結果を利用すれば5ヵ月経過したやつのみ(6ヵ月経過したものは表示しない)という方法もできるわけですね。
本当にありがとうございます。色々試行錯誤しながらファイルメーカーでの作成頑張っていきます!
前出の検索やリレーション、SQLなどを使わず、ループスクリプトにて適合レコードを抽出する方法です。
●サンプル「条件付き検索.fmp12」→ https://1drv.ms/u/s!AlaCGhTKTWEOqB0YS-1 … h?e=iWkcAJ
Offline
5ヶ月、10ヶ月経過したもの
確認ですが、これは「基準日の月にちょうど5ヶ月、10ヶ月経過したもの」の意でしょうか?
それとも「5ヶ月以上経過したもの、10ヶ月以上経過したもの」でしょうか?
「各個人の計画書で作成日が最新のやつで今月(10月)で10か月又は5ヵ月経過する物」なので、前者の解釈が正しい?
私は勝手に後者と理解していましたが、もし前者なら条件式が変わります。
Last edited by koeda (2020-05-28 09:12:56)
Offline
nextYMの計算の結果を利用すれば5ヵ月経過したやつのみ(6ヵ月経過したものは表示しない)という方法もできるわけですね。
その計算式そのものを変更した方が、処理は簡単でしょうね。
今は、Get ( 計算式繰り返し位置番号 ) * 5 を足して、5ヶ月後、10ヶ月後(繰り返し数を増やせば、15, 20, 25...)を計算させていますが、この加える数をコントロールすると自由に変更できます。
+5 にすると、5ヶ月後だけが抽出できます。その組み合わせを自由に設定できる仕組みを組み込みました。
https://www.dropbox.com/s/b1isfq88muztj … 2.zip?dl=0
koeda さん、細かいことを言うようですが、プログラムの記述は著作物です。それを引用の形では無く公表することは、厳密に言うと著作権法に抵触しますよ。
Last edited by Shin (2020-05-30 10:47:02)
Offline
koeda さん、細かいことを言うようですが、プログラムの記述は著作物です。それを引用の形では無く公表することは、著作権法に抵触しますよ。
Shinさん、ご指摘ありがとうございました。
今後は気をつけるようにいたしますのでご容赦ください。
アップロードしたファイルは削除いたしました。
今後ともよろしくお願いいたします。
Offline
引用ですよ、というコメントをつけてあれば、問題ない範囲だと思いますよ。
Offline
Pages: 1
[ Generated in 0.031 seconds, 10 queries executed - Memory usage: 562.52 KiB (Peak: 583.42 KiB) ]