This is a brief description of the process:
- Prepare a new CustomerSearchBasic object instance
- Instead of calling search() call asyncSearch()
- The SOAP call will finish without getting the results
- Job ID is generated as a result of asyncSearch()
- Now the search operation is placed in NetSuite processing queue, identified by its Job ID
- use checkAsyncStatus() operation to check whether the search is already finished or not
- Once the Job has finished, fetch results with getAsyncResult()
Example code (search for Customer with Internal ID = 100):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NSWS_Async.com.netsuite.webservices;
namespace NSWS_Async
{
class Program
{
static void Main(string[] args)
{
// create service object and CookieContainer
NetSuiteService service = new NetSuiteService();
service.CookieContainer = new System.Net.CookieContainer();
// create Passport with credentials
service.passport = new Passport();
service.passport.account = "00000";
service.passport.email = "user@domain.com";
service.passport.password = "password";
// Example search object (looking for Customer with Internal ID = 100)
CustomerSearchBasic csearch = new CustomerSearchBasic();
csearch.internalId = new SearchMultiSelectField();
csearch.internalId.@operator = SearchMultiSelectFieldOperator.anyOf;
csearch.internalId.operatorSpecified = true;
csearch.internalId.searchValue = new RecordRef[1];
csearch.internalId.searchValue[0] = new RecordRef();
csearch.internalId.searchValue[0].internalId = "100";
// Make the Async call to NetSuite; it will return Job ID
AsyncStatusResult asyncResult = service.asyncSearch(csearch);
Console.WriteLine("Searching, status: " + asyncResult.status.ToString());
// Check the status
// when Failed, set searchFailed
// when pending or processing, set searchFinished = true, otherwise set SearchFinished = false
bool searchFinished = (!((asyncResult.status == AsyncStatusType.pending) ||
(asyncResult.status == AsyncStatusType.processing)));
bool searchFailed = (asyncResult.status == AsyncStatusType.failed);
// Now keep waiting for the search results
if (!searchFailed)
{
while ((!searchFinished) && (!searchFailed))
{
// Check current status of the job
AsyncStatusResult jobStatus = service.checkAsyncStatus(asyncResult.jobId);
searchFinished = (!((jobStatus.status == AsyncStatusType.pending) ||
(jobStatus.status == AsyncStatusType.processing)));
searchFailed = (jobStatus.status == AsyncStatusType.failed);
Console.WriteLine("Polling for job status: " + jobStatus.status.ToString()
+ " " + Convert.ToInt16(jobStatus.percentCompleted)
+ "% complete");
// sleep for 5 seconds if not finished yet
if (!searchFinished) { System.Threading.Thread.Sleep(5000); }
}
}
if (!searchFailed)
{
Console.WriteLine("Async job call successful. Fetching results");
// Fetch the job results
AsyncSearchResult result = (AsyncSearchResult)service.getAsyncResult(asyncResult.jobId, 1);
if (result.searchResult.status.isSuccess)
{
if (result.searchResult.recordList != null)
{
// Print out all returned records
foreach (Record record in result.searchResult.recordList)
{
Customer customer = (Customer)record;
Console.WriteLine("Returned customer: " + customer.companyName);
}
}
}
else
{
Console.WriteLine("Search failed");
// In case of error, show error details
if (result.searchResult.status.statusDetail != null)
{
foreach (StatusDetail statusDetail in result.searchResult.status.statusDetail)
{
Console.WriteLine("ERROR: " + statusDetail.message);
}
}
}
}
else
{
Console.WriteLine("Async job call failed");
}
Console.WriteLine("Finished. Press ENTER to exit.");
Console.ReadLine();
}
}
}
No comments:
Post a Comment