Thursday, June 13, 2013

PUBLISHER ACTIONS in Summer 13 Features

Add and Customize Actions in the Chatter Publisher
Available in: Group, Professional, Enterprise, Unlimited, Contact Manager, Database.com, and Developer Editions





The Chatter publisher is the tool at the top of each feed that lets users post comments and polls and share files and links. With publisher actions, we’ve made the publisher more useful and more flexible. The publisher actions feature lets you create actions and add them to the Chatter publisher on the home page, the Chatter tab, and record detail pages. It also allows you to customize the order in which the standard Chatter actions appear, including Post, File, Link, and Poll.

Actions Overview
Actions let users do more in Chatter, like create records directly in the feed. There are two general types of actions: create actions and custom actions.
Create actions let users create records. They’re different from the New button on object tabs and the Quick Create and Create New features on the home page. Create actions respect your validation rules and field requiredness, and you can choose each action’s fields.
Custom actions are Visualforce pages with functionality you define. For example, you might create a custom action to let users write comments longer than 1000 characters.
Note: For both types of actions, you can create either object-specific actions or global actions.















Enabling Publisher Actions
1. From Setup, click Customize > Chatter > Settings.
2. Click Edit.
3. Select Enable Publisher Actions.
4. Click Save.

New Feed Tracking Option with Publisher Actions
When you enable publisher actions, a new option, All Related Objects, appears on the feed tracking page for account, campaign, case, contact, custom objects, lead, and opportunity. This option lets users view feed activity for objects that have a parent-child or lookup relationship to the host object.
1. From Setup, click Customize > Chatter > Feed Tracking > All Related Objects.

Object-Specific (Create Action)
1. From Setup, click Customize > Lead > Buttons, Links, and Actions
2. From Setup, click Customize > Lead > Page Layouts


































Global Action (Create Actions)
1. From Setup, click Create > Global Actions
2. From Setup, click Customize > Chatter > Publisher Layouts
3. From Setup, click Customize > Account > Buttons, Links, and Actions














































Object-Specific Custom Actions 
Object-specific custom actions let users interact with or create records that have a relationship to an object record. The Visualforce page for an object-specific custom action must include the standard controller for the relevant object. For example, if you want to create a custom action that lets users import a contact’s Twitter profile and add that information to a contact record, you need to use the standard contact controller.
1. From Setup, click Customize > Lead > Buttons, Links, and Actions
2. From Setup, click Customize > Lead > Page Layouts

Global Custom Actions
Create a global custom action for tasks that don’t require users to interact with or create records that have a relationship to a specific object. Visualforce pages you want to use as global custom actions can’t use standard controllers. For example, if you want to create a custom action that lets users enter a street address and see a map, the local time, and the local weather, create a Visualforce page that doesn’t use any of the standard controllers, and add it as a custom global action.
1. From Setup, click Create > Global Actions
2. From Setup, click Customize > Chatter > Publisher Layouts
3. From Setup, click Customize > Lead > Buttons, Links, and Actions















Supported Objects
You can create object-specific actions on these objects:
• Account
• Campaign
• Case
• Contact
• Custom objects
• Lead
• Opportunity
• User
You can create actions that let users create these kinds of records:
• Account
• Asset
• Campaign
• Case
• Contact
• Contract
• Custom objects
• Entitlement
• Event (without invitees)
• Lead
• Opportunity
• Service Contract
• Task

Note: When you create an object-specific action, you can choose as a target object only event, task, or any object that has a parent-child or lookup relationship to the host object.


Wednesday, June 12, 2013

Syncing Salesforce Quotes using Apex

Wondering how to sync quote with an opportunity using Apex? Did you tried updating the “IsSyncing” field and it showed an error saying field is not writable? If yes then here is the solution for you. At the Opportunity level you have a field named as “SyncedQuoteId” and if you update this field with the desired quote id, then salesforce automatically sync this quote with opportunity.

Opportunity.SyncedQuoteId = (desired) Quote.id;
update opportunity;

In the same way do you wanna sync your custom fields for quote and quote line item then here is the application from appexchange.

App Exchange App's:
Custom Quote Sync (Managed)

Custom Quote Sync (Unmanaged)

Tuesday, June 4, 2013

Integrate Custom Apex WebService with .Net Using Force.com SOAP API

This blog post will describe that how to create an Apex web service and integrate it with .Net App using Force.com SOAP API.

