みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
いつもお世話になっております。
かなり困っていますのでよろしくお願いします。
1ヶ月の売上を一覧表にするために繰り返しフィールド使用しています。
構成としては、
取り込み用テーブル フィールド名 タイプ
日付 売上 日付 日付
2013/6/2 30000 売上 数字
2013/6/3 20000 売上累計 計算 非保存、from売上、=Sum ( 売上::純売上 )
2013/6/4 5000 売上_配列 計算[31] 非保存、from売上、=売上[1]
・ 売上累計_配列 計算[31] 非保存、from売上、=売上累計[1]
・
・
2014/6/1 10000
2014/6/3 20000
2014/6/4 15000
・
・
・
表示用テーブル [1ヶ月分表示]
前年日付 前年売上 前年累計 日付 売上 累計
2013/6/1 2014/6/1 10000 10000
2013/6/2 30000 30000 2014/6/2
2013/6/3 20000 50000 2014/6/3 20000 30000
2014/6/4 5000 55000 2014/6/4 15000 45000
・
・
・
2014/6/30
上記のように一覧表にしようと繰り返しフィールドを使い31日分表示しています。
表示用テーブルは日付が予め入っていて取り込みテーブルからのlookup関数で値を取り込んでいます。
厳密には年と月をグローバルにして変更すると日や売上が変わるようにしてあります。
ここで困っているのは、前年対比を計算したいのですが、前年累計と累計が空欄ができてしまい、まともな数字が出ないのです。
日付が抜けているので値が入らないのは当然なのですが、繰り返しフィールドで累計を計算するのはできないのでしょうか?
恐れ入りますがご教授いただきたいです、どうぞよろしくお願いします
Offline
前年対比って日の?月の?
Offline
ご返答有難うございます
前年対比は累計です。単純に累計-前年累計で計算したいです。
よろしくお願いします
Offline
違うな。前年の同じ日付の売上を同時に表示したいという意味かな?
Offline
旅人様
ご返信有難うございます。
簡単に云うとそういうことです。
私がやっていたのは単純に日付からdate(月;日;年-1)で前年を求めようとしていたのですが、
前年のレコードがない日、(休みで売上がない日)は日付自体も存在しないので前年が計算できなかったのです。
そこで月間表の日付を基にlookupしたら今度は累計の計算が出来なかったというわけなんです。
そもそも売上のない日でも日付だけでもあればよかったんですが、売上のない日はレコードがないことでハマってます。
文才がないので意味わかりますか?
どうぞよろしくお願いします
Offline
取り込みテーブル?で
テーブル テーブル2
日 ≥ 日
月 = 月
年 = 年
で自己リレーションするとSumで累計が出ますよね。
これを同じように
年・月・日と年-1・月・日の二つのリレーションで表示用テーブルでLookUpしたらいいのでは?
Offline
あ、また行き違い。
売上の無い日は前日の累計を引き継ぎたいということか・・・
読解力が無いもので。
Offline
旅人様
息が合わなくてすみません
私の説明が悪くて申し訳ないです
取り込みテーブル?で
テーブル テーブル2
日 ≥ 日
月 = 月
年 = 年
で自己リレーションするとSumで累計が出ますよね。
これを同じように
年・月・日と年-1・月・日の二つのリレーションで表示用テーブルでLookUpしたらいいのでは?
元々はこの方法で計算しておりました。
1年365日分のデータが有ればこの方法で全く問題なかったです
Offline
売上の無い日の累計は
年 = 年
月 = 月
日 > 日 関連テーブルは日付の降順ソート
でLookupしたらどうですか。
Offline
旅人様
ご返信有難うございます
やはり 年-1・月・日 だと、年・月・日の日の部分のデータがないので、
例えば今年の2014/6/1のデータが無ければ2013/6/1のデータもlookupはできません。
やはり売上がないことには累計の計算もできないです。
Offline
前年売上と売上はLookupできているものとして、それらからそれぞれ累計売上を取得します。
累計フィールドは、繰り返し[31]の計算フィールドとし、
前年累計[31]の計算式は、
Let([
$n=Get(計算式繰り返し位置番号);
$f="\"前年売上[\" & Let([$i=$i+1];$i) & \"];\" & ";
$f="Let($i=0; " & Substitute(10^$n-1; 9; $f) & "\"\")";
$f="Sum(" & Evaluate($f) & "\"\"" & ")"
];
Case(Not(IsEmpty(前年売上)); Evaluate($f)) + Left(List(前年売上);0) //←Left(~;0)は自動更新計算トリガー
)
また、累計[31]の式は、上式の「前年売上」→「売上」フィールドへ変更します。
Last edited by Hiro (2014-07-02 22:15:49)
Offline
hiro様
ご回答有難うございます。
まさにそのとおりに出来ました。
ただ、まだ私の中でこの式の理解はできていませんのでこれから勉強します。
前年売上と売上はLookupできているものとして、それらからそれぞれ累計売上を取得します。
累計フィールドは、繰り返し[31]の計算フィールドとし、前年累計[31]の計算式は、
Let([
$n=Get(計算式繰り返し位置番号);
$f="\"前年売上[\" & Let([$i=$i+1];$i) & \"];\" & ";
$f="Let($i=0; " & Substitute(10^$n-1; 9; $f) & "\"\")";
$f="Sum(" & Evaluate($f) & "\"\"" & ")"
];
Case(Not(IsEmpty(前年売上)); Evaluate($f))
)また、累計[31]の式は、上式の「前年売上」→「売上」フィールドへ変更します。
ここで一つ問題が出てきました。
試しということでタイプを数字にしてルックアップして空欄に0を入力するようにした場合はちゃんと計算されたのですが、
タイプを計算にしてlookup関数で求めた場合、空欄なので累計も計算することができません。
この場合lookup関数で空欄ではなく0を入れる式を作る方法がわかりません
今は単純に Lookup (売上::売上_配列 )となっているのですが、空欄ではなくルックアップの完全に一致する値がない場合のような式にするにはどうしたらいいのですか?
また教えていただいた式を解析しきっていないうちに話すのもおかしいとは思うのですが、教えていただいた式で空欄はそのままの0が入った時と同じようにはできないですか?
大変申し訳無いですが教えてください
よろしくお願いします。
Offline
式は売上が空欄でもちゃんと計算しています。
#1の例示サンプルが、売上が空欄の場合は累計も空欄なので、
ワザワザ式の最後で判別して売上空欄は計算結果を返さなくしているのです。
● Case(Not(IsEmpty(前年売上)); Evaluate($f)) + Left(List(前年売上);0)
↓
● Evaluate($f) + Left(List(前年売上);0)
Last edited by Hiro (2014-07-02 22:46:07)
Offline
hiro様
再度ご返答有難うございます
完璧でした。
私の記述の仕方が悪かったようで、申し訳ございません。
let関数を使った式は難しいです。
今必死に調べていますが、かなり時間が掛かりそうです。
思いどうりの結果になりましたので解決にさせていただきます。
お知恵を貸していただいた先生方どうもありがとうございました。
Offline
式のヒント
・下記要領の式をテキスト計算生成して、Evaluate("生成式")で発火しています。
[1]項目: "Sum(売上[1])" → Evaluate("左式")
[2]項目: "Sum(売上[1];売上[2])" → Evaluate("左式")
[~]項目: "Sum(売上[1];売上[2];・・・)" → Evaluate("左式")
[31]項目: "Sum(売上[1];売上[2];・・・;売上[31])" → Evaluate("左式")
・n個の文字列を生成する式。
Substitute(10^n-1; 9; "文字列;") → n=5 なら 「文字列;文字列;文字列;文字列;文字列;」 (上の式生成に利用できそうですよネ!!)
・トリガを使わず式を自動更新する案。
主式 & Left(トリガフィールド;0) (計算結果は常に無で計算結果に影響を与えず、再計算だけ促す式)
Offline
繰り返しの累計は、自己参照で
Let ( n = Get ( 計算式繰り返し位置番号 ) ;
a[n] + Case ( n > 1 ; b[n-1] )
)
のようにも書けます。
非保存だとだめとかある?
>やはり売上がないことには累計の計算もできないです。
売上が無い日は0にして累計はその日以前の売上のある日を
引き継げばいいのではないかな?
http://pupld.net/21/140703/j9ko0wpdrs/index.cgi
前年対比.fmp12
間違ってるかも知れないけど・・
Offline
#17のtimさんの式を最初に考えたけど、当初例示サンプルから
aが空欄のときはbも空欄にしなければならない、と判断し、
わざわざ面倒な#11の式に書き直した経緯があります。
Offline
tim様 旅人様 hiro様
ご回答有難うございます。
tim様のものは試してみようと思ったのですがaとbは何を入れればいいのですか?
旅人様のサンプルありがとうございます。まさにこれが一番私の考えていたものに近いです。
ちゃんと解析して変更かけていこうと思います。
一つだけ疑問なのが売上自己は何のために必要なのですか?
lookupもとや累計もとを売上で計算しないのはなぜなんでしょうか?
ご教授いただけるとありがたいです。
hiro様 昨日はどうしても急ぎで出したいデータに教えていただいた式で無事解決しました。本当にありがとうございました。
ただ、たぶん計算に時間がかかるのかとても重たくなってしまいました。
解析しながら、改善していこうと思います
Offline
今更ですが・・
繰り返しをやめて、ポータルで表示が簡単にできるのでは。
この場合、全日付のレコードが必要ですが、
現テーブルでまずければ別テーブルにしてもいいでしょう。
最初の質問の表が見づらくて、読み飛ばしていました。。
ここでは、全角スペースは半角スペースになっちゃうようですね。
Offline
チポ様
ご回答有難うございます。
そうなんです。もともとポータルで表示させる予定だったのですが、
仰る通り全日付があれば、ってことなんですよ。
あくまで1ヶ月分売上のない日も含めて全部表示するというのが目的だったので
ポータルにて表示というのを断念したのです
Offline
ポータルはリレーションの数だけでも大変でしょう。
どれだけ早くなるかは分かりませんが、timさん式の具体式は、
Let(
#n=Get(計算式繰り返し位置番号)
;
売上[#n]+Case(#n>1;累計[#n-1])
)
なお、売上[#n]の[#n]は省略可能。
Offline
別テーブルを作り、
いち日を1レコードで全日付のレコードを作ります。
このテーブルに必要なリレーションは、
1. 同日付の照合
2. 前年同日付の照合
3. 年月の照合
この三つでご希望の表示は出来るでしょう。
Offline
ああ、
リレーションは累計のために
4. 前日との照合
が必要でした。
Offline
Pages: 1
[ Generated in 0.007 seconds, 9 queries executed - Memory usage: 617.72 KiB (Peak: 650.63 KiB) ]