Kevin M 2017-11-28T18:22:50
Here's an example that actually does the paging correctly.\n\nservice.searchPreferences = new SearchPreferences();\nservice.searchPreferences.bodyFieldsOnly = true;\nservice.searchPreferences.returnSearchColumns = true;\n\nTransactionSearchAdvanced customSearch = new TransactionSearchAdvanced()\n{\n columns = new TransactionSearchRow()\n {\n basic = new TransactionSearchRowBasic()\n {\n dateCreated = new SearchColumnDateField[] { new SearchColumnDateField() }\n ,\n tranDate = new SearchColumnDateField[] { new SearchColumnDateField() }\n ,\n type = new SearchColumnEnumSelectField[] { new SearchColumnEnumSelectField() }\n ,\n tranId = new SearchColumnStringField[] { new SearchColumnStringField() }\n ,\n internalId = new SearchColumnSelectField[] { new SearchColumnSelectField() }\n ,\n entity = new SearchColumnSelectField[] { new SearchColumnSelectField() }\n ,\n item = new SearchColumnSelectField[] { new SearchColumnSelectField() }\n ,\n lastModifiedDate = new SearchColumnDateField[] { new SearchColumnDateField() }\n }\n ,\n itemJoin = new ItemSearchRowBasic()\n {\n itemId = new SearchColumnStringField[] { new SearchColumnStringField() }\n }\n }\n ,\n criteria = new TransactionSearch()\n {\n basic = new TransactionSearchBasic()\n {\n type = new SearchEnumMultiSelectField()\n {\n @operator = SearchEnumMultiSelectFieldOperator.anyOf\n ,\n operatorSpecified = true\n ,\n searchValue = new string[] {\n \"_salesOrder\"\n }\n }\n ,\n lastModifiedDate = new SearchDateField()\n {\n @operator = SearchDateFieldOperator.onOrAfter\n ,\n operatorSpecified = true\n ,\n searchValue = DateTime.Now.AddDays(-15)\n ,\n searchValueSpecified = true\n }\n }\n }\n};\n\nConsole.WriteLine(\"Querying NetSuite\");\n\nSearchResult res = service.search(customSearch);\n\nConsole.WriteLine(\"\\nThe advanced search completed.\");\nConsole.WriteLine(\"\\n Total Records = \" + res.totalRecords);\nConsole.WriteLine(\" Total Pages = \" + res.totalPages);\nConsole.WriteLine(\" Page Size = \" + res.pageSize);\nConsole.WriteLine(\" Current Page Index = \" + res.pageIndex);\n\nConsole.WriteLine(\"\\n\\nHit Enter to list results\");\nConsole.ReadLine();\n\nwhile (res.searchRowList.Length > 0)\n{\n Console.WriteLine($\"\\n\\nProcessing page: {res.pageIndex}\");\n Console.WriteLine($\"Result count: {res.searchRowList.Length}\");\n\n Console.WriteLine($\"\\nHit enter to list page {res.pageIndex} results\");\n Console.ReadLine();\n\n\n foreach (TransactionSearchRow transactionRow in res.searchRowList)\n {\n TransactionSearchRowBasic transactionRowBasic = transactionRow.basic;\n ItemSearchRowBasic itemRowBasic = transactionRow.itemJoin;\n Console.WriteLine(\n \"\\n tranId=\" + transactionRowBasic.tranId[0].searchValue +\n (itemRowBasic == null ? \"\" : (\"\\n item.name=\" + itemRowBasic.itemId[0].searchValue)) \n );\n }\n\n Console.WriteLine(\"\\nQuerying NetSuite again...\");\n res = service.searchMore(++res.pageIndex);\n}\n\nservice.logout();\nConsole.WriteLine(\"\\n\\nHit Enter to close this window.\");\nConsole.ReadLine();\n",
Kevin M 2017-11-28T15:28:26
I reviewed examples provided in the NSClientERP project downloadable from NetSuite. Here is a simplified example. \n\n service.searchPreferences = new SearchPreferences();\n service.searchPreferences.bodyFieldsOnly = true;\n service.searchPreferences.returnSearchColumns = true;\n\n TransactionSearchAdvanced customSearch = new TransactionSearchAdvanced()\n {\n columns = new TransactionSearchRow()\n {\n basic = new TransactionSearchRowBasic()\n {\n dateCreated = new SearchColumnDateField[] { new SearchColumnDateField() }\n , tranDate = new SearchColumnDateField[] { new SearchColumnDateField() }\n , type = new SearchColumnEnumSelectField[] { new SearchColumnEnumSelectField() }\n , tranId = new SearchColumnStringField[] { new SearchColumnStringField() }\n , internalId = new SearchColumnSelectField[] { new SearchColumnSelectField() }\n , entity = new SearchColumnSelectField[] { new SearchColumnSelectField() }\n , item = new SearchColumnSelectField[] { new SearchColumnSelectField() }\n , lastModifiedDate = new SearchColumnDateField[] { new SearchColumnDateField() }\n }\n , itemJoin = new ItemSearchRowBasic()\n {\n itemId = new SearchColumnStringField[] { new SearchColumnStringField() }\n }\n }\n ,\n criteria = new TransactionSearch()\n {\n basic = new TransactionSearchBasic()\n {\n type = new SearchEnumMultiSelectField()\n {\n @operator = SearchEnumMultiSelectFieldOperator.anyOf\n , operatorSpecified = true\n , searchValue = new string[] {\n \"_salesOrder\"\n }\n }\n , lastModifiedDate = new SearchDateField()\n {\n @operator = SearchDateFieldOperator.onOrAfter\n , operatorSpecified = true\n , searchValue = DateTime.Now.AddDays(-3)\n , searchValueSpecified = true\n }\n }\n }\n };\n\n Console.WriteLine(\"Querying NetSuite\");\n\n SearchResult searchResult = service.search(customSearch);\n\n Console.WriteLine(\"Query Results: \" + searchResult.totalRecords.ToString());\n int total = searchResult.totalRecords;\n int updated = 0;\n bool searchMore = false;\n\n\n Console.WriteLine(\"\\nThe search() operation for transaction was run successfully.\");\n Console.WriteLine(\"\\n Total Records = \" + searchResult.totalRecords);\n Console.WriteLine(\" Total Pages = \" + searchResult.totalPages);\n Console.WriteLine(\" Page Size = \" + searchResult.pageSize);\n Console.WriteLine(\" Current Page Index = \" + searchResult.pageIndex);\n\n Console.WriteLine(\"\\n\\nHit Enter to list results\");\n Console.ReadLine();\n\n SearchRow[] records = searchResult.searchRowList;\n\n if (records != null)\n {\n for (int i = 0, j = (searchResult.pageIndex - 1) * searchResult.pageSize; i < records.Length; i++, j++)\n {\n TransactionSearchRow transactionRow = (TransactionSearchRow) records[i];\n TransactionSearchRowBasic transactionRowBasic = transactionRow.basic;\n ItemSearchRowBasic itemRowBasic = transactionRow.itemJoin;\n Console.WriteLine(\n \"\\n Transaction Return Columns Row[\" + j + \"]: \" +\n \"\\n internalId=\" + transactionRowBasic.internalId[0].searchValue.internalId +\n \"\\n tranId=\" + transactionRowBasic.tranId[0].searchValue +\n \"\\n type=\" + transactionRowBasic.type[0].searchValue +\n (transactionRowBasic.entity == null ? \"\" : (\"\\n customer internalID=\" + transactionRowBasic.entity[0].searchValue.internalId)) +\n (transactionRowBasic.item == null ? \"\" : (\"\\n item=\" + transactionRowBasic.item[0].searchValue.internalId)) +\n (itemRowBasic == null ? \"\" : (\"\\n item.name=\" + itemRowBasic.itemId[0].searchValue)) +\n (transactionRowBasic.dateCreated == null ? \"\" : (\"\\n createdDate=\" + transactionRowBasic.dateCreated[0].searchValue.ToString()) +\n (transactionRowBasic.tranDate == null ? \"\" : (\"\\n tranDate=\" + transactionRowBasic.tranDate[0].searchValue.ToString())) +\n (transactionRowBasic.lastModifiedDate == null ? \"\" : (\"\\n lastModifiedDate=\" + transactionRowBasic.lastModifiedDate[0].searchValue.ToString()))));\n }\n }\n\n\nIt is important to set your search preferences prior to performing your advanced search. Without setting returnSearchFields to true, I got no results. Also, you must supply both criteria and columns. In the NSClientERP example, each object starting with the TransactionSearchAdvanced was instantiated, configured and linked to child objects in separate lines of code. I found this very hard to follow. I'm using one line of code that instantiates the entire search object.\n\nAnother thing to note is the itemJoin, which joins the Items table to a sales order line item. There are other joins available to you, such as billingTransactionJoin. Leveraging those joins, you can reach into associated tables to get things like the item's display name, inventory information, or tracking numbers when an item ships.\n\nI have been unable to find a way to sort the results, other than filling a dataset and sorting after the fact. If anyone has a better way, please let me know. ",