みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
度々お世話になっております。環境はFMP15A、Win10」です。
さて、グローバルの日付フィールドに、「入力値の自動化の計算値」を使って、値を入れようとするのですが、繰り返しの最初にしか入りません。
全てのフィールドに値を入れるにはどうしたら良いでしょうか。
詳細は以下の通り。
◇フィールド
フィールド名 タイプ 説明
-----------------------------------------------
日付 (日付) ※レコード固有のある日付
値 (数字) ※レコード固有のある値
値配列[12] (数字) ※日付が開始日[n]と終了日[n]の範囲内ならnの位置に値を入れ、範囲外ならゼロを入れたい。
(以下のフィールドはグローバル)
基準日 (日付) ※フィールド開始日や終了日に値を設定するための基準になる日
期間区分 (テキスト) ※"日"、"週"、"月"、"年"が入る。フィールド開始日や終了日にどう値を設定するかを決める。
開始日[12] (日付) ※基準日と期間区分を元に12個の日付を入れたい。
終了日[12] (日付) ※開始日に対応する終了日を入れたい。
◇やりたいこと
基準日と期間区分によって、開始日および終了日に値を設定したい。
例えば、基準日が2018/7/1で、期間区分が"週"なら
開始日は2018/7/1、2018/7/8、2018/7/15……2018/09/16
終了日は2018/7/7、2018/7/14、2018/7/21……2018/09/22
という具合にしたい。
そして、最終的にはこれを元にクロス集計を行ないたい。
◇開始日の「入力値の自動化の計算値」に設定した計算式①
Case (
Extend ( 期間区分 ) = "日" ; Extend ( 基準日 ) + Get ( 計算式繰り返し位置番号 ) - 1 ;
Extend ( 期間区分 ) = "週" ; Extend ( 基準日 ) + ( Get ( 計算式繰り返し位置番号 ) - 1 ) * 7 ;
Extend ( 期間区分 ) = "月" ;
Let ( [ #m = Month( Extend ( 基準日 ) ) ; #y = Year ( Extend ( 基準日 ) ) ] ;
Date ( #m + Get ( 計算式繰り返し位置番号 ) - 1 ; 1 ; #y )
) ;
Extend ( 期間区分 ) = "年" ;
Let ( [ #m = Month( Extend ( 基準日 ) ) ; #y = Year ( Extend ( 基準日 ) ) ] ;
Date ( #m + ( Get ( 計算式繰り返し位置番号 ) - 1 ) * 12 ; 1 ; #y )
) ;
)
◇開始日の「入力値の自動化の計算値」に設定した計算式②
※①で駄目だったので書き換えたもの。結果的にはどちらも駄目だった。
Case (
期間区分[1] = "日" ; 基準日[1] + Get ( 計算式繰り返し位置番号 ) - 1 ;
期間区分[1] = "週" ; 基準日[1] + ( Get ( 計算式繰り返し位置番号 ) - 1 ) * 7 ;
期間区分[1] = "月" ;
Let ( [ #m = Month( 基準日[1] ) ; #y = Year ( 基準日[1] ) ] ;
Date ( #m + Get ( 計算式繰り返し位置番号 ) - 1 ; 1 ; #y )
) ;
期間区分[1] = "年" ;
Let ( [ #m = Month( 基準日[1] ) ; #y = Year ( 基準日[1] ) ] ;
Date ( #m + ( Get ( 計算式繰り返し位置番号 ) - 1 ) * 12 ; 1 ; #y )
) ;
)
◇補足
ちなみにフィールドタイプを「日付」ではなく「計算」にしたら、期待通りになりました。
よって、「計算」フィールドにしてもいいかもとは思いますが、計算の速さからいったら値は固定されていた方がいいのかと思いました。
もし、「計算」フィールドでも速度が変わらないのであれば、「計算」フィールドを使ってもいいかも知れないと思っています。
Offline
最初の説明が分かりづらかったので訂正します。
「グローバルの日付(繰り返し)フィールドに、「入力値の自動化の計算値」を使って、値を入れようとするのですが、繰り返しの最初にしか入りません。
フィールド全ての繰り返し位置に値を入れるにはどうしたら良いでしょうか。」
Offline
もしかして、こういう場合は、スクリプトを使うしかないですか?
一応、スクリプトを作って、基準日と期間区分のスクリプトトリガ(OnObjectModify)に設定したことで実現はできましたが。
Offline
> グローバルの日付フィールドに、「入力値の自動化の計算値」を使って、値を入れようとするのですが、繰り返しの最初にしか入りません。
それがFMの仕様ですから、不可能です。
> フィールドタイプを「日付」ではなく「計算」にしたら、期待通りになりました。
> よって、「計算」フィールドにしてもいいかもとは思いますが、
> 計算の速さからいったら値は固定されていた方がいいのかと思いました。
何れでも、グローバルフィールドでは非索引となり同じことでしょう。
また、結果を照合キーフィールドに充てたいようですが、これも照合元側なので問題ないでしょう。
Offline
発想を逆にすれば、計算楽になりますよ。
値配列は
Let (
[
YM = Year ( 日付[1] ) * 12 + Month ( 日付[1] ) ;
YM0 = Year ( 基準日[1] ) * 12 + Month ( 基準日[1] ) ;
n = Case (
期間区分[1] = "日" ; 日付[1] - 基準日[1] ;
期間区分[1] = "週" ; Div ( 日付[1] - 基準日[1] ; 7 ) ;
期間区分[1] = "月" ; YM - YM0 ;
期間区分[1] = "年" ; Div ( YM - YM0 ; 12 )
)
] ;
Case ( n = Get ( 計算式繰り返し位置番号 ) - 1 ; 値[1] ; 0 )
)
とします。
開始日は、
Let (
[
Y0 = Year ( 基準日[1] ) ;
M0 = Month ( 基準日[1] ) ;
YM0 = Y0 * 12 + M0 - 1 ;
n = Get ( 計算式繰り返し位置番号 ) - 1
] ;
Case (
期間区分[1] = "日" ; 基準日[1] + n ;
期間区分[1] = "週" ; 基準日[1] + n * 7 ;
期間区分[1] = "月" ; Left ( ( Div ( YM0 + n ; 12 ) + Mod ( YM0 + n ; 12 ) / 100 + .01 ) & "0" ; 7 ) ;
期間区分[1] = "年" ; Left ( ( Y0 + n + M0 / 100 ) & "0" ; 7 )
)
)
と表示させればいいでしょう。
https://www.dropbox.com/s/zo1sdfx0gzsbn … 7.zip?dl=0
Last edited by Shin (2018-07-04 13:48:40)
Offline
発想を逆にすれば、計算楽になりますよ。
こちらの方がスマートですし、確かに計算も簡略化されますね。
サンプルも含めてありがとうございました。
参考にさせて頂きます。
Offline
Pages: 1
[ Generated in 0.006 seconds, 8 queries executed - Memory usage: 564.82 KiB (Peak: 570.07 KiB) ]