Saturday, 18 August 2012

Importing Products into AX 2012 - Part 2


Product master and a related Product variant

Continuation of the Importing Products into AX2012 - Part 1, here I am posting the Create product master, dimensions, variants and release them to the particular company.






Create a product master and a related product variant

To create a product master, use the EcoResProductService.create operation. Then use the EcoResProductMasterDimValue.create operation to associate product dimension values with the product master. Finally, use the EcoResProductService.create operation again, this time to create a product variant.
 The code to create a product master is similar to the code that creates a distinct product. The primary difference is the code that associates the product master with a product dimension group (Size-Dim is given in below code).

Release products

A product must be released to a company before it can be used in that company. The ItemService and InventDimCombinationService services serve this purpose. The former can be used to release distinct products and product masters. The latter can be used to release product variants. A product master must be released before any of its product variants can be released.

Release product master

The only information required to release a product to a company is the ID of the product and the ID by which it will be represented in the company (ItemId). It is possible to add information to the ItemService service. In the following example, information about the units used for storage, purchasing, and selling is provided.

Release a product variant

A product variant can be released after a related product master has been released. When you release a product variant to a company, the product variant can be identified in two different ways:
•             Use the product number of the product variant.
•             Use the ID of the associated product master in the company (ItemId) and the InventDim structure, with the relevant fields set to the dimension values for the variant (the ItemId/InventDim approach).


Code:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ProcutMasterImport.ProductDataImportService;
using System.IO;
using System.Text.RegularExpressions;


namespace ProcutMasterImport
{
    public partial class Product : Form
    {
        internal static int ProdNumber = 0;
        internal static int Searchname = 1;
        internal static int ProdName = 2;
        internal static int StorageDimGroup = 3;
        internal static int SerialNumGroup = 4;
        internal static int InventUnitID = 5;
        internal static int PurchUnitID = 6;
        internal static int SalesUnitID = 7;
        internal static int ProdCompanyID = 8;
        internal static int ItemGroup = 9;
        internal static int ItemType = 10;
        internal static int InventoryModelGroup = 11;
        internal static int Baseprice = 12;
        //internal static int InventWareHouse   = 13;
        //internal static int PurchWareHouse    = 14;
        //internal static int SalesWareHouse    = 15;
        internal static int Itemsalestaxgroup_PO = 13;
        internal static int Itemsalestaxgroup_sales = 14;
        internal static int Priceunit_purch = 15;
        internal static int Dateofprice_purch = 16;
        internal static int Totaldiscount_purch = 17;
        internal static int Priceunit_inv = 18;
        internal static int Dateofprice_inv = 19;
        internal static int Priceunit_sales = 20;
        internal static int Dateofprice_sales = 21;
        internal static int Totaldiscount_sales = 22;



        //Master Data
        internal static int MasterProdNumber = 0;
        internal static int MasterSearchname = 2;
        internal static int MasterProdName = 3;
        internal static int DefaultColor = 5;
        internal static int DefaultConfig = 6;
        internal static int DefaultSiz = 7;
        internal static int BOMUnitID = 9;
        internal static int InputWeight = 24;
        internal static int ProductInstanceRelationType = 38; 
        internal static int Tareweight = 47;//Column Number in Excel = AV       
        internal static int TrackingDimGroupName = 49;
        internal static int MasterStorageDimGroup = 50;
        internal static int MasterProdDimGroup = 51;
        internal static int MasterLanguage = 52;
        internal static int MasterItemGroup = 53;
        internal static int MasterInventoryModelGroup = 54;
        internal static int MasterPriceunit_purch = 57;
        internal static int MasterPriceunit_sales = 58;
        internal static int MasterPriceunit_inv = 59;
        internal static int MasterItemsalestaxgroup_PO = 60;
        internal static int MasterItemsalestaxgroup_sales = 61;
        internal static int MasterProdCompanyID = 62;

        //Dim Import - Size
        internal static int MasterProdIDSize = 0;
        internal static int MasterProdSize = 1;
        internal static int MasterProdSizeName = 2;

        //Dim Import - Color
        internal static int MasterProdIDColor = 0;
        internal static int MasterProdColor = 1;
        internal static int MasterProdColorName = 2;

