Salesforce.com Nonprofit Starter Pack Kicks Butt!

February 9th, 2010

With Salesforce.com’s recent announcement that they will “donate free licenses for our technology to organizations headquartered in Haiti (for the next 10 years)”, I’m sure the guys over at the Salesforce.com Foundation are busier than ever. If you are interested in donating your time to a nonprofit, contact the Salesforce.com Foundation and see how you can help.

The Saleforce.com Foundation has developed a great set of open-source Salesforce.com customizations to support some common nonprofit business processes called the Nonprofit Starter Pack (NPSP). If you are a nonprofit looking to implement Salesforce.com or a developer looking to help out, you should seriously look into the NPSP.

I’ve implemented the NPSP at small nonprofits (10 employees) as well as large ones (3000+ employees) and it’s use cases are applicable to virtually all of them. Steve Andersen, the Solutions Architect responsible for the NPSP, has done a great job updating, enhancing and supporting the NPSP. The installation process is well documented and smooth and the packages are feature rich, flexible and robust. I’ve had the pleasure of meeting and interacting with Steve and he’s a great advocate for the Foundation and nonprofits in general. Steve and the Foundation have groomed a great culture of help and support within the Salesforce.com community. I’ve posted questions a number of times to the NPSP discussion group and received answers from Steve and other members within hours.

The NPSP is broken into the following packages (with my comments):

Nonprofit Starter Pack Contacts And Organizations – This is probably the most important package to install. It solves a major problem when dealing with individuals within Salesforce.com. With this package you can easily treat individuals as accounts to hook into existing Salesforce functionality.

Nonprofit Starter Pack Households – This is another custom object that allows you to group contacts into Households. We didn’t use this package at the last implementation that I worked on but it’s essential if you want to create mailings that limit the amount of correspondence to a single address.

Nonprofit Starter Pack Recurring Donations – This package is pretty slick for creating recurring donations, a common theme with pledges. For example, you may have an individual that has pledged to donate $1000 per month. When you create the donation, the NPSP will create a series of Opportunities providing pipeline forecasting.

Nonprofit Starter Pack Relationships – This package allows you to connects two contacts together in a relationship. With nonprofits, it’s not what you know but who you know. This package allows you to track who knows who and then leverage those relationships.

Nonprofit Starter Pack Affiliations – Another great package to track associations. However, in this case it tracks relationship of people to organizations (accounts). You can track when a person worked for a specific company or when they were a board member for a specific foundation. It also tracks dates so you can see their current status of affiliation.

Steve has put together a large number of “how to” videos for the NPSP. I used them for general help but also showed them directly to the customer to see if each package met their needs. These videos are great time-saver.

Installation – One thing that really perplexed me was installation. Initially I could not find out how to install each package. Each package has it’s own installation link and instructions. Click on one of the package links above and scroll down to the bottom of the page to find the installation link:





  • Share/Bookmark

Categories: Salesforce

1 Comment

Using Hierarchy Custom Settings in Salesforce.com

February 8th, 2010

Last month I posted on the new List Custom Settings feature released in Winter ‘10. I’ll finally round out the topic with the other flavor of custom settings: Hierarchy.

In Winter ‘10, Salesforce.com introduced Custom Settings which allow you to store custom data sets and associate them on an org-wide, profile or user basis. Custom settings are essentially custom objects that are exposed in the applications cache and are accessible via their own API. Using custom settings is much easier than rolling your own solution as they are much faster and easier to access (cached at the application level and accessible via their own interface) and do not count against SOQL limits.

Hierarchy settings allow you to personalize your application for different profiles and/or users. The interface has baked-in logic that drills down into the org, profile, and user level (based upon the current user) and returns the most specific or lowest value in the hierarchy. I’ve found hierarchy custom settings to be extremely useful for those “one off” occasions. Let’s suppose you want to authorize your sales teams to be able to offer a specific discount to customers. You might set up an org-wide custom setting of a 1% discount that everyone is authorized to offer. Now of course you have a set of high-producing sales people that are in their own profile and are able to offer a 5% discount. However (and here is the “one off”), there is that one sales person in that same profile that has lobbied the VP of Sales to be able to offer a 15% discount. With hierarchy custom settings you can accommodate all of these scenarios!!

