Получение значений полей как нулевых из сохраненного поиска в Netsuite

Я создал сохраненный поиск в Netsuite. Я пытаюсь получить значения полей через вызов веб-служб из моего приложения. Я получаю общий размер записей правильно, но при попытке получить значения полей я получаю нулевое значение для всех полей (например, имя элемента) из сохраненного поиска. Вот код:

TransactionSearchAdvanced tsa = new TransactionSearchAdvanced();
tsa.setSavedSearchId("825");
SearchResult result = _port.search(tsa);
System.out.println("size of recds..." + result.getTotalRecords());

if (result.getTotalRecords() > 0) {
    // retain the search ID in order to get more pages 
    String sSearchId = result.getSearchId();
    SearchRowList rowList = result.getSearchRowList();
    processRowList(rowList);
    int iNumPages = result.getTotalPages();
    System.out.println("pages" + iNumPages);
    for (int i = 2; i <= iNumPages; i++) {
        result = _port.searchMoreWithId(sSearchId, i);
        rowList = result.getSearchRowList();
        System.out.println("jjjj" + rowList);
        processRowList(rowList);
    }
}

_port.logout();

public void processRowList(SearchRowList rowList) {
    try {
        System.out.println("inside process...." + rowList);
        for (int i = 0; i < rowList.getSearchRow().length; i++) {
            TransactionSearchRow ts = (TransactionSearchRow) rowList.getSearchRow(i);
            TransactionSearchRowBasic tsb = ts.getBasic();
            SearchColumnSelectField[] scsf = tsb.getItem();
            for (SearchColumnSelectField sf: scsf) {
                RecordRef rf = sf.getSearchValue();
                System.out.println("itemname:::" + rf.getName());
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

2 ответа

Я новичок в Netsuite, но я отчаянно пытался решить ту же проблему, и я думаю, что у меня есть ответ. Я думаю, что когда вы пытаетесь напечатать имена элементов, вы пытаетесь перебрать все возможные поля, которые может иметь строка. Однако этот объект "item", который содержит TransactionSearchRowBasic, не является списком элементов, которые может содержать этот объект. Затем вы должны попытаться получить значения, которые содержит поиск, сохраненный в транзакции.

Итак, предположим, что у меня есть поиск сохраненных транзакций, в котором я хочу показать период транзакции, тип, счет, сумму, дату и внешний идентификатор соответствующего отдела. Сначала я посмотрел в этой ссылке идентификатор API каждой записи по сравнению с ее именем интерфейса:

https://system.netsuite.com/help/helpcenter/en_US/RecordsBrowser/2012_2/Records/transaction.html

Затем я использовал очень похожий код Java, как у вас, но с некоторыми исправлениями.

Этот метод проверяет, что все в порядке, и вызывает метод, который действительно печатает поля данных:

public void printTransactionRowFields() throws ExceededUsageLimitFault, UnexpectedErrorFault, InvalidSessionFault, ExceededRecordCountFault, RemoteException, UnsupportedEncodingException, SOAPException
    {
        TransactionSearchAdvanced tsa = new TransactionSearchAdvanced();
        //This is my Transaction saved search Internal ID
        String savedSearchID = "999";
        tsa.setSavedSearchId(savedSearchID);

        SearchResult srr = _port.search(tsa);
        boolean isSuccess = srr.getStatus().isIsSuccess();
        System.out.println("Search result: "+ isSuccess);
        int searchNumRecords = srr.getTotalRecords();
        System.out.println("Amount of records: "+ searchNumRecords);
        if (isSuccess) 
        {
            if(searchNumRecords > 0)
            {
                int iNumPages = srr.getTotalPages();
                //Must check the amount of pages to process every record
                System.out.println("Num pages: "+ iNumPages);
                //Must retain search ID to search for more pages. This is a web service ID, it's not the same as the internal ID "999"
                String sSearchID = srr.getSearchId();
                System.out.println("Search id: "  + sSearchID);
                SearchRowList rowList = srr.getSearchRowList();
                System.out.println("Num rows in row list 1: " +rowList.getSearchRow().length);
                processReportRowList(rowList);
                //We process the next iNumPages pages (it's not 0 index)
                for ( int i=2; i<=iNumPages; i++) {
                    //Users who authenticate to NetSuite by providing their credentials in the SOAP header of
                    //their requests must use searchMoreWithId to retrieve search results that span multiple pages.
                    //They cannot use searchMore or searchNext, since both operations require an active session.
                    //(For information on request-level-credential authentication, see Request-Level Credentials.)
                    srr = _port.searchMoreWithId(sSearchID, i);
                    rowList = srr.getSearchRowList();
                    System.out.println("Num rows in row list #" +i+": " +rowList.getSearchRow().length);
                    processReportRowList(rowList);
                } 
            }else{
                System.out.println("This saved search contains no records to process.");
            }
        }
        else{
            System.out.println("Search could not find Transaction Saved Search with id: " + savedSearchID);
        }
    }

Этот метод обрабатывает печать периода, типа, счета, суммы, даты, департамента моей транзакции:

public void processReportRowList(SearchRowList rowList) 
    {
        if(rowList!= null){
            System.out.println("Search row length: " + rowList.getSearchRow().length);
            for (int i=0; i<rowList.getSearchRow().length; i++) {
                TransactionSearchRow row=(TransactionSearchRow)rowList.getSearchRow(i); 
                TransactionSearchRowBasic basic= row.getBasic();
                System.out.println((basic==null)?"Basic is Null.":"Basic is not null.");
                RecordRef period = basic.getPostingPeriod(0).getSearchValue();
                String periodInternal = period.getInternalId();
                String  type = basic.getType(0).getSearchValue();
                RecordRef account = basic.getAccount(0).getSearchValue();
                Double amount = basic.getAmount(0).getSearchValue();
                Double amountFC = basic.getFxAmount(0).getSearchValue();
                Calendar tranDate = basic.getTranDate(0).getSearchValue();
                DepartmentSearchRowBasic deparmentRow = row.getDepartmentJoin();
                String departmentExternalID = deparmentRow.getExternalId(0).getSearchValue().getInternalId();
                //Print results
                System.out.println("Row# "+i+"\n"+"Period Internal ID: "+periodInternal +"\n Type: "+ type+ "\n Account Internal ID: "+
                accountInternal + "\n Amount: "+ amount + "Foreign Currency Amount: "+ amountFC + "\n Date: " + tranDate.getTime().toString()+
                "\n Department External ID: "+departmentExternalID);
            }

        }else{
            System.out.println("Row list arrived null");
        }
    }

Обратите внимание, что мне пришлось создать DepartmentSearchRowBasic, так как я пытаюсь получить внешний идентификатор отдела из записи отдела. В сохраненном поиске я выбрал внешний идентификатор этого отдела с помощью опции "Поля отдела...".

Если вы заблуждаетесь, какой метод над вашим объектом TransactionSearchRowBasic вернет вам правильное поле, выбранное вами в сохраненном результате поиска, вы можете использовать режим отладки Eclipse, чтобы увидеть, какие поля не равны NULL и какие типы они возвращают и содержат.

Надеюсь, что этот ответ поможет всем людям в отчаянии из-за отсутствия хорошей документации Netsuite! (Хотя это только мое мнение)

Вот пример, который выполняет поиск, просматривает результаты и присваивает имя дочерней компании (запись = дочерняя компания, имя поля = имя) переменной. Значение переменной переназначается при каждом появлении цикла и только для иллюстрации.

Я думаю, что вы искали функцию getFieldValue.

Подсказка: используйте браузер записей NetSuite и браузер схем для получения корректного списка записей и столбцов.

var rec = '';
var subsidiaryName = '';
var searchResults = nlapiSearchRecord( 'subsidiary', null, null, null );
for ( var i = 0; i < Math.min( 100, searchResults.length ); i++)
{
    var record = nlapiLoadRecord(searchResults[i].getRecordType(),searchResults[i].getId() );
    subsidiaryName = record.getFieldValue('name');
}
Другие вопросы по тегам