tab1: テーブル
[ID]__[A__]_[B___]_[C__]_[D__]
__1___18.5___11.8___1.2___1.5
__2___19.5___12.8___2.2___1.5
__3___20.5___13.8___3.2___1.5
クエリ1: クエリ
[ID]__[A__]_[B___]_[C__]_[D__]_[積算]
__1___18.5___11.8___1.2___1.5___216.49
__2___19.5___12.8___2.2___1.5___248.28
__3___20.5___13.8___3.2___1.5___278.07
上のような計算データが登録されている場合、次のように計算させます。
SELECT *, Rounds(CCur([A])*CCur([B])-CCur([C])*CCur([D]),0,2) AS 積算
FROM tab1;
Rounds(数字, 端数処理の指示, 端数処理後の桁数)
端数処理の指示=0・・・四捨五入
端数処理の指示=1・・・切り捨て
端数処理の指示=2・・・切り上げ
もちろん、次のように書くことも可能です。
SELECT 積算式1([A],[B],[C],[D]) AS 積算, * FROM tab1;
この場合、積算式1()という関数に値を渡すだけです。
このように関数は、式という計算手続きを予め定義しブラックボックスにします。
Public Function 積算式1(ByVal A As Double, _
ByVal B As Double, _
ByVal C As Double, _
ByVal D As Double) As Double
積算式1 = Rounds(CCur(A) * CCur(B) - CCur(C) * CCur(D), 0, 2)
End Function
これは標準モジュールに登録します。
Public Function Rounds(ByVal M As Currency, _
ByVal A As Integer, _
Optional D As Integer = 0) As Variant
Rounds = Sgn(M) * Fix(Abs(M) * 10 ^ D + Abs((A = 0) * 0.5@ + (A = 2) * (Int(M * 10 ^ D) <> (M * 10 ^ D)))) / 10 ^ D
End Function
なお、Access には RoundDown()、RoundUp()がありません。
ですから、こういう関数を自作して用意する必要があります。
お礼
早速の回答ありがとうございます。 質問の書き方が悪くてすみません。 計算式をそのままレコードとして格納 というのは計算式の確認が頻繁に必要になるため答えだけでなく式そのものを残したいという意味です。積算の場合質問にあげた計算式は1例でそのつど違ってきます。 (例:床の面積 15*12 壁1面の面積 15*2.4-1.9*2) No3の回答者さんからもEval関数を教えていただきましたのでもう一度勉強しなおしてみます。 他にヒントになることがありましたら再度教えていただけたらと思います。