摘 要: 報表的主要作用是打印輸出格式化的數(shù)據(jù)信息。本文從實用的角度出發(fā),給出了隨心所欲輸出任意表中的任意多個字段的方法,使得數(shù)據(jù)最終顯示清晰明了。
關(guān)鍵字: 權(quán)限 報表 字段 輸出
當(dāng)今社會的數(shù)據(jù)處理與日俱增,如何能從龐大的數(shù)據(jù)中找出符合條件的數(shù)據(jù)信息,并且將它們快速清晰地輸出,就顯得尤為重要。Access數(shù)據(jù)庫簡單易用,但報表在輸出數(shù)據(jù)時往往需要事先設(shè)置好報表所要綁定的表和表中的相關(guān)字段。這樣一來,如果要更換表或表中的字段,就得重新修改報表,顯得較為麻煩。為此,可以做一個窗體,表和字段的選擇全在窗體中進行(如圖1),最后只需單擊“輸出報表”按鈕即可輸出報表,達(dá)到一勞永逸隨心所欲輸出任意表中任意多個字段的報表的目的。
一、獲取表
在Access數(shù)據(jù)庫系統(tǒng)中,用戶創(chuàng)建的對象的相關(guān)信息存儲在系統(tǒng)表MSysObjects中,可通過查詢它來獲取我們想要的表。
(1)設(shè)置對系統(tǒng)表MSysObjects的訪問權(quán)限。
默認(rèn)情況下,是無法直接訪問系統(tǒng)表MSysObjects的,需要手工設(shè)置一下:
首先單擊Access數(shù)據(jù)庫“工具”菜單中的“選項”命令,在“視圖”頁上將“系統(tǒng)對象”選中,單擊“確定”按鈕保存設(shè)置。
然后單擊“工具”菜單中“安全”菜單中的“用戶與組權(quán)限”命令,在“權(quán)限”頁面中,在“對象類型”下拉列表中選擇“表”,在“用戶名/組名”中選擇“管理員”用戶,在“對象名稱”中選擇“MSysObjects”表,在“權(quán)限”中將“讀取數(shù)據(jù)”選中,單擊“確定”按鈕保存設(shè)置即可完成。
通過上面兩步設(shè)置后,就可以看見并對系統(tǒng)表MSysObjects進行訪問了。
(2)建立查詢,獲取表。
在系統(tǒng)表MSysObjects中,Name字段值表示數(shù)據(jù)對象的名稱;Type字段值表示數(shù)據(jù)庫對象的類型:1表示表,3表示系統(tǒng)對象,5表示查詢,-32761表示模塊,-32764表示報表,-32766表示宏,-32768表示窗體,-32756則表示數(shù)據(jù)訪問頁;Flags字段中值為0的表示用戶創(chuàng)建的對象。為此獲得數(shù)據(jù)庫表的名稱的查詢應(yīng)為:
SELECT MSysObjects.Name
FROM MSysObjects
WHERE((MSysObjects.Type=1)AND(MSysObjects.Flags=0))
在圖1所示的窗體中,通過組合框(名稱為zhk)來列出數(shù)據(jù)庫系統(tǒng)中所有的表(不包括系統(tǒng)表),所以該組合框的“行來源”即為上面的查詢語句。
二、列出表中的字段
當(dāng)在組合框中選擇了表后,列表框(名稱為lbk)應(yīng)自動列出相應(yīng)表所包含的所有字段,所以還需對組合框的“更新事件”進行相應(yīng)的如下設(shè)置:
Private Sub zhk_AfterUpdate()
Dim dbs As DAO.Database,tdf As DAO.TableDef
Dim fld As DAO.Field,rst As DAO.Recordset
Dim tbl As String
tbl=Forms!frmtest!zhk
Set dbs=CurrentDb
Set tdf=dbs.TableDefs(tbl)
DoCmd.SetWarnings False
DoCmd.RunSQL("Delete*from TableFields")
DoCmd.SetWarnings True
Set rst=dbs.OpenRecordset("TableFields",dbOpenDynaset)
For Each fld In tdf.Fields
If fld.Type>=1 And fld.Type<=8 Or fld.Type=10 Then
rst.AddNew
rst!FieldName=fld.Name
rst!FieldType=fld.Type
rst.Update
End If
Next fld
Set dbs=Nothing
lbk.Requery
End Sub
上面代碼的作用就是將選擇的表中的字段暫時存儲在一個臨時表TableFields中,TableFields的結(jié)構(gòu)如圖2,然后將選擇的結(jié)果再返回給列表框,所以將列表框lbk的行來源設(shè)為“SELECT FieldName FROM TableFields”。
三、重選表、字段
當(dāng)表和表中的字段都列出后,就可進行相應(yīng)的選擇,以便精簡報表的中字段。如果此時需重新選取表,只需單擊組合框重新選擇表;如果需重新選取字段,應(yīng)先將列表框中已有的字段全部清除,然后再重新選擇表中的字段。重選功能需在窗體中添加一個命令按鈕(名稱為cmdReset),該命令按鈕的單擊事件代碼可設(shè)為:
Private Sub cmdReset_Click()
DoCmd.SetWarnings False
DoCmd.RunSQL"Delete* from TableFields"
Me!lbk.Requery
DoCmd.SetWarnings True
End Sub
至此,表和表中字段的選擇操作已完全實現(xiàn),剩下的輸出報表任務(wù)就變得相對簡單了。
通過以上建立窗體,在窗體中對數(shù)據(jù)庫包含的表和表中的字段進行快速選擇,這樣在報表輸出時,就無需重新設(shè)置報表的記錄源和結(jié)構(gòu),同時精簡了報表中的字段,達(dá)到隨心所欲地輸出報表的目的。
參考文獻:
[1]陳可欣.Access VBA數(shù)據(jù)庫高效開發(fā)范例應(yīng)用[M].北京:中國青年出版社,2005.