Create sequential ID value based on the year that a record is added

With Access versions 2010 and later you can use an event-driven data macro to generate the sequential ID. For example, say you have a table named [poledata]. Open it in Design View and add two fields:

alternate_id_seq  –  Numeric (Long Integer)
alternate_id  –  Text(20)

Save the changes to your table and then switch to Datasheet View.

In the Access ribbon, switch to the “Table Tools > Table” tab and click “Before Change”

Ribbon.png

then enter the following macro …

BeforeChange.png

… or paste the following XML into the macro editor window

<?xml version="1.0" encoding="utf-16" standalone="no"?>
<DataMacros xmlns="http://schemas.microsoft.com/office/accessservices/2009/11/application">
    <DataMacro Event="BeforeChange">
        <Statements>
            <ConditionalBlock>
                <If>
                    <Condition>[IsInsert]</Condition>
                    <Statements>
                        <Action Name="SetLocalVar">
                            <Argument Name="Name">next_seq</Argument>
                            <Argument Name="Value">1</Argument>
                        </Action>
                        <Action Name="SetLocalVar">
                            <Argument Name="Name">prefix</Argument>
                            <Argument Name="Value">&quot;SAC&quot; &amp; Year(Date()) Mod 100 &amp; &quot;-&quot;</Argument>
                        </Action>
                        <LookUpRecord>
                            <Data Alias="pd">
                                <Query>
                                    <References>
                                        <Reference Source="poledata" Alias="pd" />
                                    </References>
                                    <Results>
                                        <Property Source="pd" Name="alternate_id_seq" />
                                    </Results>
                                    <Ordering>
                                        <Order Direction="Descending" Source="pd" Name="alternate_id_seq" />
                                    </Ordering>
                                </Query>
                                <WhereCondition>[pd].[alternate_id] Like [prefix] &amp; &quot;*&quot;</WhereCondition>
                            </Data>
                            <Statements>
                                <Action Name="SetLocalVar">
                                    <Argument Name="Name">next_seq</Argument>
                                    <Argument Name="Value">[pd].[alternate_id_seq]+1</Argument>
                                </Action>
                            </Statements>
                        </LookUpRecord>
                        <Action Name="SetField">
                            <Argument Name="Field">alternate_id_seq</Argument>
                            <Argument Name="Value">[next_seq]</Argument>
                        </Action>
                        <Action Name="SetField">
                            <Argument Name="Field">alternate_id</Argument>
                            <Argument Name="Value">[prefix] &amp; [next_seq]</Argument>
                        </Action>
                    </Statements>
                </If>
            </ConditionalBlock>
        </Statements>
    </DataMacro>
</DataMacros>

Now when new rows are added to the table the [alternate_id_seq] and [alternate_id] columns will be populated automatically.

Datasheet.png

Leave a Comment