Преобразование NetSuite TransactionSearch в расширенный поиск с возвращением только столбца internalId

У меня обычный поиск транзакций, SOAP выглядит так:

<?xml version="1.0" encoding="UTF-8"?>
<search xsi:type="sales:TransactionSearch" 
        xmlns="urn:messages_2013_1.platform.webservices.netsuite.com" 
        xmlns:sales="urn:sales_2013_1.transactions.webservices.netsuite.com" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xmlns:common="urn:common_2013_1.platform.webservices.netsuite.com" 
        xmlns:core="urn:core_2013_1.platform.webservices.netsuite.com">
    <sales:basic xsi:type="common:TransactionSearchBasic" xmlns:common="urn:common_2013_1.platform.webservices.netsuite.com">
        <common:type operator="anyOf" xsi:type="core:SearchEnumMultiSelectField">
            <core:searchValue xsi:type="xsd:string">_invoice</core:searchValue>
        </common:type>
        <common:customFieldList xsi:type="core:SearchCustomFieldList">          
            <core:customField operator="anyOf" xsi:type="core:SearchMultiSelectCustomField" internalId="custbodyintegrationstatus">
                <core:searchValue xsi:type="core:ListOrRecordRef" internalId="1" name="customlistintegrationstatuses"></core:searchValue>
            </core:customField>                 
        </common:customFieldList>
    </sales:basic>
</search>

