访问数据宏从查询中获取值(自动编号)

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