いまレガシー中のレガシーのAccess2000のシステムメンテやらされてて、Accessとかもう10年以上さわってなくて、しかもDBがSQLServer2008R2?とかいうこれまたSQLServerとかもう8年位さわってなくて、adp?とかいうDBはSQLServerだけど画面はAccessとかいう謎い構成になってて、東京の開発環境ってすごいなって思いましたんで…
で、なるべくVBAさわりたくないのでストアドでどうにかしようとガリガリ書いてるんだけど、バッドノウハウっぽいのにぶちあたってるのかSQLServerよく知らないからなのかわからないけど、はまったところが多々あったので何点かメモっていきたい。
ストアドで一時ファイルを使用する動的SQLを作ってexecぶちかましたとき、execが2発以上に分かれてると2回めのexecでその一時ファイルがみれない
例えばこういうの。
declare @sql varchar(max) set @sql = 'select * into #temp1 from mytable' exec(@sql) set @sql = 'select * from #temp1' exec(@sql)
これだと2回めのexecでは#temp1がみえないというか、セッション?をまたぐと消えるのかわからないけどとにかくなくなってる。
仕方ないのでこうするとできる。
declare @sql varchar(max) set @sql = 'select * into #temp1 from mytable;' set @sql += 'select * from #temp1' exec(@sql)
一時ファイルをフォームに連結して、フォームからフィールドに値を入れようとしても入れられない
一時ファイルの仕様がよくわかってないからなんだろうけど、ストアドでは普通にCRUDできるのに連結すると更新とかまったくできず、まるで編集ロックがかかったようになる。
ぐぐってくと、主キーを設定しないと編集できないらしい。
適当に一時テーブルにIDとかのIDENTITY列作ってプライマリキーを設定したらできた。
create table #temp2( ID int IDENTITY(1,1) NOT NULL, mydate datetime ) ALTER TABLE #temp2 ADD CONSTRAINT PK_idid PRIMARY KEY (ID)
テーブル値関数便利
文字通りテーブルを返す関数。
条件縛ったテーブルとか返せて、テーブルと同じようにJOINとかで使える。
フォームとかレポートのレコードソースにストアドを指定したとき、引数をどこに設定したらいいかわからなくて混乱した
普通に入力パラメータってプロパティがあったので、そこに入れればよかった。
@year=2013, @month=12
リストボックスとかコンボボックスを一気に空にしたいと思ったら、Clearみたいなメソッドがなくて混乱した
一個ずつ消せということらしいです。
For i = lst.ListCount - 1 To 0 Step -1 lst.RemoveItem (i) Next
21世紀にもなっていまだにVB5とかAccess2000のシステムが普通に公的機関とかでXPで動いてたりするので、東京っておっかないなって思いましたんで…
というか、7のXPモードでVBのシステム動かして使ってるとことかあって、XP動かなくなるからマシンとOSリプレイスしましょうって案件が出ても、XPモードがあるかぎりレガシーシステムはこの先も永遠に生き残るのでは…