我正在尝试解决一个具有挑战性的问题,可以在此问题上利用您的专业知识。
我正在尝试使用从前端应用程序获取到FootPrints Service Core 11.6数据库的查询来复制Access 2013中的某些报告。我已经完成了查询和计算,可以复制前端报告中的大多数字段,但受让人信息除外。
(注意:受让人是指分配工作票证的个人或[一般]团队,可以是多个[团队和个人])
这些受让人在FootPrints数据库的受让人表中单独列出(请参见所附图像)。当前端应用程序生成报告时,它将以某种我无法模仿的特定方式以某种方式将个人和团队受让人信息组合在一起(参见图)。这是我需要您帮助的地方!
我需要将所有受让人(个人和团队受让人)组合在一个字段中,并按与之关联的票证编号(
因此,数据库中存在以下内容
MrID |受让人|团队
12345 | Bob Smith | 服务台第1层
12345 | 简·史密斯 | 服务台第1层
12345 | (空) | 电信
23456 | (空) | 帮助台2级
34567 | Chuck Norris | (空)
45678 | (空) | 帮助台1级
45678 | (空) | 帮助台2级
45678 | (无) | 联网
45678 | (空) | 访问控制
它应该显示为1个字段,如下所示:
MrID |受让人
12345 | 帮助台方法1:Bob Smith,Jane Smith。电信:
23456 | 帮助台方法2:
34567 | 查克·诺里斯(Chuck Norris)
45678 | 帮助台方法1 :。服务台方法2 :。联网: 。访问控制:
在上面的示例中可以看到,每个团队受让人后跟一个:,多个团队成员( individuals )以分隔,而多个团队则以分隔。
遵循此约定,是否有一种方法可以通过在Access中使用查询(必要时使用或VBA )来模仿此过程?
此致
克里斯
答案 0 :(得分:1)
您没有提供足够的数据来进行更多测试。是的,您包括了屏幕截图,但是数据仅用于复制和粘贴3条记录,因此我使用了它
然后,我有一个这样的查询:
此查询的SQL代码为:
SELECT DISTINCT Table1.MrID, FINAL_ASSIGNEES([mrid]) AS ASSIGNEES FROM Table1;
如您所见,此SQL代码调用以VBA编码的名为FINAL_ASSIGNEES
的UDF。此UDF的代码为:
Public Function FINAL_ASSIGNEES(ByVal vThisMrID As Long) As String
Dim RST As Recordset
Dim SqlStr As String
SqlStr = "SELECT DISTINCT Table1.MrID, CONCATENATE_ASSIGNEE([MrID],[Team]) AS ASSIGNEES FROM Table1 " & _
"WHERE Table1.MrID=" & vThisMrID & ";"
Set RST = Application.CurrentDb.OpenRecordset(SqlStr, 2, 4)
With RST
If .EOF <> True And .BOF <> True Then
.MoveLast
.MoveFirst
Do Until .EOF = True
FINAL_ASSIGNEES = FINAL_ASSIGNEES & .Fields(1).Value & ". "
.MoveNext
Loop
FINAL_ASSIGNEES = Left(FINAL_ASSIGNEES, Len(FINAL_ASSIGNEES) - 2) 'minus 2 to get rid of extra ". "
End If
Set RST = Nothing
End With
End Function
是的,此VBA代码调用了另一个名为CONCATENATE_ASSIGNEE
的UDF。第二个UDF的代码是:
Public Function CONCATENATE_ASSIGNEE(ByVal vMrID As Long, ByVal vTeam As String) As String
Dim MyRST As Recordset
Dim MySQL As String
MySQL = "SELECT Table1.Assignee FROM Table1 " & _
"WHERE (((Table1.MrID)=" & vMrID & ") AND ((Table1.Team)='" & vTeam & "'));"
Set MyRST = Application.CurrentDb.OpenRecordset(MySQL, 2, 4)
DoEvents
With MyRST
If .EOF <> True And .BOF <> True Then
.MoveLast
.MoveFirst
Do Until .EOF = True
If IsNull(.Fields(0)) = True Then
CONCATENATE_ASSIGNEE = CONCATENATE_ASSIGNEE & "Unassigned" & ", "
Else
CONCATENATE_ASSIGNEE = CONCATENATE_ASSIGNEE & .Fields(0).Value & ", "
End If
.MoveNext
DoEvents
Loop
CONCATENATE_ASSIGNEE = vTeam & ": " & Left(CONCATENATE_ASSIGNEE, Len(CONCATENATE_ASSIGNEE) - 2) 'minus 2 to get rid of the extra ", "
End If
Set MyRST = Nothing
End With
End Function
但这可以满足您的需求。如果使用大型记录集,则可能需要一些时间进行计算。但是至少您可以使它适应您的需求。