需要智能地在访问表上执行更新 . 需要专家VBA /智能思维 .
Table1 (For reference only)
CompanyCode Text
RegionCategory Number (1-99)
RegionCount Number(0 - 25000)
Table2
InvoiceNumber Number
CompanyCode Text
NumRows Number
RegionCode FourdigitNumber
ConfirmationRemark Y / N
我们的目标是在'确认备注'栏中加上是或否 . 规则:
1.仅选择那些从Table2和不同RegionCode中恰好有两行的InvoiceNumbers . 这些将具有相同的CompanyCode . RegionCategory是RegionCode的前两位数 .
2.对于这两个发票 - 两个RegionCategory之间的差异必须大于两个 .
3.LookUp来自Table1的RegionCount
决策:我们现在基本上将两个发票与不同的区域代码进行比较 . 想法是,具有较高RegionCount的Invoice是要标记为Yes的Invoice .
- RegionCount之间的差异必须相当大 . '相当' - 我试图确定什么是正确的数字 . 我们现在就拿500 .
2.具有较低区域计数的发票 - 应该具有RegionCount - 零(bestCase)或非常非常低 . 如果具有较低区域计数的发票具有> 200的较高RegionCount值,则我们无法成功结束 .
3.NumRows,优选为1或小于1 . 这种比较不是强制性的,因此我们将有一项规定不对此进行检查 . 将其他发票标记为“N”
1 回答
您有很多方法可以处理这种类型的复杂更新 .
如果幸运的话,您可以制作一个可以包含所有更改的SQL
UPDATE
语句,但通常需要使用SELECT
查询和自定义VBA的组合来根据计算或查找的结果过滤它们 . 其他数据 .一些提示
通常,我们倾向于根据'what are the steps to get to the data that match the criteria'来思考问题 .
但有时候,它有什么步骤才能获得与标准不匹配的数据' .
因为在您的情况下结果是boolean,true或false,您可以简单地将
ConfirmationRemark
字段设置为True
用于所有记录,然后更新那些应设置为False
的字段,而不是相反 .细分每一步(就像你一样)并尝试找到最简单的
SELECT
查询,该查询只返回该步骤所需的数据 . 如果步骤太复杂,请进一步分解 .将您细分的
SELECT
语句组合在一起,慢慢构建一个更符合您目标的更复杂的查询 .一旦你走得太远,要么构造一个
UPDATE Table2 SET ConfirmationRemark=True WHERE InvoiceNumber IN (SELECT InvoiceNumber ....)
,要么使用VBA来完成你的complextSELECT
语句的结果记录集,并在更新代码中的字段之前再做一些检查 .一些问题
不幸的是,尽管您努力记录您的情况,但我们没有足够的细节来帮助您:
你没有提到哪些是主键(从你说的话来看,似乎
Table2
可能有多个记录具有相同的InvoiceNumber
)您正在处理的数据类型并不明显 . 您应该包含一个数据样本,并确定哪些数据应该以
ConfirmationRemark
set结束 .你的问题实际上太局部化了,这意味着它太具体了你不能对别人有 Value ,虽然我认为如果只是为了展示一个如何处理复杂的例子,你的问题可能会引起一些关注Access中的数据更新 .