Below is an example of how to integrate Apex webservice with Force.com SOAP API and .Net Apps using Visual Studio.

To get started, we'll run through the following steps:

1) Create an Apex webService class

Apex Code:
/********************************************************************************/
global class SuperClass{
    global class RequestClass{
        webService String accountName;
    }
    global class ResponseClass{
        webService String responseResultID;
        webService String responseResultName;
        webService String responseResultRecordType;
    }
    webService static ResponseClass behaviourOfWebService(RequestClass reqClass){
        Account acct = new Account();
        acct.Name = reqClass.accountName;
        insert acct;
        ResponseClass resClass = new ResponseClass();
        resClass.responseResultID = acct.Id;
        resClass.responseResultName = acct.Name;
        resClass.responseResultRecordType = acct.RecordTypeId;
        return resClass;
    }
}
/********************************************************************************/

2) Download the "Enterprise WSDL" or "Partner WSDL" from your salesforce.com organization.

Log in into salesforce.com organization -> User Name ->  Setup -> App Setup section -> Develop -> API -> click on Generate Enterprise or Partner WSDL -> Save file with extension ".wsdl" as "EnterpriseWSDL.wsdl" or "PartnerWSDL.wsdl".

3) Download the Apex class "SuperClass" wsdl.

Log in into salesforce.com organization -> User Name ->  Setup -> App Setup section -> Develop -> Apex Classes-> click on SuperClass -> click Generate WSDL -> Save file with extension ".wsdl" as "WebServiceWSDL.wsdl".

4) Create a .Net App in Visual Studio

Open Visual Studio -> File -> New -> Project -> Visual C# -> Windows -> Console Application -> Name it "CustomWebService" -> OK

5) Copy the path where your both WSDL's are present.

For Example:
C:\Users\Administrator\Desktop\EnterpriseWSDL.wsdl
C:\Users\Administrator\Desktop\WebServiceWSDL.wsdl

6) Add these WSDL's as Web References in Visual Studio.

In Solution Explorer -> right click on project -> Add Web Reference -> add the path in URL for Enterprise WSDL -> Web reference name = EnterpriseWSDL -> click Add Reference.

For Example:
C:\Users\Administrator\Desktop\EnterpriseWSDL.wsdl

In Solution Explorer -> right click on project -> Add Web Reference -> add the path in URL for Apex Class WSDL -> Web reference name = WebServiceWSDL -> click Add Reference.

For Example:
C:\Users\Administrator\Desktop\WebServiceWSDL.wsdl

Your Project in Visual Studio will look like below screenshot:




















7) Write C# Code to integrate with Force.com Apex Web Service using Force.com SOAP API

C# Code:
/********************************************************************************/
using System;
using System.Collections.Generic;
using System.Text;

namespace CustomWebService
{
    class Program
    {
        static void Main(string[] args)
        {
            /*
            When I add WebReferences I named Apex Class WSDL as "WebServiceWSDL"
            When I add WebReferences I named Enterprise WSDL as "EnterpriseWSDL"
            */

            //Salesforce.com Credentials
            string userName = "Your User Name";
            string userPassword = "Your Password + Your Security Token";

            //Apex Main Class WSDL Object
            WebServiceWSDL.SessionHeader webServiceWSDLSession = new WebServiceWSDL.SessionHeader();

            //Enterprise WSDL Object
            EnterpriseWSDL.LoginResult enterpriseWSDLLoginResult = new EnterpriseWSDL.LoginResult();
            EnterpriseWSDL.SforceService enterpriseWSDLSforceService = new EnterpriseWSDL.SforceService();

            //Make Sessions and Login successfully
            enterpriseWSDLLoginResult = enterpriseWSDLSforceService.login(userName, userPassword);
            enterpriseWSDLSforceService.Url = enterpriseWSDLLoginResult.serverUrl;
            webServiceWSDLSession.sessionId = enterpriseWSDLLoginResult.sessionId;

            //Number of records to process
            int numOfRecords = 1;

            //Apex Inner Class RequestClass object to fill the variables of RequestClass and send it to Salesforce.com
            WebServiceWSDL.RequestClass reqClass = new WebServiceWSDL.RequestClass();
            WebServiceWSDL.RequestClass[] reqClassList = new WebServiceWSDL.RequestClass[numOfRecords];
         
            //Traverse each record
            for (int i = 0; i < numOfRecords; i++)
            {
                reqClass = new WebServiceWSDL.RequestClass();
                reqClass.accountName = "Account Name from Dot Net";
                reqClassList[i] = reqClass;
            }

            //Apex Main Class Object
            WebServiceWSDL.SuperClassService mainWSDLClassObject = new WebServiceWSDL.SuperClassService();
            mainWSDLClassObject.SessionHeaderValue = new WebServiceWSDL.SessionHeader();
            mainWSDLClassObject.SessionHeaderValue.sessionId = webServiceWSDLSession.sessionId;
            //mainWSDLClassObject.behaviourOfWebService(reqClassList[0]);

            //Retrieve the Response of Apex class
            WebServiceWSDL.ResponseClass responseClassObject = new WebServiceWSDL.ResponseClass();
            responseClassObject = mainWSDLClassObject.behaviourOfWebService(reqClassList[0]);

            //Response Result
            Console.WriteLine("ID" + responseClassObject.responseResultID);
            Console.WriteLine("NAME" + responseClassObject.responseResultName);
            Console.WriteLine("RECORD TYPE" + responseClassObject.responseResultRecordType);
            Console.ReadLine();

        }
    }
}
/********************************************************************************/

