none
VB 2005 Express 要如何帶入Access的報表? RRS feed

  • 問題

  • 大家好,
     
    我的開發環境是:VB 2005 Express + MS Access 2000
     
    我的Access裡有4個報表,現在,要將Access裡的4個報表帶入到VB 2005 Express裡…

    我的設想是,在主要的Windows Form裡放一個ComboBox,與二個Button。
    ComboBox裡的清單就是放那4個Access做的報表名稱,當使用者選擇了他所要查詢的報表後,再按button1,VB並會將其Access的報表show出來。
    button2是取消的功能。

    因為我所找到的資料(無論是書或是網路),都說VB 2005 Express沒有產生報表的功能,只有VB Studio 2005有提供「用戶端報表定義檔案(.rdlc)」,類似VB6.0時代的Crystal Report工具。

    但我研究了一下,.rdlc的功用是要讓設計師能在VB 2005裡自行產生(編輯)報表。
    但像我已經在Access裡產生好報表了,只是要將它帶入VB中show出來,要如何做呢?
    謝謝!
     
    補充:我的程式碼如下:
     
    Public Class Report
     
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

            Select Case ComboBox1.SelectedItem
                Case "每日商品兌換報表"
                   Process.Start("E:\VB2005程式設計\Winner\winner.mdb")
                Case "每月商品兌換報表"
                   Process.Start("E:\VB2005程式設計\Winner\winner.mdb")
                Case "每週商品兌換報表"
                   Process.Start("E:\VB2005程式設計\Winner\winner.mdb")
                Case "庫存報表"
                  Process.Start("E:\VB2005程式設計\Winner\winner.mdb")
            End Select
        End Sub
     
        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            Me.Close()
        End Sub

    End Class
     
    但我這樣子寫,只能開啟該mdb檔,卻無法將mdb裡頭的報表也打開來,請問我該怎麼寫呢?
    2007年6月4日 上午 11:10

解答

所有回覆

  • 您好:
    請參考:http://www.vb-tips.com/default.aspx?ID=286a939f-ef95-4fc8-a06f-c0b2733a8f2e
    重點在於 Private Function OLEShowReport 這邊
    2007年6月4日 下午 04:38
  • Alex您好,

     

    我剛剛研究了一下那網頁裡的程式,大致上明白它的邏輯與OLEShowReport Funtion的寫法。

    不過我嘗試修改我的VB 2550 Express裡的程式,發現有幾點疑問…

    1、那網頁程式的最上方宣告的命名空間:Imports Access = Microsoft.Office.Interop.Access ,VB 2005並沒有這個命名空間耶!

    2、在Private Function OLEShowReport裡,Access.AcView 與 Access.Application 它都說型別未被定義,是否與第一點有關呢?

    請問這要如何解決呢?

    謝謝您!

    2007年6月5日 上午 03:51
    1. 一般來說,這個命名空間不是一定要使用到的,因此如果預設就包進來,自然不是好的作法,至於如何加入請參考:Office 主要 Interop 組件
    2. 是的
    2007年6月5日 上午 04:24
  • Alex您好,

     

    謝謝您的協助,目前我已順利將程式修改為如下。

    我在偵錯的狀態下去測試,不管我選擇了任何一個combobox裡的報表之按下button1,

    並沒有任何的Access的report被show出來,但是可以從「工作管理員」裡的「處理程序」看見MSACCESS.EXE被打開。

    另外,出現一項警告:

    無法將 ADO 參考版本 2.1 重新對應至版本 2.7 - "程式庫未登錄。 (發生例外狀況於 HRESULT: 0x8002801D (TYPE_E_LIBNOTREGISTERED))"

     

    不曉得這是怎麼一回事呢?

     

    Imports System.Reflection

     

    Public Class Report1

     

        Inherits System.Windows.Forms.Form

     

        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim strDB As String = String.Format("E:\VB2005程式設計\Winner\winner.mdb", GetMyPath)
            Select Case ComboBox1.SelectedItem
                Case "每日商品兌換報表"
                    OLEShowReport(strDB, "每日商品兌換報表", 2)
                Case "每月商品兌換報表"
                    OLEShowReport(strDB, "每月商品兌換報表", 2)
                Case "每週商品兌換報表"
                    OLEShowReport(strDB, "每週商品兌換報表", 2)
                Case "庫存報表"
                    OLEShowReport(strDB, "庫存報表", 2)
            End Select

        End Sub

     

        Private Function OLEShowReport(ByVal strDBName As String, _
                           ByVal strRptName As String, _
                           Optional ByVal intDisplay As Access.AcView = Access.AcView.acViewPreview, _
                           Optional ByVal strFilter As String = "", _
                           Optional ByVal strWhere As String = "") As Boolean

     

            Dim bReturn As Boolean = True
            Try


                ' Create Automation object.
                Dim objAccess As New Access.Application

                ' Open the supplied database.
                ' Optional parameter at the end of statement
                ' indicates exclusive mode if set to True...
                objAccess.OpenCurrentDatabase("E:\VB2005程式設計\Winner\winner.mdb", False)

     

                ' The OpenReport method uses the following arguments...
                ' Report Name - Name of the report object.
                ' View - Display in Print Preview or send to printer.
                '        acNormal - Print report
                '        acDesign - open report in design (n/a in runtime)
                '        acPreview - open in preview window
                ' Filter Name - Name of a saved filter query.
                ' Where Condition = valid SQL where condition.

               objAccess.DoCmd.OpenReport(strRptName, intDisplay, strFilter, _
                 strWhere)

     

                ' Close Microsoft Access session instance...
                'objAccess.Quit(Access.AcQuitOption.acQuitSaveNone)

                objAccess = Nothing

     

            Catch ex As Exception
                bReturn = False
                MessageBox.Show(ex.ToString, "Automation", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try

            Return bReturn
        End Function


        Private Function GetMyPath() As String
            Dim fi As New System.IO.FileInfo(Reflection.Assembly.GetExecutingAssembly.Location)
            Return fi.Directory.ToString
        End Function

    End Class

    2007年6月5日 上午 04:50
  • 請問樓主,最後製作,成功了嗎?
    2009年12月4日 下午 02:23