如何使用 .AfterUpdate 数据宏更新同一 table 中的多条记录而不会出错 "A data macro resource limit was hit."
How to update multiple records in same table using .AfterUpdate data macro without error "A data macro resource limit was hit."
我有一个 table tblItems,其中包含库存项目列表。 table 有很多列来描述这些项目,包括 SupplierName、SupplierOrderNumber 和 PredictedArrivalDate 的列。
如果我从供应商处订购了多件新商品,我会在 table 中分别记录每件商品,并使用相同的供应商名称、订单号和预计到货日期。
我想添加一个数据宏,这样如果我更新一条记录的 PredictedArrivalDate,该值将被复制到具有相同 SupplierName AND SupplierOrderNumber 的其他 records/items 的 PredictedArrivalDate 列。
我得到的最接近的是:
SetLocalVar (MySupplierName, [SupplierName])
SetLocalVar (MySupplierOrderNumber , [SupplierOrderNumber ])
SetLocalVar (MyPredictedArrivalDate, [PredictedArrivalDate])
For Each Record in tblItems
Where Condition = [SupplierOrderNumber] Like [MySupplierOrderNumber] And [SupplierName] Like [MySupplierName] And [PredictedArrivalDate]<>[MyPredictedArrivalDate]
Alias OtherRecords
EditRecord
SetField ([OtherRecords].[PredictedArrivalDate], [MyPredictedArrivalDate])
End EditRecord
但是我运行这个时候,只更新了5条记录,而且错误日志报错-20341:
"A data macro resource limit was hit. This may be caused by a data
macro recursively calling itself. The Updated() function may be
used to detect which field in a record has been updated to help
prevent recursive calls."
我怎样才能让它工作?
我不喜欢使用宏来做任何事情,所以我会使用 VBA 和 recordsets/an 操作查询来进行更新。
您可以通过将局部变量设置为等于其结果来调用数据宏内的用户定义函数。
Access 不喜欢数据宏自行触发(您正在这样做,您正在使用更新宏并在不同记录的同一 table 中更新字段),因为存在风险不小心创建无限循环。看起来你触发了一项旨在防止这种情况的措施。我会尽量避免这种情况。
注意:当您从 Access 外部(例如通过 ODBC)链接到 table 时,在数据宏中使用用户定义的函数可能会导致问题。
这不是一个好的解决方案(它不是数据宏),但它确实可以作为临时修复。
我创建了一个名为 "updatePredictedArrivalDate" 的更新查询:
PARAMETERS
ItemID Long,
MyPredictedArrivalDate DateTime,
MySupplierName Text ( 255 ),
MySupplierOrderNumber Text ( 255 );
UPDATE tblItems
SET tblItems.PredictedArrivalDate = [MyPredictedArrivalDate]
WHERE (((tblItems.SupplierName) = [MySupplierName])
AND ((tblItems.SupplierOrderNumber) = [MySupplierOrderNumber])
AND ((tblItems.ID) <> [ItemID]));
在 PredictedArrivalDate 表单字段 .AfterUpdate 事件中,我添加了这个宏:
IF [PredictedArrivalDate].[OldValue]<>[PredictedArrivalDate] Or [PredictedArrivalDate]<>""
OpenQuery (updatePredictedArrivalDate, Datasheet, Edit, [ID], [PredictedArrivalDate], [SupplierName], [SupplierOrderNumber])
我现在必须记住将此 .AfterUpdate 事件添加到我创建的任何其他修改该特定字段的表单中。
如果谁有更好的解决办法,请告诉我。
我有一个 table tblItems,其中包含库存项目列表。 table 有很多列来描述这些项目,包括 SupplierName、SupplierOrderNumber 和 PredictedArrivalDate 的列。
如果我从供应商处订购了多件新商品,我会在 table 中分别记录每件商品,并使用相同的供应商名称、订单号和预计到货日期。
我想添加一个数据宏,这样如果我更新一条记录的 PredictedArrivalDate,该值将被复制到具有相同 SupplierName AND SupplierOrderNumber 的其他 records/items 的 PredictedArrivalDate 列。
我得到的最接近的是:
SetLocalVar (MySupplierName, [SupplierName])
SetLocalVar (MySupplierOrderNumber , [SupplierOrderNumber ])
SetLocalVar (MyPredictedArrivalDate, [PredictedArrivalDate])
For Each Record in tblItems
Where Condition = [SupplierOrderNumber] Like [MySupplierOrderNumber] And [SupplierName] Like [MySupplierName] And [PredictedArrivalDate]<>[MyPredictedArrivalDate]
Alias OtherRecords
EditRecord
SetField ([OtherRecords].[PredictedArrivalDate], [MyPredictedArrivalDate])
End EditRecord
但是我运行这个时候,只更新了5条记录,而且错误日志报错-20341:
"A data macro resource limit was hit. This may be caused by a data macro recursively calling itself. The Updated() function may be used to detect which field in a record has been updated to help prevent recursive calls."
我怎样才能让它工作?
我不喜欢使用宏来做任何事情,所以我会使用 VBA 和 recordsets/an 操作查询来进行更新。
您可以通过将局部变量设置为等于其结果来调用数据宏内的用户定义函数。
Access 不喜欢数据宏自行触发(您正在这样做,您正在使用更新宏并在不同记录的同一 table 中更新字段),因为存在风险不小心创建无限循环。看起来你触发了一项旨在防止这种情况的措施。我会尽量避免这种情况。
注意:当您从 Access 外部(例如通过 ODBC)链接到 table 时,在数据宏中使用用户定义的函数可能会导致问题。
这不是一个好的解决方案(它不是数据宏),但它确实可以作为临时修复。
我创建了一个名为 "updatePredictedArrivalDate" 的更新查询:
PARAMETERS
ItemID Long,
MyPredictedArrivalDate DateTime,
MySupplierName Text ( 255 ),
MySupplierOrderNumber Text ( 255 );
UPDATE tblItems
SET tblItems.PredictedArrivalDate = [MyPredictedArrivalDate]
WHERE (((tblItems.SupplierName) = [MySupplierName])
AND ((tblItems.SupplierOrderNumber) = [MySupplierOrderNumber])
AND ((tblItems.ID) <> [ItemID]));
在 PredictedArrivalDate 表单字段 .AfterUpdate 事件中,我添加了这个宏:
IF [PredictedArrivalDate].[OldValue]<>[PredictedArrivalDate] Or [PredictedArrivalDate]<>""
OpenQuery (updatePredictedArrivalDate, Datasheet, Edit, [ID], [PredictedArrivalDate], [SupplierName], [SupplierOrderNumber])
我现在必须记住将此 .AfterUpdate 事件添加到我创建的任何其他修改该特定字段的表单中。
如果谁有更好的解决办法,请告诉我。