スキップしてメイン コンテンツに移動

AccessのDsum関数

#SE

今回、Accessの"Dsum関数"を初めて使った。

先にリンクテーブルを張りなおした!、という案件での事。
明細項目に商品毎の金額があるのだが、その合計をフォームで表示してほしい、というものだった。

最初は明細用のサブフォーム内で、明細レコードに金額を合計したレコードをUnionで一緒に表示しようかと考えていたんだけれど、明細サブフォームのレコード数表示は明細件数を確認するから、そこに影響する方法はダメとなったので代替手段をとった。

これまでならユーザー定義関数を書いて、その中でDAOでSQLを書いて帰ってきた値をテキストボックスに与える、という方法をとっていたんだけど、まあ、他にも方法はないかな?という事で勉強感覚でMSの関数リファレンスを眺めてたら、上記の"Dsum関数"を見つけた、というわけ。

書式 :DSum( フィールド名, テーブル名若しくはクエリー名, 条件 )
戻り値:指定したレコードのセット (定義域) に含まれる値の合計

"条件"はSQL文でのWhere句。ただし"Where"は含まない

要は、既にACCESSで定義済みのテーブルやクエリーに規定されてるフィールドの合計値をもとめる、ということ。一応条件付けも出来る。

確かにお手軽やね。

今回は、特段条件づけは必要が無かったので簡単に済ますことが出来た。
この関数は既に存在するリソースをそのまま使える場合には都合がいい。
ただ、この目的のためだけに新たなクエリーを規定する必要があるのだとしたら、それはやめて、ユーザー関数でSQLを書いた方がいいと思う。


コメント

このブログの人気の投稿

対処例:Accessフォームでチェックボックスが思うように設定できない

開発プラットフォームとしてAcccessという事は多い。 そして何気に不思議な動作をする事が多いのも事実。 今回であったのは、フォームに置いたチェックボックスが、フォームを開いた際に思ったように振舞ってくれない、というもの。 このチェックボックスは規定値=FALSEで設定してあって、人の操作以外でこのチェックボックスの値は操作していない。 そしてこのチェックボックスを置いたフォームを開くと… 問題のチェックボックス、チェックがついた状態で描画される!!! こまったチャンである。 時折は意図したとおりにOFFの状態で開く場合もあるものの、まれ。 ここはしっかりユーザーの操作(チェックボックスをONにする)に基づき、関連の項目を入力してもらう、という動作をさせたいし、また他へのI/F項目でもあって、しっかりさせたい。ちなみに、TripleState プロパティは Falseに設定してある。 簡単にググッてみたものの、ちょっと同様の事例や対処は見つからず。いくつか試したが、うまく行かない。 で、結論から書くと、こういう対処をした。 Form_OPENイベントの際に、問題のチェックボックスに以下の操作を実行 ・問題のチェックボックスにフォーカス設定 ・問題のチェックボックスに対して、SendKeys でスペース(" ")一文字投げつけ ・問題のチェックボックスの Value 値を確認。True の場合、もう一回SendKey でスペース(" ")一文字投げつけ 発想としては、チェックボックスがカレントな状態のとき、スペースキーで値が操作できる事を思い出し、ぶつけてみた。 でも、実は最初はうまく行かず。 はて? で、 SendKeys のリファレンスを改めて眺めて、 Wait オプションがある事を思い出した。 解説するまでもないが、これが True の場合、そのキーが処理されるまでVBAは次の実行をまつ。デフォルトでは False で実行される。なので、Accessが、なげつけられた?(いや、自分で自分に投げているわけだから…)スペースキーを受け取る前にVBAが進んでるか?と思い、以下に書き換えてやってみた。 SendKeys " ", True ...

VBS で引数を受け取るサンプル

WScript.Arguments に引数要素が配列で格納されているので、これを取り出す。 =========================================== '############################# 'パラメータ=オーダーIDの取り出しとセット '############################# Dim oParam 'パラメータオブジェクト Dim strPrm0  'パラメータ要素格納 Set oParam = WScript.Arguments strPrm0 = oParam(0) Wscript.echo strPrm0 =========================================== これを引数あり、引数なしでそれぞれ実行してみる。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >cscript.exe test.vbs a a >cscript.exe test.vbs test.vbs(9, 1) Microsoft VBScript 実行時エラー: インデックスが有効範囲にありません。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ strPrm0 = oParam(0) の場所で怒られている。 引数なしで起動した場合には相応の対応をしたい。 そこで、上記を書き換える。 WScript.Arguments のCount ポロパティの値をチェックして動作を切り分ける方法。 =========================================== '############################# 'パラメータ=オーダーIDの取り出しとセット '############################# Dim oParam 'パラメータオブジェクト Dim strPrm0  'パラメータ要素格納 Set oParam = WScript.Arguments ...

SKYSEAの外部デバイスへのコピー抑止を回避する方法

社内のシステム屋としてあまりほめられた事ではないが。 うちの会社ではSKYSEAを導入していて、配布するPCにはそのクライアントがインストールされている。 でも時としてそれが邪魔(会社としては邪魔するために入れているのだから当たり前だが…)な時がある。 そこでこんなのをこしらえた。 <skeseaYokushi.bat> ============================================= rem SKYSEAの外部デバイスへのコピー禁止を回避する為にサービスをとめる。 echo off sc stop "scvcabproxysvr" sc stop "astexagt" sc stop "scvsvc" sc stop "scv logagentservice" sc stop "logsvr" sc stop "icssvc" echo ============================================= SKYSEAは全部で6つのサービスで出来ている。それをとめてしまう、というバッチコマンド。ただ、このサービス相互に依存関係があり、いっぺんには停止が出来ない。 さらに厄介なのが、サービスをとめても、後ほど自動的に再起動がかかる、というつくり。ある程度時間がかかるファイルコピーでは困ってしまう。 そこで上記のコマンドをタスクスケジューラで連続的に起動してサービスをとめ続けてしまえ、とやったのが以下 <skyseayokusei.xml> ============================================= <?xml version="1.0" encoding="UTF-16"?> <Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">   <R...