NetSuite SuiteTalk - получение строки значения из SearchColumnSelectCustomField

У меня есть небольшое приложение, которое перебирает результаты «Сохраненного поиска», извлекая значения из нескольких настраиваемых столбцов (упрощенный пример):

var results = searchResults.Select(a => new
{
    X = ((SearchColumnBooleanCustomField)a.basic.customFieldList
        .First(b => b.scriptId == "custentityX")).searchValue
    Y = ((SearchColumnDateCustomField)a.basic.customFieldList
        .First(b => b.scriptId == "custentityY")).searchValue
    Z = ((SearchColumnSelectCustomField)a.basic.customFieldList
        .First(b => b.scriptId == "custentityZ")).searchValue.name
}

Для большинства возвращаемых типов столбцов я получаю значение, соответствующее типу (bool / date / etc ...), но с «SearchColumnSelectCustomField» я не получаю никакого значения в возвращаемом «searchValue.name», оно всегда равно null, однако столбец searchValue.internalID всегда заполняется. Поэтому по какой-то причине он получает выбор, но не возвращает значение из этого выбора.

Как мне получить доступ к текстовому значению, которое я вижу в интерфейсе NetSuite, из SuiteTalk ("searchValue.name")? Нужно ли мне выполнять другой запрос для получения всех пар ключей значений, связанных с этим внутренним идентификатором? Для каждого настраиваемого поля? И если да, то для чего вообще нужно поле имени?

Я пробовал поискать это, но на самом деле нет достаточного количества документации по этому вопросу (или на SuiteTalk в целом), на других языках (PHP / Java) люди упоминают "getSelectValue" (здесь и кратко здесь), я мог бы попробовать это на C #, но я не уверен если они применимы, или если это можно сделать для выбора пользовательских значений. Затем есть несколько ссылок для определения значений ПЕРЕД поиском, это кажется мне излишним, неужели это так сложно? У меня есть десятки настраиваемых полей, к которым я хотел бы получить доступ в своем последнем приложении. Похоже, должен быть способ попроще ...


person David Rogers    schedule 08.11.2016    source источник


Ответы (2)


Насколько мне известно, ответ веб-службы будет содержать только internalId и typeId для SearchColumnSelectCustomField. Чтобы получить имя, вам нужно сначала запросить NetSuite, чтобы найти все настраиваемые списки и их значения.

Вы можете сделать это с помощью CustomListSearch и установить для предпочтения поиска bodyFieldsOnly значение false. Не передавайте никаких критериев в CustomListSearch, и вам будут возвращены все настраиваемые списки и их значения. Просто сохраните результаты в памяти и ссылайтесь на них при чтении значений столбцов из сохраненного поиска.

person angrycrab    schedule 08.11.2016
comment
Это отлично подходит для всего, что возвращается как SearchColumnSelectCustomField, но как насчет стандартных полей (SearchColumnSelectField), таких как postingperiod и createdBy (Transaction). Та же проблема возникает и с этими полями, разве для них не потребуется отдельный поиск? Какой будет тип поиска, при котором будут извлечены все значения для этих типов полей, или это вообще возможно? - person David Rogers; 10.11.2016
comment
Я действительно думаю, что следующий вопрос заслуживает того, чтобы стать его собственным вопросом, поэтому я разместил его здесь. - person David Rogers; 10.11.2016

Я попробовал ответ, опубликованный @ Adud123, и он отлично работает. Вот как выглядит код:

public Dictionary<string, Dictionary<long, string>> getCustomFieldLists()
{
    return
        nsService.search(new CustomListSearch())
            .recordList.Select(a => (CustomList) a)
            .ToDictionary(a => a.internalId,
                a => a.customValueList.customValue
                     .ToDictionary(b => b.valueId, c => c.value));
}

var valueLookup = getCustomFieldLists();

var results = searchResults.Select(a => new
{
    Z = (a.basic.customFieldList.Where(b => b.scriptId == "custentityZ")
        .Select(a => (SearchColumnSelectCustomField)a)
        .Select(a => valueLookup[a.searchValue.typeId][a.searchValue.internalId])
        .First()
}
person David Rogers    schedule 08.11.2016