Showing posts with label Form. Show all posts
Showing posts with label Form. Show all posts

Monday, January 23, 2023

pass marked records to another form in D365FO

[DataSource]
    class ActivityLogDetails
    {
        /// <summary>
        ///
        /// </summary>
        public void init()
        {
            super();

            if (element.args() && element.args().caller() && element.args().record())
            {
                this.query().dataSourceTable(tableNum(ActivityLogDetails)).clearDynalinks();
                helper= MultiSelectionHelper::createFromCaller(element.args().caller());
                helper.createQueryRanges(this.query().dataSourceTable(tablenum(ActivityLogDetails)),fieldstr(ActivityLogDetails, RecId));

                if (element.args().menuItemName() == menuItemDisplayStr(MarkSalesActivityLogReserved))
                {
                    activityLogStatus = ActivityLogStatus::Reserved;
                }
                else if (element.args().menuItemName() == menuItemDisplayStr(MarkSalesActivityLogRejected))
                {
                    activityLogStatus = ActivityLogStatus::Rejected;
                }
                else
                {
                    throw error("@SYS22996");
                }
            }
            else
            {
                throw error(Error::missingRecord(tableId2PName(tableNum(ActivityLogDetails))));
            }

            Ok.enabled(false);
        }

    }

Monday, April 12, 2021

Register override lookup in D365fo from form datasource

/// <summary>
/// Extension of the form 'SalesTable' data source 'SalesLine'.
/// </summary>
[ExtensionOf(formDataSourceStr(SalesTable, SalesLine))]
final class Sales_SalesTableForm_SalesLineDS_Extension
{
    /// <summary>
    /// COC construct to handle standard datasource init method
    /// </summary>
    /// <remarks>
    /// Method overriden to add custom logic
    /// </remarks>
    void init()
    {
        next init();

        this.m_Init();
    }

    /// <summary>
    /// COC Implementation for additional logic on init method
    /// </summary>
    void m_Init()
    {
        this.sm_ReasonCodeLookupRegisterOverride();
    }

    /// <summary>
    /// SM reason code lookup override method
    /// </summary>
    public void m_ReasonCodeLookupRegisterOverride()
    {
        FormDataSource salesLineDataSource = element.dataSource(formDataSourceStr(SalesTable, SalesLine)) as FormDataSource;
        SM_Sales_SalesTableFormRegisterMethods formRegisterMethods = new SM_Sales_SalesTableFormRegisterMethods();

        salesLineDataSource.object(fieldNum(SalesLine, SM_ReasonCode)).registerOverrideMethod(methodStr(FormDataObject, lookup),
                                methodStr(M_Sales_SalesTableFormRegisterMethods, lookupReasoncode ),
                                formRegisterMethods);
              
    }

}

/// <summary>
/// Form 'SalesTable', data source 'SalesLine' register override method implementation
/// </summary>
class Sales_SalesTableFormRegisterMethods
{
    /// <summary>
    /// Overrides <c>SM_Reasoncode</c> field lookup
    /// </summary>
    /// <param name = "_formStringControl">The control that is bound to the <c>SM_Reasoncode</c> field.</param>
    public void lookupReasoncode(FormStringControl _formStringControl)
    {
        FormRun formRun = _formStringControl.formRun();

        SalesTable salesTableLoc = formRun.dataSource(formDataSourceStr(SalesTable, SalesTable)).cursor() as SalesTable;

        SalesLine::m_lookupReasoncode(_formStringControl, salesTableLoc.DlvReason);
    }

}

