在Access中计算一个复杂的表关系

问题描述 投票:0回答:1

我希望这个优秀的团队可能会有一些建议来帮助我解决一个困难的问题。 我正在开发一个Access数据库,用于从一个大型的每日批处理周期中统计事件报告,该周期涉及几百个应用程序,而这些应用程序又每天提交几十万个事件来运行。 我正在努力收集基于多种标准的统计报告信息......

目前,数据库相当简单。 两张表。

应用程序数据--一个表,包含每个单独应用程序的条目和所有相关数据(名称、开发人员、团队、业务单位、架构师等)。应用程序用2个或3个字符代码命名,例如Applicaiton X可能被称为XYZ,应用程序Y可能被称为YF。

事件数据 - 每天收集,这是所有已运行事件的列表。它存储事件信息,如事件名称、日期、成功状态、运行时间、最大完成代码等。

事件是在系统内用命名惯例定义的。 事件的名称最多可以有8个字符。 第一个字符总是'P',表示生产事件。 接下来的2到3个字符是应用程序的代码,剩下的字符可以是应用程序想要的任何东西。

我想做的是将每个事件条目与应用程序数据表中的相关应用程序相匹配(这样我就可以报告特定应用程序的所有事件信息,甚至是特定架构师所拥有的所有应用程序的事件等)。

我的问题是,目前确定关系的唯一真正方法是解析事件名称并进行比较。我想做的是将第2、3、4个字符与应用数据表中的应用代码字段进行比较,如果发现匹配,那就是应用,我可以将该记录添加到应用数据ID中作为外键。 如果发现匹配,那就是应用程序,我可以把该记录添加应用程序数据ID作为关系的外键。如果没有匹配,那就用前2个字符来匹配,判断是否是2个字符的应用代码,再次在偶数据表中填写应用数据的外键。

我曾试过用查询比较事件名称(用中字符串解析)和一系列IIF语句,但那炸得很壮观,我根本无法让复杂的语法发挥作用。 我接下来想到的是用vba模块批量完成,对每条记录中的事件名进行解析,并在应用数据应用代码字段中搜索匹配,然后更新外键字段。但这是,我相信随着每天新的事件数据的添加,我可能要定期做的事情。

我甚至不确定我的要求是否可行,但我欢迎任何关于基于此标准的自动填充外键字段的方法的想法,或者我可以每天运行的手动解决方案,以解决大量数据的问题。

谢谢你。Gord

ms-access access-vba
1个回答
0
投票

我建议在VBA中使用一系列的SQL语句可能是最好的方法。

首先,你应该将数据导入到一个临时表中,该表与你的事件表的结构相匹配。通过这样做,意味着当你进行更新时,你需要处理的数据较少,所以应该更快地进行更新。

我假设Application表有一个Autonumber主键,EventTemp表有一个要更新的数字外键。然后你可以运行一些VBA。

Sub sEventData()
    On Error GoTo E_Handle
    Dim db As DAO.Database
    Set db = DBEngine(0)(0)
    db.Execute "UPDATE tblTemp AS T INNER JOIN tblApplication AS A ON A.ApplicationCode=Mid(T.EventName,2,3) " _
        & " SET T.ApplicationID=A.ApplicationID " _
        & " WHERE T.ApplicationID=0;"
    db.Execute "UPDATE tblTemp AS T INNER JOIN tblApplication AS A ON A.ApplicationCode=Mid(T.EventName,2,2) " _
        & " SET T.ApplicationID=A.ApplicationID " _
        & " WHERE T.ApplicationID=0;"
    db.Execute "INSERT INTO tblEvent (EventName,EventDate, ApplicationID) " _
        & " SELECT EventName, EventDate, ApplicationID " _
        & " FROM tblTemp " _
        & " WHERE ApplicationID<>0;"
    db.Execute "DELETE * FROM tblTemp WHERE ApplicationID<>0;"
sExit:
    On Error Resume Next
    Set db = Nothing
    Exit Sub
E_Handle:
    MsgBox Err.Description & vbCrLf & vbCrLf & "sEventData", vbOKOnly + vbCritical, "Error: " & Err.Number
    Resume sExit
End Sub

这将处理任何可以用3个字符匹配的项目 然后是那些没有被匹配但可以用2个字符匹配的项目。然后将匹配的项目插入到您的主事件表中,然后删除任何匹配的项目。这将为您留下任何未匹配的项目,您可能需要在应用程序表中创建新的记录。

祝贺。

© www.soinside.com 2019 - 2024. All rights reserved.