Integrate Custom Apex WebService with Java Using Force.com Web Services Connector (WSC)

This blog post will describe that how to create an Apex web service and integrate it with Java App using Force.com Web Services Connector (WSC).

Below is an example of how to integrate Apex webservice with Force.com SOAP API  and Java Apps using Eclipse IDE.

To get started, we'll run through the following steps:

1) Create an Apex webService class

Apex Code:
/********************************************************************************/
global class SuperClass{
    global class RequestClass{
        webService String accountName;
    }
    global class ResponseClass{
        webService String responseResultID;
        webService String responseResultName;
        webService String responseResultRecordType;
    }
    webService static ResponseClass behaviourOfWebService(RequestClass reqClass){
        Account acct = new Account();
        acct.Name = reqClass.accountName;
        insert acct;
        ResponseClass resClass = new ResponseClass();
        resClass.responseResultID = acct.Id;
        resClass.responseResultName = acct.Name;
        resClass.responseResultRecordType = acct.RecordTypeId;
        return resClass;
    }
}
/********************************************************************************/

2) You need to install "Java JDK (6 or 7)" in your machine.
3) Second you need to check whether "Java JDK (6 or 7)" has installed successfully or not?

Just type in the command prompt:
java -version

You will the result same as below:
It will show you:
java version "1.6.0_35"
Java(TM) SE Runtime Environment (build 1.6.0_35-b10-428-10M3811)
Java HotSpot(TM) 64-Bit Server VM (build 20.10-b01-428, mixed mode)

Note: If you get error then change your command prompt directory to the Java bin directory and test it again.

For Example:
C:\Program Files\Java\jdk1.6.0_45\bin> java -version

4) Download the "Enterprise WSDL" or "Partner WSDL" from your salesforce.com organization.

Log in into salesforce.com organization -> User Name ->  Setup -> App Setup section -> Develop -> API -> click on Generate Enterprise or Partner WSDL -> Save file with extension ".wsdl" as "enterprise.wsdl" or "partner.wsdl".

5) Download the Apex class "SuperClass" wsdl.

Log in into salesforce.com organization -> User Name ->  Setup -> App Setup section -> Develop -> Apex Classes-> click on SuperClass -> click Generate WSDL -> Save file with extension ".wsdl" as "mywebservice.wsdl".

6) Download the Web Services Connector (WSC) "wsc-20.jar" file from the URL "http://code.google.com/p/sfdc-wsc/downloads/list".

7) Now create JAR (Java ARchive) files for "enterprise.wsdl", "partner.wsdl" and "mywebservice.wsdl" files.

8) Copy the "tools.jar" file from the path where you have installed "Java JDK (6 or 7)".

For Example:
"C:\Program Files\Java\jdk1.6.0_45\lib\tools.jar" and paste it in your "E:\" drive. I am doing this just for safe side so we will not have any conflicts.

Note: 
(a) "tools.jar" and "wsc-20.jar" file both must be in the same directory otherwise, you will get an error "classpath: java.io.FileNotFoundException".
(b) Just for safe side I would recommend that your "E:\" drive must have "tools.jar", "wsc-20.jar", "enterprise.wsdl", "partner.wsdl" and "mywebservice.wsdl".