        //Dim Import - Config
        internal static int MasterProdIDConfig = 0;
        internal static int MasterProdConfig = 1;
        internal static int MasterProdConfigName = 2;

        //VariantaCreation
        internal static int MasterVariantID = 0;
        internal static int MasterVariantSearchname = 1;
        internal static int MasterVariantProdMaster = 2;
        internal static int MasterVariantName = 3;
        internal static int MasterVariantConfig = 4;
        internal static int MasterVariantSize = 5;
        internal static int MasterVariantColor = 6;
        internal static int MasterVariantCompanyID = 8;
        //internal static int MasterVariantConfigName = 9;
        //internal static int MasterVariantSizeName = 10;
        //internal static int MasterVariantColorName = 11;

        public static List<string[]> ParseCSVFile(string path, Boolean hasHeaders)
        {
            List<string[]> CSVRows = new List<string[]>();
            int rowNumber = 0;
            using (StreamReader inputFile = new StreamReader(path))
            {
                string line;
                string[] line1;

                while ((line = inputFile.ReadLine()) != null)
                {
                    String pattern = ",(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))";
                    Regex r = new Regex(pattern);
                    line1 = r.Split(line);
                    if (hasHeaders != true || rowNumber != 0)
                    {
                        CSVRows.Add(line1);
                    }
                    rowNumber++;
                }
            }
            return CSVRows;
        }


        public Product()
        {
            InitializeComponent();
        }

     

                //                          //
        //Create a product master and a related product variant //
        //                          //
        static void createMaster(string[] _product)
        {
            //Boolean ismastercreated;

            //master definition
            AxdEntity_Product_EcoResProductMaster productMaster = new AxdEntity_Product_EcoResProductMaster()
            {
                DisplayProductNumber = _product[MasterProdNumber],
                ProductType = AxdEnum_EcoResProductType.Item,
                SearchName = _product[MasterSearchname]
            };
            productMaster.Translation = new AxdEntity_Translation[1];

            productMaster.Translation[0] = new AxdEntity_Translation()
            {
                LanguageId = "en-us",
                Name = _product[MasterProdName]
            };

            productMaster.Identifier = new AxdEntity_Identifier[1];
            productMaster.Identifier[0] = new AxdEntity_Identifier()
            {
                ProductNumber = _product[MasterProdNumber]
            };

            productMaster.ProductDimGroup = new AxdEntity_ProductDimGroup[1];
            productMaster.ProductDimGroup[0] = new AxdEntity_ProductDimGroup()
            {
                Product = _product[MasterProdNumber],
                ProductDimensionGroup = _product[MasterProdDimGroup]
            };

            productMaster.StorageDimGroup = new AxdEntity_StorageDimGroup[1];
            productMaster.StorageDimGroup[0] = new AxdEntity_StorageDimGroup()
            {
                Product = _product[MasterProdNumber], //"Bulb60W",
                StorageDimensionGroup = _product[MasterStorageDimGroup] //"Std-Dim"

            };


            productMaster.VariantConfigurationTechnology = AxdEnum_EcoResVariantConfigurationTechnologyType.PredefinedVariants;
            AxdEcoResProduct axdProduct = new AxdEcoResProduct()
            {
                Product = new AxdEntity_Product_EcoResProduct[1]
                {
                    productMaster
                }
            };

            CallContext ctx = new CallContext();
            EcoResProductServiceClient productService = new EcoResProductServiceClient();
            try
            {
                productService.create(ctx, axdProduct);
            }
            catch (Exception e)
            {
                System.Console.WriteLine(e.Message);
                System.Console.ReadKey();
            }

        }



