Saturday, December 29, 2018

Post handler for overriding table methods

Validate Write

[PostHandlerFor(tableStr(InventTable), tableMethodStr(InventTable, validateWrite))]
public static void InventTable_Post_validateWrite(XppPrePostArgs args)
{
      InventTable inventTable = args.getThis() as InventTable
      boolean ret = true;
      // Override the validations here and set the return value accordingly.
       Args.setReturnValue(ret);
}

modifiedField:-

[PostHandlerFor(tableStr(InventTable), tableMethodStr(InventTable, modifiedField))]
public static void InventTable_Post_modifiedField(XppPrePostArgs args)
{
        //Getting the table buffer
        InventTable inventTable = args.getThis() as InventTable
       //Getting the field id method argument.
        FieldId fieldModified = args.getArg("_fieldId");
        switch (fieldModified)
        {
            //Here you can write your logic on modified field method
                break;
        }

}

Post handler for class method

[PostHandlerFor(classStr(EcoResProductReleaseManager), methodStr(EcoResProductReleaseManager, release))]
public static void EcoResProductReleaseManager_Post_release(XppPrePostArgs args){
     EcoResProductReleaseManager releaseMgr;
    //Getting the class object
    releaseMgr     = args.getThis();
   //Getting the class parameter
   ItemId itemId  = releaseMgr.parmItemId();
   //Getting the method argument
    boolean itemCreation = args.getArg("_isCreation");
}

Control value and form event level for which auto declaration must be set true


[FormControlEventHandler(formControlStr(EcoResProductCreate, OKButton), FormControlEventType::Clicked)]
public static void OKButton_OnClicked(FormControl sender, FormControlEventArgs e)
{
       FormRun             element       = sender.formRun();
       //form control
       FormControl         modelGroupRef = element.design(0).controlName("ModelGroupId");
        Info(strfmt(“Model Group %1”, modelGroupRef.valueStr()));
       //form parameter
       ItemId              itemId        = element.parmItemId();
}

Form event handler Table Buffer on form closing event

[FormEventHandler(formStr(EcoResAttributeValue), FormEventType::Closing)]
public static void EcoResAttributeValue_OnClosing(xFormRun sender, FormEventArgs e)
{
     FormDataSource ecoResProduct_ds   =          sender.dataSource(formDataSourceStr(EcoResAttributeValue, EcoResProductAttributeValue));
      EcoResProductAttributeValue      ecoResAttributeValue = ecoResProduct_ds.cursor();

//Write your Code Here
} 

Form data source event handler

[FormDataSourceEventHandler(formDataSourceStr(EcoResProductDetailsExtended, InventTable), FormDataSourceEventType::Written)]
public static void InventTable_OnWritten(FormDataSource sender, FormDataSourceEventArgs e){
    FormRun                 form           = sender.formRun();
    FormDataSource          InventTable_ds =       form.dataSource(formDataSourceStr(EcoResProductDetailsExtended,InventTable)) as FormDataSource;
   InventTable             inventTable    = InventTable_ds.cursor();

// Write  your code Here
}

Form Level Event Handler In D365

"Form" methods, we can write  "Pre" and "Post" event handlers for the existing/new/override methods. For the Form > Init() methods we can write the "Pre" and "Post" event handler.
 Create a new class for event handler and add the "Pre" or "Post" methods

[PostHandlerFor(formStr(LedgerJournalTransCustPaym), formMethodStr(LedgerJournalTransCustPaym, init))]
public static void LedgerJournalTransCustPaym_Post_init(XppPrePostArgs args)
{
        info("Write Your Code Here");
     
}

Event Handler on form in datasource Level in D365

Form > Data source > Field level event handler methods can be written.

 form data source > fields level event > OnModified methods in the "LedgerJournalTransCustPaym" standard form.
1. Open the Form > LedgerJournalTransCustPaym > Data Source (LedgerJournalTrans) > Fields(UnitId) is the custom field added to LedgerJournalTrans - Events (expand the events node).
2. Right click on the OnModified > copy the event handler method. Below is the screenshot.

When modifying the custom field “UnitId” field in the form level, the Vend account (custom field added in the LedgerJournalTrans table) values needs to fetched basing on the UnitId modified.
In the same way basing on the requirement - “OnModified” event handler can be implemented on the form data source > field level event handler.

 /// <summary>
    /// Unitid  Onmodified event.
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    [FormDataFieldEventHandler(formDataFieldStr(LedgerJournalTransCustPaym, LedgerJournalTrans, UnitId), FormDataFieldEventType::Modified)]
    public static void UnitId_OnModified(FormDataObject sender, FormDataFieldEventArgs e)
    {
        FormDataSource          ledgerJournalTrans_ds   = sender.datasource();
        LedgerJournalTrans      ledgerJournalTrans      = ledgerJournalTrans_ds.cursor();
      
// Write Your Code Here.....................
    }