Friday, 24 March 2023

How to Create or copy product attributes using X++ code

 The post is about copying the product attributes from one product to another, you can use it to create new attributes as well.

/// <summary>

    /// Copy the product categories

    /// </summary>

    /// <param name = "_origProduct">Origin product</param>

    /// <param name = "_newProduct">New product</param>

    public void updateProductCategories(EcoResProduct _origProduct, EcoResProduct _newProduct)

    {

        EcoResProductCategory   ecoResProductCategory, ecoResProductCategoryOrig;

        EcoResProductRecId      newEcoResProductRecId = _newProduct.RecId;


        delete_from ecoResProductCategory

            where ecoResProductCategory.Product == newEcoResProductRecId;


        RefRecId  origProductRecId, newProductRecId,     productInstanceRecIdNew, ecoResTextValueRecId_AfterInsert;        

        

        EcoResCategory                     ecoResCategory;

        EcoResCategoryAttributeLookup      ecoResCategoryAttributeLookup;

        

        EcoResAttribute                    ecoResAttribute;

        EcoResAttributeValue               ecoResAttributeValue, ecoResAttributeValue_ForInsert;

        EcoResProductInstanceValue         ecoResProductInstanceValue, ecoResProductInstanceValueNew;

        EcoResTextValue                    ecoResTextValue, ecoResTextValue_ForInsert;

        

        if (_origProduct && _newProduct)        

        {            

            origProductRecId = _origProduct.RecId;

            newProductRecId = _newProduct.RecId;

            

            if (origProductRecId != newProductRecId)            

            {              

                ttsBegin;


                ecoResProductInstanceValueNew.Product = newProductRecId;


                new OverwriteSystemFieldsPermission().assert();


                ecoResProductInstanceValueNew.overwriteSystemfields(true);

                ecoResProductInstanceValueNew.(fieldNum(EcoResProductInstanceValue, InstanceRelationType)) = tableName2id(tableStr(EcoResProductInstanceValue));

                ecoResProductInstanceValueNew.insert();


                ecoResProductInstanceValueNew.overwriteSystemfields(false);

                CodeAccessPermission::revertAssert();

                ttsCommit;

                

                if (ecoResProductInstanceValueNew)                

                {

                    productInstanceRecIdNew = ecoResProductInstanceValueNew.RecId;

                    

                    while select ecoResProductCategoryOrig

                            where ecoResProductCategoryOrig.Product == origProductRecId

                        join ecoResCategory 

                            where ecoResCategory.RecId == ecoResProductCategoryOrig.Category

                    {

                        ttsbegin;

                        ecoResProductCategory.Product           = newProductRecId;                   

                        ecoResProductCategory.Category          = ecoResProductCategoryOrig.Category;

                        ecoResProductCategory.CategoryHierarchy = ecoResProductCategoryOrig.CategoryHierarchy;

                        ecoResProductCategory.insert();                       

                        ttscommit;

                        if (ecoResProductCategory)                        

                        {

                            while select ecoResCategoryAttributeLookup where ecoResCategoryAttributeLookup.Category == ecoResCategory.RecId  

                                        join ecoResAttribute where ecoResAttribute.RecId == ecoResCategoryAttributeLookup.Attribute

                            

                            {

                                select firstonly ecoResAttributeValue 

                                        where ecoResAttributeValue.Attribute == ecoResAttribute.RecId

                                    join ecoResProductInstanceValue 

                                        where ecoResProductInstanceValue.RecId == ecoResAttributeValue.InstanceValue 

                                        && ecoResProductInstanceValue.Product == origProductRecId

                                    join ecoResTextValue 

                                        where ecoResTextValue.RecId == ecoResAttributeValue.Value;

                                

                                if (ecoResAttributeValue.Attribute > 0)                                 

                                {

                                    ecoResTextValue_ForInsert.TextValue = ecoResTextValue.TextValue;

                                    new OverwriteSystemFieldsPermission().assert();

                                    ecoResTextValue_ForInsert.overwriteSystemfields(true);

                                    ecoResTextValue_ForInsert.(fieldNum(EcoResTextValue, InstanceRelationType)) = tableName2id(tableStr(EcoResTextValue));

                                    ecoResTextValue_ForInsert.insert();

                                    ecoResTextValue_ForInsert.overwriteSystemfields(false);

                                    CodeAccessPermission::revertAssert();

                                   

                                }

                                

                                if (ecoResTextValue_ForInsert)                                

                                {

                                    ecoResTextValueRecId_AfterInsert = ecoResTextValue_ForInsert.RecId;  

                                                                       

                                    ecoResAttributeValue_ForInsert.Attribute     = ecoResAttributeValue.Attribute;    

                                    ecoResAttributeValue_ForInsert.InstanceValue = productInstanceRecIdNew;      

                                    ecoResAttributeValue_ForInsert.Value         = ecoResTextValueRecId_AfterInsert;     

                                    ecoResAttributeValue_ForInsert.insert();

                                    

                                    

                                }

                            }  

                        }

                    }   

                }                

            }                       

        }

        

    }

No comments:

Post a Comment