0

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

我们的目标是在“ConfirmationRemark”栏中填写是或否。规则:

1.仅选择那些从 Table2 中恰好有两行和不同 RegionCode 的 InvoiceNumbers。这些将具有相同的公司代码。RegionCategory 是 RegionCode 的前两位。

2.对于这两个 Invoices - 两个 RegionCategory 之间的差异必须大于两个。

3.查找 RegionCount ,来自 Table1

决策制定:我们现在基本上是在比较两张具有不同 RegionCode 的发票。想法是,具有较高 RegionCount 的 Invoice 将被标记为 Yes。

1.RegionCount之间的差异一定是相当大的。'相当大' - 我正在尝试确定正确的数字。让我们暂时取500。

2. 区域计数较低的发票 - 区域计数应为零(最佳情况)或非常非常低。如果 Region Count 较低的 Invoice 具有较高的 RegionCount 值 > 200 ,则我们无法成功结束。

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

4

1 回答 1

2

你有很多方法来处理这种复杂的更新。

如果幸运的话,您可能能够编写一个UPDATE包含所有更改的 SQL 语句,但通常您必须结合使用SELECT查询和自定义 VBA 来根据计算结果或涉及其他数据的查找来过滤它们.

一些提示

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

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

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

  • 一旦你尽你所能,构造一个UPDATE Table2 SET ConfirmationRemark=True WHERE InvoiceNumber IN (SELECT InvoiceNumber ....)或使用 VBA 来检查你的 complextSELECT语句的结果记录集,并在更新代码中的字段之前做一些更多的检查。

一些问题

不幸的是,尽管您努力记录您的情况,但没有足够的细节让我们真正提供帮助:

  • 您没有提及哪些是主键(从您所说的来看,似乎Table2可能有多个相同的记录InvoiceNumber

  • 您正在处理的数据类型并不明显。您应该包含一个数据样本,并确定哪些数据应该以ConfirmationRemark集合结束。

  • 你的问题真的太本地化了,这意味着它对你来说太具体了,对其他人没有价值,尽管我认为你的问题可能会更详细一些,如果只是为了展示如何处理复杂数据的例子Access 中的更新。

于 2013-03-31T10:14:11.763 回答