ODBC Directとパススルークエリを使う


2006.2 ACCESS 2000 SP-3 + PostgreSQL 8.0.6

実行されるSQL文の制御が難しいリンクテーブルではなく、自分が書いたSQL文がPostgreSQLでそのまま実行される「ODBC Direct」と「パススルークエリ」を使ってアプリケーションを作ることを考えます。

前準備

  1. サンプルMDBとサンプルテーブル定義SQLをダウンロードします。
  2. PgAdminVなどを用いて、PostgreSQLデータベースにテスト用データベース(test2)をUNICODEで作成します。
  3. PgAdminVなどを用いて、サンプルテーブル定義SQL(tabledef.sql)を実行し、テーブルとサンプルデータを作成します。
  4. 「ODBCデータソースアドミニストレータ」でテスト用データベース接続用のシステムDSN(test2)を作成します。
  5. ACCESSからODBCドライバを経由してどのようなデータが流れているかを見るためにODBCドライバの一般ログ出力をONにします。
  6. サンプルMDB(UpdateSample.mdb)を開き、Alt+F11などでVisaul Basic Editorを開いて、ModSystemモジュール先頭のODBC接続文字列を上記手順で作成したDSN名やユーザーID、パスワードに置き換えます。
  7. フォームの"F_売上"を開き、売上伝票を入力してみます。
    日付を入力し、得意先を選択し、明細部の商品情報を適当に入力して、保存ボタンを押します。

 

アプリケーション構成

サーバー側テーブル構成

CREATE TABLE t_m商品(
商品cd text PRIMARY KEY,
商品名 text NOT NULL,
売単価 decimal(19,4) NOT NULL DEFAULT 0);

CREATE TABLE t_m得意先(
得意先cd text PRIMARY KEY,
得意先名 text NOT NULL);

CREATE TABLE t_売上(
売上no serial PRIMARY KEY,
日付 date NOT NULL,
得意先cd text NOT NULL,
入力日時 timestamp(0) NOT NULL DEFAULT LOCALTIMESTAMP(0));

CREATE TABLE t_売上明細(
売上no integer DEFAULT 0 REFERENCES t_売上 (売上no) ON DELETE CASCADE ON UPDATE CASCADE,
売上明細no smallint DEFAULT 0,
商品cd text NOT NULL REFERENCES t_m商品,
数量 integer NOT NULL DEFAULT 0,
売単価 decimal(19,4) NOT NULL DEFAULT 0,
PRIMARY KEY (売上no,売上明細no));

ローカルMDB(UpdateSample.mdb)側テーブル構成

サーバー側のt_売上およびt_売上明細と同じ構造のテーブルをローカルMDB側に持ち、入力フォームはこのローカルテーブルに連結しています。

入力フォーム(F_売上)の連結先はローカルテーブルを使うクエリであり、コンボボックスのデータソースもパススルークエリなので、フォームの作りとしてはPostgreSQLを利用せずACCESSだけで作る場合と変わりません。

心臓部は、F_売上フォームモジュールのDenpyoSave()とDenpyoCall()で、ODBC Directを使いローカルテーブルのデータをサーバーへ保存する処理と、サーバーからローカルテーブルにデータを取り出す処理を行っています。サンプルではODBC Directで保存・読み出しを行っていますが、リンクテーブルを利用した追加クエリとしても問題ありません。

 

以下、気が向いたときに製作


TOPに戻る MS ACCESSからPostgreSQLへ移行するに戻る