Pre and Post Event Handlers in AX7 (Dynamics 365 for Operations)


Ref

http://dynamicsaxaptablog.blogspot.ae/2016/03/event-handlers-and-prepost-methods-ax7.html

https://devserra.wordpress.com/tag/ax7/

https://stoneridgesoftware.com/event-handler-methods-in-ax7/

i.e.

Set Default Value in Custom Check box

In Table Datasource Events --> right click on Init Value--> Copy Post Event Handlers

Create new Class and below code

Table Method Event Handler

class test_PurchTableEventHanlders
{
    /// <summary>
    ///
    /// </summary>
    /// <param name="args"></param>
    [PostHandlerFor(tableStr(PurchTable), tableMethodStr(PurchTable, initValue))]
    public static void PurchTable_Post_initValue(XppPrePostArgs args)
    {
        PurchTable purchTable = args.getThis() as PurchTable;
        purchTable.test_PrintNote=NoYes::Yes;
    }

}

Form Event Handler - CustTableFormEventHandler

class CustTableFormEventHandler
{
    [FormDataSourceEventHandler(formDataSourceStr(CustTable, CustTable), FormDataSourceEventType::Activated)]
    public static void CustTable_OnActivated(FormDataSource sender, FormDataSourceEventArgs e)
    {
        CustTable           custTable     = sender.cursor();
        FormDataSource      custTable_ds  = sender.formRun().dataSource("CustTable");
        FormRun             element       = sender.formRun();
        FormControl         myNewButton   = element.design(0).controlName("MyNewButton");

        myNewButton.enabled(false);
    }

}


Table Events Event Handler

/// <summary>
    ///
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    [DataEventHandler(tableStr(CustInvoiceTrans), DataEventType::Inserted)]
    public static void CustInvoiceTrans_onInserted(Common sender, DataEventArgs e)
    {
        ValidateEventArgs   event       = e as ValidateEventArgs;
        CustInvoiceTrans custInvoiceTrans=sender as CustInvoiceTrans;
        SalesTable salesTable=SalesTable::find(custInvoiceTrans.salesid);
        if(salesTable.SalesStatus==SalesStatus::Invoiced )
            {
       
         //code
            }

    }

Table Method's Post Event Handler (Table - SalesTable, method - updateBackStatus)

 /// <summary>
    ///
    /// </summary>
    /// <param name="args"></param>
    [PostHandlerFor(tableStr(SalesTable), tableMethodStr(SalesTable, updateBackStatus))]
    public static void SalesTable_Post_updateBackStatus(XppPrePostArgs args)
    {
        SalesTable salesTable=args.getThis();
 
        SalesTable salesTable=SalesTable::find(custInvoiceTrans.salesid);
        if(salesTable.SalesStatus==SalesStatus::Invoiced )
           {
                      //code
                }
    }

Form Control Event Handlers

https://stoneridgesoftware.com/event-handler-methods-in-ax7/

// <summary>
    ///
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    [FormControlEventHandler(formControlStr(SalesEditLines, OK), FormControlEventType::Clicked)]
    public static void OK_OnClicked(FormControl sender, FormControlEventArgs e)
    {
   
        FormCommandButtonControl  callerButton = sender as FormCommandButtonControl;  //Retrieves the button that we're reacting to
        FormRun form = callerButton.formRun(); //Gets the running SalesEditLines form

        //Get the salesId that was selected in the SalesEditLines form
        FormDataSource salesParmTable_ds = form.dataSource(formDataSourceStr(SalesEditLines, SalesParmTable)) as FormDataSource;
        SalesParmTable salesParmTable = salesParmTable_ds.cursor();

     

        SalesTable salesTable=salesParmTable.salesTable();

        if(salesTable.SalesStatus==SalesStatus::Invoiced)
        {
         //code

        }

    }

OnModified Event for String Control in Sales Table Form

/// <summary>
    ///
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    [FormControlEventHandler(formControlStr(SalesTable, Reason), FormControlEventType::Modified)]
    public static void Reason_OnModified(FormControl sender, FormControlEventArgs e)
    {
//Retrieves the string control that we're reacting to
        FormStringControl   str_Reason = sender as FormStringControl ;
        FormRun form = strReason.formRun();

OR
//Retrieves the string control that we're reacting to
        // FormControl Reason = element.design(0).controlName("Reason");

     
        //Get the salesId that was selected in the SalesEditLines form
        FormDataSource salesLine_ds = form.dataSource(formDataSourceStr(SalesTable, SalesLine)) as FormDataSource;
        SalesLine  salesline = salesLine_ds.cursor();
               
// do your logic

    }

