みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
なかなか専門用語やFileMakerの常識がわからず、何を読んでも理解が進まず困っています。
例えば、下記のリンク先にある質問の式ですが
https://fm-aid.com/bbs2/viewtopic.php?id=4050
回答として、下記のような式が載っています。
Let ([
D = Get ( 日付 )
;PreM= Date( Month ( D )-1 ; Day ( D ) ; Year ( D ) )
];
Year ( PreM ) & "/" & Month ( PreM ) & "/*"
)
2ヶ月前
Let ([
D = Get ( 日付 )
;PreM= Date( Month ( D )-2 ; Day ( D ) ; Year ( D ) )
];
Year ( PreM ) & "/" & Month ( PreM ) & "/*"
)
_____
1. 「;」の意味:複数の式を区切っている(これは調べたらわかりました)
2. D=Get(日付)というのは、後から記述する式を簡潔にするための定義、ということでいいのか?
3. PreMというのはなぜいきなり現れたのか、これも定義?
4. "/*" を調べたらスタイルコメントの演算子だった。頭と末尾があるはずなのに、一つしかない。なぜか??
以上のようなことが、あっているのか、どうか、わからず不安なまま作業をしています。
答え合わせをさせていただけたら非常にありがたいです
Offline
あげられたリンク先が間違っているようですよ。
> 1. 「;」の意味:複数の式を区切っている
ちょっと違いますね。
関数の中の引数を区切るものです。
> 2. D=Get(日付)というのは、後から記述する式を簡潔にするための定義、ということでいいのか?
> 3. PreMというのはなぜいきなり現れたのか、これも定義?
Let関数
を理解しましょう。
> 4. "/*" を調べたらスタイルコメントの演算子だった。頭と末尾があるはずなのに、一つしかない。なぜか??
違います。
ここでは日付の「日」をワイルドカードにして「年月」で検索させるためです。
関数リファレンスのリンクです。全ての関数の解説があります。
http://www.filemaker.com/help/16/fmp/ja … ce.html%23
Offline
#2チポさんで回答済ですが、
例示された式内に誤りが在るようです。
誤り修正と見易くした補正式は、
Let (
[
#D=Get(日付);
#PreM=Date(Month(#D)-2; 1; Year(#D)) //月初日でないと、不当末日の翌月繰越し補正の恐れアリ
];
Year(#PreM) &"/"& Month(#PreM) & "/*"
)
Offline
チポさん
大変失礼しました。
正しいリンクはこちらです。
https://fm-aid.com/bbs2/viewtopic.php?id=7011
最新の関数リファレンスのリンク、ありがとうございます!
http://www.filemaker.com/help/16/fmp/ja … 2Flet.html
実は古いバージョンのリファレンスを読んだことは読んだのですが、
恥ずかしながら理解ができていないようで…
初歩的な質問で大変恐縮ですが、今後のために重ねて質問をさせていただければと思います。
Let 関数を使用すると、式の結果を変数に割り当て、その変数を使用できる結果を返すことができます
とあり、リスト構文というものの説明がありました。
Let関数の中で、いくつかの変数(チポさんのいう引数ということでしょうか)を設定することができ、
その区切りが「;」セミコロン。
先の例だと、『D』『 PreM』が、Let関数の中で設定された変数だ、ということでしょうか。
ワイルドカードについては、下記の説明で、
http://www.filemaker.com/help/12/fmp/jp … t.5.6.html
どのような文字が挿入されても構わない位置にワイルドカード文字(*)を入力します。
という表記を見つけました。
「/*」をつけてあったのは『2017/11/*』というような意味合いにするためだったのですね。
整理すると
Let ([ ←『[ 』はリスト構文で変数を書き始める印
D = Get ( 日付 ) ← 一つ目の変数
;PreM= Date( Month ( D )-1 ; Day ( D ) ; Year ( D ) ) ←二つ目の変数(一つ目の変数を計算の中で使っている)
]; ← 変数の記述はここまで
Year ( PreM ) & "/" & Month ( PreM ) & "/*" ←二つ目の変数を使用して、年月を求めた(これが最終的に求めたかった値)
)
こういうことでいいのでしょうか?
長々済みません。
Offline
> Let関数の中で、いくつかの変数(チポさんのいう引数ということでしょうか)を設定することができ、
「引数」
はFMで定義された用語です。
> その区切りが「;」セミコロン
セミコロンの使い方の一つです。
他の多くの関数の引数の区切りに使われています。
> 『D』『 PreM』が、Let関数の中で設定された変数だ
その通りです。
> 「/*」をつけてあったのは『2017/11/*』というような意味合いにするためだったのですね。
その通りです。
日付等の検索のヘルプです
http://www.filemaker.com/help/16/fmp/ja … ps.html%23
> Let ([ ←『[ 』はリスト構文で変数を書き始める印
複数の変数を定義する場合に使います。
変数が一つの場合は省略できます。
以下はその通りですね。
Offline
チポさん
最後まで丁寧にありがとうございました!
スッキリしてきました。
また頑張れそうです。
Offline
Hiroさん
ご丁寧にありがとうございます!
>>>>>>例示された式内に誤りが在るようです。
>>>>>>誤り修正と見易くした補正式は、
Let (
[
#D=Get(日付);
#PreM=Date(Month(#D)-2; 1; Year(#D)) //月初日でないと、不当末日の翌月繰越し補正の恐れアリ
];
Year(#PreM) &"/"& Month(#PreM) & "/*"
)
>>>>>>>>>>>>>>
の項について、質問させていただいても良いでしょうか?
引用元https://fm-aid.com/bbs2/viewtopic.php?id=7011
に下記のような記述があります。
対策としては下記なのでしょうか?
関数のリファレンスを見ながら、手計算をして見たら、
年については正しく数値が出てきました。
しかし、月については、余剰が少数になってしまうのです…
これは、下記の式に何か間違いがあるのでしょうか?
それとも私がMod関数に関して誤解しているのか…
もしも何かお分かりでしたら、教えていただけませんでしょうか?
よろしくお願いいたします。
Year ( Get ( 日付 ) ) * 12 + Month ( Get ( 日付 ) ) - 1
は、仮想の西暦0年1月からの満の月数が求められます。
月は1月からはじまりますのでその補正のために1を減じます。
(この数字を計算するフィールドを作っておくと、○ヶ月前の検索など楽ですよ)ですから、前月は、さらに1を減じます。
この数字を年月に戻すためには、Div ( YM ; 12 ) で年が求められ、Mod ( YM ; 12 ) で0から始まる月になりますので1を加えます。2ヶ月前は、
Let (
YM = Year ( Get ( 日付 ) ) * 12 + Month ( Get ( 日付 ) ) - 3 ;
Div ( YM ; 12 ) & "/" & ( Mod ( YM ; 12 ) + 1 ) & "/*"
)
です。qb_dpさんの式でも概ねはいいのですが、3月31日や4月30日などで誤計算になりますので、
PreM= Date( Month ( D )-1 ; 1 ; Year ( D ) )
としておいた方が無難でしょう。
ちなみに、前月ならば、
Year ( Get ( 日付 ) - Day ( Get ( 日付 ) ) & "/" & Month ( Get ( 日付 ) - Day ( Get ( 日付 ) ) & "/*"
だけでも OK です。
Offline
qb_dpさんの式でも概ねはいいのですが、3月31日や4月30日などで誤計算になりますので、
PreM= Date( Month ( D )-1 ; 1 ; Year ( D ) )
としておいた方が無難でしょう。
ここで既に回答コメントされた内容と同じことの重複でしたネ。
Offline
Hiroさん
度々すみません
Let (
[
#D=Get(日付);
#PreM= Date( Month ( D )-1 ; 1 ; Year ( D ) )
];
Year(#PreM) &"/"& Month(#PreM) & "/*"
)
ということでしょうか?
これは、自動的に先月の1日の日付を得るための計算式、ということになりますか?
Offline
Let (
[
#D=Get(日付);
#PreM= Date( Month ( D )-1 ; 1 ; Year ( D ) )
];
Year(#PreM) &"/"& Month(#PreM) & "/*"
)
ではなく、(※「#」は式内限有効「変数」の私的識別マーカとして)
Let (
[
#D=Get(日付);
#PreM= Date(Month(#D)-1; 1; Year(#D))
];
Year(#PreM) &"/"& Month(#PreM) & "/*"
)
Offline
Hiroさん
ありがとうございます!
Offline
Pages: 1
[ Generated in 0.010 seconds, 12 queries executed - Memory usage: 599.4 KiB (Peak: 616.3 KiB) ]