Этот поиск сейчас работает в производственной среде, но иногда, когда я запускаю этот поиск, я получаю UNEXPECTED_ERROR в результате. Поэтому ребята из NetSuite порекомендовали использовать расширенный поиск. Идея состоит в том, чтобы найти все счета-фактуры с предварительно определенным значением настраиваемого поля, называемого custbodyintegrationstatus. Настраиваемое поле представляет собой список значений, и мне нужно выбрать значение с internalId = "1". Единственное, что я хочу в ответ, - это internalId для каждого найденного счета. Проблема в том, что я не знаю, как это сделать. Вот мой код (C #):

TransactionSearchAdvanced advancedSearchEntity = new TransactionSearchAdvanced();

TransactionSearch ts = new TransactionSearch();
TransactionSearchBasic tsb = new TransactionSearchBasic();
// condition 1: on SO only
SearchEnumMultiSelectField semsfTranType = new SearchEnumMultiSelectField();
semsfTranType.operatorSpecified = true;
semsfTranType.@operator = SearchEnumMultiSelectFieldOperator.anyOf;
semsfTranType.searchValue = new[]{"_salesOrder"};


SearchMultiSelectCustomField spsIntegrationStatusField = new SearchMultiSelectCustomField();
spsIntegrationStatusField.operatorSpecified = true;
spsIntegrationStatusField.@operator = SearchMultiSelectFieldOperator.anyOf;
spsIntegrationStatusField.internalId = "custbodyintegrationstatus";

ListOrRecordRef searchRecordEntity = new ListOrRecordRef();
searchRecordEntity.name = "customlistintegrationstatuses";
searchRecordEntity.internalId = "1";        // indicates record status - ready / test ready / etc
spsIntegrationStatusField.searchValue = new[] { searchRecordEntity };

tsb.type = semsfTranType;
tsb.customFieldList = new SearchCustomField[] { spsIntegrationStatusField };

TransactionSearchRow tsr = new TransactionSearchRow();
TransactionSearchRowBasic tsrb = new TransactionSearchRowBasic();

SearchColumnSelectField[] selcols = new SearchColumnSelectField[1];
selcols[0] = new SearchColumnSelectField();

// Set return columns 
tsrb.internalId = selcols;
tsr.basic = tsrb;

ts.basic = tsb;
advancedSearchEntity.criteria = ts;
advancedSearchEntity.columns = tsr; //note - columns previously defined above.
_service.searchPreferences.returnSearchColumns = true;
SearchResult savedSearchResult = _service.search(advancedSearchEntity);

Запрос SOAP в журналах использования WebServices выглядит следующим образом:

<search xmlns="urn:messages_2013_1.platform.webservices.netsuite.com">
    <searchRecord xsi:type="q1:TransactionSearchAdvanced" xmlns:q1="urn:sales_2013_1.transactions.webservices.netsuite.com">
        <q1:criteria>
            <q1:basic>
                <type operator="anyOf" xmlns="urn:common_2013_1.platform.webservices.netsuite.com">
                    <searchValue xmlns="urn:core_2013_1.platform.webservices.netsuite.com">_salesOrder</searchValue>
                </type>
                <customFieldList xmlns="urn:common_2013_1.platform.webservices.netsuite.com">
                    <customField operator="anyOf" internalId="custbodyintegrationstatus" xsi:type="SearchMultiSelectCustomField" xmlns="urn:core_2013_1.platform.webservices.netsuite.com">
                        <searchValue internalId="1">
                            <name>customlistintegrationstatuses</name>
                        </searchValue>
                    </customField>
                </customFieldList>
            </q1:basic>
        </q1:criteria>
        <q1:columns>
            <q1:basic>
                <internalId xmlns="urn:common_2013_1.platform.webservices.netsuite.com"/>
            </q1:basic>
        </q1:columns>
    </searchRecord>
</search>

И вот ответ:

<searchResponse xmlns="urn:messages_2013_1.platform.webservices.netsuite.com">
    <platformCore:searchResult xmlns:platformCore="urn:core_2013_1.platform.webservices.netsuite.com">
        <platformCore:status isSuccess="true"/>
        <platformCore:totalRecords>108956</platformCore:totalRecords>
        <platformCore:pageSize>5</platformCore:pageSize>
        <platformCore:totalPages>21792</platformCore:totalPages>
        <platformCore:pageIndex>1</platformCore:pageIndex>
        <platformCore:searchId>WEBSERVICES_TSTDRV961603_060120141461034810519911044_b227f55</platformCore:searchId>
        <platformCore:searchRowList>
            <platformCore:searchRow xsi:type="tranSales:TransactionSearchRow" xmlns:tranSales="urn:sales_2013_1.transactions.webservices.netsuite.com">
                <tranSales:basic xmlns:platformCommon="urn:common_2013_1.platform.webservices.netsuite.com">
                    <platformCommon:internalId>
                        <platformCore:searchValue internalId="134200"/>
                    </platformCommon:internalId>
                </tranSales:basic>
            </platformCore:searchRow>
            <platformCore:searchRow xsi:type="tranSales:TransactionSearchRow" xmlns:tranSales="urn:sales_2013_1.transactions.webservices.netsuite.com">
                <tranSales:basic xmlns:platformCommon="urn:common_2013_1.platform.webservices.netsuite.com">
                    <platformCommon:internalId>
                        <platformCore:searchValue internalId="134200"/>
                    </platformCommon:internalId>
                </tranSales:basic>
            </platformCore:searchRow>
            <platformCore:searchRow xsi:type="tranSales:TransactionSearchRow" xmlns:tranSales="urn:sales_2013_1.transactions.webservices.netsuite.com">
                <tranSales:basic xmlns:platformCommon="urn:common_2013_1.platform.webservices.netsuite.com">
                    <platformCommon:internalId>
                        <platformCore:searchValue internalId="134200"/>
                    </platformCommon:internalId>
                </tranSales:basic>
            </platformCore:searchRow>
            <platformCore:searchRow xsi:type="tranSales:TransactionSearchRow" xmlns:tranSales="urn:sales_2013_1.transactions.webservices.netsuite.com">
                <tranSales:basic xmlns:platformCommon="urn:common_2013_1.platform.webservices.netsuite.com">
                    <platformCommon:internalId>
                        <platformCore:searchValue internalId="134200"/>
                    </platformCommon:internalId>
                </tranSales:basic>
            </platformCore:searchRow>
            <platformCore:searchRow xsi:type="tranSales:TransactionSearchRow" xmlns:tranSales="urn:sales_2013_1.transactions.webservices.netsuite.com">
                <tranSales:basic xmlns:platformCommon="urn:common_2013_1.platform.webservices.netsuite.com">
                    <platformCommon:internalId>
                        <platformCore:searchValue internalId="134255"/>
                    </platformCommon:internalId>
                </tranSales:basic>
            </platformCore:searchRow>
        </platformCore:searchRowList>
    </platformCore:searchResult>
</searchResponse>

Очевидно, что я делаю что-то не так, даже unqueue internalIds в строках поиска не указывает на это. Итак, скажите, пожалуйста, что не так. И SOAP, и любой пример кода C # / Java / etc будут очень полезны.


person Sergey Shafiev    schedule 01.06.2014    source источник


Ответы (2)


Попробуйте добавить поисковый фильтр mainline = T, чтобы удалить дубликаты. Также у вас есть запись с internalid = 1?

person felipechang    schedule 01.06.2014
comment
Не могли бы вы показать мне пример? Я не очень хорошо знаком с SuiteTalk. - person Sergey Shafiev; 02.06.2014
comment
Собственно я не понимаю, как в ответе могут появляться дубликаты? У каждой записи есть свой уникальный параметр - internalId. - person Sergey Shafiev; 02.06.2014
comment
На самом деле они не дублируются, вы видите, что по умолчанию транзакция возвращает все позиции (позиции каждой транзакции). Поэтому, если вы выполняете поиск, не глядя на верхний уровень (mainline = F), Netsuite будет выглядеть так, как у вас там, с внутренним идентификатором, возвращающимся много раз. Это связано с тем, что каждый товар в транзакции имеет разную цену / количество. То же самое произойдет, например, если вы ищете адрес клиента. В этом случае ваш поиск возвращает только 2 записи - 134200 и 134255, но выглядит повторяющимся. - person felipechang; 03.06.2014
comment
pipechang, Большое спасибо, вы не ошиблись, добавив параметр mainline = true. Я исправил свой запрос SOAP, и теперь он работает должным образом. - person Sergey Shafiev; 14.06.2014
comment
Привет, @Sergey Shafiev, как вы составляете счет для тех клиентов, у которых нет кредитного лимита, я столкнулся с проблемой, я был бы признателен, если бы вы могли поделиться со мной некоторыми подробностями stackoverflow.com/questions/52686093/ - person MUHAMMAD MUBUSHER ASLAM; 07.10.2018

Пипечанг был прав. Правильный запрос SOAP выглядит так:

<search xmlns="urn:messages_2013_1.platform.webservices.netsuite.com">
            <searchRecord xsi:type="q1:TransactionSearchAdvanced" xmlns:q1="urn:sales_2013_1.transactions.webservices.netsuite.com">
                <q1:criteria>
                    <q1:basic>
                        <mainLine xmlns="urn:common_2013_1.platform.webservices.netsuite.com">
                            <searchValue xmlns="urn:core_2013_1.platform.webservices.netsuite.com">true</searchValue>
                        </mainLine>
                        <type operator="anyOf" xmlns="urn:common_2013_1.platform.webservices.netsuite.com">
                            <searchValue xmlns="urn:core_2013_1.platform.webservices.netsuite.com">_salesOrder</searchValue>
                        </type>
                        <customFieldList xmlns="urn:common_2013_1.platform.webservices.netsuite.com">
                            <customField operator="anyOf" internalId="custbodyintegrationstatus" xsi:type="SearchMultiSelectCustomField" xmlns="urn:core_2013_1.platform.webservices.netsuite.com">
                                <searchValue internalId="2">
                                    <name>customlistintegrationstatuses</name>
                                </searchValue>
                            </customField>
                        </customFieldList>
                    </q1:basic>
                </q1:criteria>
                <q1:columns>
                    <q1:basic>
                        <internalId xmlns="urn:common_2013_1.platform.webservices.netsuite.com"/>
                    </q1:basic>
                </q1:columns>
            </searchRecord>
        </search>
person Sergey Shafiev    schedule 14.06.2014
comment
Привет, Сергей Шафиев, как вы составляете счет для тех клиентов, у которых нет кредитного лимита, у меня возникла проблема, я был бы признателен, если бы вы могли поделиться со мной некоторыми подробностями stackoverflow.com/questions/52686093/ - person MUHAMMAD MUBUSHER ASLAM; 07.10.2018