Form Events Event Handler

Form SalesEditLines --> Events -->OnClosing

    /// <summary>
    ///
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    [FormEventHandler(formStr(SalesEditLines), FormEventType::Closing)]
    public static void SalesEditLines_OnClosing(xFormRun sender, FormEventArgs e)
    {
 
            //Retrieves the button that we're reacting to
        FormDataSource salesParmTable_ds= sender.dataSource("SalesParmTable"); //Gets the running SalesEditLines form

        //Get the salesId that was selected in the SalesEditLines form
        SalesParmTable salesParmTable = salesParmTable_ds.cursor();


        SalesTable salesTable=salesParmTable.salesTable();

            SalesId salesid=salesTable.SalesId;
            if(salesTable.SalesStatus==SalesStatus::Invoiced )
            {
//Any Code
            }

    }


Enable and Disable Form Control in Form Init Method in Form Extension Class based on Purch Parameters

[ExtensionOf(formStr(PurchTable))]
public final class S_PurchTableForm_Extension
{
 
    /// <summary>
    ///
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    [FormEventHandler(formStr(PurchTable), FormEventType::Initialized)]
    public static void PurchTable_OnInitialized(xFormRun sender, FormEventArgs e)
    {
        FormRun element = sender;
        FormControl S_SubPriceFieldsGrid = element.design(0).controlName("S_SubPriceFieldsGrid");
        S_SubPriceFieldsGrid.visible(PurchParameters::find().S_PriceFields); //
     
    }

}

Enable ReceiptDateRequested and ShippingDateRequested based on Sales Origin Id in Sales Header

If Sales Origin ID is EDI Then disable above both fields

Sales Table Form --> Events --> OnActivated

 ////</summary>
     ////<param name="sender"></param>
     ////<param name="e"></param>
    [FormDataSourceEventHandler(formDataSourceStr(SalesTable, SalesTable), FormDataSourceEventType::Activated)]
    public static void SalesTable_OnActivated(FormDataSource sender, FormDataSourceEventArgs e)
    {
        boolean     allowEdit = true;

     
        SalesTable           SalesTable     = sender.cursor();
        FormDataSource      salesTable_ds  = sender.formRun().dataSource("SalesTable");
        FormRun             element       = sender.formRun();
        FormControl         ReceiptDateRequested   = element.design(0).controlName("Delivery_ReceiptDateRequested");
        FormControl         ShippingDateRequested   = element.design(0).controlName("Delivery_ShippingDateRequested");
        FormControl         SalesOriginId   = element.design(0).controlName("Administration_SalesOriginId");

        if (SalesTable.SalesOriginId == "EDI")
        allowEdit = false;

        ShippingDateRequested.enabled(allowEdit);
        ReceiptDateRequested.enabled(allowEdit);
        SalesOriginId.enabled(allowEdit);

    }


Enable and Disable based on Sales Id Field value modifications.

Sales Table Form --> Data Sources --> Sales Table --> SalesOriginId --> Events --> OnModified

   ////<summary>

     ////</summary>
     ////<param name="sender"></param>
     ////<param name="e"></param>
    [FormDataFieldEventHandler(formDataFieldStr(SalesTable, SalesTable, SalesOriginId), FormDataFieldEventType::Modified)]
    public static void SalesOriginId_OnModified(FormDataObject sender, FormDataFieldEventArgs e)
    {

        boolean     allowEdit = true;
     
        FormDataSource      salesTable_ds  = sender.dataSource();
        SalesOriginId salesOriginId = sender.getValue(0);
   
        if (salesOriginId == "EDI")
        allowEdit = false;

        salesTable_ds.object(fieldNum(SalesTable, ReceiptDateRequested)).allowEdit(allowEdit);
        salesTable_ds.object(fieldNum(SalesTable, ShippingDateRequested)).allowEdit(allowEdit);
        sender.allowEdit(allowEdit);
   
    }


Reference


Post Event handler for Table CustInvoiceTrans and its method InitFromSalesLine


 /// <summary>
    ///
    /// </summary>
    /// <param name="args"></param>
    [PostHandlerFor(tableStr(CustInvoiceTrans), tableMethodStr(CustInvoiceTrans, initFromSalesLine))]
    public static void CustInvoiceTrans_Post_initFromSalesLine(XppPrePostArgs args)
    {
        CustInvoiceTrans        custInvoiceTrans    = args.getThis();
        SalesLine               salesLine           = args.getArg('salesLine');
        SalesParmLine _salesParmLine=  args.getArg('_salesParmLine');
     
      // Qty Calculation while creating Invoice
        custInvoiceTrans.Custommethodcalculate( _salesParmLine.DeliverNow );

          }