As with list custom settings, when you create a new hierarchy custom setting, the platform creates a custom object in the background for you (notice the API Name field). You then add additional fields to the custom setting in the same manner that you do for custom objects (you are limited to checkbox, currency, date, date/time, email, number, percent, phone, text, text area and URL fields). I found the management interface for custom settings a little confusing at first and got lost a number of times trying to add fields and/or data.


After you’ve set up your custom settings and added your fields, you can select the Manage link on the custom settings page to add add/edit/delete values for the entire org, a specific profile or individual users. The image below shows the 1% discount for the entire org and then specific settings for the Standard Employees profile and a specific user.


Selecting the View link for the profile displays the settings that apply to users that are part of the “Standard Employees” profile.


Selecting the View link for the “one off” user, displays the settings that are applicable for that user only.




Accessing Custom Settings Programmatically

The cool thing is now you can programmatically access these custom settings based upon the running user and return their most appropriate value (org-wide, profile or user) in formula fields, validation rules, Apex and the Force.com Web Services API with the following interface. Be sure to check out the custom settings docs for more detailed usage.


You can only access hierarchy custom settings in formula field and validation rules. Here is the generic syntax:

{!$Setup.CustomSettingName__c.CustomFieldName__c}


For Apex code there are a number of good examples in the docs so make sure you take a look at them.


  • Share/Bookmark

Categories: Salesforce

4 Comments

GWT UiBinder – Passing Parameters to Widgets

February 5th, 2010

I received a number of emails regarding my last post, GWT UiBinder Hello World Tutorial, specifically how to pass values into widgets using the new GWT 2.0 UiBinder. Here’s a small tutorial on one of the ways in which you could do that. I plan on another tutorial on passing multiple objects using the @UiFactory method.

So here is the Entry Point class. When the module loads, it creates a new MyPanel object, passes the text “Random Text” to the constructor and then adds the panel to the RootPanel.

MyEntryPoint.java

1
2
3
4
5
6
7
8
9
10
11
12
13
package com.jeffdouglas.client;
 
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.user.client.ui.RootPanel;
 
public class MyEntryPoint implements EntryPoint {
 
	public void onModuleLoad() {
		MyPanel p = new MyPanel("Random Text");
		RootPanel.get().add(p);
	}
 
}

The MyPanel owner class defines a new constructor that accepts the passed string value (i.e. “Random Text”) and sets the value of hidden field called myField in the UiBinder template to this text.

MyPanel.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package com.jeffdouglas.client;
 
import com.google.gwt.core.client.GWT;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.Hidden;
import com.google.gwt.user.client.ui.Widget;
 
public class MyPanel extends Composite {
 
	private static MyPanelUiBinder uiBinder = GWT.create(MyPanelUiBinder.class);
 
	interface MyPanelUiBinder extends UiBinder<Widget, MyPanel> {
	}
 
	@UiField(provided=true)
	Hidden myField;
 
	public MyPanel(String someText) {
		Hidden myField = new Hidden();
		myField.setValue(someText);
		initWidget(uiBinder.createAndBindUi(this));
	}
 
}

When the UiBinder template runs, its owner class loads the value (“Random Text”) into the Hidden field which then passes this same value into the SomeWidget widget.

MyPanel.ui.xml

1
2
3
4
5
6
7
8
9
<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
	xmlns:g="urn:import:com.google.gwt.user.client.ui"
	xmlns:c="urn:import:com.jeffdouglas.client">
	<g:HTMLPanel>
	   <g:Hidden ui:field="myField"/>
	   <c:SomeWidget myField="{myField.getValue}"/>
	</g:HTMLPanel>
</ui:UiBinder>

The SomeWidget owner class is fairly straight forward. There is a setter method for MyField which runs after the constructor, receives the text (“Random Text”) and writes it to the displayText field in the UiBinder template.

SomeWidget.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package com.jeffdouglas.client;
 
import com.google.gwt.core.client.GWT;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Widget;
 
public class SomeWidget extends Composite {
 
	private static SomeWidgetUiBinder uiBinder = GWT
			.create(SomeWidgetUiBinder.class);
 
	interface SomeWidgetUiBinder extends UiBinder<Widget, SomeWidget> {
	}
 
	@UiField Label displayText;
 
	public void setMyField(String t) {
		displayText.setText(t);
	}
 
	public SomeWidget() {
		initWidget(uiBinder.createAndBindUi(this));
	}
 
}

