Wednesday, April 15, 2009

Flex plus Salesforce.com APEX Webservice

Flex plus Salesforce.com APEX Webservice:


The following post will lay out a basic “Hello World” example of how to create a Flex application using a webservice call to a Force.com APEX webservice method. This example will show you how to create a Force.com Apex webservice and cal l it from Flex. While this is just a simple hello world example you should quickly be able to see how you could leverage the power of both Flex and the Force.com platform to create rich client applications.


In this post I will be building on the Salesforce.com tutorial on how to connect Flex and Salesforce.com. Here is a link to that post: Salesforce/Flex Tutorial


Step 1 Salesforce: Create the APEX class


The first step will be for us to create the logic that will run our application. We will do this by creating an Apex class in our Salesforce.com org using Eclipse. This class is what will be called by the Flex end of application. Creating this class is like creating any other class except we will define the class as “global” and define all the methods within it as “webService”.



You will see that our class is named “helloWorldWebService” and it contains one function “helloWorldCall” which accepts one parameter “world” and returns the parameter “world” with ‘Hello’ on the front of it when called.


Step 2 Flex: Create the Flex End of the Application

Next we will need to create a Flex application to consume this webservice we created. As mentioned earlier we will assume that you already have downloaded the Salesforce library and have included it in your Flex library (Here is a link to a simple tutorial: Salesforce/Flex Tutorial).


The first part of the Flex application will be writing the user interface side of the code. In our example we will have a simple text field for input and a button that will fire the function that will log us into Salesforce.com, call the webservice, and return the results to the screen.


In the few lines of code above we create a panel to hold our fields and then add the input field, button and output field. Below is what our UI will look like.


The text field will allow us to enter a string which once we press the “Go” button will be displayed on the screen with “Hello” concatenated on the front of it by our Salesforce webservice.


Next we will move on to the meat of the application. Above we see that when the button is clicked it calls the “login()” function. This function is a simple login function that accepts a username and password and logs into Salesforce.com with those credentials. Below is the code for the login() function:


Once this function successfully logs into salesforce.com it will call our “callHelloWorld” function. This is the function that will pass our variable to our webservice and return the results to our screen.

<


Our function has three major sections to it. The first lines 40-41 are defining the parameters that we will pass to our webservice. In our example we are just passing one string. We get this by grabbing whatever the user entered into the “helloInput” text box.

Next on lines 42-49 we define the function that will be called once the webservice is run and returns data. In our example we take the result of the call and stick it into our webserviceOutput field.

Lastly on lines 51-57 we call the webservice. This call accepts four parameters webservice name (line53), method being called (line 54), parameters passed (line 55) and function to call on complete (line 54).


The result:


Below is a screenshot of the finished state of our hello world application.

Wednesday, March 4, 2009

Salesforce.com developer challenge

Back in December, Salesforce.com issued a challenge to its developer community: Build a site or application on the newly released Sites platform. Sites was announced at Dreamforce 08 and is currently in development release only.

At Demand Chain Systems (a CRM consulting and implementation firm in Minneapolis), we decided to take up this challenge, viewing it as a great opportunity to learn the Sites technology -- and hopefully to win one of the Ipod Touches Salesforce.com was offering. Our goal was to see how easy it would be to move our corporate website to the new technology and create a first-generation content management system (CMS) that we could use to update it from Salesforce.

Salesforce recently announced the winners, and we were thrilled to learn we were an honorable mention. We would like to share our experience creating our application and some thoughts along the way. We have also included a short video of the application in action.

Lessons learned

The first thing we learned was that using the Sites technology is fairly straightforward. We were able to move our corporate site from a standard HTML/CSS/PHP platform to the Sites platform in a couple of hours. It took a little digging to understand how to host the images and set up the Visualforce templates; but once we got the first couple pages up, the rest were pretty simple. It took us ~5 hours to migrate our basic site to the platform and meet the first half of our goal.

The second half our goal was to create a first-generation CMS for our site. Using a combination of Force.com technology (Visualforce, APEX, Custom Objects), we were able to architect a system in ~10-15 hours that functioned as a CMS. We added an “Edit” button to the live site so people could see it in action, knowing that if we ever moved it to production, we would have to add some additional security around that end of the CMS.

Here is a brief video of the end product we submitted for the challenge:



Here is a link to the working prototype (As you can see the Salesforce.com community has updated some of the content themselves):

http://demandchainsystems-developer-edition.na6.force.com/subPage?page=index


We at Demand Chain Systems are always excited to get our hands dirty with new Salesforce.com technology, and the Salesforce.com Sites Developer Challenge was a great opportunity to do just that. Please feel free to contact me with any additional questions/comments regarding our entry. I would love to hear feedback and enhancement ideas!

Tim Inman – tim.inman@demandchainsystems.com

Tuesday, December 16, 2008

Salesforce.com Certified...

So after hours of studying I passed the Salesforce.com Developer certification and the Salesforce.com Consultant Certification.

Here is my nifty logo to prove it:



Still waiting on my consultant logo.

Tuesday, November 11, 2008

Creating a Visualforce custom component with jQuery

Recently at the latest Salesforce.com Dreamforce event I attended a session on creating custom components in Visualforce. The best way to think about custom components is to think of them as reusable "widgets" that can be used in any Visualforce page with mininal duplicate coding. I recently also discovered jQuery...a very powerful javascript library. One of my "homework" assignments I assigned myself at Dreamforce was to create some custom components that leverage the jQuery library.

