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

时间:2018-08-16 09:31:50

标签: ms-access ms-access-2010 ms-access-data-macro

我决定使用自己的号码,而不是在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

2 个答案:

答案 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)

使用简单的数据宏和一个简单的VBA函数替换访问自动编号LongInt数据类型(请参见图x2)

Data Macro

VBA Code

相关问题