The UiBinder template simply displays the text in an HTMLPanel.

SomeWidget.ui.xml

1
2
3
4
5
6
7
<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
	xmlns:g="urn:import:com.google.gwt.user.client.ui">
	<g:HTMLPanel>
	   <g:Label ui:field="displayText"/>
	</g:HTMLPanel>
</ui:UiBinder>


  • Share/Bookmark

Categories: GWT

No Comments

Force.com Advanced Developer Programming Assignment Complete!

February 3rd, 2010

I just finished the Programming Assignment and wanted to provide some input for anyone taking it in the future. Without giving away the assignment here are my thoughts:

Allow plenty of time – The instructions suggest you allocate 20+ hours to complete the assignment. I think this is somewhat low as it took me roughly 30 hours to develop, test and deploy. Start early and knock it out before the the exam deadline. I got wrapped up on a project and, of course, finished it in the night before. I tend to work better under pressure.

Read the requirements thoroughly and often – The requirements are narrative in form; something you would expect to receive from a customer. I went through the requirements and created my own design doc which outlined objects, sharing model, triggers, controllers, Visualforce pages, workflow, security, etc. This is the document that I worked from.

Build in Production and code in Sandbox – I did virtually everything in Production which limited the amount of time needed to deploy. I built everything that I could in Production and then once I felt the solution was solid, I refreshed a Sandbox and cranked out the Triggers, Controllers, utility classes and Visualforce pages. Essentially declarative work was done in Production while code development was, of course, done in the Sandbox.

Test, deploy and retest – The test cases took some time but I wanted really strong test coverage. I think I only had one class with less than 100% coverage. After deploying all of my code to Production, I loaded some test data and went through all of the use cases to make sure it functioned as expected.

The essay portion at the testing center was fairly straight forward and took about 30 minutes. It was 6 questions as to how, why and for what reasons did I design the application the way I did.

  • Share/Bookmark

Categories: Salesforce

6 Comments

Adobe Air Applications with Salesforce.com

February 1st, 2010

I finished up an offline Case management POC a couple of weeks ago using the new Adobe Flash Builder for Force.com and was really impressed with it features and functionality given that it is still pre-beta. I’ve built a number of Flex apps for Salesforce.com but the new Stratus framework makes it a breeze with the new Salesforce.com-aware components. You can drag and drop a new LabelAndField component onto your application, wire it to a particular sObject field and it generates the functionality specified by Salesforce.com. So if your field is a picklist it automatically displays a populated combobox and configured default value, a boolean displays a checkbox, a text field displays a text box and so on. The really slick feature is if your field is a lookup to another object, it allows you to either type a value or click the magnifying glass button to search for values from the related object. The framework syncs the values for the related object to the SQLite database for you automatically! No worries. Another huge productivity gain is field validation. The framework generates the same validation you would see in the native Salesforce.com UI. This is a huge time-saver as validation rules typically change often during the lifecycle of a project.

James Ward, the Technical Evangelist at Adobe that works with Salesorce.com, introduced me to Markus Spohn who is the product manager for the Stratus framework at Salesforce.com. I sent both of them my feedback on the product and they were very responsive and eager for input. I have to give Salesforce.com credit as they really listen to customers. My only real concern was related to Flash 4 directly. I am by no means a Flash developer but I can produce Flex application by sheer will of force and brute determination. There are A LOT of really great new components in Flash 4 that will require a substantial investment of time to become proficient. James replied that Adobe is aware of the learning curve for Flash 4 and is working on ways to make the transition as painless as possible.

Markus demoed my POC at the Silicon Valley Flex User Group last week to a couple hundred developers and he said it was well received. These guys are much smarter than I am and I’m sure it gave them a new perspective on Salesforce.com. There are a lot of great possibilities for cross platform applications that can be built when you have access to Salesforce.com, the local file system and an on-board database.


  • Share/Bookmark

Categories: Salesforce

No Comments

Appirio Company Retreat 2010

January 28th, 2010

We had our first annual company retreat at the Boulder Resort in Phoenix AZ this week as a chance to recharge and focus on our goals for 2010. Since 75% of the company works virtually, it’s nice to get together with 150 of your closest friends. There as quite a bit of eating, drinking, laughing and even some friendly public embarrassment of senior management. There were life-sized posters created, very “revealing” post cards delivered to everyone’s room and even an old karaoke video of one of the founders (Narinder) that popped up. The meeting is still underway today with sales and senior management and they are working hard. On the way out I heard reference to a management dodgeball game scheduled to settle some internal disputes.