        //                          //
        ///master dimensions Size //
        //                          //
        static void createMasterDimension_Size(string[] _productDimsSize)
        {
            //master dimensions definition (two sizes, L and M)
            AxdEntity_MasterDim_EcoResProductMasterSize sizeDimensionL = new AxdEntity_MasterDim_EcoResProductMasterSize()
            {
                SizeProductMaster = _productDimsSize[MasterProdIDSize],
                Size = _productDimsSize[MasterProdSize], //"L",
                EcoResSize = new AxdEntity_EcoResSize[1]
                {
                    new AxdEntity_EcoResSize()
                    {
                        Name =  _productDimsSize[MasterProdSize] //"L"
                    }
                },
                Description = _productDimsSize[MasterProdSizeName],
                SizeProductDimensionAttribute = 3173
            };


            AxdEcoResProductMasterDimValue axdDimValue = new AxdEcoResProductMasterDimValue()
            {

                MasterDim = new AxdEntity_MasterDim_EcoResProductMasterDimensionValue[1]
                {
                    sizeDimensionL
                }
            };

            CallContext ctx = new CallContext();
            EcoResProductMasterDimValueServiceClient masterDimensionService = new EcoResProductMasterDimValueServiceClient();
            try
            {
                masterDimensionService.create(ctx, axdDimValue);
            }
            catch (Exception e)
            {
                System.Console.WriteLine(e.Message); System.Console.ReadKey();
            }
        }



        //                          //
        ///master dimensions CONFIG definition (two sizes, L and M) //
        //                          //

        static void createMasterDimension_Config(string[] _productDimsConfig)
        {
            //master dimensions definition (two sizes, L and M)
            AxdEntity_MasterDim_EcoResProductMasterConfiguration ConfigDimensionL = new AxdEntity_MasterDim_EcoResProductMasterConfiguration()
            {
                EcoResConf = new AxdEntity_EcoResConf[1]
                {
                    new AxdEntity_EcoResConf()
                    {                        
                        Name = _productDimsConfig[MasterProdConfig]//_productDimsConfig[MasterProdConfigName]// "L"
                    }
                },
                ConfigProductMaster = _productDimsConfig[MasterProdIDConfig],
                Configuration = _productDimsConfig[MasterProdConfig],  //"L",               
                Description = _productDimsConfig[MasterProdConfigName],
                //AdditionalDescription = _productDimsConfig[MasterProdConfigName],
                ConfigProductDimensionAttribute = 3170
            };


            AxdEcoResProductMasterDimValue axdDimValue = new AxdEcoResProductMasterDimValue()
            {
                //SenderId = "3274",
                MasterDim = new AxdEntity_MasterDim_EcoResProductMasterDimensionValue[1]
                {                   
                    ConfigDimensionL//, ConfigDimensionM
                }

            };

            CallContext ctx = new CallContext();
            EcoResProductMasterDimValueServiceClient masterDimensionService = new EcoResProductMasterDimValueServiceClient();
            try
            {
                masterDimensionService.create(ctx, axdDimValue);
            }
            catch (Exception e)
            {
                System.Console.WriteLine(e.Message); System.Console.ReadKey();
            }
        }


        //                          //
        ///master dimensions Size //
        //                          //
        static void createMasterDimension_Color(string[] _productDimsColor)
        {
            //master dimensions definition (two sizes, L and M)
            AxdEntity_MasterDim_EcoResProductMasterColor colorDimensionL = new AxdEntity_MasterDim_EcoResProductMasterColor()
            {
                ColorProductMaster = _productDimsColor[MasterProdIDColor],
                Color = _productDimsColor[MasterProdColor], //"L",
                EcoResColor = new AxdEntity_EcoResColor[1]
                {
                    new AxdEntity_EcoResColor()
                    {
                        Name =  _productDimsColor[MasterProdColor] //"L"
                    }
                },
                Description = _productDimsColor[MasterProdSizeName],
                ColorProductDimensionAttribute = 3169
            };


            AxdEcoResProductMasterDimValue axdDimValue = new AxdEcoResProductMasterDimValue()
            {

                MasterDim = new AxdEntity_MasterDim_EcoResProductMasterDimensionValue[1]
                {
                    colorDimensionL
                }
            };

            CallContext ctx = new CallContext();
            EcoResProductMasterDimValueServiceClient masterDimensionService = new EcoResProductMasterDimValueServiceClient();
            try
            {
                masterDimensionService.create(ctx, axdDimValue);
            }
            catch (Exception e)
            {
                System.Console.WriteLine(e.Message); System.Console.ReadKey();
            }
        }


