今回の記事では、Microsoft Accessをかれこれ20年近く利用してきた私が、Accessの機能や特徴としてあまり注目はされていないが、「実はこの機能が優れている!」とか、「この機能を活用しないともったいない」と感じる部分も記事にしていこうと思います。
Excelの進化ぶりと比較すると、MicrosoftはAccessの存在を忘れているのか?と思うぐらい何年も進化をしていませんが、Accessはそれで良いと思います。
一般的なAccessの特徴
当ブログでは、過去に幾つかAccessを題材にした記事を掲載しており、その記事のなかでもAccessで利用できる機能や、その特徴を紹介しています。
上記のリンク先の記事でも、Accessの基本的な機能については解説していますが、当項では簡単にAccessの特徴をおさらいしておきます。
Accessの特徴は以下です。
- リレーショナルデータベースが簡単に作れる。
- SQLを知らなくてもRDBを扱える。
- プログラミング経験がなくても業務アプリが作れる。
- 様々なRDBMSと「リンクテーブル」で接続できる。
Accessは、リレーショナルデータベース(RDB)をとても簡単に作れます。
一般的なRDBでは、SQL ServerやOracleといったソフトウェアをインストールする必要があり、利用できるようにするためには幾つかの設定も行います。
非常に手間であり、さらに作成したデータベースを持ち運ぶようなこともできません。
Accessでは、accdb形式(旧mdb形式)のファイルにテーブルなどのRDBのデータがすべて格納され、Accessさえインストールされている環境であれば、どの端末でもaccdbファイルを開くことができ、データベースを利用することが可能です。
また、一般的なRDB製品内のデータを参照したり更新する場合はSQLの知識が必要になりますが、Accessでは「クエリ」と呼ばれる機能があり、そのクエリではマウス操作だけでデータを抽出したり更新する処理が作れます。
よってSQLを習得する必要もありません。
また、Access内には、データベースとしてテーブル群が作れるだけではなく、オリジナルの「フォーム」が作成できて、ボタンやテキストボックスなどのコントロールを自由に配置することが可能です。
更に、「マクロ」と呼ばれる処理の自動化機能もあるため、前述したクエリをコマンドボタンの実行時イベントで割り当てたり、登録したマクロを割り当てることで、プログラミングの知識がなくても簡易的な業務アプリの作成もできます。
Accessでは「リンクテーブル」という機能があり、外部のデータベースをあたかもローカルテーブルかのように参照することができます。
SQL ServerやOracleなどのデータベース製品に接続するには、本来専門的な知識が必要になりますが、リンクテーブル機能を利用することで、接続先のデータベースの種類に関わらず、専門知識不要で接続が可能です。
このように、AccessではRDB作成ソフトという用途以外にも様々な機能があり、昔から多くの企業で広く利用されています。
実はすごい!Accessの便利な機能や特徴
当項では、今回の記事の主題である「あまり注目されていないが実は便利な機能や特徴」を紹介していきます。
異なるRDBMSを横断してテーブルの結合ができる
当記事の「一般的なAccessの特徴」でも記載しましたが、Accessでは「リンクテーブル」という仕組みを利用することで、SQL ServerやOracle、PostgreSQLやMySQLなどの一般的に利用されているRDB管理システム(RDBMS)のテーブルへも簡単に接続してデータを参照したり更新することができます。
また、このリンクテーブルでは、accdb(又はmdb)内に作成したローカルテーブルと同じようにSQL Serverなどのサーバー側テーブルを扱うことができるようになり、前述したクエリと併用することで、だれでも簡単にデータ抽出などが行えるようになります。
このリンクテーブルの仕組みを実現しているのは「ODBC(Open Database Connectivity)」です。
ODBCはMicrosoftが提唱したデータベースの基本操作における共通手順のようなものです。
各RDBMSベンダーが提供する「ODBCドライバ」と呼ばれるソフトウェアをPCやサーバーにインストールすることで利用できるようになります。
本来ユーザーやアプリケーションでは、RDBMS毎に異なる仕様やプロトコルを使い分けてデータベースを利用しますが、ODBCを使用することにより、ユーザーやアプリケーションはRDBMS毎の仕様やプロトコルの違いを意識することなくデータベースを利用できるようになります。
このODBCの技術を利用した「リンクテーブル」と「クエリ」を活用することで、Accessユーザーは高度なデータベースの知識や、SQLの技術を持たなくても手軽にデータベースのテーブルにアクセスすることができ、データ抽出やデータの一括更新などが行えます。
このリンクテーブルは上記の特徴により、Accessでは広く利用されていますが、このリンクテーブルの機能において「実はすごい」ポイントは、「異なるRDBMSを横断してテーブルを結合できる」ところです。
SQL ServerやOracleなどの一般的なRDBMS製品では、上で記載したとおり、RDBMS製品毎の内部的な仕様の違いやプロトコルの違いにより、互いのテーブルを直接参照することはできません。
ただ、RDBMSではOracleやSQL Server、PostgreSQLやMySQLなど様々な製品があり、複数のRDBMSを使い分けて利用している環境の場合、時には異なるRDBMS内のテーブルを結合してデータを抽出したい場合もあります。
例えばSQL Serverであれば「リンクサーバー」という機能があり、異なるインスタンスのRDBMSと接続して同一インスタンス内のテーブルと同じようにクエリを実行したり、テーブルを結合することができます。
また、同じSQL Serverだけが対象ではなく、前述したODBCの機能を利用することで、OracleやPostgreSQLなど異なるRDBMSのインスタンスとも接続することができ、SQL Server内のテーブルとのテーブル結合も可能です。
複数のRDBMSを併用している環境であれば、「リンクサーバー」機能は便利です。
しかし、「リンクサーバー」を利用するには、SQL Server側で異なるインスタンスに接続するための設定が必要になります。
また、接続先のRDBMSによっては、適合したODBCドライバをサーバーにインストールすることも必要です。
よって、データベースの利用者レベルの権限でそのような作業を行うことは難しいです。
ただ、Accessであれば、リンクテーブルの機能を利用することで、異なるRDBMS内のテーブルを一つのクエリで扱うことができ、互いのテーブルの列を結合することも可能です。
また、異なるRDBMS同士の仕様の違いはODBC側で吸収してくれるため、異なるRDBMSのテーブルを結合して抽出を行う場合でも、ユーザーはAccess内の関数だけ覚えておけば事足ります。
Accessのリンクテーブルでは、リンク先のデータが異なるaccdbファイルか、SQL Serverのテーブルか、Oracleのテーブルか、はたまたCSVファイルをテーブルに見立てて表示させているかを意識する必要はありません。
この機能は、実は大変便利な機能なのです。
宛名ラベル印刷など帳票作成機能が充実
Accessでは前述したとおり様々な機能があり、大変優秀なソフトですが、個人的に一押しの便利機能は「レポート」です。
Access内のローカルテーブルやリンクテーブル、クエリなどをデータソースとして帳票を自由に作成することができます。
作成可能な帳票は、大きくわけて以下の二種類です。
- 単表形式:1ページ1レコードを出力する伝票用書式
- 表形式:1ページ内に複数レコードを出力する一覧表用書式
Accessのレポートでは、この二種類の書式を使い分けて作成します。
Accessのレポートでは、フォームなどと同じように、テーブルやクエリ結果の値をテキストボックスのデータソースとして指定することができ、レイアウトを自由に設定することができます。
データベースを参照した業務上の帳票をプログラミングの知識がなくても簡単に作ることが可能です。
また、レポートはフォームと同じように「オープン時」などのイベントを持ち、Accessの「マクロ」機能やVBAと組み合わせることで、高度な制御や自動処理も実装することも可能です。
要するに、Accessが標準で用意している「レポート」は、帳票作成機能として大変優秀です。
例えば、VB.netやC#などで業務アプリケーションを開発する場合は、IDE(統合開発環境)はMicrosoftの「Visual Studio」を利用するのが一般的ですが、ひと昔前だとVisual Studioに対応する帳票作成ソフトは、サードパーティ製の有償製品しか存在しておらず、またAccessのレポートのように簡単に扱えるものでもありませんでした。
Access以外のプラットフォームでは、業務帳票の作成は手間が掛かり面倒という認識が一般的であり、Accessのレポートを知っている開発者の場合、Accessと同じように他のプラットフォームでも帳票が作れたら・・・と思ったりもします。
更にAccessのレポートが優秀だと感じるのは、宛名ラベルの印刷時です。
ラベル紙に印刷をする場合、一般的には印刷対象のラベル紙のサイズや列数などに合わせて、出力位置を細かく指定することが必要です。
ミリ単位で正確に出力位置を指定しますが、その指定位置がズレると、ラベル紙から文字がはみ出すことになり、その失敗により大量のラベル紙を無駄にすることもあります。
Accessでは、主要なラベル紙メーカーが販売しているラベル紙のサイズが始めから登録されており、ラベル紙に印刷する場合は、Accessの「宛名ラベルウィザード」にて、ラベル紙のメーカーや製品番号などを選ぶだけで、印字ズレをさせることなく印刷が可能です。
同様の機能は、同じMicrosoft Office製品のWordの差し込み印刷とExcelを使ったやり方もありますが、Access単体でデータベースから印刷データの読み込みや絞り込み、出力項目の指定や出力位置の調整、印刷の実行までを自己完結することができ、圧倒的に便利です。
帳票作成機能はもちろんのこと、特に宛名ラベルの印刷に関しては、機会があれば是非活用してもらいたい機能の一つです。
パススルークエリでRDBMSの操作ができる
Accessでは、「クエリ」と言っても具体的には複数の種類があります。
Accessのメニュー画面に表示される「クエリデザイン」タブを開くと、以下の様に作成可能なクエリの種類が並んでいます。
これらの各クエリの簡単な説明は以下です。
クエリ種類 | 同じ用途のSQL句 | SQLの記述必要有無 | 説明 |
---|---|---|---|
選択クエリ | SELECT | 不要 | レコードを参照します。 |
追加クエリ | INSERT | 不要 | レコードを追加します。 |
更新クエリ | UPDATE | 不要 | レコードを更新します。 |
削除クエリ | DELETE | 不要 | レコードを削除します。 |
テーブル作成クエリ | CREATE TABLE または SELECT INTO |
不要 | 自ファイル又は異なるAccessファイル内にテーブルを作成します。 |
クロス集計クエリ | RDBMSにより異なる | 不要 | クロス集計を作れます。 |
ユニオンクエリ | UNION | 必要 | 異なるテーブルを一つにまとめます。 |
データ定義クエリ | ALTER TABLE | 必要 | 自ファイル内のテーブルの定義を変更します。 |
パススルークエリ | 該当なし | 必要 | RDBMSのサーバー側でSQLなどのアクションを実行できます。 |
RDBに対する操作は本来SQLを記述して行いますが、AccessではSQLを書かなくても必要な処理が実行できるように(一部のクエリはSQLが必要です)、上記の各種クエリを目的に応じて選択して処理内容を設定します。
上記のクエリのなかでも、「パススルークエリ」は特別なクエリです。
パススルークエリ以外のクエリでは、Access内のローカルテーブルや、リンクテーブルで接続した異なるデータベースのテーブルに対して処理を実行します。
パススルークエリは、ODBCで外部のRDBMSに接続し、SQL文などの処理を直接送信することができ、その結果を受け取れます。
パススルークエリを使用したことが無い場合は、上記の説明だけではその特徴や、使用することによるメリットが伝わりにくいかも知れませんが、簡単に特徴やメリットをまとめると以下です。
- 処理が高速:高速なサーバーサイドで処理が実行され、Accessはその結果を受け取るだけ
- 通信速度の影響を受け難い:Accessとサーバー間で1往復の通信しか発生せず無駄な通信を減らせる
- 標準SQLが使用可能:Accessで用意されていないRDBMS側の独自関数などが使用可能
- RDBMSの殆どの操作が可能:テーブル定義の変更やストアドの実行などの特殊な操作も可能(要権限)
当ブログでは、過去にパススルークエリについても色々と記事でまとめているため、興味があれば以下のリンク先もご一読ください。
まず、分かりやすい特徴としては「処理が高速」なところです。
Accessのクエリは、Access独自の関数をクエリ内に組み込んでデータを絞り込んだり、変換したり、集計することができますが、これらはあくまで「Accessのなかでしか動作しない関数」です。
リンクテーブルで接続した異なるRDBMS側のテーブルに対してクエリを実行する場合、このAccess独自の関数をODBC側で上手く変換して標準SQLに置き換えてRDBMSに送信してくれる可能性もありますが、変換できなければその関数を無視して絞り込みを掛けないままRDBMSにデータを要求します。
RDBMSは大量のデータをAccess側に返し、そのデータに対してAccess独自の関数を使って絞り込みなどの処理を行います。
このように、「リンクテーブル」+「クエリ」の場合は無駄なデータ転送を行う可能性が高く、それがDBサーバーの負荷やクライアント端末の負荷、処理速度の遅延を発生させます。
パススルークエリの場合は、接続先RDBMS用の構文のSQLをそのまま送信することができ、その処理結果を返してもらうだけです。
その結果、パススルークエリでは、リンクテーブルとクエリの組み合わせで行っている処理と比べて、大幅な高速化が期待できます。
また、パススルークエリでは、接続先のRDBMSに対して透過的にSQLなどのコマンドを渡すことができるため、SELECT句だけではなく、UPDATE句やINSERT句のSQL文も渡せます。
更に、例えば接続先がSQL Serverであれば、「EXEC」コマンドなども渡せるため、RDBMS側のストアドプロシージャなども実行することが可能です。
また、CREATE TABLEやALTER TEBLEなど、テーブル作成やテーブル定義の変更などのDDL構文も実行させることができます。
当ブログでは、パススルークエリからストアドを実行する際のやり方を記事で紹介しています。
もしご興味があればご一読ください。
Accessのリンクテーブルを使ってOracleやSQL Serverなどの外部データベースと接続し、クエリを使ってデータ抽出などの作業をするケースは多いかと思いますが、もしこれまでパススルークエリを使用したことがなければ、是非挑戦してみください。
後、パススルークエリで不便な点としては、SQLを書いて作る必要があるのと、抽出条件などを動的に設定できない部分です。
例えば、通常の選択クエリなどであれば、抽出条件として、特定のフォームのテキストボックスの値を指定するといった実装も可能ですが、パススルークエリの場合、SQLの構文における「WHERE」句を固定値でしか登録できません。
もしパススルークエリで抽出条件などを動的にして利用したい場合は、Access VBAのDAOを利用し、パススルークエリの実行前に動的にパススルークエリ自体を作り直すといったやり方もあります。
詳しくは以下のリンク先もご参照ください。
最後に
今回の記事では、Microsoft Accessの一般的な特徴を紹介しつつ、あまり注目されていないが、実はすごいと個人的に思っているAccessの機能や使い方を紹介しました。
リンクテーブルで接続した異なるRDBMSのテーブルやローカルテーブルをクエリで自由に結合できる仕組みは凄いことですし、Accessのレポート機能の多機能さや使いやすさは非常に優秀です。
Accessユーザーはあまりこのメリットを意識しないのですが、それを知ったうえで使う方がAccessに対する理解も深まります。
また、Accessを長年利用していても、パススルークエリを使ったことがない人は結構いるので、そういう人には是非パスルークエリを試してもらいたいと思っています。
特にリンクテーブル経由の重いクエリで困っている場合は、パススルークエリに置き換えることで、目から鱗と感じるくらい劇的に処理速度が改善して驚くと思います。
今回の記事ではどなたかの参考になれば幸いです。
今回も長々と読んでいただきましてありがとうございます。
それでは皆さまごきげんよう。