Update: The photographer just posted some photos on her blog that are really cool! I like her comment at the bottom of the page, so check that out as well.

Even though the event was about having fun and reinforcing our great team culture, we did manage to get some work done. We outlined our goals for 2010, set some new strategies in motion and even unveiled some incredibly awesome new “stuff” that we will be rolling out this year (the first rule of Fight Club is….?). One of our main topics was how do we keep our hardworking-funloving-cuttingedgetechnologydriven-smacktalking culture intact while essentially doubling the company each year. It’s nice to see that management

One thing that we are very proud of is that we rolled out our new community involvement program that encourages and rewards employees for becoming involved in their community. We even kicked off the program with a team building event with an entire afternoon spent at the McDowell Sonoran Conservancy (yes, the desert) where we raked dirt, planted hundreds of cactus, moved rocks from point A to point B and generally made the desert a more presentable place. I think we actually outworked their expectations as we ran out of stuff plant, move and cleanse. I’m not sure how that happened.

Appirio is a fantastic place to work and we are always hiring smart, hard-working people that love drinking the cloud computing koolaid. If you are interested, drop me a line or check out the link above.


  • Share/Bookmark

Categories: Appirio

No Comments

GWT UiBinder Hello World Tutorial

January 19th, 2010

I’ve been working on a new project the past couple of weeks that (fortunately) requires Google Web Toolkit (GWT) and I wanted to use the new UiBinder that was released with GWT 2.0 in early December for a number of reasons (clean separation of UI and code, easier collaboration with designers, easier testing, etc ). However, I was having a hard time getting my head wrapped around it given that the GWT site has very little documentation and only a few examples. I’ve combed through the message boards, the docs and the sample Mail application that comes with the SDK and after finally groking the new functionality, I put together a little Hello World app, the kind that would have helped me out originally.

So I’m making some assumptions that you already have the GWT SDK and Eclipse Plugin installed and are familiar with both of them. If you are not, take a look at the GWT site for more info.

To get started, create a new Web Application Project called “HelloUiBinder” in the package of your choice but do not check “Use Google App Engine”.


Now create a new UiBinder template and owner class (File -> New -> UiBinder). Choose the client package for the project and then name it MyBinderWidget. Leave all of the other defaults. When you click Finish the plugin will create a new UiBinder template and owner class.


Open the MyBinderWidget.ui.xml template and add the following code. With GWT you can define your styles either in your template where you need them or externally. I’ve added a small style inline that adds some pizzaz to the label. Notice the field name myPanelContent in the template. You can programmatically read and write to this field from the template’s owner class. So when the owner class runs, it construct a new VerticalPanel, does something with it (probably add some type of content) and then fill this field with it.

Attributes for the elements (the text attribute in the Label element for example) correspond to a setter method for the widget. Unfortunately there is no code completion to get a list of these attributes in Eclipse when you hit the space bar so you either have to know the setters or refer to the JavaDocs each time. A painful process.

1
2
3
4
5
6
7
8
9
10
11
<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
     xmlns:g="urn:import:com.google.gwt.user.client.ui">
     <ui:style>
          .bolder { font-weight:bold; }
     </ui:style>
     <g:HTMLPanel>
          <g:Label styleName="{style.bolder}" text="This is my label in bold!"/>
          <g:VerticalPanel ui:field="myPanelContent" spacing="5"/>
     </g:HTMLPanel>
</ui:UiBinder>

For the owner class, MyBinderWidget.java, add the following code. In this class, a field with the same name, myPanelContent, is marked with the @UiField annotation. When uiBinder.createAndBindUi(this) is run, the content is created for the VerticalPanel and the template field is filled with the new instance.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package com.jeffdouglas.client;
 
import com.google.gwt.core.client.GWT;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
 
public class MyBinderWidget extends Composite {
 
     private static MyBinderWidgetUiBinder uiBinder = GWT
               .create(MyBinderWidgetUiBinder.class);
 
     interface MyBinderWidgetUiBinder extends UiBinder<Widget, MyBinderWidget> { }
 
     @UiField VerticalPanel myPanelContent;
 
