adsenseheader

Thursday, December 1, 2022

Deserialise json in D365 fo

Sample Json.

{

    "status": {

        "code": 200,

        "message": "Success!"

    },

    "payLoad": {

        "bizTalkFileName": "abc.txt",

        "shortDescription": "Message(s) succssfully received"

    }

}


mapEnumerator   mapEnumerator;
            Map             data;

            data = RetailCommonWebAPI::getMapFromJsonString(s);
            mapEnumerator = data.getEnumerator();
            while (mapEnumerator.moveNext())
            {
                switch (mapEnumerator.currentKey())
                {
                    case "status":
                        Map         statusMap;
                        container   val = mapEnumerator.currentValue();
                        statusMap = Map::create(val);

                        MapIterator mi = new MapIterator(statusMap);

                        while (mi.more())
                        {
                            container   valuePair = mi.valuePair();

                            if (conPeek(valuePair,1) == "code")
                            {
                                container   value = conPeek(valuePair,2);
                                if (conPeek(value,1) == "200")
                                {
                                    info("File sent to Biztalk successfully.");
                                }
                            }
                            mi.next();
                        }
                        break;

                    case "payload":
                        Map         loadMap;
                        container   loadVal = mapEnumerator.currentValue();
                        loadMap = Map::create(loadVal);

                        MapIterator loadMI = new MapIterator(loadMap);

                        while (loadMI.more())
                        {
                            container   valuePair = mi.valuePair();

                            if (conPeek(valuePair,1) == "bizTalkFileName")
                            {
                                container   fileVal = conPeek(valuePair,2);
                                str filename = conPeek(fileVal,1);
                                filename += filename;
                            }
                            mi.next();
                        }
                        break;
                }
            }
        }

Monday, November 14, 2022

Construct JSON and Webhook trigger from Dynamics 365 finance and operations through x++

DMFDefinitionGroupExecution     dmfDefGrpExec;
        DMFDefinitionGroup              dmfDefGrp;

        System.Net.Http.HttpClient httpClient = new System.Net.Http.HttpClient();

        while select forupdate dmfDefGrpExec
            join dmfDefGrp
            where dmfDefGrp.DefinitionGroupName == dmfDefGrpExec.DefinitionGroup
                && dmfDefGrp.TriggerWebHook
        {
            System.IO.StringWriter          stringWriter;
            Newtonsoft.Json.JsonTextWriter  jsonWriter;
 
            stringWriter       = new System.IO.StringWriter();
            jsonWriter         = new Newtonsoft.Json.JsonTextWriter(stringWriter);

            str sJSON = "";
            jsonWriter.WriteStartObject();
            jsonWriter.WritePropertyName("ExecutionId");
            jsonWriter.WriteValue(dmfDefGrpExec.ExecutionId);
            jsonWriter.WriteEndObject();

            sJSON = stringWriter.ToString();

            System.Net.Http.HttpContent content = new System.Net.Http.StringContent(sJSON,
                                                                        System.Text.Encoding::UTF8,
                                                                        "application/json");
            var task = httpClient.PostAsync("https://xxxxxxxxx-functionapp.azurewebsites.net/api/SyncStatus?code=5XBiPd0z_HCZpENuNAUabeXFAu5a-Lg7j_K5MWwOQpahAzFucoyn0w==",content);
            task.Wait();
            System.Net.Http.HttpResponseMessage msg = task.Result;
 
            System.Net.Http.HttpContent ct = msg.Content;
            var result = ct.ReadAsStringAsync();
            result.Wait();
            System.String s = result.Result;

            mapEnumerator   mapEnumerator;
            Map             data;

            data = RetailCommonWebAPI::getMapFromJsonString(s);
            mapEnumerator = data.getEnumerator();
            while (mapEnumerator.moveNext())
            {
                if (mapEnumerator.currentKey() == "message")
                {
                    ttsbegin;
                    dmfDefGrpExec.Status = mapEnumerator.currentValue();
                    dmfDefGrpExec.doUpdate();
                    ttscommit;
                }
            }
        }

Thursday, October 20, 2022

Link Purchase order and Sales order through Marking in x++ D365 FO

