Continuing from my post How to: Create number sequence, today I show how to use number sequence on forms.
On AX 2012 we have a class called NumberSeqFormHandler which is used to simplify the usage of record numbering on forms. This is still valid for Dynamics 365 for Finance and Operations.
First of all, we are going to create a new extension class for CustGroup form and add the class NumberSeqFormHandler to its class declaration.
[ExtensionOf(formStr(CustGroup))] final class CustGroup_Extension { public NumberSeqFormHandler numberSeqFormHandler; }
Next we create a new method called numberSeqFormHandler() in the same class:
public NumberSeqFormHandler numberSeqFormHandler() { if(!numberSeqFormHandler) { numberSeqFormHandler = NumberSeqFormHandler::newForm( CustParameters::numRefCustGroupId().NumberSequenceId, this, this.CustGroup_ds, fieldNum(CustGroup, CustGroup)); } return numberSeqFormHandler; }
This method instantiates the object if it has not been instantiated yet and returns it.
Now, we are going to create a method for each NumberSeqFormHandler’s methods, each one correspond to a form event.
Image may be NSFW.
Clik here to view.
To create an Event Handler go to CustGroup form and go to form’s datasource, expand Events node, right click on desired event and select Copy event handler method and paste it on our class.
Image may be NSFW.
Clik here to view.
This is the result:
[ExtensionOf(formStr(CustGroup))] final class CustGroup_Extension { public NumberSeqFormHandler numberSeqFormHandler; public NumberSeqFormHandler numberSeqFormHandler() { if(!numberSeqFormHandler) { numberSeqFormHandler = NumberSeqFormHandler::newForm( CustParameters::numRefCustGroupId().NumberSequenceId, this, this.CustGroup_ds, fieldNum(CustGroup, CustGroup)); } return numberSeqFormHandler; } [FormDataSourceEventHandler(formDataSourceStr(CustGroup, CustGroup), FormDataSourceEventType::Creating)] public void CustGroup_OnCreating(FormDataSource sender, FormDataSourceEventArgs e) { } }
Now add the following code to our method:
this.numberSeqFormHandler().formMethodDataSourceCreatePre();
Now, repeat the above steps for the events OnCreated, OnDeleting, OnWritten, OnValidateWrite and OnClosing. The closing event belongs to form Event, not form datasource like the others.
At the end, this is the whole code for our class.
[ExtensionOf(formStr(CustGroup))] final class CustGroup_Extension { public NumberSeqFormHandler numberSeqFormHandler; public NumberSeqFormHandler numberSeqFormHandler() { if(!numberSeqFormHandler) { numberSeqFormHandler = NumberSeqFormHandler::newForm( CustParameters::numRefCustGroupId().NumberSequenceId, this, this.CustGroup_ds, fieldNum(CustGroup, CustGroup)); } return numberSeqFormHandler; } [FormDataSourceEventHandler(formDataSourceStr(CustGroup, CustGroup), FormDataSourceEventType::Creating)] public void CustGroup_OnCreating(FormDataSource sender, FormDataSourceEventArgs e) { this.numberSeqFormHandler().formMethodDataSourceCreatePre(); } [FormDataSourceEventHandler(formDataSourceStr(CustGroup, CustGroup), FormDataSourceEventType::Created)] public void CustGroup_OnCreated(FormDataSource sender, FormDataSourceEventArgs e) { this.numberSeqFormHandler().formMethodDataSourceCreate(); } [FormDataSourceEventHandler(formDataSourceStr(CustGroup, CustGroup), FormDataSourceEventType::Deleting)] public void CustGroup_OnDeleting(FormDataSource sender, FormDataSourceEventArgs e) { this.numberSeqFormHandler().formMethodDataSourceDelete(); } [FormDataSourceEventHandler(formDataSourceStr(CustGroup, CustGroup), FormDataSourceEventType::Written)] public void CustGroup_OnWritten(FormDataSource sender, FormDataSourceEventArgs e) { this.numberSeqFormHandler().formMethodDataSourceWrite(); } [FormDataSourceEventHandler(formDataSourceStr(CustGroup, CustGroup), FormDataSourceEventType::ValidatedWrite)] public void CustGroup_OnValidatedWrite(FormDataSource sender, FormDataSourceEventArgs e) { boolean ret = true; ret = this.numberSeqFormHandler().formMethodDataSourceValidateWrite(); } [FormEventHandler(formStr(CustGroup), FormEventType::Closing)] public void CustGroup_OnClosing(xFormRun sender, FormEventArgs e) { numberSeqFormHandler.formMethodClose(); } }
Now build the code, open Dynamics and go to Accounts Receivable/Setup/Account Groups. Create a new record and check if the Customer group ID was automatically filled.
Image may be NSFW.
Clik here to view.
Clik here to view.