        //                          //
        ////product variant definition//
        //                          //
        static void createVariant(string[] _productVariant)
        {
            //product variant definition
            AxdEntity_Product_EcoResDistinctProductVariant productVariant = new AxdEntity_Product_EcoResDistinctProductVariant()
            {
                DisplayProductNumber = _productVariant[MasterVariantID], //"RunningShoeL",
                ProductType = AxdEnum_EcoResProductType.Item,
                SearchName = _productVariant[MasterVariantSearchname], //"RunningShoeL",
                ProductMaster = _productVariant[MasterVariantProdMaster] //"RunningShoe"
            };

            productVariant.Translation = new AxdEntity_Translation[1];
            productVariant.Translation[0] = new AxdEntity_Translation()
            {
                LanguageId = "en-us",
                Name = _productVariant[MasterVariantName] //"Comfortable running shoe L size"
            };

            productVariant.VariantDimValue = new AxdEntity_VariantDimValue_EcoResProductVariantDimensionValue[3];

            if (_productVariant[MasterVariantSize].ToString() != "")
            {
                productVariant.VariantDimValue[0] = new AxdEntity_VariantDimValue_EcoResProductVariantSize()
                {
                    DistinctProductVariant = _productVariant[MasterVariantID], //"RunningShoeL",
                    ProductDimensionAttribute = 3173,//The ID of the EcoResSize table
                    Size = _productVariant[MasterVariantSize], //"L",
                    EcoResSize = new AxdEntity_EcoResSize1[1]
                    {
                        new AxdEntity_EcoResSize1()
                        {
                            Name = _productVariant[MasterVariantSize] //"L"
                        }
                    }
                };
            }

            //added by imthiyaz - Color
            if (_productVariant[MasterVariantColor] != "")
            {
                productVariant.VariantDimValue[1] = new AxdEntity_VariantDimValue_EcoResProductVariantColor()
                {
                    DistinctProductVariant = _productVariant[MasterVariantID],
                    ProductDimensionAttribute = 3169,
                    Color = _productVariant[MasterVariantColor], //"L",
                    EcoResColor = new AxdEntity_EcoResColor1[1]
                {
                    new AxdEntity_EcoResColor1()
                    {
                        Name = _productVariant[MasterVariantColor]
                    }
                }
                };
            }

            //added by imthiyaz - Config
            if (_productVariant[MasterVariantConfig] != "")
            {
                productVariant.VariantDimValue[2] = new AxdEntity_VariantDimValue_EcoResProductVariantConfiguration()
                {
                    DistinctProductVariant = _productVariant[MasterVariantID],
                    ProductDimensionAttribute = 3170,
                    Configuration = _productVariant[MasterVariantConfig], //"L",
                    EcoResConf = new AxdEntity_EcoResConf1[1]
                {
                    new AxdEntity_EcoResConf1()
                    {
                        Name = _productVariant[MasterVariantConfig]
                    }
                }
                };
            }

            AxdEcoResProduct axdProduct = new AxdEcoResProduct()
            {
                Product = new AxdEntity_Product_EcoResProduct[1]
                {
                    productVariant
                }
            };

            CallContext ctx = new CallContext();
            EcoResProductServiceClient productService = new EcoResProductServiceClient();
            try
            {
                productService.create(ctx, axdProduct);
            }
            catch (Exception e)
            {
                System.Console.WriteLine(e.Message); System.Console.ReadKey();
            }
        }


      

        //                          //
        ////Release a product master//
        //                          //