Getting Custom field value from Warehouse to PO Header when creating New PO.

POST Event Handler for PurchTable OnModifiedField Event.

  ////<summary>

     ////</summary>
     ////<param name="sender"></param>
     ////<param name="e"></param>
    [DataEventHandler(tableStr(PurchTable), DataEventType::ModifiedField)]
    public static void PurchTable_onModifiedField(Common sender, DataEventArgs e)
    {
        ModifyFieldEventArgs event          = e as  DataEventArgs;
        PurchTable           purchTable     = sender as PurchTable;
        FieldId              fieldid        = event.parmFieldId();

        switch(fieldid)
        {
            case fieldNum(PurchTable, InventLocationId):
         
               purchTable.aaId =  InventLocation::find(purchTable.InventLocationId).aacId;
                break;
        }

    }


Cost Price Validation while posting stock journals.

 [PostHandlerFor(tableStr(InventJournalTrans), tableMethodStr(InventJournalTrans, checkAmount))]
    public static void InventJournalTrans_Post_checkAmount(XppPrePostArgs args)
    {
        boolean ret = args.getReturnValue();
        InventJournalTrans  inventJournalTrans = args.getThis() as InventJournalTrans;
        if (InventJournalName::find(inventJournalTrans.Qty > 0 && inventJournalTrans.CostPrice == 0)
        {
            ret = checkFailed(strFmt("Cost Price is 0 for Line %1",inventJournalTrans.LineNum));
        }
        args.setReturnValue(ret);
    }

Form Sales Update Remain --> CloseOK Post Button

 [PostHandlerFor(formStr(SalesUpdateRemain), formMethodStr(SalesUpdateRemain, closeOk))]
    public static void SalesUpdateRemain_Post_closeOk(XppPrePostArgs args)
    {
        FormRun element = args.getThis();
        FormRun callerForm = element.args().caller();
        FormDataSource formDataSource = element.ObjectSet();
        SalesLine salesLine;
        FormRealControl   remainInventPhysical = element.design(0).controlName("RemainInventPhysical");

        if (callerForm && element.args().caller().name() == formStr(SalesTable))
        {
            salesLine = callerForm.dataSource(2).cursor() as SalesLine;
            //do your logic
        }


    }

Add new value for custom field in sales line via Sales Order Lines Data Entity (Pre Insert Entity )

 [PreHandlerFor(tableStr(SalesOrderLineEntity), tableMethodStr(SalesOrderLineEntity, insertEntityDataSource))]
    public static void SalesOrderLineEntity_Pre_insertEntityDataSource(XppPrePostArgs args)
    {
        DataEntityDataSourceRuntimeContext dataSourceCtx=args.getArgNum(2);
           
        switch (dataSourceCtx.name())
        {
            case dataEntityDataSourceStr(SalesOrderLineEntity, SalesLine):
                SalesLine salesLine = dataSourceCtx.getBuffer();
                salesLine.R_RefrigerationType  =  InventTable::find(salesLine.ItemId).R_RefrigerationType;
             
                break;
        }
    }


Validate Field

[PostHandlerFor(tableStr(VendTable), tableMethodStr(VendTable, validateField))]
    public static void VendTable_Post_validateField(XppPrePostArgs _args)
    {
        VendTable   vendTable   = _args.getThis();
        boolean     returnValue = _args.getReturnValue();

        _args.setReturnValue(vendTable.S_validateField(_args.getArg('p1')) && returnValue);

    }

 /// <param name="_fieldId">
    /// Field identifier
    /// </param>
    /// <returns>
    /// True if field validation is ok otherwise false
    /// </returns>
    public boolean S_validateField(FieldId _fieldId)
    {
        switch(_fieldId)
        {
          
            case fieldNum(VendTable, S_IsM):
            if (!this.S_IsManufacturer)
                {
                    return this.S_validateFieldM();
                }
                break;
        }

        return true;

    }

  // external item check
    private boolean S_validateFieldM()
    {
        boolean                     ret = true;
        S_VendExternalItem       vendExternalItem;
        CustVendExternalItem        custVendExternalItem;

        select firstOnly vendExternalItem
        where   vendExternalItem.VendAccount    == this.AccountNum;

        if (vendExternalItem)
        {
            select custVendExternalItem where custVendExternalItem.RecId == vendExternalItem.RefRecId;

            ret = checkFailed(strFmt("test", vendExternalItem.VendAccount, custVendExternalItem.ItemId));
        }

        return ret;

    }

Pre Event Handler 

[PreHandlerFor(tableStr(PurchLineHistory), tableMethodStr(PurchLineHistory, update))]
    public static void PurchLineHistory_Pre_update(XppPrePostArgs args)
    {
        PurchLine _purchline;
        PurchLineHistory _purchLineHistory= args.getThis();

        //select   _purchline where _purchline.InventRefId ==_purchLineHistory.InventRefId
        //     && _purchline.ItemId ==_purchLineHistory.ItemId ;

        //_purchline =PurchLine::findInventTransId(_purchLineHistory.InventRefId);

        _purchline=PurchLine::find(_purchLineHistory.PurchId,_purchLineHistory.LineNumber );

            _purchLineHistory.PriceDiscTableRefRecId =_purchline.PriceDiscTableRefRecId;
     


    }

FormDataSourceEventHandler

 /// <summary>
    ///
    /// </summary>
    /// <param name="sender"></param>
    ///// <param name="e"></param>
    [FormDataSourceEventHandler(formDataSourceStr(EcoResProductDetailsExtended, BUSInventTable), FormDataSourceEventType::Creating)]
    public static void  BUSInventTable_OnCreating(FormDataSource sender, FormDataSourceEventArgs e)
    {
      
        FormRun             element1       = sender.formRun();
        element1.numberSeqFormHandler().formMethodDataSourceCreatePre();
    }

    /// <summary>
    ///
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    [FormDataSourceEventHandler(formDataSourceStr(EcoResProductDetailsExtended, BUSInventTable), FormDataSourceEventType::Created)]
    public static void BUSInventTable_OnCreated(FormDataSource sender, FormDataSourceEventArgs e)
    {
        FormRun             element1       = sender.formRun();
        element1.numberSeqFormHandler().formMethodDataSourceCreate();
    }

    /// <summary>
    ///
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    [FormDataSourceEventHandler(formDataSourceStr(EcoResProductDetailsExtended, BUSInventTable), FormDataSourceEventType::Deleting)]
    public static void BUSInventTable_OnDeleting(FormDataSource sender, FormDataSourceEventArgs e)
    {
        FormRun             element1       = sender.formRun();
        element1.numberSeqFormHandler().formMethodDataSourceDelete();
    }

    /// <summary>
    ///
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    [FormDataSourceEventHandler(formDataSourceStr(EcoResProductDetailsExtended, BUSInventTable), FormDataSourceEventType::Written)]
    public static void BUSInventTable_OnWritten(FormDataSource sender, FormDataSourceEventArgs e)
    {
        FormRun             element1       = sender.formRun();
        element1.numberSeqFormHandler().formMethodDataSourceWrite();
    }

    /// <summary>
    ///
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    [FormDataSourceEventHandler(formDataSourceStr(EcoResProductDetailsExtended, BUSInventTable), FormDataSourceEventType::ValidatingWrite)]
    public static void BUSInventTable_OnValidatingWrite(FormDataSource sender, FormDataSourceEventArgs e)
    {
        FormRun             element1       = sender.formRun();
     //   element1.numberSeqFormHandler().formMethodDataSourceWrite();
        boolean ret = true;
        ret = element1.numberSeqFormHandler().formMethodDataSourceValidateWrite();

    }





Comments


  1. Nice Post...Thanks for sharing such valuable information I am also impressed by the creativity of the writer. This is excellent information. It is amazing and wonderful to visit your site . “ know the difference between pre-click and post click

    ReplyDelete
  2. I go to your blog from time to time and guidance it to the all out of individuals who needed to feature on happening their perception coming about to ease. The approach to forming is faultless and notwithstanding the substance material is finish score. appreciation for that knowledge you give the perusers!! Nord VPN Cracked

    ReplyDelete
  3. Kaspersky License Key likewise protect your programs from sticked substance by eliminate them enduringly. Kaspersky Total Security 2019 Key

    ReplyDelete
  4. Funny Cousin Quotes · Your cousin is the brother God knew your mother could not handle. · The craziness of your family is best understood by your cousins.. Frequently, Happy Cousins Day 2022

    ReplyDelete
  5. Site de loja virtual do MyShopify usando enganosamente layout da Magalu. Magazine Luiza - Loja Online · Reclamar dessa empresa. Rio de Janeiro - RJ.Myshopify.Com General Store

    ReplyDelete

Post a Comment