Accessプロジェクトの技


 本ページでは、SQL ServerとMSDEをまとめて「SQL Server」と呼んでいます。MSDEはSQL Serverのサブセット版なので、ライセンスや管理ツールの有無、パフォーマンスなどを除き、機能的な差違はほとんどありません。MSDEをお使いの方は適宜読み替えてください。

データベースのお持ち帰り

 本番サーバから開発用テストサーバへデータベースの丸ごとコピー、またはその逆を行いたいことがよくあります。

 バックエンドデータベースがMDBファイルの場合は、MDBファイルを単純にコピーすれば良いだけだったので楽でしたが、Accessプロジェクトの場合は、どうすればよいでしょうか。

 一時的にSQLサーバを停止させてもよいというのであれば、データベースファイルを丸ごとコピーしてしまう手があります。

  1. まず、誰もSQLサーバにアクセスしていないことを確認します。
  2. もしコピー先のSQLサーバに同名のデータベースが既に存在し、そこに上書きする場合は、あらかじめデータベースを切り離しておきます。次のSQLコマンドを、osql.exeを使用するか、他のデータベースに仮のストアドプロシージャを作って実行します。
    sp_detach_db 'データベース名'
    go
    
  3. コピー元・コピー先のSQLサーバを停止させます。
  4. コピー元のコンピュータのC:\MSSQL7\Data\フォルダにある、該当する*.mdf, *.ldfファイルを、コピー先のコンピュータの同じフォルダにコピーします。なお、SQL Serverのインストール先フォルダを変更している場合は、その変更したフォルダに読み替えてください。
  5. コピー先のSQLサーバを起動し、次のSQLコマンドを実行してデータベースをSQLサーバにアタッチします。
    sp_attach_db 'データベース名', @filename1 = 'MDFファイル名', @filename2 = 'LDFファイル名'
    go
    

 なお、Access2000のメニューバーに[ツール]-[データベース ユーティリティ]に「バックアップ」と「元に戻す」がありますが、この機能にはどうやらバグがあるらしく、一部のデータが欠けてしまうことがあるようです。Access2002や2003で直っているかどうかは不明です。

コンボボックスの抽出条件

 フォームのコンボボックスのリストを、他のコントロールに入力された値を使って絞り込みしたいことがあります。

 MDBファイルでは、パラメータクエリで簡単に実現できました。ADPファイルでは無理かというと、実はSQL文を書けるなら(Accessプロジェクトに手を出すなら必須知識ですが)涙が出るほど簡単にできます。

 結論から先に言うと、引数付きのストアドプロシージャを作成し、その引数名と、条件値を指定するコントロールの名前を同じものにすれば良いのです。例えば、「産地コード」という名前のコントロールに入力された値で、「商品コード」コンボボックスのリストの値を絞り込みたい場合、こういうストアドプロシージャになります。

Create Procedure S_商品コード
(
 @産地コード int
)
As
 SELECT 商品コード, 商品名 FROM T_商品
 WHERE (産地コード = @産地コード)
 ORDER BY 商品コード
 return 

 ここで引数名を「@産地コード」にするのがポイントです。そうすると、フォームの「産地コード」コントロールの値が自動的にこの引数に入力されます。

 あとは、コンボボックスの値集合ソースを「S_商品コード」にすればいいだけの話です(あと、「産地コード」コントロールの「更新後処理」イベントプロシージャで、Me!商品コード.Requery を実行する必要がありますが)。意外と簡単なものですね。


戻る