基于智能比较的更新 - Access / VBA

时间:2013-03-26 14:16:25

标签: vba ms-access access-vba

需要智能地在访问表上执行更新。 需要专家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

决策: 我们现在基本上将两个发票与不同的RegionCodes进行比较。 想法是,具有较高RegionCount的Invoice是要标记为Yes的那个。

1. RegionCount之间的差异必须相当大。 '相当' - 我试图确定什么是正确的数字。我们现在就拿500。

2.具有较低区域计数的发票 - 应该具有RegionCount - 零(bestCase)或非常低。如果具有较低区域计数的发票具有较高的RegionCount值> 200,那我们就不能成功结束。

3.NumRows,优选为1或小于1。这种比较不是强制性的,因此我们将有一项规定不对此进行检查。将其他发票标记为“N”

1 个答案:

答案 0 :(得分:2)

您有很多方法可以处理这种类型的复杂更新。

如果幸运的话,您可以制作一个包含所有更改的SQL UPDATE语句,但通常需要使用SELECT个查询和自定义VBA的组合来根据计算结果或涉及其他数据的查找过滤它们。

一些提示

  • 通常,我们倾向于根据“获取符合条件的数据的步骤来考虑问题”。
    但有时候,更容易解决问题,而是问自己'获取与标准不符的数据的步骤是什么'。
    因为在您的情况下结果是布尔值,真或假,您可以简单地为所有记录设置ConfirmationRemark字段为True,然后更新应设置为False的字段,而不是反过来说。

  • 分解每个步骤(如您所做)并尝试找到最简单的SELECT查询,该查询将仅返回该步骤所需的数据。如果步骤太复杂,请进一步分解。

  • 将您细分的SELECT语句组合在一起,慢慢构建一个更符合您目标的更复杂的查询。

  • 一旦你走得太远,要么构造一个UPDATE Table2 SET ConfirmationRemark=True WHERE InvoiceNumber IN (SELECT InvoiceNumber ....),要么使用VBA来完成你的两个SELECT语句的结果记录集,然后再做一些检查。更新代码中的字段。

一些问题

不幸的是,尽管你努力记录你的情况,但我们没有足够的细节来帮助我们:

  • 您没有提到哪些是主键(根据您的说法,似乎Table2可能有多条记录具有相同的InvoiceNumber

  • 您正在处理的数据类型并不明显。您应该包含一个数据样本,并确定哪些数据最终应设置为ConfirmationRemark

  • 你的问题实际上太局部化了,这意味着它太具体了你不能对别人有价值,虽然我认为如果只是为了展示一个例子,你的问题可能会引起一些关注如何在Access中处理复杂的数据更新。