本ページでは、SQL ServerとMSDEをまとめて「SQL Server」と呼んでいます。MSDEはSQL Serverのサブセット版なので、ライセンスや管理ツールの有無、パフォーマンスなどを除き、機能的な差違はほとんどありません。MSDEをお使いの方は適宜読み替えてください。
本番サーバから開発用テストサーバへデータベースの丸ごとコピー、またはその逆を行いたいことがよくあります。
バックエンドデータベースがMDBファイルの場合は、MDBファイルを単純にコピーすれば良いだけだったので楽でしたが、Accessプロジェクトの場合は、どうすればよいでしょうか。
一時的にSQLサーバを停止させてもよいというのであれば、データベースファイルを丸ごとコピーしてしまう手があります。
sp_detach_db 'データベース名' go
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 を実行する必要がありますが)。意外と簡単なものですね。