MS Access / VBA相同的代码相同的数据不同的结果

时间:2013-09-23 20:25:33

标签: vba ms-access-2007 ms-access-2010

这个让我难过但很好。在MS Access中使用VBA时,有时在针对同一个表运行相同代码时会得到不同的结果。我可以运行代码2,5,6,10次并获得相同的结果,然后再次运行它并获得不同的结果。我可以运行代码两次并获得相同的结果然后我可以运行代码两次并获得不同的结果 - 所有使用相同的代码对同一个表

该代码用于对旅行进行分组,以便正确计费。我这样做是通过获取原始SQL数据并将其放入Access表,然后通过几种排序和一些交叉检查,我在表的最后一个字段中用GR或ML标记访问表中的每个行程。结果集是指定时间范围内的所有行程,现在标记为:ML(多重载入),GR(分组)或空白(需求)。

我甚至尝试过放入MoveLast / MoveFirst以确保每次都满载表(根据其他人的建议)。

以下是在相同数据上运行2次相同代码后的代码和数据的链接: Code&Data

为了隐私问题,我删除了旅行ID和客户ID数据。旅行ID是唯一的,但客户端ID将被使用多次,具体取决于客户在该时间段内的旅行次数。

您可以提供的任何和所有帮助以使此代码生成相同的结果每次运行都是 GREATLY 赞赏。我不想回去手工贴上这个报告。这是每月必须完成两次的4中最小的一个。

谢谢!
David R. Mohr
.............. ...................................行结束............ .................................................. ..........

2 个答案:

答案 0 :(得分:2)

打开t_BillableTrips时,我认为假设数据按您想要的方式排序是不安全的。这可能会在不同的运行中发生变化。我建议使用具有显式排序顺序的查询,而不是直接打开表。我的第二个建议是使用Recordset Clone方法获取Intable2和Intable3。记录集将在内存数据中共享相同的底层,但可以定位在不同的记录中。

答案 1 :(得分:0)

首先,感谢所有给出答案的人。您的提示引导我找到解决方案。

第一个问题是我直接编辑了TABLE,而我的MAKE TABLE ORDER BY命令实际上是按照我指定的顺序创建了一个表 - 它只能在大部分时间工作而我们不能拥有

因此,在深入挖掘之后,我发现越来越多的证据表明尝试对实际表进行排序 - 特别是使用MAKE TABLE命令并不是一种好的做法,并且会产生不可预测的结果并产生更多的开销。我现在将我的定位和更新基于表的QUERY,而不是实际的表。 I.E.改变了这个:

Set InTable = dbsBilling.OpenRecordset("t_BillableTrips", dbOpenTable)
Set InTable2 = dbsBilling.OpenRecordset("t_BillableTrips", dbOpenTable)
Set InTable3 = dbsBilling.OpenRecordset("t_BillableTrips", dbOpenTable)
Set InTable4 = dbsBilling.OpenRecordset("t_BillableTrips", dbOpenTable)

到此:

Set InTable = dbsBilling.OpenRecordset("q_BillableTripsSort1B", dbOpenDynaset)
Set InTable2 = dbsBilling.OpenRecordset("q_BillableTripsSort1B", dbOpenDynaset)
Set InTable3 = dbsBilling.OpenRecordset("q_BillableTripsSort1B", dbOpenDynaset)
Set InTable4 = dbsBilling.OpenRecordset("q_BillableTripsSort1B", dbOpenDynaset)

到目前为止,这似乎解决了这个问题,当然,proc运行得更快,因为它不需要为两个不同的排序运行/更新两次创建表。