Monday 21 December 2015

DUPLICATE RECORD FINDING

Without trigger , workflow , validation.......

By using Duplicate Management we can restrict end user not to allow duplicate records 

When a user attempts to save a new record, the record is first compared with existing Salesforce records to identify possible duplicates (1). 

The criteria used to compare records and identify the possible duplicates are defined by a matching rule. 

Next, a list of possible duplicates is returned (2).

 What happens when the record being saved is identified as a possible duplicate depends on what’s defined in the duplicate rule (3). 

For example, the duplicate rule could block users from saving the possible duplicate record or allow them to save it anyway. 

Both the Block and Allow options include an alert, which tells users why they can’t save the record and what they need to do. 

The Allow option includes the ability to report on the duplicate records.

When a user attempts to save an edited record, the record is first checked to see if the user has changed the value of a matching rule field.

 If so, the duplicate management process works as described for new records.

 If not, no further action is taken and duplicates are not detected.



Follow below steps to create matching and duplicate rule in salesforce 


STEP 1 :

Go to setup>Administration Setup>Data.com Administration>Duplicate Management>Matching Rules


STEP 2 :

New Rule>SelectObject>

1. Rule Name : TestMatchingRule
2. Matching Rule Criteria : Select fileds which you want to match duplicate records

EX: Name : Exact






STEP 3 :

Go to setup>Administration Setup>Data.com Administration>Duplicate Management>Duplicate Rules

New Rule>Select Object>





In duplicate management give any name in name section


In Action section select action when duplicate rule has to fire


In Matching rule section select the matching rule before created


Condition section is optional


Click on save


Note : After saving duplicate or matching rule Activate the Matching as well as Duplicate rule



STEP 4 : 

Go to object and try to create same record two times





Note : No need of Data.com Licence , it is free for all licence


                                                  That's all folk

Wednesday 15 April 2015

EMAIL TO APEX USING EMAIL SERVICES IN SALESFORCE



By using Email Services in sales force we can invoke an apex class 
 
By sending an email from any email service(gamil,yahoo..etc) to sales force generated email address it will invoke the apex class 

First we have to create an email service in sales force it will generated an email address 
 
Follow the below steps to create an email service and apex class in sales force

Step 1 : Create an apex class to executive when email receive 


 Ex: Below is the sample code to insert a record in contact (Data got from email body and subject)

