NetSuite Selecting a value in a Custom List for a SelectCustomFieldRef in C# using web-services

依然范特西╮ 提交于 2019-12-05 20:19:09

After much trial and tribulation we have come up with a solution that works. A lot of the methods have be extracted into other functions, but I will try and provide the base framework for it here for you.

The code focused on trying to make as few calls out to NetSuite as possible. This assumed that you would be re-using much of this data in multiple transactions.

    // NetSuite Session
    // _service is constructed elsewhere in code.

    // Global Values
    Dictionary<string, CustomizationRef> _Dictionary_CustomListRef = new Dictionary<string, CustomizationRef>();
    Dictionary<string, CustomList> _Dictionary_CustomList = new Dictionary<string, CustomList>();
    Dictionary<string, TransactionBodyCustomField> _Dictionary_TransactionBodyCustomField = new Dictionary<string, TransactionBodyCustomField>();

    private CustomFieldRef NetSuite_CreateSelectCustomFieldRef(string sName, string sValue)
    {
        //List or Record Type reference
        SelectCustomFieldRef custbody_field = new SelectCustomFieldRef();
        custbody_field.internalId = sName;
        custbody_field.value = new ListOrRecordRef();

        // Get the Targeted List that we point to in NetSuite
        custbody_field.value.typeId = NetSuite_getTransactionBodyCustomFieldListInternalId(sName);

        // Get ID of List Value from our targeted list in NetSuite
        custbody_field.value.internalId = NetSuite_getCustomListValueID(custbody_field.value.typeId, sValue);

        return custbody_field;
    }

    private string NetSuite_getTransactionBodyCustomFieldListInternalId(string sID)
    {
        string sReturnValue = string.Empty;

        TransactionBodyCustomField tbCustomField = NetSuite_getTransactionBodyCustomField(sID);

        if (tbCustomField != null)
        {
            sReturnValue = tbCustomField.selectRecordType.internalId;
        }

        return sReturnValue;
    }

    private TransactionBodyCustomField NetSuite_getTransactionBodyCustomField(string sID)
    {
        TransactionBodyCustomField tbCustomField = null;

        if (!_Dictionary_TransactionBodyCustomField.TryGetValue(sID, out tbCustomField))
        {
            // Gets a specific custom body object
            CustomizationRef cref = new CustomizationRef();
            cref.internalId = sID;
            cref.scriptId = sID;
            cref.type = RecordType.transactionBodyCustomField;
            cref.typeSpecified = true;
            ReadResponse res = _service.get(cref);

            if (res.status.isSuccess)
                tbCustomField = res.record as TransactionBodyCustomField;

            _Dictionary_TransactionBodyCustomField.Add(sID, tbCustomField);
        }

        return tbCustomField;
    }

    private bool NetSuite_TryGetCustomList(string sCustomListInternalID, out CustomList custList)
    {
        custList = null;
        bool bSuccess = false;

        if (!_Dictionary_CustomList.TryGetValue(sCustomListInternalID, out custList))
        {
            if (_Dictionary_CustomListRef.Count == 0)
                initializeCustomListDictionary();

            CustomizationRef crCustomList = null;

            if (_Dictionary_CustomListRef.TryGetValue(sCustomListInternalID, out crCustomList))
            {
                RecordRef recRef = new RecordRef();
                recRef.internalId = crCustomList.internalId;
                recRef.type = RecordType.customList;
                recRef.typeSpecified = true;
                ReadResponse readResp = _service.get(recRef);

                if (readResp.status.isSuccess)
                    custList = readResp.record as CustomList;

                _Dictionary_CustomList.Add(sCustomListInternalID, custList);
            }
        }

        if (custList == null)
            bSuccess = false;
        else
            bSuccess = true;

        return bSuccess;
    }

    private string NetSuite_getCustomListScriptID(string sCustomListInternalID)
    {
        string sReturnValue = string.Empty;
        CustomList custList;

        if (NetSuite_TryGetCustomList(sCustomListInternalID, out custList))
            sReturnValue = custList.scriptId;

        return sReturnValue;
    }

    private string NetSuite_getCustomListValueID(string sCustomListInternalID, string sValue)
    {
        string sReturnValue = string.Empty;
        CustomList custList;

        if (NetSuite_TryGetCustomList(sCustomListInternalID, out custList))
        {
            CustomListCustomValue[] clValueList = custList.customValueList.customValue;

            foreach(CustomListCustomValue clValue in custList.customValueList.customValue)
            {
                if (clValue.value.ToUpper() == sValue.ToUpper())
                {
                    sReturnValue = clValue.valueId.ToString();
                    break;
                }
            }
        }

        return sReturnValue;
    }

    private void initializeCustomListDictionary()
    {
        _Dictionary_CustomListRef.Clear();

        // Gets all of the custom lists
        CustomizationType ct = new CustomizationType();
        ct.getCustomizationType = GetCustomizationType.customList;
        ct.getCustomizationTypeSpecified = true;

        GetCustomizationIdResult res = _service.getCustomizationId(ct, true);

        foreach (CustomizationRef cref in res.customizationRefList)
            _Dictionary_CustomListRef.Add(cref.internalId, cref);
    }

I hope that this code snippet has helped you out and wish the best of luck.

~EDIT~

Additionally when going back the other way (extracting a value) here is how to turn the ID back into the selected value text. The customField object is a CustomFieldRef obtained from the "options" field of the transaction (which is an array of CustomFieldRefs).

    SelectCustomFieldRef selectCustFieldRef = customField as SelectCustomFieldRef;
    sCustFieldRefId = selectCustFieldRef.internalId;
    sCustFieldRefValue = NetSuite_getCustomListValueFromID(selectCustFieldRef.value.typeId, long.Parse(selectCustFieldRef.value.internalId));

    private string NetSuite_getCustomListValueFromID(string sCustomListInternalID, long lValue)
    {
        string sReturnValue = string.Empty;
        CustomList custList;

        if (NetSuite_TryGetCustomList(sCustomListInternalID, out custList))
        {
            CustomListCustomValue[] clValueList = custList.customValueList.customValue;

            foreach (CustomListCustomValue clValue in custList.customValueList.customValue)
            {
                if (clValue.valueId == lValue)
                {
                    sReturnValue = clValue.value;
                    break;
                }
            }
        }

        return sReturnValue;
    }

You can use getCustomizationId to return meta data for customizations by the specified customization type.

Within the array of customizations, you can find the particular customization you need, and all the meta data associated with it, including your custom list. You should find all the information you need.

By doing a get on the custom list, you can retrieve all values and IDs.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!