簡體   English   中英

當數據在SQL Server中時,如何通過ADO在Access中創建報表?

[英]How to create reports in Access via ADO When data is in SQL Server?

我有一個Access 2003項目,其中所有數據都存儲在SQL Server 2008中。我正在使用ADO通過完全未綁定的表單查看/更新數據。 例如,一個窗體上有幾個文本框和組合框。 加載表單后,我使用ADO調用SQL SQL上的存儲過程,它返回一個記錄集,然后我通過VBA使用記錄集中的數據填充控件。 我喜歡這種方法,因為Access中只存儲了VBA。 沒有數據(實際上連接字符串存儲在Access中,僅此而已!)。

我的問題是報告時該怎么辦。 我想創建基於SQL Server中創建的視圖的報表,但是,如果可能的話,我想避免直接從Access內部靜態鏈接到視圖。 是否可以在運行時將報表的記錄源動態設置為SQL Server視圖的結果? 如果是這樣,如何設計報告ID Access不包含任何數據?

更多信息...我要避免鏈接到Access中的視圖的原因是可以在其中運行Access應用程序的環境發生更改(生產,開發,測試)。 當前,每當我對數據庫存儲過程進行任何調用時,我都會在Access中存儲的唯一表中查找連接字符串(基於Active Directory,因此不存儲密碼)。

謝謝你的幫助。

首先,我們要弄清楚:您沒有Access 2003“項目”。 您有一個Access 2003數據庫。

實際的Access Data Project不能具有本地表,並且使用SQL Server作為后端。 當您查看表時,您會看到服務器上存在的表,而在“查詢”下,您會看到服務器上存在的視圖,函數和存儲過程。 您可以使用“升級向導”將Access數據庫轉換為Access數據項目(或者可能更好,只需創建一個新的ADP(Access數據項目)並導入所有表單,報表,宏和模塊。

以下是我的想法:

  1. 將數據庫轉換為實際的Access Data Project,然后僅使用常規的舊查詢,就像它們已尋址到本地數據庫一樣。 您甚至可以將表單綁定到存儲過程,並且它們可以是可更新的。 要處理生產,開發和測試,只需在GUI中更改連接字符串,或通過如下代碼更改它:

     Application.CurrentProject.CloseConnection Application.CurrentProject.OpenConnection NewConnString 

    如果要從集中式數據庫,共享文件或公共表中的文本文件中讀取連接字符串,請在每個環境中加載(具有每個其他環境的連接信息)。 我有一個Access Data Project,該項目的工具欄帶有“環境”下拉列表。 切換環境后,隨后將填充子數據庫下拉列表,並最終通過事件通知所有打開的表單(盡管綁定表單在發生這種情況時會關閉)。

  2. 使用鏈接表沒有錯。 只需編寫一個過程即可遍歷所有表,並在您要更改環境時更新它們以指向正確的服務器。 “靜態”鏈接和“動態”鏈接之間的區別只是一個VB過程,該過程可遍歷所有表並重新鏈接它們-輕而易舉。

  3. 在運行時動態設置報表記錄集是有問題的。 在實際的Access Data Projects中可能可以,但是在常規MDB中絕對不可能。

  4. 您可以在Access MDB中創建直通查詢,但是我不確定要傳入參數。您可能必須使用硬編碼的參數動態設置查詢文本,然后運行報表。 除非每個人都有自己的前端可以運行,否則這對於多用戶數據庫將是一個問題。

我建議你去選擇1或2選1似乎簡單,但一些學習做之前,你會擁有超過MDB的學術發展變得容易。 讓我知道您是否認為您會走這條路,我會與您分享一些陷阱。 但是,這可能比您現在手動做的所有操作要容易。 (糟糕!)第二種選擇是最快的,它可以立即實現,並且不會對您當前使用MDB的技巧產生任何影響。

UPDATE

因此,如果要鏈接表,請使用以下代碼來入門:

Sub TableRelink(MdbPath As String)
   Dim Table As DAO.TableDef
   Dim Tables As DAO.TableDefs
   Set Tables = CurrentDb.TableDefs
   For Each Table In Tables
      If Table.SourceTableName <> "" Then 'If a linked table
         Table.Connect = ";DATABASE=" & MdbPath 'Set the new source
         Table.RefreshLink
       End If
   Next
End Sub

該代碼用於MDB文件,但是某些挖掘將迅速為您提供用於SQL Server鏈接表的正確屬性和值。

另一個想法

我只是想到了另一種可能的方法來處理您遇到的問題:在Access中使用會話鍵化的“臨時”表。 創建一個本地表,其中包含視圖返回的所有列以及一個GUID列。 運行報表時,將視圖的內容插入到本地表中,並以新的GUID值作為鍵。 將報表的記錄源設置為SELECT * FROM MyViewTempTable WHERE GUID ='{GUID}'。 簡單的問題解決了。 在report_close上,從表中刪除。 也許還要加上一個日期,並在10天后刪除,以防任何行遺留下來。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM