Search code examples
javaweb-servicessoapwsdlnetsuite

How to get client list using SOAP Web Services in Netsuite ERP?


I am really new to SOAP web services and to Netsuite ERP and I am trying to generate a report in my company where I need to obtain all the Clients and their Invoices using the data available in Netsuite ERP. I followed the Java and Axis tutorial they offer with their sample app for the ERP and I successfully created a Java project in Eclipse that consumes the WSDL for netsuite 2015-2 and compiles the needed classes to run the sample app. So, I followed an example found in their CRM exapmle app to obtain a Client's information but the only problem is that their example method needs you to introduce the Client's ID. Here is the sample code:

 public int getCustomerList() throws RemoteException,
                ExceededUsageLimitFault, UnexpectedErrorFault, InvalidSessionFault,
                ExceededRecordCountFault, UnsupportedEncodingException {
            // This operation requires a valid session
            this.login(true);

            // Prompt for list of internalIds and put in an array
            _console
                    .write("\ninternalIds for records to retrieved (separated by commas): ");
            String reqKeys = _console.readLn();
            String[] internalIds = reqKeys.split(",");

            return getCustomerList(internalIds, false);
        }


private int getCustomerList(String[] internalIds, boolean isExternal)
            throws RemoteException, ExceededUsageLimitFault,
            UnexpectedErrorFault, InvalidSessionFault, ExceededRecordCountFault {
        // Build an array of RecordRef objects and invoke the getList()
        // operation to retrieve these records
        RecordRef[] recordRefs = new RecordRef[internalIds.length];
        for (int i = 0; i < internalIds.length; i++) {
            RecordRef recordRef = new RecordRef();
            recordRef.setInternalId(internalIds[i]);
            recordRefs[i] = recordRef;
            recordRefs[i].setType(RecordType.customer);
        }

        // Invoke getList() operation
        ReadResponseList getResponseList = _port.getList(recordRefs);

        // Process response from get() operation
        if (!isExternal)
            _console.info("\nRecords returned from getList() operation: \n");

        int numRecords = 0;
        ReadResponse[] getResponses = getResponseList.getReadResponse();
        for (int i = 0; i < getResponses.length; i++) {
            _console.info("\n  Record[" + i + "]: ");

            if (!getResponses[i].getStatus().isIsSuccess()) {
                _console.errorForRecord(getStatusDetails(getResponses[i]
                        .getStatus()));
            } else {
                numRecords++;
                Customer customer = (Customer) getResponses[i].getRecord();
                _console.info("    internalId="
                        + customer.getInternalId()
                        + "\n    entityId="
                        + customer.getEntityId()
                        + (customer.getCompanyName() == null ? ""
                                : ("\n    companyName=" + customer
                                        .getCompanyName()))
                        + (customer.getEntityStatus() == null ? ""
                                : ("\n    status=" + customer.getEntityStatus().getName()))
                        + (customer.getEmail() == null ? ""
                                : ("\n    email=" + customer.getEmail()))
                        + (customer.getPhone() == null ? ""
                                : ("\n    phone=" + customer.getPhone()))
                        + "\n    isInactive="
                        + customer.getIsInactive()
                        + (customer.getDateCreated() != null ? ""
                                : ("\n    dateCreated=" + customer
                                        .getDateCreated().toString())));
            }
        }

        return numRecords;
    }

So as you can see, this method needs the internal ID of each Customer which I find not useful as I have a many Customers and I don't want to pass each Customer's ID. I read their API docs (which I find hard to navigate and kind of useless) and I found a web service called getAll() that gives all the records given a getAllRecord object which requires a getAllRecordType object. However, the getAllRecordType object does not support Customer entities, so I can't obtain all the customers on the ERP this way.

Is there an easy way to obtain all the Customers in my Netsuite ERP (maybe using other thing rather than the SOAP Web Services they offer? I am desperate about this situation as understanding how Netsuite's Web Services API has been really troublesome.

Thanks!


Solution

  • I made it using the following code on my getCustomerList method:

            CustomerSearch customerSrch = new CustomerSearch();
            SearchResult searchResult = _port.search(customerSrch);
            System.out.println(searchResult.getTotalRecords());
            RecordList rl = searchResult.getRecordList();
            for (int i = 0; i <searchResult.getTotalRecords()-1; i++) {
                Record r = rl.getRecord(i);
                System.out.println("Customer # " + i);
                Customer testcust = (Customer)r;
                System.out.println("First Name: " + testcust.getFirstName());
            }