アップサイジング Having と Where

| コメント(0)
SQL Server 2005 Express Edition に Access 2007 からアップサイジングしました。当然、いくつかアップサイジングできない部分が生じます。クエリの Where 式が失敗すると Web 上にたくさん出ていますし、イベント・プロシージャーを書くとき DAO もダメで ADO にしなさいなどとあります。

と、いうことで Access 2007 の内から ADO に切り替えて作成しました。完璧と思えるほどに作りこんでアップサイジングしましたが、いくつもバグが見つかり苦労しました。年金組は高いマニュアルの購入はできませんのでインターネット情報のみが頼りです。何も分からないときにインターネット検索をしてもなかなか該当が見つからないものです。わかってから検索すると一発でヒットします。(笑)

イベント・プロシージャーの部分はデータベースの或る月分のデータを集計し、エクセルの表に差し込む作業です。

トラブルが発生した時の原因を列挙しておきます。
  1. フォーム内に埋め込んだマクロは外出しにしてマクロを保存しました。Where 式の部分を Stored Procedure で作成する件は無くなりました。一部どうしてもストアドプロシージャーで書かないとうまくいかないものがあります。同じような設計にもかかわらず、原因究明できていません(as of  2009/9/1)
  2. ADP の VBA 画面で、<ツール>-<参照設定>項目に Microsoft ActiveX Data Objects 2.8 Library の設定を追加しますが、Microsoft Excel  12.0 Object Library も必要でした。参照 #1
  3. コーディングの途中に DAO の Currentdb.name を使った Excel File の Path を見つける仕組みが残っていました。現在は CurrentProject.Path を使用しています。ついでにコード行が大幅に削減される効果もあり。参照 #2
  4. SQL文の作成は、Access 2007 のクエリで集計用から作成すると便利です。それをデザインモードで開いたのち、コピーします。集計用クエリを SQL 文表示にすると where 式の部分が Having となります。当初、機能的には違いがないと勝手に判断し SQL文で Where と書き換えていましたが、どうしてもバグがとれません。初心に帰ってコピーして貼り付けたら一発でOKとなってびっくり。調べたら集計のときはHaving になるようですね。20年前の知識でやってはいけません、最新の情報に更新してから進めるべきでしたね。参照 #3
  5. 同SQL文で、日付で絞り込むには Access 2007 の DB と SQL サーバーでの書き方が異なります。日付の囲む文字が Access 2007 では # でしたが、' (アポストロフィ)です。 参照#3

参照 #1
Dim cn  As ADODB.Connection
Dim rs   As ADODB.Recordset
Dim objEXCEL   As Object

Set cn = CurrentProject.Connection
Set rs = New ADODB.Recordset
Set objEXCEL = Excel.Application
参照 #2
strXLSFILE = CurrentProject.Path & "\" & strBOOK
参照 #3
" GROUP BY T00センター受付簿テーブル.受付日, T00センター受付簿テーブル.分類コード, T10分類マスター.分類 " _
" HAVING T00センター受付簿テーブル.受付日 Between " & "'" & Format(月初日, "yyyy/mm/dd") & "' And '" & Format(月末日, "yyyy/mm/dd") & "' " _
参照 エクセルに書き出し部分
With objEXCEL
        .Visible = True
        .UserControl = True
       
        .Workbooks.Open (strXLSFILE)
        .Worksheets("原紙").Copy Before:=Worksheets("ReadMe")
        .ActiveSheet.Name = strYYYYMM
        .Cells(1, 14).Value = Val(Mid(strYYYYMM, 5)) & "月"
        .Cells(3, 4).Value = Format$(基準日, "gggee年mm月dd日") & " ~ " & Format$(年度末, "gggee年mm月dd日")
       
       
        '書き出しループ処理
        Do Until rs.EOF

            ' 日にちのみ取り出し
            nYLINE = Day(Format(rs.Fields("受付日").Value, "yyyy/mm/dd")) * 2
       
            ' 月の後半は次ページにする
            If nYLINE > 30 Then nYLINE = nYLINE + 4

            ' 分類コードで列を指定
            cCODE = rs.Fields("分類コード").Value

            Select Case cCODE
                Case Is > 900: nXLINE = 11
                Case Is > 600: nXLINE = 10
                Case Is > 500: nXLINE = 9
                Case Is > 400: nXLINE = 8
                Case Is > 300: nXLINE = 7
                Case Is >= 280: nXLINE = 6
                Case Is > 200: nXLINE = 5
                Case Is >= 140: nXLINE = 4
                Case Is >= 130: nXLINE = 3
                Case Is >= 120: nXLINE = 2
                Case Is >= 110: nXLINE = 1
                'ESLE:                         nXLINE = 0
            End Select

            If nXLINE <> 5 Then
                .Cells(nYLINE + 7, 2).Value = rs.Fields("曜日")
                .Cells(nYLINE + 7, 3 + nXLINE).Value = rs.Fields("件数")
                .Cells(nYLINE + 8, 3 + nXLINE).Value = rs.Fields("来場者数の合計")
               
                以下省略

            End If
           
            rs.MoveNext
           
       Loop
                  
End With



コメントする

最近のブログ記事

Windows XPのOutlook Express 6.0 のスペルチェック
近所の会社の社長さんは Windows …
白菜の花
畑は春の陽気ですね。2/23以降朝の冷え…
css - リストの黒丸や四角の黒などが表示できない
比較的簡単なページを作成しています。リス…

おすすめ