     public MyBinderWidget() {
          initWidget(uiBinder.createAndBindUi(this));
 
          HTML html1 = new HTML();
          html1.setHTML("<a href='http://www.google.com'>Click me!</a>");
          myPanelContent.add(html1);
          HTML html2 = new HTML();
          html2.setHTML("This is my sample <b>content</b>!");
          myPanelContent.add(html2);
 
     }
 
}

Now change the entry point class to look like the following.

1
2
3
4
5
6
7
8
9
10
11
12
package com.jeffdouglas.client;
 
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.user.client.ui.RootPanel;
 
public class HelloUiBinder implements EntryPoint {
 
     public void onModuleLoad() {
          MyBinderWidget w = new MyBinderWidget();
          RootPanel.get().add(w);
     }
}

Now open HelloUiBinder.html and remove all of the HTML content between the </noscript> and and </body> save it. Once you run the application, copy the development URL and run paste it into your favorite supported browser, you should see the following.


Now suppose you wanted to nest a widget inside your MyBinderWidget that did something when a button was clicked. We’ll create a small series of checkboxes that allows the user to select their favorite colors and display them when the button is clicked. Create a new UiBinder called FavoriteColorWidget in the client package. Add the following code to the FavoriteColorWidget.ui.xml template.

1
2
3
4
5
6
7
8
9
10
11
<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder'
    xmlns:g='urn:import:com.google.gwt.user.client.ui'>
    <g:VerticalPanel>
      <g:Label ui:field="greeting"/>
      <g:Label>Choose your favorite color(s):</g:Label>
      <g:CheckBox ui:field="red" formValue="red">Red</g:CheckBox>
      <g:CheckBox ui:field="white" formValue="white">White</g:CheckBox>
      <g:CheckBox ui:field="blue" formValue="blue">Blue</g:CheckBox>
      <g:Button ui:field="button">Submit</g:Button>
    </g:VerticalPanel>
</ui:UiBinder>

Now add the click handler in the FavoriteColorWidget.java owner class.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package com.jeffdouglas.client;
 
import java.util.ArrayList;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.Widget;
 
public class FavoriteColorWidget extends Composite {
 
     private static FavoriteColorWidgetUiBinder uiBinder = GWT
               .create(FavoriteColorWidgetUiBinder.class);
 
     interface FavoriteColorWidgetUiBinder extends
               UiBinder<Widget, FavoriteColorWidget> {
     }
 
     @UiField Label greeting;
     @UiField CheckBox red;
     @UiField CheckBox white;
     @UiField CheckBox blue;
     @UiField Button button;
 
     public FavoriteColorWidget() {
          initWidget(uiBinder.createAndBindUi(this));
 
          // add a greeting
          greeting.setText("Hello Jeff!!");
 
          final ArrayList<CheckBox> checkboxes = new ArrayList<CheckBox>();
          checkboxes.add(red);
          checkboxes.add(white);
          checkboxes.add(blue);
 
         // add a button handler to show the color when clicked
          button.addClickHandler(new ClickHandler() {
               public void onClick(ClickEvent event) {
                    String t = "";
                    for(CheckBox box : checkboxes) {
                         // if the box was checked
                         if (box.getValue()) {
                              t += box.getFormValue() + ", ";
                         }
                    }
                    Window.alert("Your favorite color/colors are: "+ t);
               }
          });
 
     }
 
}

The last thing we’ll need to do is add our new widget to the MyBinderWidget template. Open MyBinderWidget.ui.xml and add the custom namespace reference and the FavoriteColorWidget.

1
2
3
4
5
6
7
8
9
10
11
12
13
<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">;
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
     xmlns:g="urn:import:com.google.gwt.user.client.ui"
     xmlns:c="urn:import:com.jeffdouglas.client">
     <ui:style>
          .bolder { font-weight:bold; }
     </ui:style>
     <g:HTMLPanel>
          <g:Label styleName="{style.bolder}" text="This is my label in bold!"/>
          <g:VerticalPanel ui:field="myPanelContent" spacing="5"/>
          <c:FavoriteColorWidget/>
     </g:HTMLPanel>
</ui:UiBinder>

Now when you run the application it should look like the following.


  • Share/Bookmark

Categories: GWT, Google, Google App Engine

10 Comments

Force.com Advanced Developer Programming Assignment

January 14th, 2010

