1

我决定生成自己的号码,而不是在 Access 中使用自动号码(有时会产生重复)。

我正在使用数据宏Before Change,但我不确定如何运行查询SELECT MAX(ID)+1 FROM MyTable并将其插入到每个Insert.

我已经搞砸了 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

4

2 回答 2

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>

您不应DMax在数据宏中或在数据宏所依赖的查询中使用 VBA 函数或域聚合。如果这样做,它只能从正在运行的 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>
于 2018-08-16T09:43:01.060 回答
0

使用简单的数据宏和一个简单的 VBA 函数替换 Access Autonumber LongInt 数据类型(参见图像 x2)

数据宏

VBA 代码

于 2019-01-12T05:22:11.097 回答