global class CreateContactFrmEmail implements Messaging.InboundEmailHandler {
 global Messaging.InboundEmailResult handleInboundEmail(Messaging.InboundEmail      email,Messaging.InboundEnvelope envelope) {
Messaging.InboundEmailResult resultData = new Messaging.InboundEmailresult();

if((email.subject ! = null && email.plainTextBody != null){

      Contact con = new Contact();
         con.LastName = email.fromName;
         con.Email = email.fromAddress;
         con.Description = email.plainTextBody;
         con.Title = email.subject;
      insert con;

if(email.textAttachments != null){
      for (Messaging.Inboundemail.TextAttachment tAttachment : email.textAttachments) {
             Attachment attachment = new Attachment();
                 attachment.Name = tAttachment.fileName;
                 attachment.Body = Blob.valueOf(tAttachment.body);
                 attachment.ParentId = con.Id;
            insert attachment;
      }
}

  if(email.binaryAttachments != null){
        for (Messaging.Inboundemail.BinaryAttachment bAttachment : email.binaryAttachments) {
              Attachment attachment = new Attachment();
                 attachment.Name = bAttachment.fileName;
                 attachment.Body = bAttachment.body;
                 attachment.ParentId = con.Id;
             insert attachment;
      }
  }
}
      resultData.success = true;
      return resultData;
   }
}

Step 2 : After creation of sales force apex class follow below steps to create email service 


Go to SETUP > BUILD > DEVELOPE > EMAIL SERVICES > NEW EMAIL SERVICES



Fill the form

1. Email Service Name : give any name

2. Apex Class : Select a class which you want to executive when email send

3. Accept Attachments : If you want add attachments then select which type of attachment your adding

4. Accept Email From : List the email addresses and domains from which you want this email service                                       to receive emails.                       
Separate multiple entries by commas. For example: george@mycompany.com, yahoo.com, gmail.com.

Leave this field blank if you want the email service to receive email from any email address or domain.
 
5. Active : Check if you want to use this service

6. Route Error Emails to This Email Address : If error occurs while sending, if you want know error ,     give your email address to receive error

7. Save

Step 3 : After saving the record create new email address under Email Addresses


1. Email address : Don't change any thing

2. Accept Email From : Enter email addresses or domain names that are authorized to send emails to      the service.

Separate multiple entries by commas. Examples: george@mycompany.com, yahoo.com, gmail.com.

NOTE: the addresses entered in this field must be the same as or fully qualify addresses or domains allowed by the service as shown above. For example, if the service's list above only include mycompany.com then the list entered below must be of the form user1@mycompany.com, user2@mycompany.com, etc.

3. Save

After saving it will generate an new email address

Step 4 : Copy the email address generated in step 3 and send an email from your email(gmail,yahoo,....etc)  


Then go to the contact object and check it record is create or not

NOTE : wait for few minutes it will take some time to insert a record in sales force



Thursday 26 March 2015

SALESFORCE TO SALESFORCE INTEGRATION USING REST/SOAP API

For sales force to sales force integration required  Two organization

1. Sales Force Org 1 
2. Sales Force Org 2

STEP 1 : Create one ViSsula Force Page and Controller in Sales Force Org 2


Visual Force Page: (Page Name : sfdc_to_sfdc)

<apex:page controller="ExternalServiceCall">
<apex:form >
<apex:commandButton value="CallService" action="{!callMethod}" title="CallService"/>
</apex:form>
</apex:page>

Apex Controller:

public class ExternalServiceCall {
public PageReference callMethod() {
String Endpoint = '';
Http http = new Http();
HttpRequest req = new HttpRequest();
req.setEndpoint(Endpoint);
req.setMethod('POST');
HTTPResponse res = http.send(req);
System.debug('----------------'+res.getBody());
return null;
}
}

STEP 2 : Create one CONNECTED APP in Sales Force Org 1

1. Go to SETUP > BUILD > CREATE > APP > CONNECTED APP > NEW

Connected App Name : S_TO_S_APP

Contact Email : Your Email Address

API (Enable OAuth Settings) : Check (Enable OAuth Settings)

Callback URL : Sales Force Org 2 visual force page URL (sfdc_to_sfdc)

EX: https://c.ap2.visual.force.com/apex/CallExternalService

Selected OAuth Scopes : Select all and move from left to right


2. SAVE

STEP 3 : Copy consumer key and Consumer Secret and paste in note pad


1. Consumer Key (3MVG9Y6d_Btp4xp46JlONG7HS6J2U7.oBhNF2mAUQhyotYkFWexxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx)

2. For consumer secret click on reveal copy the code (86658178********)

STEP 4 :

https://**salesforce instance**/services/oauth2/authorize?response_type=code&client_id=**Cosumer key**&redirect_uri=**Callback URL**&state=mystate1

In Above URL replace below given parameters

1. **salesforce instance** : Replace with your sales force org instance

2. **Cosumer key** : Consumer Key of connected APP which we copied in the above step

3. **Callback URL** : Sales Force Org 2 visual force page URL

4. State : give your own string in state

Note : state should be different every time your calling this URL


STEP 5 : Copy the Above URL and open in a new browser

1. It will open an window which asking to permission (Allow IT)

2. It will ask your Sales Force Org 2 credentials (Give your credential and login)

3. Page Redirect to visual force page (sfdc_to_sfdc)

4. Visual force URL should look like 
https://c.ap2.visual.force.com/apex/CallExternalService&code=aPrxqJ8A8kLOza.1WWrtEdk2HbfhS3ZFa7OAR20zsgGyVdnZVO_ieN6nRxWBwka19lulk3RoTg%3D%3D&state=mystate1 

5. From the URL copy the CODE and paste in note pad

STEP 6 :

https://**salesforce instance**/services/oauth2/token?code=**code**&grant_type=authorization_code&client_id=**Consumer Key**&client_secret=**Consumer Secret**&redirect_uri=**Call Back URL**

Above URL is to get the Access Token

1. **salesforce instance** : Replace with your sales force org instance

2. **code** : STEP 5

3. **Consumer Key** : STEP 3

4. **Consumer Secret** : STEP 3

5. **Call Back URL** : Sales Force Org 2 visual force page URL

NOTE: Go to Remote site settings and create new remote site (Name : salesforceOrg, URL : **salesforce instance**)

STEP 7: Copy the above URL and paste in STEP 1 class > method > String  Endpoint


1. Class : ExternalServiceCall

Method : callMethod

String Endpoint = STEP 6 (URL)

2. Save

3. Click on Save button

4. Go to the debug log

5. Copy the Access Token

Now Integration is Done with sales force now you can make calls from sales force to sales force

   STEP 8: To call class of Sales Force Org 1 from Sales Force Org 2

EX:

Create a class in Sales Force Org 1

Apex Controller :

@RestResource(urlMapping='/sfdcCalling/*')
global class SalesforceOrg{
@HttpGet
global static List<Contact> sfdcMethod(){
List<Contact> sfdcContact = new List<Contact>();
sfdcContact = [select Name,Email from Contact];
return sfdcContact;
}
}

Call Above calss (SalesforceOrg) From Org 2

Copy the below code and paste in developer console or workbench in Sales Force Org 2 and executive

String accessToken = '00D90000000iCmb!AR4AQKhpsb2wJYLLxdafV71KdkRxBmRuRmWD_LTmEtRkFdxTWYh_V7CPqc*******************************';
Http http = new Http();
HttpRequest req = new HttpRequest();
req.setEndpoint('https://immu-dev-dev-ed.my.salesforce.com/services/apexrest/sfdcCalling');
req.setMethod('GET');
req.setHeader('Authorization',' Bearer '+accessToken);
HTTPResponse res = http.send(req);
System.debug('----------------'+res.getBody());

Note : 
Access Token : From STEP 7

setEndpoint : should be Sales Force Org 1 Endpoint ,In above http call the end point is Sales Force Org 1 class Annotation Name(sfdcCalling)

STEP 9: For more endpoints please refer the below URL

https://developer.salesforce.com/page/Creating_REST_APIs_using_Apex_REST


Tuesday 3 March 2015

TRIGGER RECURSION IN SALESFORCE

How to avoid Trigger Recursion in salesforce


If an executing trigger calls itself then it goes to into infinite loop and is called recursion.
Use Case
trigger DemoTrigger on Demo__c (before insert) {
insert new Demo__c();
}
In the above example when try to insert a record in trigger again Trigger will invoke(Because when try to insert a record again trigger will invoke) until trigger limit exceeded

If a trigger on a particular object executing on a particular DML does the same DML on that object then the same trigger would be called and it will go into recursion.
A static variable can be set in a class before executing the trigger to avoid the recursion.
Solution 

Class:
public class p { 
  public static boolean firstRun = true; 
}
Trigger:
trigger TestTrigger on Demo__c (before insert) {
if(p.firstRun)
{
p.firstRun = false;
insert new Demo__c();
}    
}

Monday 23 February 2015

DISPLAY ONE VISUAL FORCE PAGE DATA IN TO ANOTHER VISUAL FORCE PAGE

This can be done using attribute include.


 We have to just specify the name of the visual force page and include this attribute in our visual force page.

<apex:insert>
<apex:composition>
<apex:define>


EX:
VF 1:
----

                 VF page name Template.

                <apex:page >
<apex:outputText >Welcome to Accord</apex:outputText><br/><br/>
<apex:insert name="header"/><br/><br/>
<apex:outputtext >We are Pioneer in training students</apex:outputtext><br/><br/>
<apex:insert name="body"/><br/><br/>
<apex:outputtext >Thank You</apex:outputtext>
</apex:page>

VF 2:
----

<apex:page sideBar="false">
<apex:composition template="Template">
<apex:define name="header">
Accord welcomes you!
</apex:define>
</apex:composition>
</apex:page>

SALESFORCE INTEGRATION WITH .NET USING SOAP API

SALESFORCE INTEGRATION WITH .NET USING SOAP API  PART - 1
Required
1. .Net end point (or) WSDL wile 
NOTE : If client provides WSDL file no need to follow STEP 1 
STEP 1 :

Copy the .Net Endpoint given by the client (https://xxxxxxxxxxxx/gw/xxxx/nextgencrm/ldap.getpicture.dev)
Go to the web browser open new tap paste it and add (?wsdl
EX: https://xxxxxxxxxxxx/gw/xxxx/nextgencrm/ldap.getpicture.dev?wsdl 
Copy the XML data and paste in notepad or notepad++
Remove one binding and related port in that XML because sales force support only one binding
EX: 
Remove second binding and related port
Binding:
-------
<wsdl:binding name="LdapSoap12" type="tns:LdapSoap">
.
.
.</wsdl:binding>
Port:
-----
<wsdl:port2 name="LdapSoap" binding="tns:LdapSoap">
<soap:address location="xxxxxxxxxxxx" />
</wsdl:port2>
Save the file as MyService.wsdl on your desktop 
STEP 2:
Login in to your sales force account
Go to setup > Build > Develop > Apex
Click on Generated Apex

Browser and select MyService.wsdl file and Parse it
If successfully parse Change the name of class as MyDotnetService and save it

STEP 3 :

Open the class MyDotnetService it look like below example 
EX: 
public class MyDotnetService {
public class HelloWorld_element {
private String[] apex_schema_type_info = new String[]{'http://tempuri.org/','true','false'};
private String[] field_order_type_info = new String[]{};
}
public class HelloWorldResponse_element {
public String HelloWorldResult;
private String[] HelloWorldResult_type_info = new String[]{'HelloWorldResult','http://tempuri.org/',null,'0','1','false'};
private String[] apex_schema_type_info = new String[]{'http://tempuri.org/','true','false'};
private String[] field_order_type_info = new String[]{'HelloWorldResult'};
}
public class LdapSoap {
public String endpoint_x = 'https://xxxxxxxxxxxxxxxxxxxxxx/gw/xxxxxxxxxx/nextgencrm/ldap.getpicture.dev';
public Map<String,String> inputHttpHeaders_x;
public Map<String,String> outputHttpHeaders_x;
public String clientCertName_x;
public String clientCert_x;
public String clientCertPasswd_x;
public Integer timeout_x;
private String[] ns_map_type_info = new String[]{'http://tempuri.org/', 'MyDotnetService'};
public String HelloWorld() {
MyDotnetService.HelloWorld_element request_x = new MyDotnetService.HelloWorld_element();
MyDotnetService.HelloWorldResponse_element response_x;
Map<String, MyDotnetService.HelloWorldResponse_element> response_map_x = new Map<String, MyDotnetService.HelloWorldResponse_element>();
response_map_x.put('response_x', response_x);
WebServiceCallout.invoke(
this,
request_x,
response_map_x,
new String[]{endpoint_x,
'http://tempuri.org/HelloWorld',
'http://tempuri.org/',
'HelloWorld',
'http://tempuri.org/',
'HelloWorldResponse',
'MyDotnetService.HelloWorldResponse_element'}
);
response_x = response_map_x.get('response_x');
return response_x.HelloWorldResult;
}
}
STEP 4
Go > setup > Administer > Security Controls > Remote Site Settings > New Remote Site
Add Endpoint URL given by client
If client given WSDL file , Go to generated class ( MyDotnetService )

MyDotnetService > LdapSoap > endpoint_x

copy the end point and paste in remote site settings

STEP 5 :

Open the workbench or developer console

Copy class Name , sub class name , and method name like below example 
EX:

MyDotnetService.LdapSoap ldap = new MyDotnetService.LdapSoap();
String response = ldap.HelloWorld();
System.debug('response--------'+response); 
NOTE :

If time out error came, Add below code
ldap.TimeOut_x = 60000;

Now you successfully integrated sales force with .Net using SOAP API 
NOTE : This process is works only when client end point has no Authorization