I recently received the Force.com Advanced Developer programming assignment and a few people have emailed me about its contents. So, not to give anything away, you essentially get a sandbox and an EE org to develop the app outlined in programming assignment. The requirements (8 pages) look pretty straight forward and nothing jumps out at me as being crazy. If you have experience developing Salesforce apps (and you should if you are taking this test!) it should look familiar. You deal with objects, roles, permissions, sharing model, workflow, Apex, Visualforce, etc. All of the things you would expect as an advanced developer.

You should budget a minimum of 20 hours to complete the assignment; however, they recommended that you budget as much time as possible to ensure there is ample time to successfully complete the assignment. Collaboration between candidates, use of Salesforce.com support, and solicitation of help from others is NOT allowed and is grounds for disqualification.

Both the programming assignment and essay exam need be completed and submitted by Monday, February 8th 2010 at 9:00 AM (GMT -8:00) Pacific Time (US and Canada). The essay exam and programming assignment will be evaluated and scored by a panel of salesforce.com experts and candidates will receive their pass/fail status approximately one month after the window closes.


  • Share/Bookmark

Categories: Salesforce

2 Comments

My Favorite Salesforce.com Spring ‘10 Features

January 12th, 2010

For those that don’t have time to weed through all 171 pages of the Spring ‘10 Release Notes, I’ve pulled out a few of my favorites for your viewing pleasure. I didn’t hit all of the items in the release notes so make sure you pull up the the PDF and check out the goodies in detail.

Entitlement Management – Service Cloud
By far the most detailed new feature at 45 pages! You can now set up entitlement management so that your support reps can verify if your customers are eligible for support, create and maintain service contracts, specify service levels on a per customer basis and enforcement of service levels with time-dependent, automated processes. There is a TON of stuff around Entitlement Management including service contracts and milestones so definitely take a closer look!

Quotes – Sales Cloud
A quote is a record showing proposed prices for products and services created from an opportunity and its products. You can create a set of quotes to show different combinations of products, discounts, and quantities so customers can compare prices. Each opportunity can have multiple associated quotes, and any one of them can be synced with the opportunity. You can also create and email PDF quotes.

Answers – Service Cloud
Answers is the newest feature of the Community application that lets community members ask questions, post replies, and vote whether they like or dislike a reply. It looks somewhat similar to Ideas in such that you assign categories to communities and then enable Answers for the customer and partner portals.

Knowledge Enhancements – Service Cloud
A ton on Knowledge enhancements including new API objects for articles, metadata components for data category groups, describe calls for data categories, SOQL and SOSL filter, field level security for articles, custom report types and access to articles in the partner portal.

SOQL Enhancements

New GROUP BY Clause
SELECT LeadSource, COUNT(Name) FROM Lead GROUP BY LeadSource

New HAVING Clause
SELECT Name, Count(Id) FROM Account GROUP BY Name HAVING Count(Id) > 1

Aggregate Functions (Finally!!!!)
SOQL now supports AVG(), COUNT(), COUNT_DISTINCT(), MIN(), MAX(), and SUM()

Date Functions
A slew of new date functions for SOQL to make your life easier.

Semi-Join and Anti-Join Support For Reference Fields
I ran into the issue all the time when writing queries. Now your subqueries can filter by ID (primary key) or reference (foreign key).

Force.com Apex Code Enhancements

  • The Apex scheduler is now generally available.
  • Callouts Enhancements including increased size limit, output messages with multiple elements (hurrah!!), new baked-in DOM class for parsing and generating XML content and enhanced two-way SSL authentication
  • Limits on the number of items a collection can hold have been removed. However, there’s still a general limit on heap size. What!!??
  • sObjects are now created as Objects and you can create generic sObject collections: Set foo = new Set();
  • I’m don’t this this is what Taggert was talking about during his DF09 presentation, but there are a lot of new logging features to check out on line 121. Check it out! Should make life easier until what Taggert revealed in on the roadmap for debugging is GA.

Visualforce Enhancements

  • component now uses Ext 3.0
  • Salesforce.com Stylesheets No Longer Called for PDFs

Force.com Web Services API Enhancements

  • New SOSL Clause for Filtering By Data Categories
  • New Support for API Version in Outbound Messages
  • Numerous new Objects to support Entitlement Management, Answers and Quotes
  • There are also some new and changed API calls
  • Support for Sites objects (Site and SiteHistory)

