みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
こんにちは、はじめまして。
ファイルメーカーで帳簿をつけています。
消費税がアップするかもしれないので、
まえもって今年のうちに対応しておこう! と張り切っていたのですが、
うまくいかなくて困っています。
少し具体的にお話しします。
わたしがお店を始めたのは3年前で、最初は消費税をいただいていませんでした。
その後、消費税をいただくようになり、現在にいたっています。
そして(おそらくは来年)消費税が10%になります。
なので、消費税率のフィールドをこんなふうに定義してみました。
case(
(入金日) < (消費税導入日) ; "0" ;
(消費税導入日) < = (入金日) < (消費税変更日) ; "8" ;
(消費税変更日) < = (入金日) ; "10" ;
)
ところが、最初の2行目まで、つまり税率0%と8%までは
きちんと反映されるのに、最後の10%のものだけがうまく反映されず、
変更日以降もそのまま8%の表示が続くのです。
「< =」を「≤」にしてみたりと、いろいろやってみたのですが、
どうにもうまくいきません。
よろしければ対処法教えていただけたら嬉しいです。
年の瀬の大変な時ですが、よろしくお願いします!
式の順番を変えればいいです。完全に逆にしましょう。
Offline
ありがとうございます! とはいえ、まだまだ一進一退です。
しばらくまたいろいろ試してみてお返事いたします。ともあれ、ありがとうございました!
ありがとうございました、なんとか解決しました。
実際には順番を入れ替えてもうまくいきませんでした。
ただ、入れ替えるうちに、正しく機能する場所が変わるのに気づきました。
このことから、どうも一つのcase関数のなかに二つの不等号があると
片方しか計算しなくなるようだ、ということに気づきました。
そこで、あまりスマートとは言えないかもしれませんが、
いったん0%か8%かを計算するフィールド(1)を作り、
もう一つ8%か10%かを計算するフィールド(2)を作って、
消費税率変更日以前はフィールド(1)を、以後はフィールド(2)を読み込む
フィールド(3)を作るという二段構えの方式で乗り切りました。
こういう解決法を思いついたのはShinさんのおかげです。
暮れのお忙しい最中、本当にありがとうございました。
横からですが、すみません。
もう解決されてますが。
caseでちゃんとできますよ。
というか、こういう場合に使うのがcaseですね。
https://fmhelp.filemaker.com/help/17/fm … /case.html
の説明部分を見てくださいね。
このことから、どうも一つのcase関数のなかに二つの不等号があると
片方しか計算しなくなるようだ、ということに気づきました。
caseは式の最初から判定を進めて、合致した時点であとの
条件式は無視されます。
case(
(入金日) < (消費税導入日) ; "0" ;
(消費税導入日) < = (入金日) < (消費税変更日) ; "8" ;
(消費税変更日) < = (入金日) ; "10" ;
)
これだと導入日以降の入金日は10%の判定式まで進まずに、
すべて8%の条件に合致してしまいますね。
二段構えの式で解決されたようですが、
今後のためにもcaseの使い方を理解されると便利ですよ。
Last edited by やまほん (2018-12-29 09:09:25)
Offline
正解は、
Case(
消費税変更日 <= 入金日 ; 10 ;
消費税導入日 <= 入金日 ; 8 ;
0
)
ですが、私の書き方では、
Case (
入金日 < 消費税導入日 ; 0 ;
入金日 < 消費税変更日 ; 8 ;
10
)
としておくと、後々のメンテナンスの時にわかりやすいでしょう。
Last edited by Shin (2018-12-29 10:13:11)
Offline
蛇足ですが、比較演算子の評価に誤解があるようなので一応。
(消費税導入日) < = (入金日) < (消費税変更日)
こちらの式ですが、片方しか評価されていないのではなく意図した比較になっていないだけです。
<= と < の優先順位は等しいので単に左から順に評価しますが、分割すると
(消費税導入日) < = (入金日) = 0 または 1
0 または 1 < (消費税変更日) = 1(例外を除く)
という計算が行われます。
仮に (入金日) が (消費税変更日) より後の日付であっても、2回目に評価されるのは (入金日) ではなくなってしまうのです。
(消費税導入日) < = (入金日) and (入金日) < (消費税変更日)
とすれば意図した結果になるでしょう。
例外についてですが、ファイルメーカーの日付型では数値の1は 0001/01/01 となるようなので、その場合だけ結果がFalse(0)になります。
Offline
すいません、お借りします
今更ながら、ここにたどり着きました。
少し使っていなかった、FMで確定申告の資料を作っていて、壁にぶち当たりました。
ほぼ、同じ問題と思いますが、解決できません。
補足、アドバイスいただければうれしいです。
10年以上前から使っていますので、5%から8%は対応できていました。
Case (
仕入日 < "2014/04/01" ; 0.05 ;
0.08 ; )
プラスで10%に変更加えたらおかしくなりました。
Case (
仕入日 < "2014/04/01" ; 0.05 ;
(仕入日 >= "2014/04/01" and 仕入日 < "2019/10/01") ; 0.08 ;
0.1)
アドバイスいただければ助かります。
仕入日が日付データでしょうから、比較対象が文字列の"2014/04/01"ではなく
GetasDate("2014/04/01")
か
Date(4;1;2014)
にしないといけません。
後者の方が日付の形式に依存しないのでお勧め。
> Case (
> 仕入日 < "2014/04/01" ; 0.05 ;
> (仕入日 >= "2014/04/01" and 仕入日 < "2019/10/01") ; 0.08 ;
> 0.1)
条件式は左から順に評価し、それが真になった以降の評価はされません。
ですから、
Case (
仕入日 < Date ( 4 ; 1 ; 2014 ) ; 0.05 ;
仕入日 < Date ( 4 ; 1 ; 2019 ) ; 0.08 ;
0.1 )
と書けますね。
3%以前はいいのかな・・
Offline
himaganeeさん、チポさん、早速ありがとうございました。
バッチリです。
基本的なことが、できていませんでした。
本当に助かりました。
感謝です。
(チポさん3%以前はデーター持っていませんので、大丈夫です。お気づかいありがとうございます)
Pages: 1
[ Generated in 0.008 seconds, 9 queries executed - Memory usage: 526.12 KiB (Peak: 547.02 KiB) ]