9) Execute the following commands in Command Prompt to generate JAR File "JAR file (Java ARchive)" for "enterprise.wsdl" or "partner.wsdl" and "mywebservice.jar".

For Example:
java -classpath wsc-XX.jar com.sforce.ws.tools.wsdlc enterprise.wsdl enterprise.jar

Real Example:
Generate enterprise.jar
java -classpath E:\tools.jar;E:\wsc-20.jar com.sforce.ws.tools.wsdlc E:\enterprise.wsdl E:\enterprise.jar

Generate partner.jar
java -classpath E:\tools.jar;E:\wsc-20.jar com.sforce.ws.tools.wsdlc E:\partner.wsdl E:\partner.jar

Generate mywebservice.jar
java -classpath E:\tools.jar;E:\wsc-20.jar com.sforce.ws.tools.wsdlc E:\mywebservice.jar.wsdl E:\mywebservice.jar

Now these commands will generate "enterprise.wsdl" or "partner.wsdl" and "mywebservice.jar".

Generate Java Code in Eclipse (Creating an Enterprise WSDL Application)

Now that your environment is ready to go, it's time to build a test application to see how things are working. Most developers build client applications with the enterprise WSDL, so we’ll start with that one first.
In Eclipse, complete the following steps to build a Java application based on the enterprise WSDL.
  1. Create a new Java project named “WSC - Enterprise” (click File | New | Java Project).
  2. Add the wsc-XX.jar and enterprise.jar to the project (click Project | Properties | Java Build Path | Libraries or External Libraries, then add the JARs to the project.
  3. Add a new folder, wsc, to the src folder in your app (right-click src in Package Explorer, then click New | Folder).
  4. Create a new class src/wsc/CallWS.java and paste in the code from the code listing that follows.
  5. Replace the stub user credentials in the code with your own user name and password with security token for the appropriate static members, then save your source code.
  6. Run the application.
Your Project in Eclipse IDE will look like below screenshot:
















Java Code:
/********************************************************************************/
package wsc;

import com.sforce.soap.SuperClass.SoapConnection;
import com.sforce.soap.SuperClass.Connector;
import com.sforce.soap.SuperClass.RequestClass;
import com.sforce.soap.SuperClass.ResponseClass;

import com.sforce.ws.ConnectionException;
import com.sforce.ws.ConnectorConfig;
import com.sforce.soap.enterprise.*;


public class CallWS {


  static final String USERNAME = "Your User Name";
  static final String PASSWORD = "You User Password + Your Security Token";

  static SoapConnection MyWebserviceWSconnection;
  static EnterpriseConnection enterpriseConnection;

  public static void main(String[] args) {

    ConnectorConfig config = new ConnectorConfig();
    config.setUsername(USERNAME);
    config.setPassword(PASSWORD);


    try {

      //create a connection to Enterprise API -- authentication occurs
      enterpriseConnection = com.sforce.soap.enterprise.Connector.newConnection(config);    
      // display some current settings
      System.out.println("Auth EndPoint: "+config.getAuthEndpoint());
      System.out.println("Service EndPoint: "+config.getServiceEndpoint());
      System.out.println("Username: "+config.getUsername());
      System.out.println("SessionId: "+config.getSessionId());


      //create new connection to exportData webservice -- no authentication information is included
      MyWebserviceWSconnection = Connector.newConnection("","");
      //include session Id (obtained from enterprise api) in exportData webservice
      MyWebserviceWSconnection.setSessionHeader(config.getSessionId());
      
      RequestClass reqClass = new RequestClass();
      reqClass.setAccountName("Account Created By Java Program");
      
      ResponseClass resClass = new ResponseClass();
      resClass = MyWebserviceWSconnection.behaviourOfWebService(reqClass);
      System.out.println("Record ID ---"+resClass.getResponseResultID());
      System.out.println("Record Name ---"+resClass.getResponseResultName());
      System.out.println("Record Record Type ---"+resClass.getResponseResultRecordType());

      //String result = MyWebserviceWSconnection.receiveData("test");
      //System.out.println("Result: "+result);


    } catch (ConnectionException e1) {
        e1.printStackTrace();
    }  
  }
}
/********************************************************************************/

Helpful Links:
http://wiki.developerforce.com/page/Introduction_to_the_Force.com_Web_Services_Connector
http://code.google.com/p/sfdc-wsc/downloads/list

http://boards.developerforce.com/t5/Java-Development/Trying-to-call-a-simple-Apex-Web-Service-method-from-Java/td-p/206407
http://boards.developerforce.com/t5/General-Development/How-to-Call-WebService-Method-in-Java/td-p/261755
http://kperisetla.blogspot.com/2011/09/creating-custom-apex-web-service-in.html
http://forums.crmsuccess.com/t5/forums/forumtopicprintpage/board-id/JAVA_development/message-id/5930/print-single-message/false
http://boards.developerforce.com/t5/Java-Development/Problem-Calling-Apex-WebService-from-Java/td-p/206637
http://stackoverflow.com/questions/11204614/access-salesforce-apex-soap-webservice-from-java

Monday, June 3, 2013

Integrate Force.com SOAP API with Java Apps Using Force.com Web Services Connector (WSC)

Services This blog post will describe you that how to integrate Salesforce - Force.com SOAP API with Java Apps.

Below is an example of how to integrate Force.com SOAP API with Java Apps using Eclipse IDE.

Introduction to the Force.com Web Services Connector

The Force.com Web Services Connector (WSC) is a code-generation tool and runtime library for use with Force.com Web services. WSC uses a high-performing Web services client stack implemented with a streaming parser. It is the preferred tool for working with salesforce.com APIs. You can write Java applications with WSC that utilize the Force.com SOAP API, Bulk API, and Metadata API. There are even runtime libraries that let you access the Force.com SOAP API from applications running on Google App Engine.

Using WSC, you can perform operations with a few lines of code that would take many more lines of code with other Web services clients.

This article provides an introduction to WSC. The WSC can be used to invoke any doc-literal wrapped Web service, but in this article we’ll focus on the SOAP API with both the enterprise and partner WSDLs, and the Metadata API. Along the way, you’ll learn how to get started with WSC, and see an example of a console application that demonstrates WSC functionality.

Introduction to Force.com
Force.com has several API's including:
  • Force.com SOAP (Simple Object Access Protocol) API
  • Force.com Metadata API
  • Force.com Bulk API
  • Force.com Streaming API
  • Force.com REST (Representational State Transfer) API
  • Force.com Chatter API
Preparing to Integrate Java Apps with Force.com APIs:
I am assuming you have some experience building Java applications with Force.com APIs.

To get started, we'll run through the following steps:

1) First you need to install "Java JDK (6 or 7)" in your machine.
2) Second you need to check whether "Java JDK (6 or 7)" has installed successfully or not?

