Thursday, May 22, 2014

SalesForce Order Contract Number Not Required Field

In SalesForce, to make the "Contract Number" field of the "Order" object not a required field. Go to

Setup > Build > Customize > Orders > Page Layout



Click the properties wrench next to the Contract Number field:



Uncheck the Required checkbox:



That's it.  Not very intuitive, but easy enough to change.


Hope this helps,
Aaron Hoffman


Sunday, May 11, 2014

Google Analytics Scheduled Emails Not Working

When using Google Analytics it is very helpful to send daily and weekly reports. Google Analytics has the ability to schedule these reports to be emailed, but like many other people (see here: https://productforums.google.com/forum/#!topic/analytics/1JqNpbSDYac) I was having an issue getting these reports to actually send.

Some of them were working and others were not.  Ultimately I was able to determine that the reports that were not working were being sent to someone other than myself. I was able to resolve the issue by only sending reports to myself, then setting up a forward rule in my email to forward the reports to the appropriate people.



Annoying, yes, but it works. However this way you do get the added benefit of tracking that they are in fact sent, and you can reference the email later and get replies directly from the email.

These emails/reports still seem to be actually sent/generated at random times throughout the day (my last 5 days: 4pm, 1pm, 2pm, 8pm, 7pm), I'm not yet sure how to resolve this issue, but when I do, I'll update this post.


Hope this helps,
Aaron




Saturday, May 3, 2014

SalesForce API Tutorial .NET DeveloperForce.Force NuGet Package

Below is a guide to getting started with the SalesForce API using the .NET DeveloperForce.Force NuGet package.

(GitHub Source to supplement this blog post: https://github.com/aaronhoffman/SalesForceApiTutorial)
(SalesForce API documentation: http://www.salesforce.com/us/developer/docs/api/)

Steps:

1. Make sure the API is turned on for your Organization.

The API must be activated as part of your license. You'll have to pay for API access per seat (for every user) even if you'll only have one integration.

I was told by one SalesForce rep that you can check on the status of this feature on the Setup > Company Profile > Company Information page under the Feature Licenses section, but the API is currently enabled for my organization and I see nothing there... so I can't confirm this.  Ultimately, I had to open a support ticket to get it turned on and working for my organization.


2. Create a new "App" to generate a Consumer Key and Consumer Secret.

Go to the Setup > Build > Create > Apps page and click the "New" Button in the "Connected Apps" section.


On the "New Connected App" page you'll need to fill in the required fields. You'll also need to check the "Enable OAuth Settings" checkbox and provide a callback URL. The callback URL does not actually need to exist, and it will not be used in this tutorial. You'll also want to select an OAuth scope, in my scenario I chose "Full access (full)".

Click the save button when you are finished and you will be taken to the Connected App View screen. In the "API (Enable OAuth Settings)" section, copy your Consumer Key and Consumer Secret values, you'll need those to authenticate via the API.


3. Retrieve or generate your Security Token.

(Note: at first, I did not do this step because it is not in the least bit obvious, and I was receiving this error message from the API: "authentication failure - Failed: API security token required" (more info) - so if you Google'd this error and ended up here, please read on.)

If accessing the API from an IP Address that has not been added to a trusted list, you'll need to append your Security Token to your UserName and Password (more info).  If you're like me, you'll have no idea what your security token is, so you'll need to have SalesForce reset it, generate a new one, and email it to you.

To reset your Security Token and have SalesForce generate and email you a new one, go to the upper right-hand corner and hover over your name, in the dropdown select "My Settings", the in the left sidebar menu select "Reset My Security Token" then click the "Reset Security Token" button. SalesForce will then send you an email containing your new Security Token.




4. Add NuGet package to your project.

One nice thing about the SalesForce API for .NET developers is that they have created a SDK/client library that is available via NuGet. Simple add the "DeveloperForce.Force" NuGet package to your project to utilize it. (Always ensure that you are using the latest version of the NuGet package. At the time of writing this, it is still very new and under active development.)

Source: https://github.com/developerforce/Force.com-Toolkit-for-NET
NuGet Package: https://www.nuget.org/packages/DeveloperForce.Force/



(GitHub Source to supplement subsequent steps: https://github.com/aaronhoffman/SalesForceApiTutorial/blob/master/Source/SalesForceApiTutorial.View.Console/SalesForceController.cs)


5. Authentication

The first thing you'll need to do if you want to use the API is Authenticate. You Authenticate using your same UserName and Password as you would use to log into the website (http://www.salesforce.com/) plus the Consumer Key, Consumer Secret, and Security Token we retrieved earlier. One gotcha: you'll need to append your Password and Security Token together and use that value as your "Password" if you are attempting to authenticate from an IP Address that has not been added to your list of trusted IP Addresses. Code snippet available on GitHub.

var userName = "";
var password = "";
var passwordSecurityToken = "";
var consumerKey = "";
var consumerSecret = "";

var auth = new AuthenticationClient();

await auth.UsernamePasswordAsync(consumerKey, consumerSecret, userName, password + passwordSecurityToken);

var forceClient = new ForceClient(auth.InstanceUrl, auth.AccessToken, auth.ApiVersion);


6. Query via API

There's a good chance you might want to query your SalesForce objects using the API. The DeveloperForce project currently supports this functionality. The DeveloperForce project supports both dynamics in .NET and async/await (make sure you have a .NET 4.5 project, or can support the async/await Task pattern).

The Salesforce.Force.ForceClient is the main class you'll be working with.  It has both QueryAsync() and QueryByIdAsync() methods.

The QueryAsync() method accepts a string as a parameter.  The string represents the query you want to execute. The query is in the Salesforce Object Query Language (SOQL) syntax http://www.salesforce.com/us/developer/docs/soql_sosl/index.htm.  It is similar to SQL. Some examples:


select Id, Name from Account

select Id, Name from Account where Id = 'xxxxxxxxxx'

select Contact.Firstname, Contact.Account.Name from Contact


As far as I have found, there is no equivalent to "select * from ___" so you have to list all the fields you want to retrieve. (more about determining field names below in #8)

Alternatively, you can use the QueryByIdAsync() method. This method returns all the the fields associated with an object, but only one layer, so no complex types.

With both of these methods, the type returned can be a static type that you have defined (the properties of the static type must match the names of the fields in the query) or a dynamic. I prefer dynamics in this case, so that's what I'll be using in this example. Again, code here.

Quick Example:

var accounts = await forceClient.QueryAsync("select Id, Name from Account");

foreach (var account in accounts.records)
{
    System.Console.WriteLine(String.Format("Id:{0}, Name:{1}", account.Id, account.Name));
}



7. Modify via API

There's also a pretty good chance you'll want to update your SalesForce objects via the API. The DeveloperForce project supports those operations as well.

dynamic myAccount = new ExpandoObject();
myAccount.Name = "Aaron";
var accountId = await forceClient.CreateAsync("Account", myAccount);

myAccount.Name = "Aaron 2";
await forceClient.UpdateAsync("Account", accountId, myAccount);

await forceClient.DeleteAsync("Account", accountId);


8. Helpful Hints

To determine the object property/field names to use in the SOQL syntax, go to Setup > Build > Customize > [Object Name] > Fields and look at either the "Field Name" or the "API Name" column.

API Data Type to SalesForce Field Type: http://www.salesforce.com/us/developer/docs/api/Content/api_ui_datatype_map.htm

Value to set a multi-select picklist: If you are trying to set a picklist (multi-select) field and want to select multiple things, provide the values as a string of semi-colon separated values. https://developer.salesforce.com/forums?id=906F00000008rhVIAQ

API Limit: Your organization has an API request limit. The limit and current usage can be found on the Setup > Company Profile > Company Information page labeled "API Requests, Last 24 Hours".

Other Get Started articles:
http://seroter.wordpress.com/2014/01/16/using-the-new-salesforce-toolkit-for-net/
https://developer.salesforce.com/blogs/developer-relations/2014/01/announcing-the-salesforce-toolkits-for-net.html


That's it, enjoy!


Hope this helps,
Aaron