访问数据宏从查询中获取值(自动编号)
Access data macro get value from query (auto numbering)
我决定生成自己的编号,而不是在 Access 中使用自动编号(有时会产生重复编号)。
我正在使用数据宏 Before Change
,但我不确定如何 运行 查询 SELECT MAX(ID)+1 FROM MyTable
并将其插入到每个 [=12= 的 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
您只能在数据宏中使用非常有限的 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>
使用简单的数据宏和一个简单的 VBA 函数替换 Access Autonumber LongInt 数据类型(参见图像 x2)
Data Macro
VBA Code
我决定生成自己的编号,而不是在 Access 中使用自动编号(有时会产生重复编号)。
我正在使用数据宏 Before Change
,但我不确定如何 运行 查询 SELECT MAX(ID)+1 FROM MyTable
并将其插入到每个 [=12= 的 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
您只能在数据宏中使用非常有限的 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>
使用简单的数据宏和一个简单的 VBA 函数替换 Access Autonumber LongInt 数据类型(参见图像 x2)
Data Macro
VBA Code