Just type in the command prompt:
java -version

You will the result same as below:
It will show you:
java version "1.6.0_35"
Java(TM) SE Runtime Environment (build 1.6.0_35-b10-428-10M3811)
Java HotSpot(TM) 64-Bit Server VM (build 20.10-b01-428, mixed mode)

Note: If you get error then change your command prompt directory to the Java bin directory and test it again.

For Example:
C:\Program Files\Java\jdk1.6.0_45\bin> java -version

3) Download the "Enterprise WSDL" or "Partner WSDL" from your salesforce.com organization.

Log in into salesforce.com organization -> User Name ->  Setup -> App Setup section -> Develop -> API -> click on Generate Enterprise or Partner WSDL -> Save file with extension ".wsdl" as "enterprise.wsdl" or "partner.wsdl".

4) Download the Web Services Connector (WSC) "wsc-20.jar" file from the URL "http://code.google.com/p/sfdc-wsc/downloads/list".

5) Now create JAR (Java ARchive) files for "enterprise.wsdl" and "partner.wsdl" files.

6) Copy the "tools.jar" file from the path where you have installed "Java JDK (6 or 7)".

For Example:
"C:\Program Files\Java\jdk1.6.0_45\lib\tools.jar" and paste it in your "E:\" drive. I am doing this just for safe side so we don't have any conflicts.

Note: 
(a) "tools.jar" and "wsc-20.jar" file both must be in the same directory otherwise, you will get an error "classpath: java.io.FileNotFoundException".
(b) Just for safe side I would recommend that your "E:\" drive must have "tools.jar", "wsc-20.jar", "enterprise.wsdl" and "partner.wsdl".

6) Execute the following command to generate JAR File "JAR file (Java ARchive)" for "enterprise.wsdl" or "partner.wsdl".

