Dynamics 365 FO学习笔记

雨燕双飞 提交于 2019-12-03 13:45:46

 

D365FO官方Wiki:

https://docs.microsoft.com/en-us/dynamics365/unified-operations/fin-and-ops/

 

1. 窗体控件不再支持Active X 控件和ManagedHost控件,取而代之的是一种可扩展的控件架构。

2. 获得窗体的DataSource

[FormEventHandler(formStr(HcmPosition), FormEventType::Initialized)]
        public static void HcmPosition_OnInitialized(xFormRun sender, FormEventArgs e)
        {

            FormDataSource hcmosition_ds = sender.dataSource(formDataSourceStr(HcmPosition, HcmPosition));
 Or 
FormDataSource                              hcmosition_ds = sender.dataSource('HcmPosition');
        }

 

3. FormDataSource的EventHandler获得FormRun

 

[FormDataSourceEventHandler(formDataSourceStr(HcmPosition, HcmPosition), FormDataSourceEventType::Created)]
        public static void HcmPosition_OnCreated(FormDataSource sender, FormDataSourceEventArgs e)
        {

            FormRun formRun = sender.formRun() as FormRun;
            
        }

 

4. 通过FormControl的EventHandler获得FormRun

 

[FormControlEventHandler(formControlStr(HcmPosition, HcmPosition_PositionId1), FormControlEventType::Modified)]
        public static void HcmPosition_PositionId1_OnModified(FormControl sender, FormControlEventArgs e)
        {
            FormRun formRun = sender.formRun() as FormRun;

        }

 

5. 获得窗体上的FormControl

 
 
[FormEventHandler(formStr(HcmPosition), FormEventType::Initialized)]
        public static void HcmPosition_OnInitialized(xFormRun sender, FormEventArgs e)
        {
            sender.design().controlName(formControlStr(HcmPosition, HcmPositionNewPosition)).AllowEdit(false);
            // to get form open Mode
            OpenMode                                    openMode = sender.args().openMode();
        }

 

6. 获得Current Record

 

 

[FormControlEventHandler(formControlStr(HcmPosition, HcmPositionNewPosition), FormControlEventType::Clicked)] public static void HcmPositionNewPosition_OnClicked(FormControl sender, FormControlEventArgs e) { HcmPosition hcmposition = sender.formRun().dataSource(1).cursor();

            HcmPosition hcmposition = sender.args().record(); }

 

7. 使用DataEventArgs发送验证结果

[DataEventHandler(tableStr(CategoryTable), DataEventType::ValidatingDelete)]
    public static void CategoryTable_onValidatingDelete(Common _sender, DataEventArgs _e)
    {
        CategoryTable categoryTable = _sender as CategoryTable;
        ValidateEventArgs validateEventArgs = _e as ValidateEventArgs;
        boolean ret = true;

        if (categoryTable.UseInProject)
        {
            ProjCategory projCategory = ProjCategory::find(categoryTable.CategoryId);
            ret = projCategory.validateDelete();
        }

        if (ret && categoryTable.UseInExpense)
        {
            TrvCostType trvCostType = TrvCostType::find(categoryTable.CategoryId);
            ret = trvCostType.validateDelete();
        }
        
        if (!ret)
        {
            validateEventArgs.parmValidateResult(false);
        }
    }

 

8. 用 ValidateFieldValueEventArgs 发送验证结果给Validate Field method

 

[DataEventHandler(tableStr(LedgerParameters), DataEventType::ValidatingFieldValue)]
    public static void LedgerParameters_onValidatingFieldValue(Common sender, DataEventArgs e)
    {
        ValidateFieldValueEventArgs ve = e;
        boolean isValid = true;
        LedgerParameters ledgerParameters = sender as LedgerParameters;
        #isoCountryRegionCodes
        
        if (ve.parmFieldName() == fieldStr(LedgerParameters, ChineseVoucher_CN) 
            && SysCountryRegionCode::isLegalEntityInCountryRegion([#isoCN]))
        {
            if ((select firstonly RecId from LedgerJournalTrans
                    where LedgerJournalTrans.LedgerVoucherType_CN != 0
                        || LedgerJournalTrans.Voucher_CN != '').RecId != 0)
            {
                // The general journal needs to be empty in order to modify the setup for the Chinese voucher system.
                isValid = checkFailed("@GLS54497");
            }
            ve.parmValidateResult(isValid);
        }
        
    }

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();

}

 

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();

}   

 

 

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();

}

 

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");

}

 

Post handler for overriding table methods modified field and 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);

}

 

[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;

        }

}

窗体内的方法

[ExtensionOf(formStr(PurchTable))]
final class RIC_PurchTable_Extension
{
    /// <summary>
    ///
    /// </summary>
    /// <param name="args"></param>
    [PostHandlerFor(formStr(PurchTable), formMethodStr(PurchTable, updateControlsForFrenchConfirmedPO))]
    public static void PurchTable_Post_updateControlsForFrenchConfirmedPO(XppPrePostArgs args)
    {
        FormRun sender = args.getThis();
        FormDataSource purchTable_DS;
        PurchTable purchTable;
        boolean canEnable;
        if (PublicSectorUtils::isFrenchRegulatoryEnabled())
        {
            purchTable_DS = sender.dataSource(formDataSourceStr(PurchTable, PurchTable));
            purchTable = purchTable_DS.cursor();
            canEnable = purchTable.canModifyPurchaseOrder();
            purchLine_PurchPriceGrid.allowEdit(canEnable);
        }
    }

}

Override Form DataSource method using Extensions in D3fO

[FormDataSourceEventHandler(formDataSourceStr(SalesTable, SalesLine), FormDataSourceEventType::Activated)] public static void SalesLine_OnActivated(FormDataSource sender, FormDataSourceEventArgs e) {              FormDataSource      fds = sender.formRun().dataSource("SalesLine");         SalesLine           salesline = fds.cursor();         FormRun             fr = sender.formRun();         FormControl         fc = fr.design(0).controlName("CreateServiceOrder");                if(salesLine.ProjID)         {             fc.enabled(true);         }         else         {             fc.enabled(false);         }     }

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!