SSブログ

MS Access VBAプロシージャの呼び出し [Accessクエリ]

今回は、VBAプロシージャをMS Accessのクエリから呼び出してみるのである。
SQLポケリでは、AccessではCREATE PROCEDUREやCREATE FUNCTIONは使えないことになっている。このことに間違いはないのだが、ストアドプロシージャが使用できないかのような誤解を招いているようなので、本ブログで訂正したいのである。

そもそも

Accessは、Office製品のひとつなので、VBAが使用できる。VBAはVisual Basic for Applicationだったかしら。Visual Basic言語でOfficeアプリケーションでの業務を自動化するようなプログラムを作成できます。っていうのがVBAのウリなわけです。

SQLは、リレーショナルデータベースへの命令が可能な言語である。Accessはもちろんのこと、SQL ServerやOracleといった大規模システム用のデータベースでも使用できる。
SQLの特徴として「非手続き型言語である」というものがある。一般的なプログラミング言語は、手続き型である。VBAも手続き型言語である。いくつものステートメントが順番に実行されていき、すべての手続きが終了しないと、処理が終了しない。
SQLでは、ひとつのステートメント(命令文)で1回の処理は終了するようにできている。
また、SQLの基本命令には、一般的な手続き型のプログラミング言語には"必ず"と言ってよいほど存在する、IF文のような場合分けの命令や、WHILE文のような繰り返し処理を行う命令文が存在しない。

ムズカシイ話になってきてしまった。簡単にいってしまえば、

SQL基本命令の特徴
 非手続き型
 1ステートメントで1処理が完結
 IFやFORなどの制御命令がない

ということなのである。

SQL拡張命令

SQLの基本命令には、IFやWHILEが存在しないのであるが、拡張命令には存在する。データベースベンダが各社の製品をより使いやすくするために、言語の拡張を行ってきた結果である。
SQL Serverでは、TransactSQLと呼ばれる拡張されたSQLが使用できる。Oracleでは、PL/SQLと呼ばれるものがある。どちらもIFやWHILEといった制御命令が使用できる。

でもって、Accessはどうかというと、もともとVBAやマクロでユーザが機能を拡張できるようになっていたので、わざわざ新しくSQLを拡張しなくても"いいじゃん"的な発想であったのであろう。SQLを拡張することでデータベースエンジンを複雑にするよりも、既存のVBAというしくみを使って、なんとかやりくりしてしまおう、という道を選んだのである。

ストアドプロシージャ

ストアドプロシージャとファンクションは、データベースの中に作成されるプロシージャやファンクションのことである。
SQL基本命令ではなく、SQL拡張命令に分類される。

SQL ServerやOracleでは、CREATE PROCEDUREでプロシージャを作成できるし、CREATE FUNCTIONでファンクションを作成できる。処理の内容は、拡張されたSQL命令で記述する。SQLの基本命令から作成したプロシージャやファンクションを呼び出すことが可能である。

Accessではというと、CREATE PROCEDURE、CREATE FUNCTIONを使用することができない。しかし、VBA Editorを使ってPublic Functionを作成しておけば、SQLからVBAのファンクションを呼び出すことが可能である。

ちょっと作ってみよう。

VBAのコードは、作成タブの「Visual Basic」ボタンをクリックして、Visual Basic for Applicationsの別ウインドウを開いて作成していく。
このウインドウは、いつまで経っても操作性が変化しない。.NETじゃない昔のVBを操作しているようなデジャブ感を味わいつつ、操作性が変わらないのは「いいことだ」としみじみ思いながら、標準モジュールに、ModuleTestを作成して、Public Functionでf_fooを作成してみた。

AccessVBAファンクションを作成.png

.NETじゃなくVBAなので、Return命令は使えない。ファンクションと同じ名前の変数で戻り値を返す。
f_fooファンクションは、引数を倍にして戻すだけ。
当然ながら、VBの文法で処理内容を書くわけです。

f_fooを呼び出すクエリを作成してみる。

AccessVBAファンクションf_fooをクエリから呼び出し.png

SQLビューにしたらこんな感じ。

AccessVBAファンクションf_fooをクエリから呼び出しSQL.png

実行するとこうなる。

AccessVBAファンクションクエリの結果.png

ちゃんと計算されている。

さて、VBAファンクションを作成して、SQLから呼び出すことができた。
VBAファンクションはストアドファンクションと呼ぶべきかどうか...
VBAファンクションはVBAで書かれているものだからなぁ... SQLじゃないし。

ということで、SQLポケリでは、Accessでは、ストアドプロシージャを扱えない、ということになっているのであった。どこかに、書いておくべきかなぁ...
えーと、長い言い訳でした。すみません。



Access クエリ 徹底活用ガイド ~仕事の現場で即使える

Access クエリ 徹底活用ガイド ~仕事の現場で即使える

  • 作者: 朝井 淳
  • 出版社/メーカー: 技術評論社
  • 発売日: 2018/05/25
  • メディア: 大型本





サイト内を検索

nice!(0)  コメント(0) 
共通テーマ:携帯コンテンツ

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。



Copyright Atsushi Asai Google+朝井淳
[改訂第4版]SQLポケットリファレンス

[改訂第4版]SQLポケットリファレンス

  • 作者: 朝井 淳
  • 出版社/メーカー: 技術評論社
  • 発売日: 2017/02/18
  • メディア: 単行本(ソフトカバー)

イラストで理解 SQL はじめて入門

イラストで理解 SQL はじめて入門

  • 作者: 朝井 淳
  • 出版社/メーカー: 技術評論社
  • 発売日: 2019/05/16
  • メディア: 単行本(ソフトカバー)

[データベースの気持ちがわかる]SQLはじめの一歩 (WEB+DB PRESS plus)

[データベースの気持ちがわかる]SQLはじめの一歩 (WEB+DB PRESS plus)

  • 作者: 朝井 淳
  • 出版社/メーカー: 技術評論社
  • 発売日: 2015/03/03
  • メディア: 単行本(ソフトカバー)

Access クエリ 徹底活用ガイド ~仕事の現場で即使える

Access クエリ 徹底活用ガイド ~仕事の現場で即使える

  • 作者: 朝井 淳
  • 出版社/メーカー: 技術評論社
  • 発売日: 2018/05/25
  • メディア: 大型本

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。