For Example:
java -classpath wsc-XX.jar com.sforce.ws.tools.wsdlc enterprise.wsdl enterprise.jar

Real Example:
Generate enterprise.jar
java -classpath E:\tools.jar;E:\wsc-20.jar com.sforce.ws.tools.wsdlc E:\enterprise.wsdl E:\enterprise.jar

Generate partner.jar
java -classpath E:\tools.jar;E:\wsc-20.jar com.sforce.ws.tools.wsdlc E:\partner.wsdl E:\partner.jar

Now these commands will generate "enterprise.wsdl" or "partner.wsdl".

Generate Java Code in Eclipse (Creating an Enterprise WSDL Application)

Now that your environment is ready to go, it's time to build a test application to see how things are working. Most developers build client applications with the enterprise WSDL, so we’ll start with that one first.
In Eclipse, complete the following steps to build a Java application based on the enterprise WSDL.
  1. Create a new Java project named “WSC - Enterprise” (click File | New | Java Project).
  2. Add the wsc-XX.jar and enterprise.jar to the project (click Project | Properties | Java Build Path | Libraries or External Libraries, then add the JARs to the project.
  3. Add a new folder, wsc, to the src folder in your app (right-click src in Package Explorer, then click New | Folder).
  4. Create a new class src/wsc/Main.java and paste in the code from the code listing that follows.
  5. Replace the stub user credentials in the code with your own user name and password with security token for the appropriate static members, then save your source code.
  6. Run the application.
Your Project in Eclipse IDE will look like below screenshot:










/********************************************************************************/
package wsc;

import com.sforce.soap.enterprise.Connector;
import com.sforce.soap.enterprise.DeleteResult;
import com.sforce.soap.enterprise.EnterpriseConnection;
import com.sforce.soap.enterprise.Error;
import com.sforce.soap.enterprise.QueryResult;
import com.sforce.soap.enterprise.SaveResult;
import com.sforce.soap.enterprise.sobject.Account;
import com.sforce.soap.enterprise.sobject.Contact;
import com.sforce.ws.ConnectionException;
import com.sforce.ws.ConnectorConfig;

public class Main {

static final String USERNAME = "YOUR-USERNAME";
static final String PASSWORD = "YOUR-PASSWORD&SECURITY-TOKEN";
  static EnterpriseConnection connection;

  public static void main(String[] args) {

    ConnectorConfig config = new ConnectorConfig();
    config.setUsername(USERNAME);
    config.setPassword(PASSWORD);
    //config.setTraceMessage(true);
 
    try {
   
      connection = Connector.newConnection(config);
   
      // display some current settings
      System.out.println("Auth EndPoint: "+config.getAuthEndpoint());
      System.out.println("Service EndPoint: "+config.getServiceEndpoint());
      System.out.println("Username: "+config.getUsername());
      System.out.println("SessionId: "+config.getSessionId());
   
      // run the different examples
      queryContacts();
      createAccounts();
      updateAccounts();
      deleteAccounts();
   
   
    } catch (ConnectionException e1) {
        e1.printStackTrace();
    }

  }

  // queries and displays the 5 newest contacts
  private static void queryContacts() {
 
    System.out.println("Querying for the 5 newest Contacts...");
 
    try {
     
      // query for the 5 newest contacts    
      QueryResult queryResults = connection.query("SELECT Id, FirstName, LastName, Account.Name " +
      "FROM Contact WHERE AccountId != NULL ORDER BY CreatedDate DESC LIMIT 5");
      if (queryResults.getSize() > 0) {
        for (int i=0;i<queryResults.getRecords().length;i++) {
          // cast the SObject to a strongly-typed Contact
          Contact c = (Contact)queryResults.getRecords()[i];
          System.out.println("Id: " + c.getId() + " - Name: "+c.getFirstName()+" "+
              c.getLastName()+" - Account: "+c.getAccount().getName());
        }
      }
   
    } catch (Exception e) {
      e.printStackTrace();
    }  
 
  }

  // create 5 test Accounts
  private static void createAccounts() {
 
    System.out.println("Creating 5 new test Accounts...");
    Account[] records = new Account[5];
 
    try {
     
      // create 5 test accounts
      for (int i=0;i<5;i++) {
        Account a = new Account();
        a.setName("Test Account "+i);
        records[i] = a;
      }
   
      // create the records in Salesforce.com
      SaveResult[] saveResults = connection.create(records);
   
      // check the returned results for any errors
      for (int i=0; i< saveResults.length; i++) {
        if (saveResults[i].isSuccess()) {
          System.out.println(i+". Successfully created record - Id: " + saveResults[i].getId());
        } else {
          Error[] errors = saveResults[i].getErrors();
          for (int j=0; j< errors.length; j++) {
            System.out.println("ERROR creating record: " + errors[j].getMessage());
          }
        }  
      }
   
    } catch (Exception e) {
      e.printStackTrace();
    }  
 
  }
}
/********************************************************************************/
Helpful Links:
http://wiki.developerforce.com/page/Introduction_to_the_Force.com_Web_Services_Connector
http://code.google.com/p/sfdc-wsc/downloads/list

http://boards.developerforce.com/t5/Java-Development/Trying-to-call-a-simple-Apex-Web-Service-method-from-Java/td-p/206407
http://boards.developerforce.com/t5/General-Development/How-to-Call-WebService-Method-in-Java/td-p/261755
http://kperisetla.blogspot.com/2011/09/creating-custom-apex-web-service-in.html
http://forums.crmsuccess.com/t5/forums/forumtopicprintpage/board-id/JAVA_development/message-id/5930/print-single-message/false
http://boards.developerforce.com/t5/Java-Development/Problem-Calling-Apex-WebService-from-Java/td-p/206637
http://stackoverflow.com/questions/11204614/access-salesforce-apex-soap-webservice-from-java

Sunday, June 2, 2013

How to write Batch Apex along with Visualforce page?

Batch Apex with Visualforce

Visualforce Controller Code:
public class RunBatchController{
public void RunBatch(){
// DeletionBatch is the batch you implemented.
DeletionBatch batch = new DeletionBatch();
Database.executeBatch(batch);
}
}

Visualforce Page Code:
<apex:page controller="RunBatchController">
   <apex:commandButton action="{!RunBatch}" value="Delete Records"/>
</apex:page>

Play with Pricebook & Products & Opportunity Objects

Play with Pricebook & Products & Opportunity Objects

There are 5 standard objects involved around it:
  • Pricebook
  • Product
  • PricebookEntry
  • Opportunity
  • Opportunity Product
Scenario without Multi-Currency enabled:
  • First you setup a Pricebook. If you have different prices based on customer type or deal then you would need to create custom Pricebooks (e.g. online tutoring, in-home tutoring, and school tutoring).
  • Second you would need to create a Product.
  • Third you would need to associate Product with the Pricebook. If you have only a standard Pricebook then you just need to associate it with the Product otherwise, you would need to associate with the custom Pricebook too. But in order to associate custom Pricebook you have to associate standard Pricebook with the Product first. This process create a PricebookEntry record.
  • Fourth you would need to create an Opportunity (Note: There is a field PricebookId on Opportunity that says this Opportunity has associated to whcih Pricebook?).
  • Fifth you would need to add Opportunity Products. First time when you add it will prompt you to choose the Pricebook (e.g. standard or custom Pricebooks will be shown in the picklist).
  • After that all the Products will be shown which are associated with the Pricebook which user has chosen already. After creating Opportunity Products, PricebookId field will be populated on Opportunity. Now going forward user will only add those Products which are associated with that Pricebook (Note: Opportunity can have only one PriceBook associated with it).
  • If in future user want to associate Opportunity with different Pricebook they need to click on the button "Choose Pricebook" (Note: it will delete all the previous Opportunity Product records.).
Note: You can not add 2 Products with different Pricebooks on the same Opportunity.

Scenario with Multi-Currency enabled:
  • Let's assume that your organization work on 2 currencies "USD" and "EUR".
  • First You setup standard and custom Pricebook in all currencies.
  • Second you would need to setup Products (Currency ISO on Product will not do anything so, you can remove from the page layout).
  • Third you would need to associate Product with the Pricebook.
  • Fourth you would need to create an Opportunity and select a Currency ISO field "USD" or "EUR" (Note: This will tell you that you will only Products which have been setup in that Currency ISO code).
  • Fifth you would need to add Opportunity Products.
Note: All currency amounts are displayed in the default currency of the record as well as in the personal currency of the user. When you change the default currency of a record, currency amounts are not converted; they simply display with the new currency code.