初心者のFileMaker pro Q&A (旧掲示板)

みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。

1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)

You are not logged in.

Announcement

新しい掲示板は、こちら:https://fm-aid.com/forum/t/filemaker


#1 2017-11-07 12:34:44

uniod9
Member

式の記述の仕方の基本の確認

なかなか専門用語や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

#2 2017-11-07 13:25:21

チポ
Member

Re: 式の記述の仕方の基本の確認

あげられたリンク先が間違っているようですよ。


> 1. 「;」の意味:複数の式を区切っている
ちょっと違いますね。
関数の中の引数を区切るものです。

> 2.  D=Get(日付)というのは、後から記述する式を簡潔にするための定義、ということでいいのか?
> 3.  PreMというのはなぜいきなり現れたのか、これも定義?

Let関数
を理解しましょう。

> 4.  "/*" を調べたらスタイルコメントの演算子だった。頭と末尾があるはずなのに、一つしかない。なぜか??
違います。
ここでは日付の「日」をワイルドカードにして「年月」で検索させるためです。


関数リファレンスのリンクです。全ての関数の解説があります。
  http://www.filemaker.com/help/16/fmp/ja … ce.html%23

Offline

#3 2017-11-07 14:43:12

Hiro
Member

Re: 式の記述の仕方の基本の確認

#2チポさんで回答済ですが、
例示された式内に誤りが在るようです。
誤り修正と見易くした補正式は、

Let (
[
   #D=Get(日付);
   #PreM=Date(Month(#D)-2; 1; Year(#D))   //月初日でないと、不当末日の翌月繰越し補正の恐れアリ
];
  Year(#PreM) &"/"& Month(#PreM) & "/*"
)

Offline

#4 2017-11-07 14:51:30

uniod9
Member

Re: 式の記述の仕方の基本の確認

チポさん

大変失礼しました。
正しいリンクはこちらです。
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

#5 2017-11-07 16:20:21

チポ
Member

Re: 式の記述の仕方の基本の確認

> Let関数の中で、いくつかの変数(チポさんのいう引数ということでしょうか)を設定することができ、
「引数」
はFMで定義された用語です。

> その区切りが「;」セミコロン
セミコロンの使い方の一つです。
他の多くの関数の引数の区切りに使われています。

> 『D』『 PreM』が、Let関数の中で設定された変数だ
その通りです。

> 「/*」をつけてあったのは『2017/11/*』というような意味合いにするためだったのですね。
その通りです。

日付等の検索のヘルプです
  http://www.filemaker.com/help/16/fmp/ja … ps.html%23


> Let ([                  ←『[ 』はリスト構文で変数を書き始める印
複数の変数を定義する場合に使います。
変数が一つの場合は省略できます。

以下はその通りですね。

Offline

#6 2017-11-07 17:01:26

uniod9
Member

Re: 式の記述の仕方の基本の確認

チポさん

最後まで丁寧にありがとうございました!
スッキリしてきました。
また頑張れそうです。

Offline

#7 2017-11-07 17:50:52

uniod9
Member

Re: 式の記述の仕方の基本の確認

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

#8 2017-11-07 18:03:10

Hiro
Member

Re: 式の記述の仕方の基本の確認

#7 wrote:

qb_dpさんの式でも概ねはいいのですが、3月31日や4月30日などで誤計算になりますので、
PreM= Date( Month ( D )-1 ; 1 ; Year ( D ) )
としておいた方が無難でしょう。

ここで既に回答コメントされた内容と同じことの重複でしたネ。

Offline

#9 2017-11-07 18:15:57

uniod9
Member

Re: 式の記述の仕方の基本の確認

Hiroさん

度々すみません

Let (
[
   #D=Get(日付);
   #PreM= Date( Month ( D )-1 ; 1 ; Year ( D ) )   
];
  Year(#PreM) &"/"& Month(#PreM) & "/*"
)

ということでしょうか?

これは、自動的に先月の1日の日付を得るための計算式、ということになりますか?

Offline

#10 2017-11-07 19:41:26

Hiro
Member

Re: 式の記述の仕方の基本の確認

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

#11 2017-11-10 18:30:12

uniod9
Member

Re: 式の記述の仕方の基本の確認

Hiroさん

ありがとうございます!

Offline

Registered users online in this topic: 0, guests: 1
[Bot] ClaudeBot

Board footer

Powered by FluxBB
Modified by Visman

[ Generated in 0.010 seconds, 12 queries executed - Memory usage: 599.4 KiB (Peak: 616.3 KiB) ]