愚者の経験

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

月別アーカイブ: 4月 2013

バックエンドにSQL Serverばかり使ってると…

ここ2,3年くらいほとんどAccess+SQL Serverで開発していたので
Accessのクエリが書けません。

特にJOIN句!どうなってんの!全然わからない!(笑)
いや、なんとなくは分かるんだけど…

集計値でマスタに更新しようとしたりしたらもう大変です。

普通にSQL書こっかーでもJOIN句がちょっと…GUIでしよう

あ、集計値は別クエリにして保存しないといけないんだっけ?

集計の選択クエリを作っていざ実行!

「更新可能なクエリであることが必要です。」(´・ω・`)

なん…だと!
って感じで全然捗りません。別に更新される側を集計してる訳じゃないんだし…

いずれにせよかなりハマってしまいました。
一時テーブルに吐き出すしか対応方法ないんですかね。

[Access][VBA]OpenArgsなどに複数の値を渡すとき

「Docmd.OpenForm」と「Docmd.OpenReport」の第6引数である「OpenArgs」ですが
複数の値を入れたいという要望はとてもよくわかります。
そこで苦肉の策で「区切り文字」を決めて値を連結して後からSplitをかけるのが
一般的(?)なんですが気になるのがその「区切り文字」です。

わかりやすいのは「,(コンマ)」や「/(スラッシュ)」です。
渡す値が数値しかないのであれば、いいと思いますが文字列も渡す場合
文字列中に区切り文字がないことを祈りながら使うことになります。

これは精神衛生上よろしくないので、なんとかしたいと思いますよね?
そこで「入力されることのない文字」を探すことになるわけですが

私は「Chr(1-9)」をおすすめします。これらは制御文字で入力は基本的に出来ないからです。
「Chr(0)」の方が良さげなんですがこの文字は変数上文字列連結出来てもOpenArgsに渡すと
「Null」になってしまって使えません。

[Access][VBA]CurrentDbについて

大体のプロパティで返されるオブジェクトは永続化されていて
メソッドで返される場合はその時限りだと思っていいと思います。

Public Sub Test()
    Const UpdateSQL As String = "update 担当者 set ナンバー=担当者ID"
    DBEngine.Workspaces(0).Databases(0).Execute UpdateSQL
    Debug.Print DBEngine.Workspaces(0).Databases(0).RecordsAffected
    
    CurrentDb.Execute UpdateSQL
    Debug.Print CurrentDb.RecordsAffected
    
    With CurrentDb
        .Execute UpdateSQL
        Debug.Print .RecordsAffected
    End With
End Sub

2番目の「CurrentDb.RecordsAffected」は「0」になります。
直前のExecuteした「CurrentDb」とRecordsAffectedプロパティを参照している「CurrentDb」は
全くの別のオブジェクト(インスタンス)です。

[Access]レポートで行数を固定する方法

結構需要が高い案件ですね。
しかし大概の場合は解決法として
Me.NextRecord = False
を使っています。
次の行へ進まずに留めておき、規定の回数詳細セクションを
フォーマットした後、Trueに戻して終了するというオーソドックスな
やり方です。

しかしここはあえてもう一つ紹介します。
Me.MoveRayout = False
です。自分はもっと参考にされるべきだと思っています。
これはセクションの「フォーマット時」に設定でき、
Falseにすると描画の開始位置を移動させないというものです。

わかりにくいのでもう少し説明します。
ヘッダーセクションと詳細セクションがあったとして
そのまま印刷すると当然
ヘッダーセクションの下に詳細セクションを印刷します。
ここでヘッダーセクションの「フォーマット時」に「Me.MoveRayout = False」を
指定すると、なんと
ヘッダーセクションと同じ場所から詳細セクションを印刷します。
印刷開始場所が下にずれない指定となります。
これを利用して適切なページヘッダー等に罫線などのレイアウトを書き
適当なグループヘッダーで「本来のヘッダーの高さ」に設定し
印刷するだけで、行の固定が出来上がります。
※途中で改ページする場合は当然カウントして改ページコントロールを
制御する必要があります。

レポートをデザインで見た場合、後者の方法は見づらくなるのですが
コードはいずれかのヘッダーセクションの「フォーマット時」に「Me.MoveRayout = False」
があるだけのシンプルなレポートになります。

一度お試しを。