Thursday, April 29, 2021

Dynamically FORM CONTROLS - Generate FormDataSource fields on FORM based on setup and sequence in D365FO

Form Method:

Init -> method

    public void init()

    {

 

        DictTable                   dictTable;

        FormBuildDataSource         fds;

        FormBuildDesign             formBuildDesign;

 

        #DEFINE.FormWidth(500)

        #DEFINE.FormHeight(300)

 

        this.dictTable = new DictTable(tableNum(<TableName>));

 

        this.fds = this.form().dataSource(formDataSourceStr(<FormName>,<TableName>));

 

        formBuildDesign = this.form().design();

        formBuildDesign.widthMode(-1);

        formBuildDesign.widthValue(#FormWidth);

        formBuildDesign.heightMode(-1);

        formBuildDesign.heightValue(#FormHeight);

 

 FormBuildGroupControl  tabGroupCtrl = formBuildDesign.control(‘GroupName’);

        tabGroupCtrl.dataSource(fds.id());

        tabGroupCtrl.allowEdit(true);

        tabGroupCtrl.hideIfEmpty(false);

 

        //We can loop it as well, if requires for all fields

        this.addField(dictTable.id(), fieldName2Id(dictTable.id(), configFields.FieldName), fds, tabGroupCtrl, true);

 

        super(); //All build control should generate before init super call

    }

Addfield -> method

protected void addField(tableId _tableId,

        fieldId _fieldId,

        FormBuildDataSource _formBuildDataSource,

        FormBuildGroupControl _formBuildGroupControl,

        boolean _allowControlEdit)

    {

        FormBuildStringControl formBuildStringControl;

        FormBuildInt64Control formBuildInt64Control;

        FormBuildIntControl formBuildIntControl;

        FormBuildComboBoxControl formBuildComboBoxControl;

        FormBuildCheckBoxControl formBuildCheckBoxControl;

        FormBuildTimeControl formBuildTimeControl;

        FormBuildDateControl formBuildDateControl;

        FormBuildGuidControl formBuildGuidControl;

        FormBuildDateTimeControl formBuildDateTimeControl;

        FormBuildRealControl formBuildRealControl;

        FormBuildSegmentedEntryControl formBuildSegmentedEntryControl;

        FormBuildReferenceGroupControl formBuildReferenceGroupControl;

 

        FormBuildControl formBuildControl;

       

        SysDictField dictField;

        int j;

        tableId rootTableId;

        str controlName;

        UtilElementName utilElmName;

        Types baseType;

 

        dictField = new SysDictField(_tableId, _fieldId);

        if(dictField.isSystem())

        {

            //System fields are only stored on the root table, so get the information from there.

            rootTableId = SysDictTable::getRootTable(_tableId);

            dictField = new SysDictField(rootTableId, _fieldId);

        }

 

        if (dictField.saveContents())

        {

            for(j = 1;j <= dictField.arraySize(); j++)

            {

                formBuildControl = null;

 

                controlName = strfmt('%1_%2', dictField.name(), j);

                baseType = dictField.baseType();

                utilElmName = dictField.typeName();

 

                switch (baseType)

                {

                    case Types::String:

                    case Types::RString:

                    case Types::VarString:

                        formBuildStringControl = _formBuildGroupControl.addDataField(_formBuildDataSource.id(), _fieldId, j);

                        formBuildStringControl.autoDeclaration(true);

                        formBuildStringControl.label(dictField.name());

 

                        formBuildStringControl.displayHeightMode(0);

                        formBuildStringControl.displayHeightValue(1);

 

                        formBuildControl = formBuildStringControl;

                        break;

 

                    case Types::Integer:

 

                        if (Global::isTypeTime(utilElmName))

                        {

                            formBuildTimeControl = _formBuildGroupControl.addDataField(_formBuildDataSource.id(), _fieldId, j);

                            formBuildTimeControl.autoDeclaration(true);

                            formBuildTimeControl.label(dictField.name());

 

                            formBuildControl = formBuildTimeControl;

                        }

                        else

                        {

                            formBuildIntControl = _formBuildGroupControl.addDataField(_formBuildDataSource.id(), _fieldId, j);

                            formBuildIntControl.autoDeclaration(true);

                            formBuildIntControl.label(dictField.name());

 

                            formBuildControl = formBuildIntControl;

                        }

                        break;

 

                    case Types::Int64:

                        // Reference Controls are created by default for surrogate foreign keys. However, the raw 64-bit

                        // integer should always be displayed. Force all Int64 type fields to use an Int64 Control.

                        formBuildControl = _formBuildGroupControl.addDataField(_formBuildDataSource.id(), _fieldId, j);

 

                        formBuildInt64Control = formBuildControl as formBuildInt64Control;

                        if (formBuildInt64Control != null)

                        {

                            formBuildInt64Control.autoDeclaration(true);

                            formBuildInt64Control.label(dictField.name());

                           

                            formBuildControl = formBuildInt64Control;

                        }

                        else

                        {

                            formBuildReferenceGroupControl = formbuildControl as FormBuildReferenceGroupControl;

                            if (formBuildReferenceGroupControl != null)

                            {

                                formBuildReferenceGroupControl.autoDeclaration(true);

                                formBuildReferenceGroupControl.label(dictField.name());

 

                                formBuildControl = formBuildReferenceGroupControl;

                            }

                            else

                            {

                                formBuildSegmentedEntryControl = formBuildControl as formBuildSegmentedEntryControl;

                                if (formBuildSegmentedEntryControl != null)

                                {

                                    formBuildSegmentedEntryControl.autoDeclaration(true);

                                    formBuildSegmentedEntryControl.label(dictField.name());

 

                                    formBuildControl = formBuildSegmentedEntryControl;

                                }

                            }

                        }

 

                        break;

 

                    case Types::Enum:

                        formBuildControl = _formBuildGroupControl.addDataField(_formBuildDataSource.id(), _fieldId, j);

 

                        formBuildComboBoxControl = formBuildControl as formBuildComboBoxControl;

                        if (formBuildComboBoxControl != null)

                        {

                            formBuildComboBoxControl.autoDeclaration(true);

                            formBuildComboBoxControl.label(dictField.name());

 

                            formBuildControl = formBuildComboBoxControl;

                        }

                        else

                        {

                            formBuildCheckBoxControl = formBuildControl as FormBuildCheckBoxControl;

                            if (formBuildCheckBoxControl != null)

                            {

                                formBuildCheckBoxControl.autoDeclaration(true);

                                formBuildCheckBoxControl.label(dictField.name());

 

                                formBuildControl = formBuildCheckBoxControl;

                            }

                        }

 

                        break;

 

                    case Types::Real:

                        formBuildRealControl = _formBuildGroupControl.addDataField(_formBuildDataSource.id(), _fieldId, j);

                        formBuildRealControl.autoDeclaration(true);

                        formBuildRealControl.label(dictField.name());

                       

                        formBuildControl = formBuildComboBoxControl;

 

                        break;

 

                    case Types::Guid:

                        formBuildGuidControl = _formBuildGroupControl.addDataField(_formBuildDataSource.id(), _fieldId, j);

                        formBuildGuidControl.autoDeclaration(true);

                        formBuildGuidControl.label(dictField.name());

 

                        formBuildControl = formBuildGuidControl;

 

                        break;

 

                    case Types::Date:

                        formBuildDateControl = _formBuildGroupControl.addDataField(_formBuildDataSource.id(), _fieldId, j);

                        formBuildDateControl.autoDeclaration(true);

                        formBuildDateControl.label(dictField.name());

                      

                        formBuildControl = formBuildDateControl;

                       

                        break;

 

                    case Types::UtcDateTime:

                        formBuildDateTimeControl = _formBuildGroupControl.addDataField(_formBuildDataSource.id(), _fieldId, j);

                        formBuildDateTimeControl.autoDeclaration(true);

                        formBuildDateTimeControl.label(dictField.name());

 

                        formBuildControl = formBuildDateTimeControl;

 

                        break;

                }

 

 

                if (formbuildControl != null)

                {

                    formbuildControl.name(controlName);

                    formbuildControl.helpText(dictField.label());

 

                    formBuildSegmentedEntryControl = formBuildControl as FormBuildSegmentedEntryControl;

                    if (formBuildSegmentedEntryControl != null)

                    {

                        // Segmented Entry controls should never be editable in the Table Browser.

                        // There is no way to specify a Controller class so the user would see errors.

                        formBuildSegmentedEntryControl.allowEdit(false);

                    }

                    else

                    {

                        formbuildControl.allowEdit(_allowControlEdit);

                    }

                }

            }

        }

    }


Thursday, April 15, 2021

Get Metadata of an Data Entity D365FO

Export data entity metadata information in excel

Reference: https://www.theaxapta.com/2021/03/how-to-get-meta-data-of-data-entity.html 

 


D365FO Data Management - Import/Export Container Data Fields

Implement the logic for convert "container field" data bounded value into the base64 string during the data export.

Table Field -> ConImage

Data Entity Field -> 

Create two new unmapped field as 

ConImageStr

Method: Data entity methods -> POST LOAD

//Export - start

//Post load to export data container information to str

if (this.ConImage)

{

    container conValue;

    str containerAsString;

    conValue= this.ConImage;

    containerAsString = con2base64str(conValue);

    this.ConImageStr = containerAsString;


}

//Export - End


//Import code  - start

//Use method -> defaultRow()

str containerAsString;

Container conValue;

containerAsString = this.ConImageStr;

conValue= base64str2con(containerAsString);

this.ConImage= conValue;

//Import code  - End


In the case of a container with binary content, add one more string field to the staging table, for exporting the Memo field.

The field should extends FileName EDT 

Field name: conImageStrFileName

Implement data entity method


When exporting this DMF data entity, ConImageStr will be packaged into separate files.

public static container getFieldsToBeConvertedToFile()

{

    return [fieldstr(<EntityName>, ConImageStr),

            fieldstr(<StagingTableName>, ConImageStr),

            fieldstr(<StagingTableName>, ConImageStrFileName),

            true];

}


Create export project and export now

Download package

Unzip package file

Resource folder with all container contents exported as separate files.





Export label custom content

 GRID => Properties "Export Label" => "SalesReportMexico" To get download file with custom naming.