我决定使用自己的号码,而不是在Access中使用自动号码(有时会产生重复)。
我正在使用数据宏Before Change
,但不确定如何运行查询SELECT MAX(ID)+1 FROM MyTable
并将其插入每个Insert
的ID字段中。
我搞砸了SetField,SetLocalVar,LookUpRecord操作,但到目前为止还没有运气。
编辑:我已尝试按照示例在表达式中使用DMAX:https://www.599cd.com/tips/access/incrementing-your-own-counter/。当我手动添加一行时,此方法有效。但是,我从Excel VBA添加了行,此时该方法停止工作,并产生错误the function is not valid for expressions used in data macros
答案 0 :(得分:2)
您只能在数据宏中使用非常有限的SQL语句。不过,您可以使用查询。
创建一个查询(称为QueryA),然后输入SELECT MAX(ID)+1 As Expr1 FROM MyTable
作为SQL
然后,您可以使用具有以下结构的数据宏:
If [IsInsert] Then
Look Up A Record In QueryA
SetLocalVar
Name = NewID
Expression = [QueryA].[Expr1]
SetField
Name = ID
Value = NewID
以下是AXL:
<?xml version="1.0" encoding="UTF-8"?>
<DataMacros xmlns="http://schemas.microsoft.com/office/accessservices/2009/11/application">
<DataMacro Event="BeforeChange">
<Statements>
<ConditionalBlock>
<If>
<Condition>[IsInsert]</Condition>
<Statements>
<LookUpRecord>
<Data>
<Reference>QueryA</Reference>
</Data>
<Statements>
<Action Name="SetLocalVar">
<Argument Name="Name">NewID</Argument>
<Argument Name="Value">[QueryA].[Expr1]</Argument>
</Action>
</Statements>
</LookUpRecord>
<Action Name="SetField">
<Argument Name="Field">Field1</Argument>
<Argument Name="Value">[NewID]</Argument>
</Action>
</Statements>
</If>
</ConditionalBlock>
</Statements>
</DataMacro>
</DataMacros>
您不应在数据宏中使用VBA函数或域聚合,例如DMax
,也不应在查询中使用数据宏所依赖的域。如果这样做,则只能从正在运行的Access应用程序中触发它,因为这些仅在Access内部有效。
或者,您可以重写SQL语句以对数据宏有效。这意味着:没有聚合,没有计算!但是您可以使用排序来获取最大值:
If [IsInsert] Then
Look Up A Record In SELECT [MyTable].[ID] As [Expr1] FROM [MyTable] ORDER BY [MyTable].[ID] DESC
Alias A
SetLocalVar
Name = NewID
Expression = [A].[Expr1] + 1
SetField
Name = ID
Value = NewID
以下是AXL(使您更容易理解有限的SQL):
<?xml version="1.0" encoding="UTF-8"?>
<DataMacros xmlns="http://schemas.microsoft.com/office/accessservices/2009/11/application">
<DataMacro Event="BeforeChange">
<Statements>
<ConditionalBlock>
<If>
<Condition>[IsInsert]</Condition>
<Statements>
<LookUpRecord>
<Data Alias="A">
<Query>
<References>
<Reference Source="MyTable" />
</References>
<Results>
<Property Source="MyTable" Name="ID" Alias="Expr1" />
</Results>
<Ordering>
<Order Direction="Descending" Source="MyTable" Name="ID" />
</Ordering>
</Query>
</Data>
<Statements>
<Action Name="SetLocalVar">
<Argument Name="Name">NewID</Argument>
<Argument Name="Value">[A].[Expr1]+1</Argument>
</Action>
<Action Name="SetField">
<Argument Name="Field">Field1</Argument>
<Argument Name="Value">[NewID]</Argument>
</Action>
</Statements>
</LookUpRecord>
</Statements>
</If>
</ConditionalBlock>
</Statements>
</DataMacro>
</DataMacros>
答案 1 :(得分:0)