アーカイブ

Accessレポートの背景色がグレーになってしまう

Accessのフォームもそうですが、レポートも背景が指定していない色になることがあります。
新規に作成した画面やレポートならそういう事も少ないと思いますが
古い時代のAccessを大事に使用していてバージョンアップ対応をすると
稀に背景色がグレーになるとかいう事象が発生しています。

その場合は、グレーになっている箇所のプロパティを修正すると解決することが多いです。
例えば、レポートの明細であれば

詳細セクション→プロパティ→代替の背景色の設定「色なし」→他のに変更

Accessでクラスモジュールを使ってみた

クラスモジュールを新規作成

~DCrpStockDao~
Option Compare Database
Option Explicit

Private Const C_MSG_TITLE = "締め処理クラス"
Private m_cutoffDiv As Integer    ' 締日区分
Private m_cutoffDate As Date      ' 締日年月日
Private m_ownerCrpCode As String  ' 荷主コード

Rem ----------------------------------------------------------------------------------
Rem     関数名   : Class_Initialize
Rem     処理内容 : クラスの初期処理
Rem     引  数  : なし
Rem     戻り値  : なし
Rem ----------------------------------------------------------------------------------
Private Sub Class_Initialize()
    m_cutoffDiv = 0
    m_ownerCrpCode = ""
End Sub

Rem ----------------------------------------------------------------------------------
Rem     関数名   : Class_Terminate
Rem     処理内容 : クラスの初期処理
Rem     引  数  : なし
Rem     戻り値  : なし
Rem ----------------------------------------------------------------------------------
Private Sub Class_Terminate()

End Sub

'***************************
' 締日区分をセット
'***************************
Public Property Let setCutoffDiv(ByVal value As Integer)
    m_cutoffDiv = value
End Property

'***************************
' 締日年月日をセット
'***************************
Public Property Let setCutoffDate(ByVal value As Date)
    m_cutoffDate = value
End Property

'***************************
' 荷主コードをセット
'***************************
Public Property Let setOwnerCrpCode(ByVal value As String)
    m_ownerCrpCode = value
End Property

Rem ----------------------------------------------------------------------------------
Rem     関数名   : goShime
Rem     処理内容 : 締め実行処理
Rem     引  数  : なし
Rem     戻り値  : true(正常)/false(異常)
Rem ----------------------------------------------------------------------------------
Public Function goShime() As Boolean
Dim objCmd As New ADODB.command
Dim objRsCrp As New ADODB.Recordset
Dim objRs As New ADODB.Recordset
Dim objRsDtl As New ADODB.Recordset
Dim strSql As String
Dim baseID As Long
Dim crpId As Long

On Error GoTo EXCEPTION

~省略~

Exit Function
EXCEPTION:
    MsgBox "エラーが発生しました。エラー内容:" & ERR.Description & Chr$(10), vbCritical, "締め実行処理 1/6 (メイン)"
End Function

各画面からクラスモジュールを呼び出す

    '*** データベースを開く
    gobjCon.ConnectionString = conConnectStr
    gobjCon.Open

    '*** トランザクション開始
    gobjCon.BeginTrans

    '*** クラス定義
    Set crpStockDao = New DCrpStockDao
    ' 締年月日
    crpStockDao.setCutoffDate = CDate(Me.txt締年月日.value)
    ' 締日区分
    crpStockDao.setCutoffDiv = Nz(Me.cbo締日区分.value)
    ' 荷主コード
    crpStockDao.setOwnerCrpCode = Nz(Me.txt荷主コード.value)

    '=================
    ' MAIN処理
    '=================
    ' (1)締め処理実行
    If crpStockDao.goShime() = False Then
        GoTo Error_Rollback
    End If

    ' (2)

    ' (3)


    '*** コミット
    gobjCon.CommitTrans

    '*** 後処理
    gobjCon.Close: Set gobjCon = Nothing

    ' マウスを元に戻す
    Application.Echo True
    DoCmd.Hourglass False

    '=================
    ' 終了メッセージ
    '=================
    MsgBox "締め処理が正常に終了しました。", vbInformation + vbOKOnly, C_MSG_TITLE

Exit Sub
Error:
    MsgBox "エラーが発生しました。エラー内容:" & ERR.Description & Chr$(10), vbCritical, C_MSG_TITLE
    
Error_Rollback:
On Error Resume Next
    ' ロールバック
    gobjCon.RollbackTrans
    ' 後処理
    gobjCon.Close: Set gobjCon = Nothing
    ' マウスを元に戻す
    Application.Echo True
    DoCmd.Hourglass False
End Sub

クラスモジュールは、在庫データ更新とか重要な処理をクラスにまとめておき(javaでいうところのDAOみたいな)
各々画面からCALLするという形を取りました。
クラス定義をnewでsetしてクラスで使う変数をsetしてからメインメソッドをCALLするような作りにしました。
メリットは在庫データ更新はここに集約したので、メンテナンスしやすいという点でしょうか。
標準モジュールでも良いような気もしますが、今回はちょっと使ってみたくてクラスモジュールを使ってみました。

Accessモジュールで定義した関数をクエリで使用

Accessモジュールで定義した関数をクエリで使用(呼び出す)方法を紹介します。
クエリのSQLの中で少し複雑なことをしたいと思った時に
IF文だとなかなか難しい編集もあります。
そんな時に、Accessモジュールで関数を作成しておいてそれをSQLで使えるのです。
結構便利ですが滅多に使わないし、使わないで済むならそれで良いとも思います。
レポート出力の場合は、取得結果をそのまま使いたい事のほうが多いのでその時に使いました。

モジュール

Rem ----------------------------------------------------------------------------------
Rem     関数名   : getSecNumeric
Rem     処理内容 : Q_レポート明細UNIONで使用しています。
Rem                寸法文字列を数値に変換し抽出しソート指定が可能にします。
Rem     引  数  : source_str、no(何番目の寸法か指定 1~4)
Rem     戻り値  : 抜き取った数値
Rem ----------------------------------------------------------------------------------
Public Function getSecNumeric(source_str As String, no As Integer) As Double
Dim index As Integer
Dim leng As Integer
Dim pos As Integer
Dim suuchi As Variant
Dim retNum As Double

    retNum = 999999
    suuchi = ""
    index = 1
    leng = Len(source_str)
    
    ' 9999x9999x9999x9999
    For pos = 1 To leng
        If index = no Then
            If Mid(source_str, pos, 1) >= 0 And Mid(source_str, pos, 1) <= 9 Then
                suuchi = suuchi & Mid(source_str, pos, 1)
            ElseIf Mid(source_str, pos, 1) = "." Then
                suuchi = suuchi & Mid(source_str, pos, 1)
            ElseIf Mid(source_str, pos, 1) = "x" Then
                index = index + 1
            End If
        Else
            If Mid(source_str, pos, 1) = "x" Then
                index = index + 1
            End If
        End If
    Next
    If IsNumeric(suuchi) Then
        retNum = CDbl(suuchi)
    End If
    getSecNumeric = retNum
End Function

クエリでの使用例

select
  1 as mode
  , base.crp_base_id
  , base.from_date
  , m_item.item_spec1
  , m_item.item_spec2
  , m_item.item_spec3
  , m_item.item_spec4
  , m_item.item_spec
  , getSecNumeric(m_item.item_spec, 1)  AS item_spec_num1
  , getSecNumeric(m_item.item_spec, 2)  AS item_spec_num2
  , getSecNumeric(m_item.item_spec, 3)  AS item_spec_num3
  , getSecNumeric(m_item.item_spec, 4)  AS item_spec_num4
from