愚者の経験

「また今度」はほとんどこない

カテゴリーアーカイブ: ADP

Office2013評価版とかいろいろ試す

「OfficeProfessionalPlus2013」を試してみました。
ファイル名は「OfficeProfessionalPlus_x86_ja-jp.img」です。

ADODB.Recordsetの不具合が直っていました!!個人的にかなりうれしいです。
Previewではフォームの「Recordset」プロパティにSetしてもデータが正しく
表示されてなかったのですが、上のOfficeでは正しく表示できているようです。
また、編集等もできたように思います。

これでストアドプロシージャで取得したデータを編集する方法が絶たれずに
済みました。

Access Proect(*.adp)でローカル一時テーブルを使う

またまたadpネタです。
adpでは「ローカルテーブルを持つことができない
という大きなハンデを抱えています。利用できるテーブルはすべてSQL Serverに作成
する必要があり、作業用のテーブルが必要な場合はSQL Serverの一時テーブル
(先頭に「#」を使ってCreate Table する構文)で作成できますが、これはセッション単位で
破棄してしまいます。

例えば以下のように

CREATE PROCEDURE [dbo].[sp_test] 
AS
BEGIN
	create table #temptbl (col1 INT PRIMARY KEY)
	
	select *
	from #temptbl
END

というストアドを作成してフォームのレコードソースに「sp_test」としたとしても、
データを入力することはできません。「tempdbのオブジェクトが」みたいなエラーが出ます。

ではユーザー(プログラム)別にテーブルを持つことは出来ないのかというと
VBAを使って可能です。

標準モジュールに以下のように記述します。

Option Compare Database
Option Explicit

Private cn As ADODB.Connection

Public Sub test()
    If (cn Is Nothing) Then
        Set cn = CurrentProject.AccessConnection        
        cn.Execute "CREATE TABLE #temptbl (col1 INT PRIMARY KEY)"
    End If
End Sub

フォームのストアドも修正します。CREATE TABLEを取るだけです。

ALTER PROCEDURE [dbo].[sp_test] 
AS
BEGIN
	select *
	from #temptbl
END

これでアプリケーションの開始時にtestプロシージャをコールしておけば
フォーム上で入力出来るローカルテーブルの出来上がりです。

testプロシージャではadpのコネクションを取得し、そのコネクション上でExecuteして
一時テーブルを作成します。この操作でAccessが持つセッションに
従属する(?)ローカル一時テーブルとなりフォームにバインド出来るようになります。

後はストアドで一時テーブルをselectしておけば編集可能になります。
起動と同時に作成し、アプリケーションの終了と同時に破棄されますので便利です。

create table ですがCurrentProject.AccessConnection.Execute ~~~
みたいに一行で実行してもいいです。

CREATE TABLEの文字列をスカラー関数にしてSQL Serverに
登録しておくことで一元管理もできそうです。

CREATE FUNCTION sf_test 
()
RETURNS nvarchar(max)
AS
BEGIN
	RETURN 'create table #temptbl (col1 INT PRIMARY KEY)'
END
GO
Option Compare Database
Option Explicit

Public Sub test1()
    Dim tblstr As String
    
    With CurrentProject.AccessConnection
        tblstr = .Execute("select dbo.sf_test()").Fields(0).Value
        
        .Execute tblstr
    End With
        
End Sub

ローカルテーブルが欲しい場合はおすすめ?です。
ところでAccess 2013 RTMになってADODB.Recordsetをフォームに
Set出来るようになったんでしょうか?実に気になります。