みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
win10
pro15を使用しています。長文すみません。
使用するテーブルは一つ
使用するフィールドは以下の通り
・入居年月日(日付)
・駐車代(数字)
・駐車場消費税なし(テキストフィールド)
・初月日割り計算(計算、(結果は数字))
※現在、駐車代フィールドには「10,000」や「11,000」など税抜き税込すべての結果数字を入力しています。
※駐車場消費税なしフィールドはチェックボックスセットになっており「*」であれば税金不要「””」であれば税金必要という意味です。
(したいこと)初月日割り計算フィールドに以下の計算式を入れて入居初月の日割り駐車場代を計算したいのです。
Let ( [
nM日数=Date ( Month ( 入居年月日 ) +1 ; 1 ; Year ( 入居年月日 ) )-1
] ;
If ( 駐車代="" or 駐車代=0 ; "" ;
If ( Day ( 入居年月日 )=1; 駐車代;
If ( Day ( 入居年月日 )<>1 and 駐車場消費税なし="" ; Int ((Truncate(駐車代/1.1/30;3)*(nM日数-(入居年月日-1))*1.1 )
)))))
上記はうまく計算できます。これに
If ( Day ( 入居年月日 )<>1 and 駐車場消費税なし<>"" ; Int ((Truncate(駐車代/30;3)*(nM日数-(入居年月日-1)) )
を加えたいのですが・・・
Let ( [
nM日数=Date ( Month ( 入居年月日 ) +1 ; 1 ; Year ( 入居年月日 ) )-1
] ;
If ( 駐車代="" or 駐車代=0 ; "" ;
If ( Day ( 入居年月日 )=1; 駐車代;
If ( Day ( 入居年月日 )<>1 and 駐車場消費税なし="" ; Int ((Truncate(駐車代/1.1/30;3)*(nM日数-(入居年月日-1))*1.1 );
If ( Day ( 入居年月日 )<>1 and 駐車場消費税なし<>"" ; Int ((Truncate(駐車代/30;3)*(nM日数-(入居年月日-1)) )
))))))
とすると「関数が多すぎる」というエラーが出てしまします。
どのようにしたらよろしいでしょうか?
説明足らずでしたらご指摘お願いします。
どうぞご教授よろしくお願いします。
Offline
とりあえず、IfはやめてCaseにすればすっきりするのでは。
条件は、順番に「それ以外の場合」だけを記述して簡潔にします。
例えば
Day ( 入居年月日 )=1
が出てきたら、それ以降は
Day ( 入居年月日 )<>1
は自明なので不要になります。
例えば
Case ( 駐車代="" or 駐車代=0 ; "" ;
Day ( 入居年月日 )=1; 駐車代;
駐車場消費税なし="" ; Int ((Truncate(駐車代/1.1/30;3)*(nM日数-(入居年月日-1))*1.1 );
Int ((Truncate(駐車代/30;3)*(nM日数-(入居年月日-1)) )
以下略
みたいになります。
himadaneesa様
ありがとうございます。
なるほど仰せの通りにcaseを使うとすっきりしました。大変ためになりました。
しかし
それでも「関数中の引数が多すぎます」と出てきてしまいます・・・
どうしたらよろしいでしょうか?
構文が間違っているのでしょうか?引数の使い過ぎということでしょうか?
ご教授よろしくお願いします。
Offline
「関数が多すぎる」ではないだろうと思ってましたが
「関数中の引数が多すぎます」は、;の数が多すぎるという意味です。
関数ごとに引数の数は決まってますので、
例えばIfなら1つか2つ、Positioinなら3つです。
他にLetやSubstituteなど上限だけ決まってる関数もあります。
エラー箇所が選択状態になりませんか?
himadaneeさん
ご回答ありがとうございます。
エラー説明不足でした。すみません。
関数ごとに引数の数は決まってるんですね・・・
Let ( [
nM日数=Date ( Month ( 入居年月日 ) +1 ; 1 ; Year ( 入居年月日 ) )-1
] ;
Case ( 駐車代="" or 駐車代=0 ; "" ;
Day ( 入居年月日 )=1; 駐車代;
駐車場消費税なし="" ; Int ((Truncate(駐車代/1.1/30;3)*(nM日数-(入居年月日-1))*1.1 ); ←ここの「;」が選択状態になります
Int ((Truncate(駐車代/30;3)*(nM日数-(入居年月日-1)
)))
上記の個所が選択状態になります。
ではこの構文は引数をなんとかして減らすしか方法はないということですね?(;^_^A
Offline
上の式をインデントを入れると、
Let (
[
nM日数 = Date ( Month ( 入居年月日 ) + 1 ; 1 ; Year ( 入居年月日 ) ) - 1
] ;
If (
駐車代 = "" or 駐車代 = 0 ; "" ;
If (
Day ( 入居年月日 ) = 1 ; 駐車代 ;
If (
Day ( 入居年月日 ) <> 1 and 駐車場消費税なし = "" ; Int ( ( Truncate ( 駐車代 / 1.1 / 30 ; 3 ) * ( nM日数 - ( 入居年月日 - 1 ) ) * 1.1 ) ;
If (
Day ( 入居年月日 ) <> 1 and 駐車場消費税 なし <> "" ; Int ( ( Truncate ( 駐車代 / 30 ; 3 ) * ( nM日数 - ( 入居年月日 - 1 ) ) ) )
)
)
)
)
)
となり、少し変ですね。エラーは、「関数注の引数が多すぎる」のはずです。括弧の数が合っていないのでしょう。(エラーとなっている1個目の Int() を閉じる ) が無い)
If()を入れ子にするのは読みにくくなり、エラーもわかりにくなります。次の式でも同じかと思います。
Let (
[
nM日数 = Day ( Date ( Month ( 入居年月日 ) + 1 ; - Day ( 入居年月日 ) ; Year ( 入居年月日 ) ) ) ;
tax = Case ( IsEmpty ( 駐車場消費税なし ) ; 1.1 ; 1 )
] ;
Case (
駐車代 = "" or 駐車代 = 0 ; "" ;
Day ( 入居年月日 ) = 1 ; 駐車代 ;
Int ( Truncate ( 駐車代 / tax / 30 ; 3 ) * nM日数 * tax )
)
)
Last edited by Shin (2022-11-06 03:45:32)
Offline
SHIN様
できました。
括弧の数が合っていないということだったとは・・構文もすごくすっきりなりました。<m(__)m>
皆さまありがとうございます。
Offline
Pages: 1
[ Generated in 0.009 seconds, 7 queries executed - Memory usage: 521.55 KiB (Peak: 526.09 KiB) ]