3
votes

Greetings, Well I am bewildered. I have been tasked with updating a PHP script that uses the BulkAPI to upsert some data into the Opportunity entity.

This is all going well except that the Bulk API is returning this error for some clearly defined custom fields:

InvalidBatch : Field name not found : cv__Acknowledged__c

And similar.

I thought I finally found the problem when I discovered the WSDL version I was using was quite old (Partner WSDL). So I promptly regenerated the WSDL. Only problem? Enterprise, Partner, etc....all of them...do not include these fields. They're all coming from the Common Ground package and start with cv_

I even tried to find them in the object explorer in Workbench as well as the schema explorer in Force.com IDE.

So, please...lend me your experience. How can I update these values?

Thanks in advance!

Clif

Screenshots to prove I have the correct access: alt textalt textalt text

EDIT -- Here is my code:

require_once 'soapclient/SforcePartnerClient.php';
        require_once 'BulkApiClient.php';

        $mySforceConnection = new SforcePartnerClient();
        $mySoapClient = $mySforceConnection->createConnection(APP.'plugins'.DS.'salesforce_bulk_api_client'.DS.'vendors'.DS.'soapclient'.DS.'partner.wsdl.xml');

        $mylogin = $mySforceConnection->login('[email protected]', 'redactedSessionredactedPassword');

        $myBulkApiConnection = new BulkApiClient($mylogin->serverUrl, $mylogin->sessionId);

        $job = new JobInfo();
        $job->setObject('Opportunity');
        $job->setOpertion('upsert');
        $job->setContentType('CSV');
        $job->setConcurrencyMode('Parallel');
        $job->setExternalIdFieldName('Id');
        $job = $myBulkApiConnection->createJob($job);

        $batch = $myBulkApiConnection->createBatch($job, $insert);

        $myBulkApiConnection->updateJobState($job->getId(), 'Closed');

        $times = 1;
        while($batch->getState() == 'Queued' || $batch->getState() == 'InProgress')
        {
            $batch = $myBulkApiConnection->getBatchInfo($job->getId(), $batch->getId());
            sleep(pow(1.5, $times++));
        }

        $batchResults = $myBulkApiConnection->getBatchResults($job->getId(), $batch->getId());

        echo "Number of records processed: " . $batch->getNumberRecordsProcessed() . "\n";
        echo "Number of records failed: " . $batch->getNumberRecordsFailed() . "\n";
        echo "stateMessage: " . $batch->getStateMessage() . "\n";

        if($batch->getNumberRecordsFailed() > 0 || $batch->getNumberRecordsFailed() == $batch->getNumberRecordsProcessed())
        {
            echo "Failures detected. Batch results:\n".$batchResults."\nEnd batch.\n";
        }

And lastly, an example of the CSV data being sent:

"Id","AccountId","Amount","CampaignId","CloseDate","Name","OwnerId","RecordTypeId","StageName","Type","cv__Acknowledged__c","cv__Payment_Type__c","ER_Acknowledgment_Type__c"
"#N/A","0018000000nH16fAAC","100.00","70180000000nktJ","2010-10-29","Gary Smith $100.00 Single Donation 10/29/2010","00580000001jWnq","01280000000F7c7AAC","Received","Individual Gift","Not Acknowledged","Credit Card","Email"
"#N/A","0018000000nH1JtAAK","30.00","70180000000nktJ","2010-12-20","Lisa Smith $30.00 Single Donation 12/20/2010","00580000001jWnq","01280000000F7c7AAC","Received","Individual Gift","Not Acknowledged","Credit Card","Email"
3
You should check the Field level security settings on the fields. - superfell
You should be able to update any field while using Partner WSDL (fallback to generic sObject without relying on whatever is explicitly listed in Enterprise). Have you tried working with normal (non-bulk) webservices API? Doesn't matter whether the fields come from package or are self-made: if Eclipse and Data Loader allow you to work on them, then they're visible in normal API. Maybe there's a bug in bulk API? - eyescream
The schema explorer in Eclipse doesn't show them either. I feel like I'm missing something retarded. - clifgriffin
Either the fields are being hidden by field level security for your profile, or you're looking at a different login. - superfell
My profile is System Administrator ALT. A custom profile that seems to be a 100% clone of System Administrator. I have added screenshots to show you that my profile has all of the access necessary to Opportunity (both field-level and object-level). Any other ideas? Am I missing something? - clifgriffin

3 Answers

8
votes

After 2 weeks, 4 cases, dozens of e-mails and phone calls, 3 bulletin board posts, and 1 Stackoverflow question, I finally got a solution.

The problem was quite simple in the end. (which makes all of that all the more frustrating)

As stated, the custom fields I was trying to update live in the Convio Common Ground package. Apparently our install has 2 licenses for this package. None of the licenses were assigned to my user account.

It isn't clear what is really gained/lost by not having the license other than API access. As the rest of this thread demonstrates, I was able to see and update the fields in every other way.

If you run into this, you can view the licenses on the Manage Packages page in Setup. Drill through to the package in question and it should list the users who are licensed to use it.

alt text

Thanks to SimonF's professional and timely assistance on the Developer Force bulletin boards: http://boards.developerforce.com/t5/Perl-PHP-Python-Ruby-Development/Bulk-API-So-frustrated/m-p/232473/highlight/false#M4713

0
votes

I really think this is a field level security issue. Is the field included in the opportunity layout for that user profile? Field level security picks the most restrictive option, so if you seem to have access from the setup screen but it's not included in the layout, I don't think the system will give you access.

0
votes

If you're certain that your user's profile has FLS access to the fields and the assigned layouts include the fields, then I'd suggest looking into the definition of the package in question. I know the bulk API allows use of fields in managed packages normally (I've done this).

My best guess at this point is that your org has installed multiple versions of this package over time. Through component deprecation, it's possible the package author deprecated these custom fields. Take a look at two places once you've logged into salesforce:

1.) The package definition page. It should have details about what package version was used when the package was first installed and what package version you're at now.

2.) The page that has WSDL generation links. If you choose to generate the enterprise WSDL, you should be taken to a page that has dropdown elements that let you select which package version to use. Try fiddling with those to see if you can get the fields to show up.

These are just guesses. If you find more info, let me know, and I can try to provide additional guidance.