Force.com IDE
The Force.com IDE Spring ‘10 release is scheduled for February 15th. Not sure of the new features but from what I have heard in the past you should (safe harbor) be able to copy from from SOQL search results.

Complex Data Modeling with Multilevel Master-Detail Relationships
You can now include multiple levels in master-detail relationships. For example, in addition to defining a two-object master-detail relationship, such as Account—Expense Report, you can extend the relationship to subdetail records, such as Account—Expense Report—Expense Line Item. You can then perform operations across the master—detail—subdetail relationship. There are some caveats so check out the details.

Sandbox to Production—Change Sets Beta
Use change sets to move configuration changes via a web interface. New enhancements include clone an existing change set, cross-version upload, delete change sets, and a six month expiration of change sets.

New UI Theme
The new UI theme that was unveiled at DF09 is an org-wide update that will be available after February 5th, 2010. The new UI supports IE 7 & 8, Firefox 3.0.x and Safari 3.2.x. Sorry Chrome!

Dashboard Enhancements

  • With custom dashboard tables you can create tables with up to four columns, with column totals for number and currency summary fields.
  • With dashboard finder, you can quickly find a dashboard by typing its name in the search filter. All accessible dashboards matching that text are dynamically displayed in the drop-down list.
  • New visibility option for report and dashboard folders to deny access to a folder for portal users (“This folder is accessible by all users, except for portal users”).

Secure Communication with External Websites
Encrypt sensitive date with certificates and key pairs whenever Salesforce.com communicates with a supported external website. Salesforce.com offers either CA-signed or self-signed certificates.

CTI 2.0 Toolkit
A new toolkit for developers and partners to build more robust CTI adapters for call center users.

Globalization Enhancements

  • Translation Workbench Enhancements
  • Translatable Visualforce Email Templates
  • Increased Maximum Limit for Rules
  • Lookup Filter Beta Enhancements
  • Number of Remote Access Application Authorizations Increased
  • Enable Sidebar Search Auto-Complete Setting
  • Enable Single-Search-Result Shortcut Setting
  • A number of Auto-Complete Enhancements
  • Standard Action Overrides are Packageable – Standard action overrides on buttons and links are now packageable for custom objects.
  • Personalized Email Alerts – You can now set the From Email Address in email alerts to the address of the default workflow user.

Limited Release, Beta and Developer Previews

Adobe Flash Builder for Force.com – Developer Preview
Adobe® Flash® BuilderTM for Force.com is an Eclipse-based IDE for developing Force.com Stratus apps (Adobe Air apps that leverage Force.com logic and data). Stratus applications run seamlessly online or offline while taking full advantage of the security, scalability, and reliability of Force.com. I’ve been playing with Stratus for a few months and plan to have a really cool demo with code soon.

New Report Builder – Developer Preview
A new visual report builder for tabular reports (with limited functionality).

New Opportunity Page – Pilot
An improved opportunity detail page with highlight panels, recommendations, and drag and drop side tabs. Available after Feb. 5, 2010.

My Domain – Limited Release
You can brand your login and navigation URLs for Salesforce to create something like: https://appirio.my.salesforce.com. It also is more secure as it uses HTTPS.

Patch Updates for Packages – Limited Release
Automatically upgrade your managed packages with patches. A push upgrade is a method of automatically upgrading your customers to a newer version of your package. A package subscriber doesn’t need to do anything to receive the push upgrade. If you are developing managed packages this is a must read.

Rich Text Support – Beta
A new rich tech field type that is production quality but with some known limitation. The max size is 32,000 characters including HTML tags and only .gif, .jpeg and .png images are supported.


  • Share/Bookmark

Categories: Salesforce

12 Comments

Developing Apps with the Adobe Flash Builder for Force.com

January 11th, 2010

I’ve been doing a lot of work the past couple of weeks with the new Adobe Flash Builder for Force.com and the new Stratus framework. I’m in the putting together a fairly large Adobe Air demo and an accompanying blog post. In the meantime I ported a small app from Flex 3 to the new Adobe Flash Builder for Force.com and did a small screencast of some new functionality. It was a demo that I did of a way to provide a graphical representation of an floor layout (warehouse, real estate, floorplan, etc.) and show how to tie the elements to distinct records in Salesforce.com.

  • Share/Bookmark

Categories: Flex, Salesforce

No Comments

Feed

http://blog.jeffdouglas.com /