        private static void releaseMasterProduct(string[] _productRelease)
        {
            AxdEntity_InventTable inventTable = new AxdEntity_InventTable()
            {

                ItemId = _productRelease[MasterProdNumber], //"Bulb60W",
                Product = _productRelease[MasterProdNumber], //"Bulb60W",


                SalesPriceModelBasic = AxdEnum_SalesPriceModelBasic.PurchPrice, //(AxdEnum_SalesPriceModelBasic)Enum.Parse(typeof(AxdEnum_SalesPriceModelBasic), _productRelease[Baseprice]),//_product[Baseprice],
                //SerialNumGroupId = _productRelease[SerialNumGroup],

                Invent = new AxdEntity_Invent[1]
                {
                    new AxdEntity_Invent()
                    {
                        ItemId = _productRelease[MasterProdNumber], //"Bulb60W",
                        UnitId = _productRelease[MasterPriceunit_inv] //"Box"
                    }
                },
                Purch = new AxdEntity_Purch[1]
                {
                    new AxdEntity_Purch()
                    {
                        ItemId = _productRelease[MasterProdNumber], //"Bulb60W",
                        UnitId = _productRelease[MasterPriceunit_purch] //"Box"
                    }
                },
                Sales = new AxdEntity_Sales[1]
                {
                    new AxdEntity_Sales()
                    {
                        ItemId = _productRelease[MasterProdNumber], //"Bulb60W",
                        UnitId = _productRelease[MasterPriceunit_sales] //"Pcs"
                    }
                },

                InventModelGroupItem = new AxdEntity_InventModelGroupItem[1]
                {
                    new AxdEntity_InventModelGroupItem()
                    {                       
                        ModelGroupId = _productRelease[MasterInventoryModelGroup]
                    }
                },
                InventItemGroupItem = new AxdEntity_InventItemGroupItem[1]
                {
                    new AxdEntity_InventItemGroupItem()
                    {
                        ItemGroupId = _productRelease[MasterItemGroup]
                    }
                }

            };

           
            /*inventTable.StandardInventColorId = _productRelease[DefaultColor];
            inventTable.StandardConfigId = _productRelease[DefaultConfig];
            inventTable.StandardInventSizeId = _productRelease[DefaultSiz];*/
            //default size, color, config cvon't be aasuigned here

            inventTable.BOMUnitId = _productRelease[BOMUnitID];
            inventTable.NetWeight = Decimal.Parse(_productRelease[InputWeight]);
            inventTable.TaraWeightSpecified = true;
            inventTable.MetalTypeSpecified = true;
            inventTable.TaraWeight = Decimal.Parse(_productRelease[Tareweight]);
         
            AxdItem item = new AxdItem()
            {
                InventTable = new AxdEntity_InventTable[1]
                {
                    inventTable
                }
            };

            CallContext ctx = new CallContext()
            {
                Company = _productRelease[MasterProdCompanyID] //"DMO"
            };

            ItemServiceClient itemService = new ItemServiceClient();
            try
            {
                itemService.create(ctx, item);
            }
            catch (Exception e)
            {
                System.Console.WriteLine(e.Message); System.Console.ReadKey();
            }
        }



        //                          //
        ///Use the ItemId/InventDim approach//
        //                          //      

        private static void releaseProductVariants2(string[] _productVariantRelease)
        {
            AxdEntity_InventDimCombination releasedVariant = new AxdEntity_InventDimCombination()
            {
                DistinctProductVariant = "",
                ItemId = _productVariantRelease[MasterVariantProdMaster],// "RunningShoe",
                InventDimId = "",
                InventDim = new AxdEntity_InventDim[1]
                {
                    new AxdEntity_InventDim()
                    {
                        InventSizeId = _productVariantRelease[MasterVariantSize], //"M",
                        InventColorId = _productVariantRelease[MasterVariantColor],
                        ConfigId = _productVariantRelease[MasterVariantConfig]
                    }
                }
            };

            AxdInventDimCombination inventDimCombination = new AxdInventDimCombination()
            {
                InventDimCombination = new AxdEntity_InventDimCombination[1]
                {
                    releasedVariant
                }
            };

            CallContext ctx = new CallContext()
            {
                Company = _productVariantRelease[MasterVariantCompanyID] //"DMO"
            };

            InventDimCombinationServiceClient inventDimCombinationService = new InventDimCombinationServiceClient();
            try
            {
                inventDimCombinationService.create(ctx, inventDimCombination);
            }
            catch (Exception e)
            {
                System.Console.WriteLine(e.Message); System.Console.ReadKey();
            }
        }


        private void ProductMaster_Click(object sender, EventArgs e)
        {
            List<string[]> ProdData = ParseCSVFile("D:\\ProductMasters.csv", true);
            foreach (string[] ProdMasterData in ProdData)
            {
                createMaster(ProdMasterData);
            }
        }

      
         private void CreateDims_Click(object sender, EventArgs e)
        {
            List<string[]> ProdDims_Size = ParseCSVFile("D:\\MasterDimSize.csv", true);

            foreach (string[] MasterDimensions_Size in ProdDims_Size)
            {
                createMasterDimension_Size(MasterDimensions_Size);
            }

            List<string[]> ProdDims_Color = ParseCSVFile("D:\\MasterDimsColor.csv", true);

            foreach (string[] MasterDimensions_Color in ProdDims_Color)
            {
                createMasterDimension_Color(MasterDimensions_Color);
            }

            List<string[]> ProdData_Config = ParseCSVFile("D:\\MasterDimConfig.csv", true);

            foreach (string[] MasterDimensions_Config in ProdData_Config)
            {
                createMasterDimension_Config(MasterDimensions_Config);
            }
        }