/// <summary>
    /// Overrides <c>SM_Reasoncode</c> field lookup
    /// </summary>
    /// <param name = "_formStringControl">The control that is bound to the <c>SM_Reasoncode</c> field.</param>
    public static void lookupReasoncode(FormStringControl _formStringControl, DlvReasonId _dlvReason)
    {
        Query query = new Query();

        QueryBuildDataSource queryBuildDataSource = query.addDataSource(tableNum(ReasonTable));
        queryBuildDataSource.addSelectionField(fieldnum(ReasonTable, Reason));

        if (SM_CustParameters::find().ActivateReasonCode)
        {
            container conReasoncode;
            ReasonTable reasonTable;
            SM_DeliveryReasonReasonCodeCombination deliveryReasonReasonCodeCombination;

            while select ReasonCode from deliveryReasonReasonCodeCombination
                exists join reasonTable
                where reasonTable.Reason == deliveryReasonReasonCodeCombination.ReasonCode
                && deliveryReasonReasonCodeCombination.DlvReasonId == _dlvReason
                && reasonTable.SM_ActivateReasonCode == NoYes::Yes
            {
                conReasoncode += deliveryReasonReasonCodeCombination.ReasonCode;
            }

            str reasoncodes = conReasoncode != conNull() ? con2Str(conReasoncode) : SysQuery::valueEmptyString();

            queryBuildDataSource.addRange(fieldnum(ReasonTable, Reason)).value(reasoncodes);
        }
       
        SysTableLookup lookup = SysTableLookup::newParameters(tablenum(ReasonTable), _formStringControl);

        lookup.addLookupfield(fieldnum(ReasonTable, Reason));
        lookup.addLookupfield(fieldnum(ReasonTable, Description));

        lookup.parmQuery(query);
        lookup.performFormLookup();
    }

Sunday, April 11, 2021

Access public variables in extension class using chain of command

When you wrap a method, you can also access public and protected methods
and variables of the base class.
CustInvoiceJour is a base class variable hence you will be able to access it. Eg.

[ExtensionOf(classStr(SalesConfirmJournalCreate))]
Final class SalesConfirmJournalCreate_Extension
{
protected void createJournalHeader()
{
next createJournalHeader();
//It's as simple as this:
custConfirmJour.SalesBalance = 0;
}
if gets an error, It's an old bug with variable names. Declare new one and use it:
protected void createJournalHeader()
{
next createJournalHeader();
CustConfirmJour custConfirmJourLocal =
custConfirmJour;
custConfirmJourLocal.MyField = 'blah-blah';
}
}

How to refresh form datasource from Class or Table in D365fo

// If this is a data source on a form, then refresh from table in AX7 / D365.
if (FormDataUtil::isFormDataSource(this))
{
	FormDataUtil::getFormDataSource(this).refresh();
}


Refresh from data source from class in AX7 / D365
Table tableBuffer;
FormDataSource formDataSource;
tableBuffer = _args.record();
formDataSource = FormDataUtil::getFormDataSource(tableBuffer);
formDataSource.research();

Refresh from data source from class in AX7 / D365 from workflow
I just wrote couple of custom workflow. But on Submit workflow, form did not refresh and available for edit until, you manually refresh the form. That behavior is certainly not acceptable by end user.

usually _args.caller().updateWorkflowControls(); will do this. Possible I missed something. But for its solution I add following code snippet for data set refresh that works for me.

dssRfpTable tableBuffer = _args.record();
FormDataSource custInvoiceTableDataSource;
custInvoiceTableDataSource = FormDataUtil::getFormDataSource(tableBuffer);

 

if (custInvoiceTableDataSource)
{
custInvoiceTableDataSource.research(true);
custInvoiceTableDataSource.refresh();
}

How to open new form through code in AX

 /// <param name = "_sender">The AnswersButton control.</param>
    private void onAnswersButtonClicked(FormFunctionButtonControl _sender)
    {
        FormRun formRun = _sender.formRun();
        CaseDetail caseDetailBase_CaseDetail = formRun.dataSource(formDataSourceStr(CaseDetail, CaseDetailBase_CaseDetail)).cursor() as CaseDetail;
        Args answersButtonArgs = new Args();
        answersButtonArgs.caller(_sender);
        answersButtonArgs.record(KMVirtualNetworkAnswerTable::find(CaseDetailBase_CaseDetail.AnswerId));

        new MenuFunction(menuItemDisplayStr(KMKnowledgeCollectorResultAnswer), MenuItemType::Display).run(answersButtonArgs);
    }

Thursday, January 14, 2016

AX 2012: Refresh form by Code in AX


Refresh form by Code X++


     Add this code in form level

        #Task
        element.task(#taskF5);

Table browser URL in D365FO

Critical Thinking icon icon by Icons8