跨数据库表中的行验证给定条件
Posted
技术标签:
【中文标题】跨数据库表中的行验证给定条件【英文标题】:Validate given conditions across the rows in a database table 【发布时间】:2020-09-10 12:59:27 【问题描述】:我有一个这样的位置和对应值的数据库表
position value
Z170S11 630
Z176S11 103
Z060S11 7162
Z143S01 47
'position' 对于这个表是唯一的。位置的集合是固定的。 'value' 列的行条目将随着应用程序的每次新运行而改变。
我也有一个关于此表中所有值的固定条件列表。此列表是我要存储在数据库中的 Excel 文件的一部分。该列表有这样的条目
left hand side operator right hand side
Z143S01 + Z060S11 = Z176S11
Z143S01 >= Z170S11
左右两边都可以包含最多 10 个不同值的和和差。运算符有 '='、'='。
对于每个条件,我都需要检查当前的“值”字段是否正确。例如
Z143S01 + Z060S11 = Z176S11
将评估为
47 + 7162 = 103
这是错误的。每次检查的结果都应该呈现给用户。
将这些条件存储为我的数据库的一部分并自动检查它们是否满足上表中的给定值的好方法是什么?
我想将它们作为字符串值存储在表格中,并使用 VBA 的“Split”和“DLookup”函数单独评估每一行。正如我预计要检查的大约 1.000 个条件一样,这可能会变得太慢。有没有更简单/更快的方法,可能更多地依赖 SQL?
【问题讨论】:
您能否提供更多详细信息 @VishalSheth 你在想什么细节?更多示例行?我对实际输出格式持开放态度 @VishalSheth 我更新了问题并提供了更多详细信息 是强制使用 SQL DLookup 函数还是使用某种脚本很好 行得通的就是好的。问题主要是关于存储条件的好方法,因为它们不会改变。我希望该过程尽可能干净地检查它们。拆分字符串并使用 DLookups 的脚本可能会变得非常混乱。 【参考方案1】:自定义函数打开位置记录集,循环记录并对条件表达式字符串执行替换操作,Eval() 函数计算新字符串,返回 True 或 False。
Function TestVal(sStr As String)
Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset("SELECT * FROM Positions")
Do While Not rs.EOF
sStr = Replace(sStr, rs!Position, rs![Value])
rs.MoveNext
Loop
Debug.Print sStr
TestVal = Eval(sStr)
End Function
可以在查询或文本框中调用函数。SELECT Conditions.*, TestVal([LeftSide] & [Operator] & [RightSide]) AS IsTrue FROM Conditions;
【讨论】:
这对我很有用。应该注意的是,该解决方案假定作为条件一部分的每个位置也具有值。如果不是这种情况,则 Eval 将中断。我可以通过为所有位置添加 0 值来解决这个问题。谢谢! 或者在查询表达式中使用 Nz() 或 IIf() 如果字段为空,则强制为 0。 或者在函数中处理可能的Null。不止一种方式...以上是关于跨数据库表中的行验证给定条件的主要内容,如果未能解决你的问题,请参考以下文章