如何使用Access VBA更新多值字段

时间:2018-03-12 21:55:23

标签: vba access-vba

我正在编写一个脚本,该脚本从另一个软件产品中获取打印输出,解析数据然后导入培训事件。以下是我正在使用的数据样本:

         RANDOMLY GENERATED TEST DATA – PRIVACY ACT NOT APPLICABLE  

TRAINING EVENT INQUIRY                    AS OF DATE  08 MAR 18 

COURSE  NARRATIVE                   DUR  TYPE  MIL  START  START  STOP  STOP
 CODE                                    INT   IND  DATE   TIME   DATE  TIME
000555  MANDATORY FUN TRAINING      008   A         08MAR18 0800 08MAR18 1600   

BUILDING NO. ROOM NO. EVENT ID  MIN SIZE  MAX SIZE #SCHED   REPEAT IND  
 578          CONF    0550001      005       012     012        N   

EMP NR  NAME                  GRD    W-C   W-C EVT  LABOR STAT  
00001   WONG CLIFTON L        005    BCTK    001
00002   BROCK CANDICE K       006    AICN    001
00003   GIBBS AMOS L          004    CODA    009
00004   BROOKS JAN A          004    CODA    009
00005   ROBINSON BERNADETTE M 004    AXAM    008
00006   WILKERSON MICHELE D   005    BDCK    007
00007   HARMON ERVIN E        004    BAVI    006
00008   ALEXANDER TOMMIE S    006    AIXB    005
00009   FRANK MALCOLM T       005    AIEE    004
00010   ABBOTT HECTOR O       002    AIEN    003
00011   HENDERSON KIMBERLY S  004    AXWT    002
00012   BENNETT MELISSA P     006    DMGR    001
B1Q 18067  16:34:14    PROCESSED.                     VERSION DATE: 041817  

这里的目标是,只需单击一下,解析数据,提取所有相关信息,找出哪些员工属于我,然后将事件数据转储到一个表中,然后可以用来生成通知和其他报道。

到目前为止,我已成功阅读上述数据,提取所有相关课程信息(何时及何地)以及所有属于我的员工(在这种情况下,每个人都有WC开始用" A")。然后,它会将员工编号从EMP NR列和员工工作中心W-C列转储到tblImport。我遇到的问题是下面的一些代码,它应该标记多值字段中的所有员工" AssignedPersonnel",其中包含所有员工的行源我拥有。

Private Sub problem_code()

Dim i, empnv As Integer
Dim cdb As DAO.Database
Dim imt As DAO.Recordset
Dim rst As DAO.Recordset2
Dim asp As DAO.Field2

Set cdb = CurrentDb
Set rst = cdb.OpenRecordset("tblEvents", dbOpenTable)
Set asp = rst("AssignedPersonnel")
Set imt = cdb.OpenRecordset("tblImport", dbOpenTable)

rst.MoveFirst
rst.AddNew
imt.MoveFirst
Do While Not imt.EOF
    empnv = imt!EmpID
    asp(empnv) = True
    imt.MoveNext
Loop
rst.Update

End Sub

我知道我可以手动更新该字段并使用condition = true查询该字段以获取分配给该培训的人员,但是尝试将VBA代码写入该字段会让我完全陷入困境。最终发生的事情是,当我尝试设置asp(empnv) = True时,我收到错误3265,此集合中找不到该项。我在这里错过了什么?或者,更深层次的问题是我应该重构我的整个数据库以避免完全使用MVF吗?

编辑:减少发布的代码数量以最小化示例。

1 个答案:

答案 0 :(得分:0)

我知道这已经超过一年了,您可能已经找到了解决方案,但是对于那些来这里寻找类似问题的潜在解决方案的人,我有一种解决方案应该可以根据您提供的信息来工作。

在发布代码之前,我们需要了解的第一件事是,在VBA中处理多值字段时,我们需要将其视为表记录为其父级的子记录集。这意味着需要在导航到适当的记录后对其进行声明。就您而言:

private void ButtonOpenMenu_Click(object sender, RoutedEventArgs e)
{
    ButtonCloseMenu.Visibility = Visibility.Visible;
    ButtonOpenMenu.Visibility = Visibility.Collapsed;
}

private void ButtonCloseMenu_Click(object sender, RoutedEventArgs e)
{
    ButtonCloseMenu.Visibility = Visibility.Collapsed;
    ButtonOpenMenu.Visibility = Visibility.Visible;
}

private void ListViewMenu_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    UserControl usc = null;
    GridMain.Children.Clear();

    switch (((ListViewItem)((ListView)sender).SelectedItem).Name)
    {
        case "ItemMain":
            usc = new UserControlMain();
            GridMain.Children.Add(usc);
            break;
        default:
            break;
    }
}

第二,一个常见的误解是,由于在表中我们将记录源分配给多值字段,所以我们只需要像手动操作一样切换适用于该字段的记录。可悲的是,事实并非如此,因为记录源只是一个数据验证工具,并没有固有地用数据填充“多值字段”。对于您来说,在创建新记录时,此字段为空。

第三,我们需要了解,设置为多值字段的值的Recordset仅仅是Single Field Recordset,据我所知,它没有提供字段名,并且必须由该字段引用。字段ID号为0。

最后,将数据添加到“多值字段记录集”时,我们需要将其作为记录集。

因此,事不宜迟,这是一种可能对我有效的解决方案:

Dim rst As DAO.Recordset2
Dim asp As DAO.Recordset
...
rst.AddNew
Set asp = rst.AssignedPersonnel.Value
...