我一直很好奇如何完成这样的事情:
tblProject
id
1
2
tblSample
id projectID sampleNumber
1 1 1
2 1 2
3 1 3
tblTests
id testName
1 test1
2 test2
3 test3
tblTestResults
id testID projectID sampleID testResults
1 1 1 1
2 2 1 1
3 3 1 1
我想将以下内容输出到数据表中:
projectID sampleID testID test1 test2 test3
1 1 1 entry entry entry
1 1 2 entry entry entry
1 1 3 entry entry entry
Test1,Test2和Test3是来自tblTests的名称。有没有办法自动更新测试名称列下面输入的项目?透视不允许编辑。我想出的解决方案是解决方法: 1)将数据透视表输出到列表框中,双击它将加载包含测试的表单。 2)使用gridview。加载标题:projectID,sampleID和测试名称。在数组中,跟踪测试名称列以及它属于哪个testresult id。更新后,手动更新字段。
有更好的方法吗? 谢谢
答案 0 :(得分:1)
从Access 2002开始,Microsoft升级了Access表单,以显着提高以数据透视表格式显示数据的能力。这些功能基于Access 2000 for Office Web Components中最初引入的功能。
在开始为Access表单编制数据透视表之前,您需要对Office Web Components库(owc10.dll
)的引用。在Access 2002/2003中,库文件在\Program Files\Common Files\Microsoft Shared\Web Components\10
路径中可用。在Access 2002中,Microsoft Office XP Web Components项不会出现在References
对话框中。因此,您必须知道库文件的路径(owc10.dll
),以便在指定引用时可以浏览它。
首先,您需要创建一个用于保存数据透视表的表单。您可以使用CreateForm
方法执行此操作。
接下来,您通常希望通过CreateForm
方法更改分配给表单的默认名称。这种做法允许您的Access表单名称反映其在应用程序中的角色。
最后,您需要在Access窗体上配置数据透视表的活动视图,以便它将数据组织为显示到适当的行,列和过滤器轴。您可以通过将Access表或查询中的列名分配给数据透视表的活动视图的轴来执行此操作。
Office Web Components
对象模型使用RowAxis
和ColumnAxis
等术语来指定活动视图的轴。要组织的任何数据都属于活动视图的DataAxis
。您可以将多列数据指定为属于行,列,过滤器和数据轴。
可以下载包含本文示例的Access文件here。该文件包含一个名为frmPVTDesigner
的表单,其中包含五个按钮。标有Make Orders PivotTable
的顶部按钮根据从Northwind.mdb
文件导入的Orders表创建一个简单的数据透视表。数据透视表(请参阅此[image] 2中的左侧窗格)按OrderID
对ShipCountry
进行分类。按钮后面的代码将透视表保存在pvtOrders
表单中。在调用按钮的单击事件过程之后,您需要先删除pvtOrders
表单,然后才能重新运行单击事件过程(或更改事件过程中的代码,以便使用不同的方法保存新表单)名称)。
使用与[image] 2左侧窗格中的数据透视表类似的数据透视表,分析师可以显示每个ShipCountry
的订单数量。此[image] 2中的右侧面板显示,有16个订单的ShipCountry
列值为"阿根廷" 。用户可以通过右键单击数据透视表中的OrderID
列标题并选择AutoCalc > Count
来生成此小计。此外,通过点击PivotTable
工具栏上的隐藏详细信息按钮,用户可以选择取消显示各个OrderID
值,以便只显示计数。
通过调用其他三个过程,顶部按钮的Click事件过程为数据透视表创建一个表单,将自定义名称pvtOrders
分配给表单,并配置数据透视表。该应用程序使用了几个模块级变量strFormName
和strRecordSource
:
Sub CreatePivot()
Dim strFormName As String
Dim strRecordSource As String
Private Sub cmdOrdersPivotTable_Click()
Dim strDefaultName As String
strRecordSource = "Orders"
strDefaultName = CreatePivotTable
strFormName = "pvtOrders"
If (AssignPivotTableName(strDefaultName, _
strFormName)) = False Then
Exit Sub
End If
ConfigureOrdersPivotTable
End Sub
从此代码调用的CreatePivotTable
函数过程创建一个新表单,其RecordSource属性设置等于strRecordSource,它是两个模块级变量之一。在尝试在表单上配置数据透视表之前,必须为表单分配记录源。 CreatePivotTable
过程为表单的DefaultView属性赋值,以便在用户从“数据库”窗口打开表单时,使用数据透视表视图打开表单。此DefaultView设置不会影响DoCmd对象的OpenForm方法如何打开表单。
CreatePivotTable
例程向cmdOrdersPivotTable_Click例程返回新表单的名称。此名称的格式为Formn,其中n是整数值。在CreatePivotTable
保存表单的设置并关闭表单后,cmdOrdersPivotTable_Click将默认表单名称和自定义表单名称传递给AssignPivotTableName,这是我的另一个功能。除非自定义表单名称已属于数据库文件中的另一个表单,否则此函数会为数据透视表的表单指定新的自定义名称。 A For ...每个循环搜索AllForms集合的成员,以确定另一个现有表单是否已具有新表单的名称。当新的自定义表单名称已经属于现有表单时,该函数过程将删除由CreatePivotTable
创建的表单,并返回值False以指示它没有重命名该表单。在这种情况下,cmdOrdersPivotTable_Click将终止应用程序。否则,AssignPivotTableName过程成功重命名新表单并将值True返回到cmdOrdersPivotTable_Click
:
Function CreatePivotTable() As String
Const acFormPivotTable = 3
Dim frm1 As Access.Form
Set frm1 = CreateForm
frm1.DefaultView = acFormPivotTable
frm1.RecordSource = strRecordSource
CreatePivotTable = frm1.Name
DoCmd.Close acForm, CreatePivotTable, _
acSaveYes
End Function
Function AssignPivotTableName _
(strDefaultName As String, _
strFormName As String) As Boolean
Dim acc1 As AccessObject
AssignPivotTableName = True
For Each acc1 In CurrentProject.AllForms
If acc1.Name = strFormName Then
MsgBox "Choose a form name other " & _
"than '" & strFormName & "' that " & _
"does not match an existing form."
AssignPivotTableName = False
DoCmd.DeleteObject acForm, strDefaultName
Exit Function
End If
Next acc1
DoCmd.Rename strFormName, acForm, _
strDefaultName
End Function
应用程序创建表单并为其指定自定义名称后,ConfigureOrdersPivotTable
过程会将表单的RecordSource设置中的列分配给表单上数据透视表的活动视图的轴。在为数据透视表创建任何表单时,可以重用CreatePivotTable
和AssignPivotTableName
,但配置数据透视表的过程对于每个数据透视表通常都是唯一的。
配置过程最初会打开指定数据透视表的表单。接下来,它使用With ... End With语句指向窗体上的数据透视表对象的ActiveView对象。在With...End
With语句中,该过程连续地将列(在本例中为ShipCountry和OrderID)分配给PivotFieldset
对象(fst1)。 With...End
With语句中的代码将PivotFieldset
插入到ActiveView对象的轴中。 ConfigureOrdersPivotTable将PivotFieldset
和ShipCountry列分配给ActiveView的RowAxis
属性,将PivotFieldset
和OrderID
列分配给ActiveView的DataAxis
属性:
Sub ConfigureOrdersPivotTable()
Dim fst1 as PivotFieldset
'Open form in PivotTable view and set
'a reference to the form
DoCmd.OpenForm strFormName, acFormPivotTable
Set frm1 = Forms.Item(strFormName)
'Set PivotTable fieldsets
With frm1.PivotTable.ActiveView
Set fst1 = .FieldSets("ShipCountry")
.RowAxis.InsertFieldSet fst1
Set fst1 = .FieldSets("OrderID")
.DataAxis.InsertFieldSet fst1
End With
'Close form with its PivotTable view
DoCmd.Close acForm, frm1.Name, acSaveYes
End Sub
请参阅:
有关此示例的更多信息,请访问Source。
Stack Overflow:Edit pivot table contents in Access
答案 1 :(得分:0)
我更喜欢在这种情况下使用临时表。将数据透视表数据复制到临时表并在单击“保存”按钮后返回编辑后的数据,几个简单的查询就可以完成工作