Friday 14 December 2018

Update Variant Sizes based on Configuration

Recently in a project, there was a scenario where the sizes had an incorrect display order imported when the configuration was imported. On the size groups, the data seemed correct. To tackle that, the following job was created. It looks at the correct display order from the configuration and populates it to the variant configuration.

static void UpdateProductSizeDisplayOrder(Args _args)
{
    InventTable inventTable;
    EcoResProductMasterDimensionValue dimValue;
    EcoResProductMasterSize prodMasterSize;
    EcoResDistinctProduct disProduct;
    RetailSizeGroupTrans retailSizeGroupTrans;
    CommaIo file;
    int iCount=0;

    ;
    file = new CommaIo(@"\\XXX\ProdSizes_PROD_NEW"+".csv","W");

    file.write("ItemId","Size","sizeRecId","DisplayOrder","SizeGroup","CorrectDisplayOrder","ChangeMade");
    while select inventTable // where inventTable.ItemId == 'B4E2200'
    {
        while select forupdate prodMasterSize where prodMasterSize.SizeProductMaster == inventTable.Product
        {
            select retailSizeGroupTrans where retailSizeGroupTrans.size == EcoResSize::find(prodMasterSize.Size).Name
            && retailSizeGroupTrans.sizeGroup == EcoResProductMaster::find(prodMasterSize.SizeProductMaster).RetailSizeGroupId;



            if(prodMasterSize.RetailDisplayOrder != retailSizeGroupTrans.DisplayOrder)
            {
                file.write(
                            inventTable.ItemId,
                            EcoResSize::find(prodMasterSize.Size).Name,
                            prodMasterSize.RecId,
                            prodMasterSize.RetailDisplayOrder,
                            EcoResProductMaster::find(prodMasterSize.SizeProductMaster).RetailSizeGroupId,
                            retailSizeGroupTrans.DisplayOrder,"YES"
                            );

                ttsBegin;
                prodMasterSize.RetailDisplayOrder = retailSizeGroupTrans.DisplayOrder;
                prodMasterSize.update();
                ttsCommit;

                iCount++;
            }
            else
            {
                file.write( inventTable.ItemId,
            EcoResSize::find(prodMasterSize.Size).Name,
            prodMasterSize.RecId,
            prodMasterSize.RetailDisplayOrder,
            EcoResProductMaster::find(prodMasterSize.SizeProductMaster).RetailSizeGroupId,
            retailSizeGroupTrans.DisplayOrder,"NO");
            }

        }
    }
        info("Finished");
}

Tuesday 9 October 2018

Update Product numbers for Released and Product Master

In one of my projects, there was a requirement for bulk renaming the released products and the product master. Luckily, the numbers for both released and master were kept the same for me to filter on the PKs conveniently. Used the code below to achieve that.

static void RenameInvenTableProdsPK(Args _args)
{
    InventTable inventTable;
    str oldDisplayNumber,newDisplayNumber;
    int iCount;
    CommaIo file;
    ;
    file = new CommaIo(@"\\XXXXX\file.csv","W");
    While select ItemId from InventTable where inventTable.ItemId like 'B4*'
    {
        try
        {
            oldDisplayNumber = inventTable.ItemId;
            newdisplayNumber = "O_"+inventTable.ItemId;
            inventTable.ItemId = newdisplayNumber;
            inventTable.renamePrimaryKey(); //old method of product renaming
           
            //using the service to rename product master
            EcoResProductNumberRenameService::newFromProduct(
            EcoResProduct::findByProductNumber(oldDisplayNumber).RecId,
            oldDisplayNumber,
            newdisplayNumber,NoYes::Yes).rename(); //one of the attributes allows us to include product variants in the renaming process
            iCount++;
    }
    
    catch{
        file.write(oldDisplayNumber);
        continue;
    }
    }
   info(strFmt("Done - %1",iCount));  
}


Tuesday 2 October 2018

Dynamics AX R3 | List of all tables with details

In one of the recent projects, I had to pull the details of all the tables with their current record counts and if they are the part of any country specific localisation. I used the following code to pull those details. Nice simple code got the job done well.
static void GetTablesDetails(Args _args)

{
    #AOT
    #File
    #Properties

    CommaIo csvIO;
    str description;
    TreeNode tables;
    int total, counter;
  ;

    csvIO = new CommaIo(@"c:\AX_tables_details.csv", #IO_WRITE);
    csvIO.write("No","TableName""ID","LegacyId","SaveDataPerCompany","TableGroup","FormRef","CountryRegionCodes","RecordsCount");
    tables = TreeNode::findNode(@"\Data Dictionary\Tables");
    total = tables.AOTchildNodeCount();
    tables = tables.AOTfirstChild();

    for(counter = 1; counter <= total; counter++)
    {
       
        csvIO.write(counter,tables.AOTgetProperty("Name"),tables.AOTgetProperty("ID"),tables.AOTgetProperty("LegacyId"),tables.AOTgetProperty("SaveDataPerCompany"),tables.AOTgetProperty("TableGroup"),tables.AOTgetProperty("FormRef"),tables.AOTgetProperty("CountryRegionCodes"),SysDictTable::casRecordCount(tables.AOTname()));
        tables = tables.AOTnextSibling();
     }

    info("Done");
}