        private void CreateVariants_Click(object sender, EventArgs e)
        {
            List<string[]> ProdData_Variants = ParseCSVFile("D:\\ProductMasterVariants.csv", true);

            foreach (string[] ProdMasterData_Variants in ProdData_Variants)
            {
                createVariant(ProdMasterData_Variants);

            }
        }

        private void ReleaseAll_Click(object sender, EventArgs e)
        {
            List<string[]> ProdMasterData_Rel = ParseCSVFile("D:\\ProductMasters.csv", true);

            foreach (string[] ProdMasterDataRelease in ProdMasterData_Rel)
            {
                releaseMasterProduct(ProdMasterDataRelease);//master products              
            }

        }

        private void ReleaseVariants_Click_1(object sender, EventArgs e)
        {
            List<string[]> ProdData_VariantsRel = ParseCSVFile("D:\\ProductMasterVariants.csv", true);

            foreach (string[] ProdMasterData_VariantsRel in ProdData_VariantsRel)
            {
                releaseProductVariants2(ProdMasterData_VariantsRel);
            }
        }
    }
}




Sample CSV:


5 comments:

  1. Hello,

    When I run my .net application using AX web services I successfully create product master, variants, release product master but fail to release variants.

    When I try your suggested:

    DistinctProductVariant = "",
    ItemId = "MyProductMaster",
    InventDimId = ""

    I get the exceptions:

    Field 'Dimension No.' must be filled in.

    and

    The value in field DistinctProductVariant is invalid.

    Have you tested your code? I saw a similar example that generates the same error.
    When I changed this code to:

    DistinctProductVariant = "MyVariantCode",
    ItemId = "MyProductMaster",
    InventDimId = "MyVariantCode",

    I get exception:

    The value 'MyVariantCode' in field 'Dimension No.' is not found in the related table 'Inventory dimensions'.

    It looks that Inventory dimensions table has to be prepopulated first with the "MyVariantCode" value. The same happens when you try to assign a color or a size to a variant. If this color/size doesn't exist in EcoResCOlor/EcoResSize, ti will generate the error. Since AOT doesn't allow me to create a service that would write to EcoResColor (or EcoResSize) I created a procedure to write the SQL backend.

    ReplyDelete
    Replies
    1. Hi,
      Thanks for the reply...

      Yes, the code has been tested properly... :)

      As you rightly said, we need populate the inventdim table with the variat values.

      sample:

      ITEMID 50ASCTDAX
      CONFIGID ACCT
      INVENTSIZEID 2.5MM
      INVENTCOLORID BL
      NAME ---
      AUTOCREATED 1
      COSTPRICE 0
      PRICEUNIT 0
      MARKUP 0
      PRICEQTY 0
      PRICEDATE 00:00.0
      ALLOCATEMARKUP 0
      ITEMIDCOMPANY
      INVENTDIMID 00022280_056
      RECID 5637336098


      Regards,
      singu

      Delete
    2. Is there any way to populate inventdim table using services and .net code??

      Regards,
      Sameh

      Delete
  2. Hello Singu,

    I'm trying to add the Price, PriceDate to the each InventTableModule(Purch, Sales, Invent).
    So, I added below code

    Purch = new AxdEntity_Purch[1]
    {
    new AxdEntity_Purch()
    {
    ItemId = _productRelease[MasterProdNumber], //"Bulb60W",
    UnitId = _productRelease[MasterPriceunit_purch], //"Box"

    Price = 10,
    PriceDate = DateTime.parse("2012-09-28")
    }
    },


    Compliing is done without error. But, Test Result is no value on the Price, PriceDate. I checked InventTableModule on the Table Brower in AOT.

    How can I add Price, PriceDate when I create Item?

    Thanks.
    Alvin

    ReplyDelete
  3. Hi Singhu ...I have one serious doubt. I have created configuration and sizes thru code which will automatically come to product master variants. but i want to know how to release those through code..

    ReplyDelete