我正在编写一个脚本,该脚本从另一个软件产品中获取打印输出,解析数据然后导入培训事件。以下是我正在使用的数据样本:
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吗?
编辑:减少发布的代码数量以最小化示例。
答案 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
...