2010-02-02 308 views
3

我遇到了生成複雜訪問報告(通過複雜的意思是數據處理,可變數量的字段等)的問題。
讓我更深入的詳細講解一些我需要實現的東西:從動態交叉表查詢和vba訪問報告「手動」生成報告

  • 某些字段不應該根據查詢
  • 如果某記錄不存在,一個漂亮的彩色一些值顯示(應該顯示消息,而不是會出現在那裏的值(例如,假設在日期字段中存在具有03/04/2009的記錄,則在日期字段中也存在具有03/06/2009的記錄,但是也存在在2009年5月3日之前沒有記錄,在顯示與最後記錄相關的數據之前,我應該打印一些類似於「2009年3月5日未顯示」的內容)
  • 一個條形圖, a不是記錄中的值,而是通過一組記錄計算出來的其他值(例如某個日期的所有等級的平均值)。此圖表中的系列數量也會根據記錄中的值而變化,此圖表不在詳細信息部分,而是位於頁面標題或某種組標題中。

還應該提到查詢是TRANSFORM查詢(更確切地說,是許多TRANSFORM查詢的INNER JOIN),因此查詢返回的列數是變化的。雖然在過去,我一直無法將此查詢綁定爲報告的記錄源,但不知何故,Access現在停止了抱怨(有人可以澄清這一點嗎?這是正常的,我是否應該擔心它並將其用作記錄源或我應該避免)

有兩個選項來實現我想要的(我可以看到現在):

  1. 創建沒有記錄源和大量未綁定字段的報告,並通過幾個事件(Report_Open,Section_Format等)和DAO的幫助下,手動設置這些字段的值。通過VBA也可以更改圖表的數據系列。
  2. 將記錄源設置爲查詢,並創建一些瘋狂和令人困惑的VBA代碼來處理數據並實現我需要的一切。

在我看來,選項2將是一個巨大的頭痛和浪費時間,我認識到選項1非常像寫入Excel文件(因爲所有的數據都是通過DAO獲得的),這會容易得多,因爲我對那裏幾乎所有東西都有更多的控制(但是由於其他許多原因,我們希望在訪問報告中包含所有內容)

儘管我有偏見並打算使用選項1,但我發現這個選項的幾個問題,例如:

  1. 我找不到在VB報表中創建新頁面的方法A,因此我只限於第一頁。
  2. 缺乏某種對VBA和Access免費,在線的,體面的和完整的文檔的報道

此外,如果選擇2是比較可行的,我當然願意去用它,但我也願意需要一些建議,也許還有一些技巧來解決我在這個問題中提到的問題。

所以,問題是:

  • 我在哪裏可以找到關於訪問報告和VBA一些體面的和完整的文檔?
  • 如何在訪問報告中創建頁面,並選擇要寫入的頁面?
  • 由於我手上有這個問題,我是否會遇到任何我應該知道的瓶頸?我是否應該考慮使用訪問報告的替代方案(例如,寫入電子表格)?
+0

你有沒有考慮創建使用字(自動化)的報告或使用HTML? – Fionnuala 2010-02-02 17:17:20

+0

我想堅持到儘可能多地訪問報表,切換僅在必要時 – 2010-02-02 17:41:49

回答

1

聽起來像是想要dynamically create the report並避免所有虛擬文本框。

+0

這是一個非常超級的文章,但似乎過於複雜,我創造的東西,這是一個重複的活動上即時報告,唯一的變化的事情是交叉表中列的確切數量,取決於特定的數據集。 – 2010-02-02 23:01:28

+0

您可能會發現至少有3-5列,所以其餘的可以動態創建。定位在交叉表中會非常複雜。在設計模式下以編程方式打開報告怎麼辦? – JeffO 2010-02-03 02:28:32

+0

對我來說,不得不在設計模式下打開任何對象是一個錯誤。首先,它不適用於MDE/ACCDE。此外,如果你想在飛行中添加控件,你最終會用完,因爲還有700多名控件在窗體/報表的壽命限制,不管你是否刪除部分或不保存物體。所以,一般來說,根本不可取。 – 2010-02-04 00:42:14

0

在以下方面:

我不能找到一種方法來創建與VBA報告新頁面 ,因此我 僅限於第一頁。

您的解決方案#1似乎假定未綁定報告。

我想我會做的是有形式的交叉錶行來源,所以你必須記錄生成網頁,然後用無控件定義報表的控件(除了綁定的控件字段始終存在於CrossTab中)。然後,您可以根據特定列在運行時分配ControlSources。下面是一個交叉的SQL從一個應用程序抓起,現在我的工作:

TRANSFORM First(impNoMatch.PersonID) AS FirstOfPersonID 
    SELECT impNoMatch.LastName, impNoMatch.FirstBame 
    FROM impNoMatch 
    GROUP BY impNoMatch.LastName, impNoMatch.FirstName 
    PIVOT impNoMatch.Status; 

現在,你知道,在SELECT子句中的字段將始終存在,因此,如果你打開了SQL字符串的記錄您正在使用和統計記錄的字段集合中的字段數(不能使用報表的記錄,除非它是一個ADO記錄集,即不綁定到記錄源):

Dim strSQL As String 
    Dim rsFields As DAO.Recordset 
    Dim lngFieldCount As Long 

    strSQL = Me.Recordsource 
    Set rsFields = CurrentDB.OpenRecordset(strSQL) 
    lngFieldCount = rsFields.Fields.Count 

從這一點,因爲你知道SELECT語句中的字段數(即行標題),可以計算要分配的動態控件的數量,並且可以使用此記錄dset的字段集合來分配ControlSources並取消隱藏控件。

您將開始使用所有將顯示動態字段集的控件,以使其Visible屬性爲FALSE。您還需要爲這些控件使用命名約定。在下面的代碼中,我使用了txtNN,其中NN是Fields集合中格式爲2位的數字索引。下面的代碼(它增加了行什麼上面列出,並在OnOpen事件運行):

Dim strSQL As String 
    Dim rsFields As DAO.Recordset 
    Dim lngFieldCount As Long 
    Dim l As Long 
    Dim strControlName As String 

    strSQL = Me.RecordSource 
    Set rsFields = CurrentDb.OpenRecordset(strSQL) 
    lngFieldCount = rsFields.Fields.Count 
    For l = 2 To lngFieldCount - 1 
    strControlName = "txt" & Format(l, "00") 
    Me(strControlName).ControlSource = rsFields.Fields(l).Name 
    Me(strControlName).Visible = True 
    Next l 
    rsFields.Close 
    Set rsFields = Nothing 

現在,如果你想獲得幻想,你可以重新格式化控制,改變寬度和水平/垂直位置。如果你這樣做,你必須在不同的事件中做到這一點,選擇它會有點棘手。把它放在報告組的標題的OnFormat事件中唯一的好地方。如果你沒有任何分組,你可以添加一個不做任何事情的分組。在我的交叉表的情況下,姓氏和名字上的兩級排序以及名字上沒有任何內容的標題是使用OnFormat事件更改報表上控件的外觀/佈局的好地方。

至於你如何學習如何做到這一點的問題,我建議選擇一箇中級/高級Access編程書。Access開發人員手冊是這方面的黃金標準,其中包括大量程序化控制報告的例子。

+0

感謝您的回答。雖然我過去比較喜歡選項#1,但不能手動創建頁面讓我接近#2。由於在報告中顯示的數據是不準確的記錄中的數據,我一直在使用標籤和手動設置通過VBA和DAO他們的標題。另外,我一直在使用大量的Me.NextRecord =假和Me.NextRecord = true來填補DAO的記錄不在報表記錄源值(大量勞動力到這裏爲止,我必須承認)。我想,但是,我可能會讓它:) 另外,感謝很多的文檔參考。 – 2010-02-04 14:24:09

+0

這聽起來像你最好在HTML或Word自動化中做這件事。訪問報告在任意輸出方面效果不佳 - 它們是建立在假設報告表面將與其背後的記錄緊密結合的基礎上的。 – 2010-02-05 02:59:34