Thursday, January 22, 2015

Inserting/Upserting multiple objects in SFDC (salesforce.com) as part of a single transaction

Many times while creating business flows involving SFDC a common problem any developer would face is how to manage transactions, how to guaranteee that all operations on SFDC tables would be ACIDic.

Common Scenarios involve updating an Order Table and OrderLines table or an Invoice header and an Invoice Lines table, and so on and so forth.

There are two properties that will help a developer to navigate through this:

1.) The SFDC API (enterprise.wsdl) takes in SObjects,Yes, the types of the SObjects can be different, but they are all SObjects, which means you can send different types of Sobjects in a single SFDC request xml.

So , for instance, you could in one xml, send the updates for the Order and the OrderLines table, it will have multiple sobjects, (one header, and multiple line sobjects) and so on as the case be.

<insertInvoiceCreateInputVariable>
<part name="parameters" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<create xmlns:ns4="urn:enterprise.soap.sforce.com" xmlns="urn:enterprise.soap.sforce.com">
<ns4:sObjects xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ERP_Invoice__c">
<ens:Invoice_Number__c xmlns:ens="urn:sobject.enterprise.soap.sforce.com">00000</ens:Invoice_Number__c>
<ens:Invoice_Date__c xmlns:ens="urn:sobject.enterprise.soap.sforce.com">2015-01-14</ens:Invoice_Date__c>
<ens:Sold_to_BP_Number__c xmlns:ens="urn:sobject.enterprise.soap.sforce.com">00000</ens:Sold_to_BP_Number__c>
<ens:Bill_to_BP_Number__c xmlns:ens="urn:sobject.enterprise.soap.sforce.com">00000</ens:Bill_to_BP_Number__c>
<ens:Ship_to_BP_Number__c xmlns:ens="urn:sobject.enterprise.soap.sforce.com">000000</ens:Ship_to_BP_Number__c>
<ens:Customer_PO_Number__c xmlns:ens="urn:sobject.enterprise.soap.sforce.com">000000</ens:Customer_PO_Number__c>
<ens:ERP_Order__c xmlns:ens="urn:sobject.enterprise.soap.sforce.com">00000</ens:ERP_Order__c>
<ens:Header_Reference_Number__c xmlns:ens="urn:sobject.enterprise.soap.sforce.com"/>
<ens:Order_Type__c xmlns:ens="urn:sobject.enterprise.soap.sforce.com">000</ens:Order_Type__c>
<ens:Sold_to_Contact_Name__c xmlns:ens="urn:sobject.enterprise.soap.sforce.com"> </ens:Sold_to_Contact_Name__c>
<ens:Sold_to_Contact_Phone__c xmlns:ens="urn:sobject.enterprise.soap.sforce.com"/>
<ens:Sold_to_Contact_Email__c xmlns:ens="urn:sobject.enterprise.soap.sforce.com"/>
<ens:Invoice_Amount__c xmlns:ens="urn:sobject.enterprise.soap.sforce.com">0</ens:Invoice_Amount__c>
<ens:CurrencyIsoCode xmlns:ens="urn:sobject.enterprise.soap.sforce.com">USD</ens:CurrencyIsoCode>
<ens:Invoice_Header_Note__c xmlns:ens="urn:sobject.enterprise.soap.sforce.com"/>
<ens:Document_Type__c xmlns:ens="urn:sobject.enterprise.soap.sforce.com">00</ens:Document_Type__c>
<ens:Order_Date__c xmlns:ens="urn:sobject.enterprise.soap.sforce.com">2015-01-15</ens:Order_Date__c>
<ens:Billing_Frequency__c xmlns:ens="urn:sobject.enterprise.soap.sforce.com"/>
<ens:Billing_Method__c xmlns:ens="urn:sobject.enterprise.soap.sforce.com">Fully Upfront</ens:Billing_Method__c>
<Sales_Org_Id__c xmlns="">000</Sales_Org_Id__c>
</ns4:sObjects>
<ns4:sObjects xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ERP_Invoice_Detail__c">
<ens:Higher_Level_Position__c xmlns:ens="urn:sobject.enterprise.soap.sforce.com"/>
<ens:Invoice_Number__c xmlns:ens="urn:sobject.enterprise.soap.sforce.com">00000</ens:Invoice_Number__c>
<ens:Invoice_Line_Number__c xmlns:ens="urn:sobject.enterprise.soap.sforce.com">0000000</ens:Invoice_Line_Number__c>
<ens:Delivery_Number__c xmlns:ens="urn:sobject.enterprise.soap.sforce.com">00000</ens:Delivery_Number__c>
<ens:Delivery_Position_Number__c xmlns:ens="urn:sobject.enterprise.soap.sforce.com">000000</ens:Delivery_Position_Number__c>
<ens:ERP_Order_Number__c xmlns:ens="urn:sobject.enterprise.soap.sforce.com">000000</ens:ERP_Order_Number__c>
<ens:ERP_Order_Position__c xmlns:ens="urn:sobject.enterprise.soap.sforce.com">000000</ens:ERP_Order_Position__c>
<ens:Material_Number__c xmlns:ens="urn:sobject.enterprise.soap.sforce.com">000000</ens:Material_Number__c>
<ens:Invoiced_Qty__c xmlns:ens="urn:sobject.enterprise.soap.sforce.com">1.0</ens:Invoiced_Qty__c>
<ens:ERP_Plant__c xmlns:ens="urn:sobject.enterprise.soap.sforce.com">000</ens:ERP_Plant__c>
<ens:List_Price__c xmlns:ens="urn:sobject.enterprise.soap.sforce.com">0.000</ens:List_Price__c>
<ens:Invoice_Line_Net_Amount__c xmlns:ens="urn:sobject.enterprise.soap.sforce.com">0.000000</ens:Invoice_Line_Net_Amount__c>
<ens:Detail_Line_Reference_Number__c xmlns:ens="urn:sobject.enterprise.soap.sforce.com"/>
<ens:Installed_Product_Number__c xmlns:ens="urn:sobject.enterprise.soap.sforce.com"/>
<ens:Installed_Product_Serial_Number__c xmlns:ens="urn:sobject.enterprise.soap.sforce.com"/>
<ens:Quotation_Number__c xmlns:ens="urn:sobject.enterprise.soap.sforce.com"/>
<ens:Invoice_Line_Note__c xmlns:ens="urn:sobject.enterprise.soap.sforce.com"/>
<ens:Service_Contract_Start_Date__c xmlns:ens="urn:sobject.enterprise.soap.sforce.com">2015-01-14</ens:Service_Contract_Start_Date__c>
<ens:Service_Contract_End_Date__c xmlns:ens="urn:sobject.enterprise.soap.sforce.com">2016-01-14</ens:Service_Contract_End_Date__c>
<ens:Contact_Id__c xmlns:ens="urn:sobject.enterprise.soap.sforce.com"/>
</ns4:sObjects>
</create>
</part>
</insertInvoiceCreateInputVariable>

2.) In the SFDC header, set the AllorNone header to 'true' :

      <urn:AllOrNoneHeader>
         <urn:allOrNone></urn:allOrNone>
      </urn:AllOrNoneHeader>

Now, SFDC takes care that all these sobjects either get created(in this case, because it's a create operation) all successfully or all are rolled back when any one of them fails.

No comments:

Post a Comment