MS-Access,SQL,VB.NET:使用行数据创建具有唯一值的可更新枢轴

时间:2018-01-21 04:52:12

标签: ms-access access-vba

我一直很好奇如何完成这样的事情:

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。更新后,手动更新字段。

有更好的方法吗? 谢谢

2 个答案:

答案 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),以便在指定引用时可以浏览它。

以编程方式为Access表单创建数据透视表可能需要几个步骤:

首先,您需要创建一个用于保存数据透视表的表单。您可以使用CreateForm方法执行此操作。

接下来,您通常希望通过CreateForm方法更改分配给表单的默认名称。这种做法允许您的Access表单名称反映其在应用程序中的角色。

最后,您需要在Access窗体上配置数据透视表的活动视图,以便它将数据组织为显示到适当的行,列和过滤器轴。您可以通过将Access表或查询中的列名分配给数据透视表的活动视图的轴来执行此操作。

Office Web Components 对象模型使用RowAxisColumnAxis等术语来指定活动视图的轴。要组织的任何数据都属于活动视图的DataAxis。您可以将多列数据指定为属于行,列,过滤器和数据轴。

基于表

创建数据透视表

可以下载包含本文示例的Access文件here。该文件包含一个名为frmPVTDesigner的表单,其中包含五个按钮。标有Make Orders PivotTable的顶部按钮根据从Northwind.mdb文件导入的Orders表创建一个简单的数据透视表。数据透视表(请参阅此[image] 2中的左侧窗格)按OrderIDShipCountry进行分类。按钮后面的代码将透视表保存在pvtOrders表单中。在调用按钮的单击事件过程之后,您需要先删除pvtOrders表单,然后才能重新运行单击事件过程(或更改事件过程中的代码,以便使用不同的方法保存新表单)名称)。

使用与[image] 2左侧窗格中的数据透视表类似的数据透视表,分析师可以显示每个ShipCountry的订单数量。此[image] 2中的右侧面板显示,有16个订单的ShipCountry列值为"阿根廷" 。用户可以通过右键单击数据透视表中的OrderID列标题并选择AutoCalc > Count来生成此小计。此外,通过点击PivotTable工具栏上的隐藏详细信息按钮,用户可以选择取消显示各个OrderID值,以便只显示计数。

通过调用其他三个过程,顶部按钮的Click事件过程为数据透视表创建一个表单,将自定义名称pvtOrders分配给表单,并配置数据透视表。该应用程序使用了几个模块级变量strFormNamestrRecordSource

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设置中的列分配给表单上数据透视表的活动视图的轴。在为数据透视表创建任何表单时,可以重用CreatePivotTableAssignPivotTableName,但配置数据透视表的过程对于每个数据透视表通常都是唯一的。

配置过程最初会打开指定数据透视表的表单。接下来,它使用With ... End With语句指向窗体上的数据透视表对象的ActiveView对象。在With...End With语句中,该过程连续地将列(在本例中为ShipCountry和OrderID)分配给PivotFieldset对象(fst1)。 With...End With语句中的代码将PivotFieldset插入到ActiveView对象的轴中。 ConfigureOrdersPivotTable将PivotFieldset和ShipCountry列分配给ActiveView的RowAxis属性,将PivotFieldsetOrderID列分配给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

请参阅:

答案 1 :(得分:0)

我更喜欢在这种情况下使用临时表。将数据透视表数据复制到临时表并在单击“保存”按钮后返回编辑后的数据,几个简单的查询就可以完成工作