みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
下記の計算式では、s生年月日空白の場合にゼロが表示されます。それを空白にしたいのですが、よろしくお願いします。
If(s生年月日 = "";""; Year(Get ( 日付 ))) - Year(s生年月日) - (Month(s生年月日) * 100 + Day(s生年月日) > Month(Get ( 日付 )) * 100 + Day(Get ( 日付 )))
If(s生年月日 = "";""; があるので、空白が返るはずですが。
また、括弧の位置や数が少々おかしいです。見直しを。
Offline
計算式はそれでいい様ですね。
その計算フィールドの計算式のオプションで
□式内の全フィールドの値が空欄の時、計算しない
にチェックが入っていないからでしょう
Offline
If (
s生年月日 = "" ; "" ;
Year ( Get ( 日付 ) ) - Year ( s生年月日 )
- ( ( Month ( s生年月日 ) * 100 + Day ( s生年月日 ) ) > ( Month ( Get ( 日付 ) ) * 100 + Day ( Get ( 日付 ) ) ) )
)
でないとダメでしょう。
元の式では、(s生年月日 = "";""; Year(Get ( 日付 ))) で If 文は終わっていますし、Day(s生年月日) > Month(Get ( 日付 )) * 100 だけで比較されてしまいます。
Offline
Ifで終わっていないですよ。
初めて見た、
ちょっと変わっている式ですが、、
Offline
if を途中まで使っている、という変わった式、という事ですか。
ならば、if で空白にしておいても、あとからそれに加減しているので、空白にはならないでしょう。
Offline
みなさんインデントがないのに把握できるの凄すぎです。
/* hatake さんの式 */
If ( s生年月日 = "" ; "" ; Year ( Get ( 日付 ) ) ) -
Year ( s生年月日 )
- (
Month ( s生年月日 ) * 100 + Day ( s生年月日 ) >
Month ( Get ( 日付 ) ) * 100 + Day ( Get ( 日付 ) )
)
/* if 文以外の式が評価されて s生年月日 が Null の時、0 になるのは当然。 */
/* Shin さんの式 */
If (
s生年月日 = "" ;
"" ;
Year ( Get ( 日付 ) ) - Year ( s生年月日 )
- ( ( Month ( s生年月日 ) * 100 + Day ( s生年月日 ) )
> ( Month ( Get ( 日付 ) ) * 100 + Day ( Get ( 日付 ) ) )
)
)
/* s生年月日が Null の時、なにも評価されないので Null になる。 */
shinさんありがとうございます。式当てはめましたら、見事にくうはくになりました。また、よろしくお願いします。
すみません、過去のトピックですが、
質問させてくださいm(_ _)m
年齢計算を自動更新するには、
どうすればよいのでしょうか。
Shinさんが書いてらっしゃる下記の式で、
生年月日を入力した時点での年齢はでました。
その後、ファイルを開いた時点で
年齢が自動で更新されるようにするには、
どのようにすればよいのでしょうか。
初歩的すぎる質問で申し訳ないですが
どうぞよろしくお願いいたします。
If (
s生年月日 = "" ; "" ;
Year ( Get ( 日付 ) ) - Year ( s生年月日 )
- ( ( Month ( s生年月日 ) * 100 + Day ( s生年月日 ) ) > ( Month ( Get ( 日付 ) ) * 100 + Day ( Get ( 日付 ) ) ) )
)
計算フィールドの計算式の[索引オプション]で[計算結果を保存せず必要時に再計算する]をオンにします。
Get ( 日付 ) はフィールドではないので日付が変わっても自動計算されません。
Offline
Moz様
索引オプションを設定するだけで自動更新されるんですか!?
そんなに簡単に設定出来るんですね…。
ありがとうございます!勉強になります。
Moz様
ご返信ありがとうございます!!
すみません、勉強不足でしてよく分かっていないのですが、
[索引オプション]で[計算結果を保存せず必要時に再計算する]をオンにすると
生年月日フィールドを書き換えた時のみ、自動計算され、
ファイルを開いただけでは、自動で計算はされませんよね?
「ファイルを開いたら自動計算」とするには、
1.「本日の日付」をフィールドにする
2. 全置換にするボタンを作成し、押下したら再計算。
という方法しかないのでしょうか?
教えて頂けますと助かります、、、
よろしくお願いいたします。
[索引オプション]で[計算結果を保存せず必要時に再計算する]をオンにすると
生年月日フィールドを書き換えた時のみ、自動計算され、
ファイルを開いただけでは、自動で計算はされませんよね?
実際に設定して試されましたか?自動で再計算されますよ。
このオプションをオンにすると文字通り必要時に再計算されます。
必要時というのは表示する際です。
年齢を検索するとその際に全レコードに対して再計算が行われます。
※レコード数に比例して時間がかかります。
全置換する方法でも良いですが、毎日それをやりますか?
年齢の検索は年齢で検索するより本日が目的の年齢となる日付で生年月日を計算した方が遙かに早いでしょう。
Last edited by Moz (2020-06-14 10:17:53)
Offline
Moz様
ご返信ありがとうございます!
実際にやってみたのですが、
本日の日付が変わらないので、
おっしゃるようになっているのかが分かりませんでした。
索引オプションのみで、自動計算が出来るのですね。
本当に勉強になりました!!
アドバイス誠にありがとうございましたm(_ _)m
本日の日付が変わらないので、
おっしゃるようになっているのかが分かりませんでした。
確認ですが再計算したいのは年齢ですよね?
質問者さんが例示した #9 のように Get ( 日付 ) を利用した計算式の場合、
Get ( 日付 ) はフィールドではないため、日付が変わっても再計算されません。
再計算のためには[計算結果を保存せず必要時に再計算する]をオンにすることで
常に再計算されるように設定する必要があるということです。
ここまでの理解はできていますか?
年齢は正しく再計算されるようになりましたか?
Offline
そうです!年齢です。
理解できてないのかもしれません。
例えば、今日(6月14日)
下記の生年月日を入力したとします。
Aさん 生年月日:2019年6月14日
そうすると、年齢は【1】歳と計算されます。
明日(6月15日)に、このファイルを開いた時は
年齢が自動的に【2】歳になるのですよね?
明日にならないと分からないと言う意味で記載しました。
PCの日付を変えれば検証できます。
また、いままで正しく動いていなかったのならば年齢は生年月日を入力したときのままでしょう?
索引オプションを変更後にランダムにチェックを行えば本日時点での年齢になっていると確認できるでしょう。
Year ( Get ( 日付 ) ) - Year ( 生年月日 )
- ( ( Month ( 生年月日 ) * 100 + Day ( 生年月日 ) ) > ( Month ( Get ( 日付 ) ) * 100 + Day ( Get ( 日付 ) ) ) )
このように本日日付の取得に Get ( 日付 ) を使う計算式なら明日になれば明日の時点での年齢になります。
If関数を入れてありましたが[すべての参照フィールドが空の場合は評価しない]がオン(デフォルト)ならば不要です。
※オフでも不要だと思いますが......生年月日を空にすれば年齢も空になります。
変更する際にコピペするのでなく、自分が何をしているのかを考えながら変更する癖を付けると良いですよ。
何をしているのか理解できなければ目的を達しても次にまた詰まってしまいます。
Last edited by Moz (2020-06-14 14:13:34)
Offline
本当におっしゃる通りです。
理解しないまま進めてしまうと成長もそこまでですよね(T . T)
すみません、書いていただいた計算式について
教えていただけませんでしょか?
月に100をかけるのはどうしてですか?
( ꒪⌓꒪)
Youが引用した計算式を再度引用しただけですヨ。
年齢計算の式ですネ。私は数字に弱いのでこのような書き方はしません。
Year ( Get ( 日付 ) ) - Year ( 生年月日 )
1.現在年から生年月日の年を引きます。例)1980/11/10生まれ→2020-1980=40
誕生日を迎えていなければ年齢は加算されないので(満年齢)
今年の誕生日を迎えているかを考慮します→日付を数字に置き換えて比較します。
( ( Month ( 生年月日 ) * 100 + Day ( 生年月日 ) ) > ( Month ( Get ( 日付 ) ) * 100 + Day ( Get ( 日付 ) ) ) )
2.誕生日の月を100倍して日付を足します。例)11月10日→1110
3.今日の月を100倍して日付を足します。例)6月14日→614
2と3を比較して2が大きければ誕生日を迎えてないので1の計算結果から1を引いたのが年齢です。
2と3を比較して3が大きければ誕生日を迎えているので1の計算結果が年齢です。
以下のようになります。
2020-1980-(1110>614)→2020-1980-1=39
(1110>614)の部分は括弧内が成立すれば 1 しなければ 0 です。論理式を組み込んだ計算式です。
参考例)誕生日が 1980/3/2 の場合 → 2020-1980-(302>614)=40
この計算式のメリットは今年の誕生日を計算しなくて良いので短くてすむことですかね。
Last edited by Moz (2020-06-14 15:05:24)
Offline
論理式の挙動をわかって組み込むのはいいのですが、あまり好きでは無いので、
Int ( Year ( Get ( 日付 ) ) + Month ( Get ( 日付 ) ) / 100 + Day ( Get ( 日付 ) ) / 10000
- Year ( s生年月日 ) - Month ( s生年月日 ) / 100 - Day ( s生年月日 ) / 10000 )
という式を使っています。
Offline
100をかける意味がようやくわかりました。
丁寧に教えてくださり、ありがとうございますm(_ _)m
本当に初歩的な質問で申し訳ありませんが、
誕生日を迎えているかいないかで、
1歳加減されていますが、
式には、1の数字がありません。
【条件に合えば、+1または−1】が
式に見当たはないのはどうしてでしよか?
#19 で既にその部分にも言及しています。
- ( ( Month ( 生年月日 ) * 100 + Day ( 生年月日 ) ) > ( Month ( Get ( 日付 ) ) * 100 + Day ( Get ( 日付 ) ) ) )
例)生年月日が 1980/11/10 の場合、 - ( 1110 > 614 ) となります。
ここまでの理解は大丈夫でしょうか?
- ( 1110 > 614 ) の括弧内は論理式と呼ばれる部分です。この計算式が成立すれば 1 しなければ 0 になります。
この場合 1110 は 614 より大きいので 1 となり、括弧が外れて - 1となります。
計算式全体は
2020 - 1980 - 1
です。
なお、条件に合わない場合 -1 ではなく 0 です。例えば 1980/3/2 であれば - ( 302 > 614 ) は条件に合わず 0 です。
shinさんも書かれていますが、論理式を計算式中に含めるのは
後から見直した際や FileMaker に詳しくない方にとって理解が難しくなります。
避けられるようならば避けられたほうが良いでしょう。
Last edited by Moz (2020-06-14 17:44:12)
Offline
Moz様
論理式の件、ようやく理解できました。
何度も何度も質問したにもかかわらず、
都度、丁寧に教えてくださり、本当にありがとうございました。
おかげさまで、年齢計算が問題なく完成いたしました。
心より感謝申し上げます。
FM初心者にとっては、一人で悩みに悩み、時間だけが過ぎていく日々が多く、
こちらで質問させていただけることが、大変救いとなっております。
これに懲りませず、どうぞこれからもよろしくお願いいたします。
Pages: 1
[ Generated in 0.006 seconds, 8 queries executed - Memory usage: 574.26 KiB (Peak: 594.8 KiB) ]