みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
いつもお世話になっております。田中と申します。
現在、FileMaker17Pro Advancedを使用しております。
「顧客データ」テーブルの「顧客ID」と1対多でリレーションを設定した「全売上データ」テーブルを用いて、
「顧客データ」側のフォーム形式レイアウトに「次回連絡日」というフィールドを設定しようと試行しております。
「次回連絡日」の定義は、
①1年以内に売上が有った顧客・・・・・・・・最も新しい売上日から13週間後の日にちを表示する
②1年以内に売上が3回有った顧客・・・・・・3回前の売上から起算して1年後の日にちを表示する※一年の売上の最大数は3回となります。
③1年以内または過去売上が無かった顧客・・・レイアウトを表示した日にちを本日とした日にちを表示する
と考えております。
以前ご教授いただいた、日付昇順末尾から過去データを取り出す事は出来ましたが、
上記定義の計算式を設定する事が出来ていない状況です。
もし、定義等を含めて良い方法がございましたらご教授のほどをお願い致します。
範囲指定のリレーションを組むのも面倒なので、他の補助的設定を一切必要としない、単独のSQL計算式だけ求める方法です。
作成日以降の見る日(今日=Get(日付))によって計算結果を自動更新表示したいなら、計算結果を非保存にします。
別途「起算日」を指定して、その起算日に基づいて非更新表示させたいなら、計算結果は保存にします。
(※式内 #TDY=Get(日付) → #TDY=起算日 へ差換え)
Let([
#TDY=Get(日付);
#SQL=
ExecuteSQL(
"
SELECT ""売上日""
FROM ""売上データ""
WHERE ""顧客ID""=? AND ""売上日"" BETWEEN ? and ?
ORDER BY ""売上日"" DESC
"
; ""
; ¶
; 顧客ID
; GetAsDate(Substitute(#TDY;[Year(#TDY);Year(#TDY)-1]))
; #TDY
)
];
Choose(
Min(ValueCount(#SQL);3)
; #TDY
; GetAsDate(#SQL) + 7*13
; GetAsDate(GetValue(#SQL;1)) + 7*13
; Let([#d=GetValue(#SQL;3)]; Substitute(#d;[Year(#d);Year(#d)+1];["-";"/"]))
)
)
Offline
「顧客データ」テーブルに、1年前の日付を設定するグローバルフィールドを作り、「全売上データ」の日付とのリレーションを追加し、日付で降べきにソートします。
顧客データから、売上データのレコードをCount()で崇徳し、
Choose ( Count(リレーション::日付) ;
Get ( 日付 ) ;
Max ( リレーション::日付 ) + 13 * 7 ;
Max ( リレーション::日付 ) + 13 * 7 ;
Min ( リレーション::日付 ) + 365
)
1年を厳密に計算したいのでしたら、月末の処理(2月29日の1年後は?)が面倒かもしれませんが、365 を足す代わりに、Date() 関数で1年を足すようにしてください。
Date ( Month ( Min ( リレーション::日付 ) ) ; Day ( Min ( リレーション::日付 ) ) ; Year ( Min ( リレーション::日付 ) + 1 ) )
Last edited by Shin (2019-06-17 15:33:20)
Offline
Hiro 様
今回も、即急なご回答を頂き有り難うございます。
SQL計算式での算出方法で、フィールドの設定が出来ました。
有り難うございます。
Shin 様
初めまして。この度は御回答いただきまして、有り難うございます。
グローバルフィールドを設定しリレーション、ソートを設定した上で
ご教授いただいた計算フィールドを設定しましたが、私の理解力不足の為、
空欄が表示される結果となってしまいました。
私の勉強不足の為、このような結果となってしまし、大変申し訳なく思います。
ご教授いただいた中の、顧客データから、売上データのレコードをCount()で拾得、が
上手くできていない為だと考えておりますので、引続き設定の方を試行してみます。
大変恐縮ですが、この場をお借りしてもう一つお伺いしたい事があります。
上記定義は1年を区切りとしておりますが、これをYearからweekへと変換する事は可能でしょうか。
例:1年以内→52週以内、1年後→52週後等…
質問ばかりで申し訳ありませんが、何卒よろしくお願い致します。
尚、Shin 様にご指摘いただいた閏年につきましては考慮しないものとさせていただきます。
>#4『上記定義は1年を区切りとしておりますが、これをYearからweekへと変換する事は可能でしょうか。
例:1年以内→52週以内、1年後→52週後等…』
この変更は簡単です。式はむしろシンプルになりますネ。(修正箇所→赤色)
Let([
#WKS=52; //← 起算週数を指定
#TDY=Get(日付);
#SQL=
ExecuteSQL(
"
SELECT ""売上日""
FROM ""売上データ""
WHERE ""顧客ID""=? AND ""売上日"" BETWEEN ? and ?
ORDER BY ""売上日"" DESC
"
; ""
; ¶
; 顧客ID
; #TDY - 7*#WKS //← 「1年:GetAsDate(Substitute(#TDY;[Year(#TDY);Year(#TDY)-1]))」
; #TDY
)
];
Choose(
Min(ValueCount(#SQL);3)
; #TDY
; GetAsDate(#SQL) + 7*13
; GetAsDate(GetValue(#SQL;1)) + 7*13
; GetAsDate(GetValue(#SQL;3)) + 7*#WKS //← 「1年:Let([#d=GetValue(#SQL;3)]; Substitute(#d;[Year(#d);Year(#d)+1];["-";"/"]))」
)
)
Last edited by Hiro (2019-06-17 22:07:07)
Offline
Hiro 様
追加の質問にも関わらず、ご対応有り難うございます。
計算フィールドでの表示を確認いたしました。
こちらでご教授いただいたSQL文も活用させていただきます。
本質問は、御回答を頂きましたのでステータスを解決とさせていただきます。
Hiro 様・Shin 様 ご協力、御回答有り難うございました。
計算フィールドの設定の間違いでは。
https://www.dropbox.com/s/r0tvow550ex2f … 2.zip?dl=0
SQL とどちらがシンプルでしょうかね
Last edited by Shin (2019-06-18 10:05:33)
Offline
Pages: 1
[ Generated in 0.005 seconds, 7 queries executed - Memory usage: 520.73 KiB (Peak: 525.63 KiB) ]