Why use jQuery to create a Visualforce component?

jQuery is a fast and concise cross-browser JavaScript Library that simplifies HTML document traversing, event handling, animating, and Ajax interactions for rapid web development. To learn more about the power of jQuery visit their site at: http://jquery.com/

Combining jQuery with Salesforce.com allows us to leverage the proven UI components of the library with the power of Salesforce.com. The new Visualforce functionality in Salesforce.com allows us to create reusable components that we can insert in any other Visualforce page.

In the following example we will walk through getting jQuery, creating a static resource, creating a custom component, and finally adding that custom component to a visual force page.

Steps 1: Get jQuery

jQuery is a lightweight javascript library that comes with a bunch of very stable UI elements (Dialog boxes, accordion widget, spinners, etc).

Get the latest build of jQuery from the jQuery website. http://jquery.com/

Steps 2: Zip it up

Once you have downloaded the latest build of the jQuery library .zip it up for upload to Salesforce.com. That is right...we will be able to reference all the files in the .zip file from within the custom component we will create. No need to upload all the files individually.



Steps 3: Create a static resource

Next we will log into Salesforce.com and create a static resource calling it "JQuery_UI". Upload the jQuery .zip file to this resource and save it for reference in your custom component.



Steps 4: Create the custom component

Next we will write the code for the reusable Visualforce custom component. Remember that the value of creating a custom component is that you only have to create the code once and you will be able to reuse the component with one line of code in any Visualforce page. Also the static resource will only be loaded once per page no matter how many times you call the custom component in a Visualforce page (reducing page load times).

Below is the simple code for our custom component. It could be extended to accept and pass variables however, our component will be a stand-alone component that simply displays a nicely formatted jQuery dialog box with a message in it for the user.


Items to note in the code:

Lines 5-7: You will see in the code that we simply reference the files in the static resource we created.
Lines 12-24: Creating the architecture of the dialog box

Lines 30-34: Invoking the jQuery library to make the dialog box appear.


Steps 5: Include custom component in a Visualforce page

The last step is to include the custom component on any Visualforce page. As we see below it as easy as adding one tag.



Step 6: Call your Visualforce page

So now we call the Visualfoce page and we see our "mashup" of jQuery and Salesforce.com Visualforce code.


For more information see:
Salesforce.com - http://wiki.apexdevnet.com/index.php/Apex_and_Visualforce
jQuery -http://jquery.com/

Monday, June 9, 2008

5 out of 5 stars...

It has been a week now and I have had about 8 downloads of my AppExchange app "Record Locking with Inline Messaging!"...and I even got 5 out 5 stars on one user rating.


Thank you MMS-FL!

Friday, May 30, 2008

My first AppExchange listing

RecordLock with Inline Messaging! was officially added to the AppExchange today. This is my first app released to Salesforce.com's AppExchage...mostly just to figure out the process for future apps.



It is a simple app that allows a user to lock any record in Salesforce.com and display an inline message with a custom error.

Here is the link to the AppExchange listing:

https://www.salesforce.com/appexchange/detail_overview.jsp?id=a0330000005L38LAAS

Here is a link to a quick video overview:

http://demandchainsystems.com/blog/appExchange/Index.html

Enjoy!

Monday, May 19, 2008

Populate simple Visualforce table

The following code demonstrates the key concepts in creating a custom controller and linking it to a Visualforce page to return a set of data.

Custom Controller:
public class mySecondController {

/// Create a list
/// <OBJECT_NAME>
List<TIDev__Project_Requirements__c> rqs;

/// getReq() - Reffer to the list in the
/// visualforce page with "Req" minus the "get" from
/// controller name.
public List<TIDev__Project_Requirements__c> getReq() {

/// Get the data for the list
rqs = [select id, TIDev__Requirement__c, TIDev__Due_Date__c, TIDev__Assigned_to__c from TIDev__Project_Requirements__c Where TIDev__Object__c = 'Account'];
return rqs;
}
}

The custom controller is simply a class with the "get" method invoked. In our example it is called "getReq()". This method quries Salesforce.com for a set of records and returns it to the Visualforce page in a List. The Visualforce page will be able to access this list by referencing the the name of the method minus the "get". So in our example it would be "Req".

Visualforce Page:


<apex:page showHeader="false" sidebar="false" controller='mySecondController'>
<apex:pageBlock title="Requirements" id="tblId">
<apex:dataTable value="{!Req}" var="requirements" cellPadding="4" border="1">
<apex:column>
<apex:facet name="header">Account Requirement</apex:facet>
<apex:outputField value="{!requirements.TIDev__Requirement__c}"/>
</apex:column>
<apex:column>
<apex:facet name="header">Assigned to</apex:facet>
<apex:outputField value="{!requirements.TIDev__Assigned_to__c}"/>
</apex:column>
<apex:column>
<apex:facet name="header">Due Date</apex:facet>
<apex:outputField value="{!requirements.TIDev__Due_Date__c}"/>
</apex:column>
</apex:dataTable>
</apex:pageBlock>
</apex:page>


The first step in your Visualforce page is to link that page to the custom controller you created. This is done with the "controller" tag in the tag.

Next the List is referenced in the with 'value="{!Req}"'. The data in that list is assigned to the the variable "requirements" and then referenced in the data table using standard Salesforce.com dot notation "{!requirements.TIDev__Requirement__c}".