Public void LinkPOAndSO(InventTransId _poTransid InventTransId _soTransId Qty _qtyToMark)
{
tmpInventTransMark tmpInventTransMark;
InventTransId issueInventTransId = _poTransid;
InventTransId receiptInventTransId = _soTransId;
InventTransOriginId receiptInventTransOriginId =
InventTransOrigin::findByInventTransId(receiptInventTransId).RecId;
InventTrans receiptInventTrans =
InventTrans::findByInventTransOrigin(receiptInventTransOriginId);
InventTransOriginId issueInventTransOriginId =
InventTransOrigin::findByInventTransId(issueInventTransId).RecId;
InventTrans issueInventTrans =
InventTrans::findByInventTransOrigin(issueInventTransOriginId);
MarkingCollection collection = TmpInventTransMark::markingCollection(
InventTransOrigin::find(receiptInventTransOriginId)
receiptInventTrans.inventDim()
receiptInventTrans.Qty);
collection.insertCollectionToTmpTable(tmpInventTransMark);
select firstonly tmpInventTransMark
where tmpInventTransMark.InventTransOrigin == issueInventTrans.InventTransOrigin
&& tmpInventTransMark.InventDimId == issueInventTrans.InventDimId;
if (tmpInventTransMark.RecId != 0)
{
Qty qtyToMark;
if (_qtyToMark)
{
qtyToMark = _qtyToMark;
}
else
{
qtyToMark = issueInventTrans.Qty;
}
tmpInventTransMark.QtyMarkNow = qtyToMark;
tmpInventTransMark.QtyRemain -= tmpInventTransMark.QtyMarkNow;
Map mapUpdated = new Map(Types::Int64 Types::Record);
mapUpdated.insert(tmpInventTransMark.RecId tmpInventTransMark);
TmpInventTransMark::updateTmpMark(
receiptInventTransOriginId
receiptInventTrans.inventDim()
-qtyToMark
mapUpdated.pack());
}
}

Tuesday, May 10, 2022

Computed columns on extended data entites in D365 FO

HI,

If you are wondering how to write computed column in entity extension below is the sample piece of code.

Step 1: Create a class object extends your entity
Step 2: Sample code to get ISO code from LogisticsAddressCountryRegion

[ExtensionOf(tableStr(LogisticsAddressCountryRegionTranslationEntity))]
public final class LogisticsAddressCountryRegionTranslation_DIS_Extension {
    public static server str ISOCode_DIS() {
        SysDictTable dictLogisticsCountryRegion = new SysDictTable(tableNum(LogisticsAddressCountryRegion));
        LogisticsAddressCountryRegion logisticsAddressCountryRegion;

        str countryRegionID = SysComputedColumn::returnField(dataentityviewstr(LogisticsAddressCountryRegionTranslationEntity), identifierstr(LogisticsAddressCountryRegionTranslation), fieldstr(LogisticsAddressCountryRegionTranslation, CountryRegionId));

        str val = strFmt("SELECT TOP 1 %1 FROM %2 WHERE %2.%3 = %4",
            dictLogisticsCountryRegion.fieldName(fieldNum(LogisticsAddressCountryRegion, ISOcode), DbBackend::Sql),
            dictLogisticsCountryRegion.name(DbBackend::Sql),
            dictLogisticsCountryRegion.fieldName(fieldNum(LogisticsAddressCountryRegion, CountryRegionId), DbBackend::Sql),
            countryRegionID);

        return val;
    }

}


Step 3: Create a unmapped field(required type) in my
case its STR.In the property DataEntityViewMethod "LogisticsAddressCountryRegionTranslation_DIS_Extension::ISOCode_DIS"

Stpe 4: Create a field in Staging table
Step 5: Compile and Synchronise the created objects.

Regards,
Pradeep

Tuesday, January 18, 2022

Copy Data From One Table To Another Table By Using buf2buf- D365FO

Hello Guys...! Some times we get requirement like , we have to copy data from one table to other table . For that we created a new static method. This method we can use if our second table fields Id's are same as First table field Id's. Here in the example we are copying data from Staging table to Target table.
static void buf2Buf(Common  _from,
                                Common  _to,
                                TableScope _scope = TableScope::CurrentTableOnly)
    {
        var         dictTable = new DictTable(_to.TableId);
        int64       tableId;
        FieldId     fieldId = dictTable.fieldNext(0, _scope);

        while (fieldId && ! isSysId(fieldId))
        {
            _to.(fieldId)   = _from.(fieldName2Id(_from.tableId,fieldId2Name(_to.tableId,fieldId)));
            fieldId         = dictTable.fieldNext(fieldId, _scope);
        }
    }