Friday, August 29, 2008

VisualForce App - Send Alert Button (Part 3) : Fleshing Out the Visualforce Page

This article describes a custom application that adds a "Send Alert" button on the Case Detail Record. The application basically does two things: (1) Sends an email status update to a distribution list of internal users, and (2) adds the status update as a Case Comment. This is the third in a series of articles describing how we implemented the feature, and pitfalls we ran into along the way.

Here is a code drop of the final Visualforce page behind the Send Alert button, which we previewed in Part 2:

WARNING: I'm finding that Blogger is a HORRIBLE medium for posting code like this, at least with the current template. I'm working on a website where I can post these code samples, and make it easier for readers to grab them. Hope to have that online in a week or two! In the meanwhile, my appologies for the ugly rendering in Blogger!


<!-- Alert Notification Wizard -->
<apex:page controller="SendAlertController">
<apex:sectionHeader title="Active Alert - Status Update" subtitle="Internal CPC Notification Only"/>
<apex:pageBlock >
This is an Internal (Cedar Point) <b>Sev {!Case.Priority} ALERT</b> Status Update for the <b>{!Account.Name}</b> Account Team.
</apex:PageBlock>
<apex:form >
<apex:pageBlock title="Current Status Update">
<apex:pageBlockButtons >
<apex:commandButton action="{!send}" value="Send Update"/>
<apex:commandButton action="{!sendfinal}" value="Send Final Update"/>
<apex:commandButton action="{!cancel}" value="Cancel"/>
</apex:pageBlockButtons>
<apex:pageBlockSection columns="1">
<apex:pageBlockSectionItem >
<apex:outputLabel value="Send To:" for="sendTo"/>
<apex:outputText value="Account Team Members plus {!sendtogroup} Group" id="sendTo"/>
</apex:pageBlockSectionItem>
<apex:pageBlockSectionItem >
<apex:outputLabel value="Account Team Members:" for="teamMembers"/>
<apex:outputText value="{!teamMemberNames}" id="teamMembers"/>
</apex:pageBlockSectionItem>
<apex:pageBlockSectionItem >
<apex:outputLabel value="Alert Group Members:" for="groupMembers"/>
<apex:outputText value="{!groupMemberNames}" id="groupMembers"/>
</apex:pageBlockSectionItem>
<apex:pageBlockSectionItem >
<apex:outputLabel value="Additional To:" for="moreto"/>
<apex:inputTextarea id="moreTo" value="{!moreTo}" rows="1" cols="100"/>
</apex:pageBlockSectionItem>
<apex:pageBlockSectionItem >
<apex:outputLabel value="Subject:" for="subject"/>
<apex:outputText id="subject" value="{!subject}"/>
</apex:pageBlockSectionItem>
<apex:pageBlockSectionItem >
<apex:outputLabel value="Priority" for="priority"/>
<apex:outputField value="{!Case.Priority}" id="priority"/>
</apex:pageBlockSectionItem>
<apex:pageBlockSectionItem >
<apex:outputLabel value="Case" for="caseNum"/>
<apex:outputLink value="/{!Case.Id}" id="caseNum">{!Case.CaseNumber}</apex:outputLink>
</apex:pageBlockSectionItem>
<apex:pageBlockSectionItem >
<apex:outputLabel value="Description" for="caseDesc"/>
<apex:outputField value="{!Case.Subject}" id="caseDesc"/>
</apex:pageBlockSectionItem>
<apex:pageBlockSectionItem >
<apex:outputLabel value="Switch" for="caseSwitch"/>
<apex:outputText value="{!SwitchName}" id="caseSwitch"/>
</apex:pageBlockSectionItem>
<apex:pageBlockSectionItem >
<apex:outputLabel value="SW Rel" for="caseSwRel"/>
<apex:outputText value="{!SwitchRel}" id="caseSwRel"/>
</apex:pageBlockSectionItem>
<apex:pageBlockSectionItem >
<apex:outputLabel value="Opened" for="caseCreatedDate"/>
<apex:outputField value="{!Case.CreatedDate}" id="caseCreatedDate"/>
</apex:pageBlockSectionItem>
<apex:pageBlockSectionItem >
<apex:outputLabel value="Status Update" for="statusUpdate"/>
<apex:inputTextarea id="statusUpdate" value="{!comment.CommentBody}" rows="8" cols="100"/>
</apex:pageBlockSectionItem>
</apex:pageBlockSection>
</apex:PageBlock>
</apex:form>
<!-- <apex:detail /> -->
</apex:page>


That's the code, and here's what the final page looks like when rendered in a Visualforce page:

Thursday, August 28, 2008

Putting code in your Google Blog

We interrupt this Visualforce show-n-tell with a special announcement. One of my blog visitors, ELIT3, asked if I could post the code of my Visualforce pages, rather than screenshots. I tried to copy the code into the blog post, but when I viewed the posting, the code was all mangled. The browser had interpretted the Visualforce code as HTML, and disintegrated it.

I thought I could prevent that by just wrapping the code in <pre> </pre> tags, but that didn't seem to help. Today, I finally figured out that I need to wrap the code between some <code> </code> tags, but I still had to convert the "<", ">", other special characters.

I trolled around the web and found a couple sites to help with that, and thought I'd share. So if you're interested in posting code on your own blogs (and also for my own future reference, since I'm sure to forget), check these out!

My favorite is Elliot Swan's Postable site: http://www.elliotswan.com/postable/

I like the way it looks, and I love it's simplicity -- you just drop all your code into the text window:



Then, click the "Make it friendly" button. His browser app will replace all the "<", ">", and "&" symbols with the appropriate HTML translations.



Then, you simple wrap <code> </code> tags around your converted "HTML friendly" text, and wala! It's viewable in a Google Blog post (and can be copied by your readers!):


<!-- Alert Notification Wizard -->
<apex:page controller="SendAlertController">
<apex:sectionHeader title="Active Alert - Status Update" subtitle="Internal CPC Notification Only"/>
<apex:pageBlock >
This is an Internal (Cedar Point) <b>Sev {!Case.Priority} ALERT</b> Status Update for the <b>{!Account.Name}</b> Account Team.
</apex:PageBlock>
</apex:page>


Here's another site http://www.htmlconvert.net/ that goes one better, giving you an option to transform the text into standard HTML code with colorized tags:


<!-- Alert Notification Wizard -->
<apex:page controller="SendAlertController">
<apex:sectionHeader title="Active Alert - Status Update" subtitle="Internal CPC Notification Only"/>
<apex:pageBlock >
This is an Internal (Cedar Point) <b>Sev {!Case.Priority} ALERT</b> Status Update for the <b>{!Account.Name}</b> Account Team.
</apex:PageBlock>
</apex:page>

Cute!

Wednesday, August 27, 2008

VisualForce App - Send Alert Button (Part 2) : How do I make a Visualforce Page, anyway?

This article describes a custom application that adds a "Send Alert" button on the Case Detail Record. The application basically does two things: (1) Sends an email status update to a distribution list of internal users, and (2) adds the status update as a Case Comment. This is the second in a series of articles describing how we implemented the feature, and pitfalls we ran into along the way.

In yesterday's blog, I described the basics of what we wanted to accomplish with the proposed "Send Alert" button. Today, I'll retrace our first steps, showing how we first "dipped our toes" in the Visualforce waters.

Ok ... How Do I Make a Visualforce Page, Anyway?

My first glimpse into Visualforce was during Marc Benioff's keynote at Dreamforce 2007. I'll confess to you right up front, the developers make this look EASY, but it took a little bit of stumbling before I made my first Visualforce page. Not to worry, it gets easier with practice!

At Dreamforce 2007, I had jotted down notes --pages of notes, actually -- and I flipped through them with enthusiasm. Enthusiasm turned to confusion, which turned to despair. I realized I had no idea where to begin. Apparently I'd left out some notes for making a Visualforce page.

I hit the Developer's Wiki: http://wiki.apexdevnet.com/index.php/Apex_and_Visualforce. If you've never been here, visit now!

There are a ton of videos, user guides, and "getting started" presentations for the aspiring Apex / Visualforce developer. I spent a good chunk of the day just watching the videos, and perusing the developer's guide. Eventually, I realized I was just procrastinating, and it was time to dig in.

I followed a step that I saw Ron Hess do in one of the video presentations; I typed the following URL into my browser:

https://na3.salesforce.com/apex/SendAlert

(NOTE: If you're crazy enough to be following along, be sure that you substitute "na3" for the correct pod on which your instance of Salesforce runs, typically na1, na2, na3, na4, na5, etc.)

That's the simpler method of creating a new Visualforce page ... just add "/apex/page_name" to the end of your Salesforce pod name. Because the Visualforce page does not yet exist, the platform prompts you to create a new page.



Oooh, cool! I've played with plenty of HTML, so I could immediately see what was happening here. I resisted the urge to create my first Visualforce "Hello World" page, and plowed on with the application.


I copied the browser URL ("https://na3.salesforce.com/apex/SendAlert") to my clipboard, and then created a custom button for the Case object.

If you're following along at home (or work, or whatever):



  1. Click Setup --> Customize --> Cases --> Buttons and links

  2. Click NEW in the "Custom Buttons and Links" section
    Make your custom button look like this.

Note that in the content section of the Browser, I've pasted the clipboard content, and then added "?={!Case.Id}" to the end. Whenever this "Send Alert" button is evoked from a Case Detail Page, it will open our new VisualForce page, with the current case record in "focus".





I added the custom button to our Case page layout:



  1. Click Setup --> Customize --> Cases --> Page Layouts

  2. Edit the appropriate "Case Layout"

  3. Click the "Detail Page Buttons" component, and then click "Edit Properties"

  4. Move the "Send Alert" button from the "Available Buttons" list to the "Selected Buttons" list.

So there's our button, and now we have a Case detail record in focus when we open the Visualforce Page. I modified the Visualforce page with some basic headers:


Pretty cool, pretty easy! Tomorrow we'll work on the input text box, and the rest of the Visualforce page.

Tuesday, August 26, 2008

VisualForce App - Send Alert Button (Part 1)

This article describes a custom application that adds a "Send Alert" button on the Case Detail Record. The application basically does two things: (1) Sends an email status update to a distribution list of internal users, and (2) adds the status update as a Case Comment. This is the first in a series of articles describing how we implemented the feature, and pitfalls we ran into along the way.


BACKGROUND: At the company where I work, several cross-functional teams snap into action when a Sev-1 (Critical Issue), Sev-2 (Major Issue) or Sev-3 (Operational Issue) is reported into Technical Support by one of our customers. In accordance with our internal business policies, Tech Support must notify these cross-functional teams via email, and provide periodic status updates as the Case is being worked.

The teams include members from Engineering, Technical Support, and of course, the Sales/Account Team. All cross-functional team members monitor the updates via Blackberry, and respond appropriately. For example, Engineering dispatches a SWAT team to assist Tech Support with issue resolution. At the same time, the Sales/Account team contact Customer management, providing a proactive message ("we're on it") and ongoing status updates.


PROBLEM WE WERE TRYING TO SOLVE: There were two problems we observed after this procedure was put in place.

(1) Status Updates Were Not Being Added to the Case: While our technical team was very good about sending the internal email status updates, they were inconsistent in the practice of copying these updates into the Case. The directors and managers made request after request for these updates to be added as a Case comment -- but the discipline never came. We decided that if we gave Tech Support a method for entering the status updates within Salesforce.com, we could have the platform send out the email status update, and also store the update as a Case Comment automatically.

(2) Targeting the Update to the Right Audience: The distribution list to which these email status updates were sent changes frequently, because our Account Teams shift dynamically, depending on the project demands of our customer base. The distribution list for the status updates also changed depending on the Customer account, and the severity (Priority) of the case. It was difficult for Tech Support to keep tabs on these ever-changing distribution lists. We wanted to make this completely transparent to the Technical Team -- they just had to create a status update, and the SFDC platform would distribute it to the correct distribution list.


HOW WE DID IT: We added a custom "Send Alert" button, a Visualforce page, and some Apex code to the Case detail record which basically does the following:

1.) Displays some basic template of summary information from the case, which will be included in the email status update.
2.) Provides a blank text window, where the user can post the current status update.
3.) Packages all the summary info and status update into an email message, and sends it to the appropriate Account Team, as well as the cross-functional team members.
4.) Posts the status update as a new case comment.


Okay, that's the background. Tomorrow, we'll show how we went about creating the Visualforce portion of this application. Stay tuned!

Sunday, August 24, 2008

LinkedIn Let's the Cat out of the Bag

Most of my professional life, I've worked for small start ups (50-150 employees). Just as with larger corporations, start-up companies go through turbulent years and may experience lay-offs. I've weathered many lay-offs at various companies that I've worked for, although in recent years, I've found that the language has changed. They are no longer lay-offs, but RIFs (Reduction in Force).

It used to be that whenever a Lay-off would come, surviving employees would be called together, either in small groups or in a larger "all-hands" meeting. The executive staff would sometimes describe the reasons for the lay-off ... err, RIF, explain why it was necessary, how we would all need to pull together, work harder with less -- you know the drill.

Invariably, Human Resources would step up at the end, and remind all employees that they must not discuss the RIF with anyone outside the company. If any employees were contacted by outside recruiting firms or companies looking for the names of "termed employees", the callers should be immediately referred to HR.

I'm not sure how effectively that worked in the old days, but I know it's not working very effectively in our Web 2.0 world today. Here's a telephone conversation I had with a former business colleague, who still works at the company I left several years ago.

ME: "So you guys got some big lay-offs recently, huh?"

HER: "Oh my god ... how did you know? No one outside the company is supposed to know. They just announced it! They're still calling people down for their exit interviews."

I shared a couple names of folks I thought who might be on the "termed employee" list.

HER: "Ok, now, you're freaking me out. I just saw him walk by with HR and an empty cardboard box. They were going down to clear out his office. How did you know?"

ME: "LinkedIn."

HER: "Huh?"

ME: "LinkedIn. I was just scrolling through the Network Updates of my LinkedIn connections, and I saw a whole bunch of recommendations being written up by folks who work there."

I've commented about LinkedIn before on this blog. LinkedIn is a social networking group focused on "connecting academic and business colleagues together, even as they change jobs and careers". One of the neat features of LinkedIn is that once you've added a colleague as being "connected / assocaited" to yourself, you can watch updates that they make to their resume, updates they make to projects that they are currently working on, and in this case, recommendations that they are either writing for other LinkedIn users, or even recommendations that have been written for them (by other LinkedIn users).

It wasn't difficult to see that there was a flurry of recommendation letters being written for and by employees from my old stomping grounds. Occasionally someone might write a recommendation letter for someone without prompting, but this level of activity usually indicates that lay-offs are in process, a merger / acquisition is coming down, or something is panicing the work force -- such that they are all looking to get there resumes updated, and their LinkedIn network updated on their changing work status.

My friend survived the lay- ... RIF, and I'm glad. And she later told me that they get the same monologue from HR, to not share the company job changes outside of the company. But by then, LinkedIn had already let the proverbial cat out of the bag.

Monday, August 18, 2008

Back to the Grind

I like my job, I really do. That seems to come as a great surprise to a great many people, but I honestly love my career in high tech.

I like my vacations, too. I'm just back from a week at the beach, and as always, it's taking a while to slip it in gear. While on vacation, I'm on a complete media and technology black-out. No iPod, No WiFi, no laptop, no Blackberry. There's a TV at the summer beach cottage (which we rent from my father), but I don't even turn that on. World events come to us by way of a curious, low-tech marvel called a "newspaper" -- which I fetch each morning by walking a half-mile (round trip) to a nearby roadside market.

At the beach, I totally immerse in being a kid, with my kids: building sandcastles on the beach, playing bocce, tossing frisbees, and surfing. I do a lot of reading at the beach, more than I do at home, but not from a Kindle. Instead, I haul these heavy, clunky things called "books" in my beach bag. Unlike the online media that I read all through the year, these often have nothing to do with high-tech.

This week I read The Good Guy (Dean Koontz), You've Been Warned (James Paterson), and Duma Key (Stephen King). These aren't book titles that I, necessarily, would have selected from a bookstore -- but they were all hard-cover books that had been left on the cottage book shelves by previous tenants. I did enjoy the first two, I found the Stephen King book to drag on too much.

I love the beach, I love the "escape", but it's really hard to jump back to work. Keep in mind my opening to this blog post -- I love my job, I love the work that I do -- but after a full week of being completely unplugged, it's surprising to me how hard it is to get back to work.

Examples:

- When the alarm clock sounded, I had no idea what it was. The "beep, beep" of the alarm was associated as a truck, backing up, outside my window. I was getting extremely annoyed at the truck driver, who was taking so long to back-up, until I realized that it was an alarm clock.

- Leaving the house this morning, I tried to get on my bicycle, rather than in my commuter car. I had strattled the bike before remembering that I don't work close enough for cycling to work (I wish!). I was still in beach mode, heading out for a morning bike ride.

- My computer is an alien thing to me. I couldn't even turn it on. Instead, I made office visits to the "usual suspects", to see what happened at the office the past week and what they felt needed my urgent attention.

I worked from pen and paper for a good chunk of the morning, and I'm slowing booting up. This blog gets the first attention of the day, but there is a pile of 705 email messages waiting for me next. Back to the grind ...

Thursday, July 31, 2008

Salesforce.com Certification Programs

Is the Force with you? Are you a “young padawan” or a Master of the Force?

Those of us who have been using Force.com for any period of time have developed some very specialized skills. Until recently, many practicioners felt that there wasn’t a common ranking by which we could evaluate or compare our skill levels. That’s all changed now, with the advent of official certification programs through Salesforce.com.


Not Necessarily New
Salesforce has actually had a number of certification programs in place for some time now. These have been promoted through their annual user conference. For instance, at Dreamforce 2007, there was an Administrator training program, which included a certification exam at the end. Pass the exam and you were granted a snazzy “Salesforce ’07 Certified Administrator” logo to brandish on your email signature, and also bragging rights on your resume.

Salesforce.com Consultants and Partners have had access to their own certification programs, as well. You don’t need to be an actual consultant to sign up for the “referral partner” program, and some practitioners signed up just to get access to the certifications. There are different levels of certified consultant: Level 1 (basic), Level 2 (advanced), Level 3 (developer). Salesforce provides these partners with training program offerings, or an opportunity to skip right to the exam. Partners who pass the exam earn a custom logo for their email signature, and a chance to put “Salesforce.com Level II Certified Consultant” (or whatever level they passed) on their resume.


New Certification Programs Announced in July
The recent expansion of Salesforce.com’s existing program was influenced by our input, as expressed on Salesforce.com Idea Exchange. Hundreds of SFDC users promoted the an expansion of the existing certification programs. I like sandpcheryl's comment on the idea: "SFDC should do for SFA's (SalesForce Admins) what Oracale did for DBA's basically create its own job class. I have been to the admin training and have a certificate, but would like to take a test and show my employer and others that I know my stuff!"

Nadim Hossain (Salesforce.com Product Marketing, Training & Certification) announced the new Certification Programs on July 15th, and you can read more information about them here. Currently, there are two levels of certification for administrators (basic and advanced). A Master-level certification is also planned. Classes and exams for Developer certification are still being developed, but it looks like they will follow the same 3-tier model (basic, advanced and master). To earn the certification, you must pass an exam. If you are very practiced and confident of your skills, you can skip to the exam right away. Not sure if you’re ready? Salesforce.com has put together some great study guides, which include an outline of the exam content, sample questions and sample answers. Salesforce.com also offers training classes, specifically designed around content that will be covered in the exam.


Cost of the Exams
The cost of the Administrator exams (both basic and advanced) is $200 list price, as of this date. You need to take the exams in sequence, you can’t skip directly to the highest level certification. For example, Administrator certification is a pre-requisite for the Advanced Administrator exam. So you have to pay $200 to take the Administrator Exam, and then another $200 to take the Advanced Administrator exam. You can take the exam at any time, and there are literally hundreds of testing locations around the world offering the exams -- I found several facilities within a 60-mile radius of my house. Very cool!

Preparatory Training classes (for those who prefer that) is an additional cost (approximately $3000, with discounts available for volume purchases). These are 4+ day training classes, offered through Salesforce.com at numerous locations / major cities throughout the US.


Developer Certification … Still in Development!
Developer certification training classes are expected to be available in August, with exams offered shortly thereafter. You can sign up for the mailing to get notified as to when the exams and training programs will be offered here.


Rumors Debunked
The rumors that you need to grow your hair in a braid, and then have the braid cut off when you pass the certification exam, are completely untrue. Apparently, that was only done by the young padawans of the Old Republic, and was for their achievement in a completely different Force.

Monday, July 28, 2008

SOQL within a Visualforce Page



I'm trying to figure out how I can query a related object in Visualforce, without hammering javascript into my VF page, or using a custom controller.

That's the VF page (above), here's the code that generates it.

It's easy to access the data from the standard Case controller, and it's to traverse one level up to the Account parent of this Case record. But I've been staring at the code trying to figure out how to get the Name field from the related Switch__c object.

I've tried hacking some Select queries into the VF page, but that didn't work out so well. I don't want to java script something so trivial.

It seems like I should be able to reference "{!Case.Switch__c.Name}" in the same way that I reference {!Case.Account.Name}, but traversing parent-child doesn't seem behave the same for related records.

Back to the books ... or maybe a plea for help on the dev forums.

Sunday, July 27, 2008

Insomnia



It's back, my dear old friend, Insomnia. Although it's different for me. I don't lie prone in bed, gazing wide-eyed at the cieling. Instead, I sit hunch-back over my keyboard, banging out code and crawling through the web.

Lately, I've been taking a deep dive into Apex and Visualforce, and it's really cool stuff. So cool, in fact, that I'll suddenly be concious of the birds chirping outside my window, and realize that I've been up all night coding again. My last meal was a soggy tuna sandwich about 16 hours earlier.

I do a lot of freelance work, but the current project is for my employer. My boss wants a feature added to Salesforce.com that allows his technical team to send a periodic email status update to various internal audiences when a high priority Case is opened. The tricky part is that there are different rules as to who the email should be sent to, depending on the severity (priority) of the Case and the Customer (Account) who opened the case, and the mail distribution rules change pretty frequently. The users can't easily keep track of these rule changes -- so we're going to let Salesforce.com do it for them. They just need to post the update, and my code under the hood will handle the email template preparation and distrubtion.

Before, I would have just banged this out with an S-control, but I thought I'd try this out with a combination of Apex and VisualForce pages instead. So I added a "Send Alert" button to the Case detail record page layout, and now I'm fighting the learning curve to implent this functionality in Visualforce.

I've poured through wikis, webinars and documentation posted on the Apex Developer Net forums. My mind loses all track of the passage of time, including recollection of when I last slept, when I last ate, when I last interacted with the human race. Still, I've learned a lot, and my "Send Alert Notification" components and pages are looking pretty slick.

I have to shift gears now, because I've been doing all my development (so far) in a production environment ... so naughty, I know. Last night, I hit a wall and realized I needed to create a new Apex Class, and it took me way too long to realize that the reason I couldn't make one was because I wasn't in a Developer edition or sandbox. Ooops.

I haven't done enough with the Sandbox, so now I need to go study up on it. I'll come back and share what I learn.

Thursday, July 24, 2008

Roboform -- Very Cool Tool



Here's a cool tool that I can't live without. It's called Roboform, and it's a "must have" tool if you maintain many subscriptions on the web. Every time you subscribe to a new website or service on the internet, you're usually asked to provide a user name and password. Most people use the same usernames and passwords on the many different websites that they visit, which is just asking for trouble. If they only knew how vulnerable those passwords really were. Trust me on this, I know.

I used to maintain a PHP-based message board. It was subscription-based, meaning users had to provide a username and password to login. The passwords were supposedly stored in a secure SQL database, but it wasn't terribly difficult to hack open. In fact, I did it quite by accident. One of my users had complained that they had forgotten their password, the "Forget your password?" links weren't working for them, and they really didn't want to create a 2nd account -- was there anyway I could look up their old password?

It took about 25 minutes to figure out where the passwords were stored, how they were encrypted, and what his current password was. He was very thankfuly, while I suddenly realized that I now had everyone's password -- over 500 members of my community message board. And you could just tell that these were accounts and passwords that were reused on their other subscriptions, like online banks (there were a ton of 4-digit, all-numeric passwords), social networking websites (Facebook, Myspace, etc), other community message boards, etc.

Of course, I'm far too scrupulous to have done anything with that account / password info. In fact, I ended up submitting a bug report to the platform developer, telling them how I had cracked their password database, and suggesting a fix. But it really opened my eyes to how vulnerable all these passwords are that we willfully enter into websites. It made me think of all the online subscriptions I maintain:
  1. Gmail.com
  2. Ebay.com
  3. Amazon.com
  4. Myspace.com
  5. Facebook.com
  6. Salesforce.com (for work)
  7. Salesforce.com (for my NH User Group)
  8. Salesforce.com (Developer Account #1)
  9. Salesforce.com (Developer Account #2)
  10. Salesforce.com (Developer Account #3)
  11. PayPal account
  12. Corporate browser based email login
  13. Corporate web-based documentation control system
  14. Corporate web-based software bug tracking system
  15. Gaming Accounts (EQ, WoW, SWG, LotR, Tabula Rasa)
  16. Wikipedia accounts (dozens of 'em)
  17. Web-based community message boards (dozens of them), most PHP, just like the one I easily hacked open once upon a when
  18. Online News sites I frequent (dozens of 'em)
  19. This blogger account

The list goes on and on and on, and it grows every single day. I spend a lot of time on the web, frequent a lot of new sites, and many are subscription based. They're free, but they still prompt you for a username and password.


Security pros tell you that it's just good practice to have a unique / different password for every system that you access, but who can remember hundres of unique passwords?


Roboform.


Download the application (www.roboform.com) and install it. Roboform installs a new toolbar on your browser. As you visit websites, and are prompted for username and password, Roboform interrupts and asks if this should be a site that Roboform must remember. If you click yes, it records the website information, the user name entered, and the password entered. From that point on, you can visit the website and automatically login into it ... at the click of a mouse!


You can even create multiple aliases. That's very handy for the schizophrenic (or perhaps for couples / family members who share the same computer, but maintain their own accounts to different websites).


The "free" version of the application will remember up to 10 sites/accounts/passwords and two different aliases, but you can upgrade to the full "Roboform Pro" version for $29.95 and get unlimited in both categories.

Roboform can also auto-generate highly secure passwords (random alpha-numeric strings) so you can be assured that every password you enter on every site is unique, difficult to crack, and not similar to any of your other passwords.


There are a ton of other features (form filler) and security reasons (phishing security, keylogger prevention) to use this tool. Best of all, there is no spyware, no adware. Ultimately, I just like it for it's ease of use and simplicity. I bought both Roboform Pro and Roboform2Go.


Roboform2Go runs on your USB device, which is very handy for me, since I log in to a lot of different computers at different locations. No matter where I am, no matter what system I'm using, I can securely log on to my favorite websites -- without having to recall their long, goofy URLs, or what my unique user account and password is to that specific site.


Roboform -- it's the Force Monkey's Top Pick of cool tools.

Wednesday, July 23, 2008

It's not what you know ... it's who you know!


Meet Kate Mines. Kate is a Salesforce.com customer, and an actress living in Burbank CA. We "met" on the SFDC Community Message Board. More recently, we've started to exchange emails.

Yeah, she's a hottie -- and she's very smart. Reading through all the entries in her blog (and I read ALL of them), I can tell that she's not just smart -- she's geeky smart. She totes her laptop and digital camera around wherever she goes, Skypes with friends while shooting a film in Jordan (as in the Middle East country), trolls the internet to find cool sites like Packing List Online ... and somehow found a way to create a Force.com developer account. In other words, she's part of the geeky MySpace generation (like me) and wants to take full advantage of this Wacky Web 2.0 World -- without even knowing what Web 2.0 is. And that's pretty damn cool.

As smart as she is, Kate clearly knows the old adage "It's not what you know, it's who you know" is more true in Hollywood than anywhere else. So she wants an application that helps her keep track of all the people she's come to know. Not just who she knows, but how she knows them, who they are, what they do, where they met, how often they've been together on the same set / audition / workshop, etc.

I trolled around her personal website (www.katemines.com), and that led me to other internet services that people in the acting world use -- like IMDb.com and ActorsAccess.com.

Both seem like powerful tools. They are social networking tools for the acting world, but neither of them allow Kate to do what she really wants to do. In her words,

Somtimes I'll work with a director at a theatre, but I want to link them to their agent, and then a casting event I met them at. When I look at one of my contacts, I want to see all the places we've met. It needs to be cross searchable, so if I can only remember the conference name, location or date, or whatever, I can search by all of these, you know?


Classic social networking application, right? But even while there are many social networking tools out there (LinkedIn, MySpace, FaceBook, etc.), all designed to bring social contacts together, none of them do what Kate needs.

I guess that kinda surprised me. How is it that the acting world doesn't have an application like LinkedIn? Actors need to track their social connections, just like business people do. They need to track the degrees of social separation within their contact network, and find ways to get connected to those who can further their career. But more than just tracking 1st, 2nd, and 3rd degree connections (ala LinkedIn), people like Kate want to track their connection history. How often have I met this person? Show me all the dates and events that we were at together. What role was this person performing at each event (starring role, supporting role, director role, etc), and what role was I performing at that same event?

It's a fascinating application, and I'm really looking forward to working on this project.

Monday, July 21, 2008

Cool Webinar from Force.com – Move Beyond S-Controls


Force.com’s Sheridan Gaenger recently shared an introductory presentation on Visualforce with me. The webinar was presented by Ron Hess, Andrew Waite and Jon Mountjoy, all Force.com staff members of the Platform Team.

In the presentation, Andrew Waite demonstrates some of the remarkable features of Visualforce by comparing an existing AppExchange application (written by Ron Hess) using S-controls to the same application (re-written by Andrew Waite) in Visualforce. The Visualforce solution was more elegant -- written with far fewer lines of code and developed in hours (compared to Ron's S-control application which took several days to write). The Visualforce application was easier to understand, easier to maintain, and had many other advantages over the application written with S-controls (browser compatibility, application run-time, etc.).

In addition to Andrew’s “S-Control vs. Visualforce” application demo, Jon Mountjoy did a great “Visualforce 101” demo. Jon showed how to write the classic “Hello world” application using Visualforce. He went on to modify the standard look-and-feel of a page layout, and introduced some of the 65 standard Visualforce components which can be used in your own application development.

It’s a great introduction to Visualforce, and is definately worth reviewing -- even if you've never coded your own S-control. The session was recorded, and the Force.com Platform Team has posted the entire presentation, including sample code and some of the FAQs that developers have asked after viewing it. You can find all this on the Apex Developer Forums.

NOTE: I believe the presentation is currently available for public viewing. If that should change –- such that the presentation is restricted to registered Apex Dev Net developers -- you can easily create your own developer Account. Refer to Step 3 in my July 13th blog for a walk-through on doing that.

To view the Visualforce Webinar presentation, click here: http://wiki.apexdevnet.com/index.php/Visualforce_Webinar_Summer08. Additional information and code samples can be found at http://wiki.apexdevnet.com/index.php/Visualforce.

Sunday, July 13, 2008

Where Do I Learn How To Use Salesforce.com?

One of my clients contacted me this past week and asked a simple question – where do I learn to do what you do?

“When I call you, we log in together to my Salesforce.com account, and then you talk me through the process of setting up some custom fields, custom objects, moving things around on page or whatever. These are all things I feel I should probably know after using Salesforce for over a year. Where do you learn to do all the things you do?”

First, in the interest of full disclosure, it’s appropriate to share that my educational background is Computer Science, and my 20-year work experience has been in the fields of database architecture, software application development and customer support. My learning might have been at a slightly faster pace because of that background. However, I don’t think you need a software engineering degree to become proficient in Force.com. That’s the beauty of the Salesforce.com platform, and cloud-computing in general: anyone can come up to speed on it – very, very quickly.

Here are my tips for mastering the Force. These are in no particular order, but the sequence is roughly how I came to know the platform, and I think it’s a pretty good path:


  1. Dedicate Time for Training: Dedicate a couple hours per week to learning about the Force.com platform. Schedule it as your Monday morning or Friday afternoon ritual. If you have absolutely no time to budget for Force.com training during the work week, make some time after hours at home. Reserve these hours on your calendar, put a reminder on your Blackberry, do whatever it takes – but make sure it is quality, non-interrupted time.


  2. Browse the Force.com Online Help: Start by just browsing the online help. Login to your instance of Force.com, and then click on the “Help & Training” link near the top-center area of your browser content window.


    Click on the “Help” tab, and you’ll find a ton of useful resources for all different types of users and administrators. You can select / print the “Printable User Guide”, or just walk through all the various help topics in the left side-bar.


    Be sure to check out the “Tips & Users Guides” link, too. You’re sure to find a lot of information here that will eat up those “training hours” that you scheduled for yourself in step 1.


  3. Get a Developer Account: Did you know that you can get a Force.com developer account for free? A developer account has 2 user licenses, and limited data storage capacity, but it’s perfectly suited for testing your new Force.com skills. In your Developer account, you can try out changes before you implement them in your corporate environment. Before creating a developer account, be sure you have a personal email account (other than your work email account). If you don’t have one, they’re easy to create – just browse over to www.gmail.com and click on the Sign-up for Gmail link.

    Once you have a gmail account, use that email alias to create a developer account. Go to the Apex Developer Network at developer.salesforce.com and click the "Join Now" button.


  4. Download the Book: Download a PDF version of “Creating On-Demand Applications: An Introduction to the Apex Platform”. This manual is the first of a two-book series that was handed out at Dreamforce 2007. It walks the reader through the process of creating a “Recruiting” application. During this process, you'll create custom objects, tabs, custom fields, custom formula fields, validation rules, page layouts, and more. All the skills that a Force.com administrator should know are covered in this book, step-by-step.


  5. Browse the AppExchange: If you haven’t yet been to the AppExchange, now is the time to check it out. AppExchange is a library of applications built for Force.com. You can demo the applications, view screenshots of them, read user reviews, view online presentations / demos, etc. Some of the applications cost money, but many of them are free. Use the search engine to search on a few topics that might be of interest to you, or just browse through the categories until you find something that suits your fancy. Download an application to either your Developer account, or to your corporate account (if you have sufficient admin priviliges) -- don't worry, they're easy to remove, if you find that you don't like it. Or, you can use your budding talents to customize the application, so that it does work for your implementation of Salesforce.com.


  6. Browse Successforce: Check out Successforce at success.salesforce.com. In particular, check out the Guides tab. I really wish I’d known about this resource when I started the roll-out of my first Salesforce.com implementation. There are tons of downloads available on this site, including process maps, implementation guides, and free training presentations.


  7. Official Training from Salesforce.com: Consider attending a Salesforce.com “Administrator Essentials” training class. This 4-day training class is held periodically throughout the year, in major cities all around North America. It’s $3,000 for the course, and covers all the topics outlined in the “Creating On-Demand Applications” manual above. I confess that I didn’t take this route myself, because I’ve never favored these type of training events. I learn better from a book and online content than I do from classroom lecture – especially a lecture that lasts 6-8 hours for 4-5 consecutive days – ugh! But I know there are others who learn better in a classroom enviroment, so it's worth mentioning.


  8. Join a Salesforce.com User Group: There are dozens of Salesforce.com User Groups around the globe. These user groups schedule meetings throughout the year, and discuss all things related to our favorite SAAS platform, Salesforce.com. You’re sure to pick up tips, tricks and best practices, as implemented by other professionals working with the Force. It’s a great way to network and collaborate with other administrators, developers and/or power users. To find the Salesforce.com User Group nearest you, check out http://usergroups.salesforce.com/ If you can't find a user group near you, consider starting your own!


  9. Take it to the Next Level: By now, you should be fairly proficient as a Salesforce.com Administrator and/or Power User. If that was your goal, you can stop here. If you want to kick it up a notch, and get even more from your implementation of Salesforce.com, it’s time to cross over from Administrator to Developer. Your journey starts here: http://wiki.apexdevnet.com/index.php/Getting_Started


Like all things in life, the more you practice it, the more proficient you will become. Follow these steps to get started with the Force. They'll start you on the path. How far you go, how adept you become, is up to you.

Of course, if you don't have time for all this -- then hire a Force Monkey to assist you!

Friday, July 11, 2008

What did we ever do without GoToMeeting?



If you're an administrator of Salesforce.com -- or even if you aren't -- GoToMeeting is one of the "must have" tools for the office. In this article I'll talk a little bit about the application, and why I've come to depend on it.

WHAT IS GOTOMEETING?
If you don't know about GoToMeeting, it's built by Citrix Online, which has become the fourth largest Software-as-a-Service (SAAS) provider in the world. Their product is a web conferencing tool, similar to WebEx (by Cisco) and LiveMeeting (by Microsoft) -- but in my experience cheaper, and easier to use.

GoToMeeting allows conference call organizer(s) to share their desktop screen with all of the remote conference call participants, as long as they all have access to an internet connection. This is web collaboration software, which is getting a lot more market buzz in our slowing economy.

Ok, so why is GoToMeeting such a cool thing for Salesforce.com Administrators? Think about Salesforce.com, or more specifically, giving a training topic on a new application that you've rolled out for Salesforce.com. You could take dozens of screenshots of the various page layouts in your application, and then weave those screenshots into a PowerPoint presentation. You could then send that PowerPoint presentation to all of the far-flung members of your Sales Team and walk through it page by page at the next team conference call.

Or -- you could use GoToMeeting and give a demo of the application live. Every member of the GoToMeeting web conference can see the application, as you click through the various user screens. If they have questions about the application, you can deviate from your "training script", and demonstrate the answer to their question within the app, right on their screen. They can be 3 floors above you in the same office building, or on the other side of the world. As long as they have an internet screen, your screen is their screen.

The GoToMeeting organizer can share all of their screen, or only certain applications. I'll often share my browser (which has Salesforce.com running in it) but keep my notes / talking points hidden from the other users. I can see the notes on my own screen, but other users only see my browser screen.

In addition, the meeting organizer controls who has access to the keyboard and mouse. So you could give a training presentation on a particular topic, for instance, and then turn control over to one of the meeting participants. Have the participant walk through the exercise themselves, while you monitor them. It's a good way to see what information was "retained", and what areas you may need to focus additional talking points on in your next training session.

One of the most valuable aspects of GoToMeeting is that you can record your session in a Windows Media Player format. Store these recorded sessions on a file server, and you can gradually build a library of training sessions. Meeting participants (or individuals who couldn't attend the conference call because of a meeting conflict) can review the recorded sessions at their leisure.

I'm fortunate to be part of a company that has several Corporate GoToMeeting accounts. The Corporate GoToMeeting Account allows me to host GoToMeeting sessions for up to 25 users, or GoToWebinar sessions for up to 1000 users. Standard GoToMeeting accounts top out at 15 remote users per session.

Whether it's a corporate or standard GoToMeeting account, you pay a recurring $50 monthly fee, or a 20% discounted annual fee. That fee allows you to setup unlimited GoToMeeting sessions. If you want to try it out, the first month is free (and you can probably find promo codes for extended trials on the web, or from your local advertising media).

One warning -- use your own phone conferencing system for the audio portion. GoToMeeting does provide a audio conference service, but the audio quality is terrible. I'm not sure what call conference platform they're using, but it stinks!GoToMeeting must recognize this, because they provide a very easy way for users to override their conference call service, and use their own.

WANT TO KNOW MORE?
You can get more information from www.gotomeeting.com.


You can watch a product demo (I love demo's!), check out pricing, etc.

GoToMeeting is a really slick tool, and I highly recommend it to all my Customers.

Tuesday, July 8, 2008

New Blog Title, New URL

I decided to change the Blog title from "SFDC Monkey" to "Force Monkey", and naturally that meant changing the URL from "http://sfdcmonkey.blogspot.com/" to "http://forcemonkey.blogspot.com/".

Hope I didn't lose much readership audience in the change! =)

Why the switch? Well, it looks like the re-branding of Salesforce.com is slowly underway. Back in September, when I attended DreamForce 2007, Marc Benioff announced in his keynote the new branding of their SAAS platform. The new brand name would be ... Force.com.

In that keynote, Marc was showing how he was trying to lead his company from being associated as a sales force automation platform into something bigger. While SFA was the products roots, it's become much more than that. It's a more complete solution than just SFA, particularly now with VisualForce and tools that allow you to do just about anything within the Force.com API.

I wondered how long it would take to rebrand the company from Salesforce.com. While at the DreamForce 2007 show, in fact, while in the keynote address, I set my browser to www.force.com -- to see where it would take me. The URL is reserved, but today it redirects you to http://www.salesforce.com/platform.

But all around there are hints that the rebranding is underway. For one thing, when you look at the Salesforce.com logo, the "force.com" portion is highlighted, while the "sales" is starting to fade away into the background.

Last week, I noticed that the "AppExchange" logo, which used to appear in the top-right corner as you were logged in, has been replaced with a new "Force.com" logo.



So the SFDC Monkey is rebranding, too. Let's go write some apps!

Monday, July 7, 2008

Communicating with Users via Google Sites

If there is one recommendation I can pass on to fellow Salesforce.com (SFDC) administrators and CRM Project Managers, it’s this: Maintain Constant Lines of Communication with your User Base.

As a CRM platform, we are constantly adding new functionality to our implementation of SFDC. Our implementation started when we migrated from PropWeb Help Desk software to Salesforce.com, for our Customer Support organization. A few months later, we implemented an inventory tracking system, so our Manufacturing department could track all hardware assets and Return Material Authorizations. Next we integrated Sales Force Automation and Miller-Heiman Opportunity tracking for our Sales Team. We’ve added software bug tracking, hardware ECO management, sales order tracking, field technician deployment tracking, professional services / project management, vacation tracking, etc.

On top of all the customized changes we’ve made to the platform these past 18 months, Salesforce.com has rolled out 6 new releases of their platform, each with new features (rich text formatting for solution articles, tagging, inline editing, customer portals) that we’ve opted to enable. Of course, once you enable a new feature, it behooves you to provide some training to your users on how to get the most use of it.

Recently, a SFDC New Hampshire User Group member indicated that they were thinking about “a SFDC tips/tricks/best practices update newsletter going out quarterly”, and wanted to know I did something for my organization, and if so, what the template was.

I suggested they avoid using a newsletter to reach out to their users. Creating a newsletter, particularly as infrequent as once per quarter, is a daunting challenge. First, you have to research what articles are the most relevant and timely, then you have to write them. Next, your newsletter has to be scrubbed by your editorial team (or at least reviewed and proof-read), and finally it has to be published. What a chore this project would become … and besides, newsletters are so 20th century!

My recommendation? Google Sites. Back in April, SFDC announced some integration they were doing with Google Talk, Google Docs, and Google Email. I wanted to find out more about the integration, so spent some time exploring the Google Apps home page. I somehow landed on the “Google Sites” home page, and started playing around with the tool.

Within a few hours, I had created a prototype of the Salesforce Projects Home Page (click image to enlarge). I created a custom tab which links to the Google site, giving my SFDC users quick access to the “CRM Projects” home page.

Our CRM project home page is updated frequently (several times a week, at the very least) as a communication medium to our users. It describes new features that we have rolled out this month, and what projects my team is currently working on. NOTE: My team is myself and one other developer, who manage the CRM-related projects for 150 enterprise-license users. Google sites is extremely easy to administer, update and maintain. The WYSIWYG editor allows you to add rich-format text (bold, italics, colored font), links to other URLs – you can even include pictures, which is so critical when describing changes to a graphical user interface like SFDC. Google sites are secure; you can control who in your company can view and/or update the pages.

The real advantage of this method, over a published newsletter, is that the information is available “on-demand”. When a user wants to see what’s new in Salesforce, they can check out the “What’s New in SFDC” tab. We don’t have to spend a lot of time writing up newsletter articles for a weekly, monthly or quarterly publication. Instead, we share the workload of keeping the user base informed of our current projects by updating this site with fresh updates and information.

Each month, the content is archived, so users can go back any number of months to see what changed last month, the month before, etc. (Click image at left to enlarge).


Oh, here’s another time-saver tip to fellow admins. These archives come in very handy for year-end performance reviews. With a few clicks of the mouse, I can put 12-18 pages worth of “stuff my team did during the past 12 months to deserve an AMAZING performance review (and appropriate merit increase)” right into my self-evaluation / performance review.

Monday, June 23, 2008

Encrypted Custom Fields

Do you currently use Salesforce.com to track data that is of a highly sensitive and confidential matter? To some extent, all of the data that we entrust into Salesforce.com servers is highly sensitive – but in particular, what information about your Customers are you tracking in Salesforce.com. Social security numbers? Credit card numbers? Could one of your users casually run a report that collects all this information, export it to Excel, and then print or otherwise allow that data to fall into the wrong hands?

If you have data in Salesforce.com that would cause damage or great embarrassment to your organization (or your personal reputation, as the custodian of this data) if it fell into wrong hands, then read on!

Here’s a little trick from the Winter’08 Release that I completely missed the first time around: Encrypted Fields. According to Katherine Owens at Salesforce.com, “Encrypted Custom Fields are a new field type that enables customers to store sensitive data in encrypted form and apply a display mask when the data is displayed (e.g., Social Security Number: XXX-XX-1234). Encrypted custom fields allow customers with regulatory requirements around Personally Identifiable Data or Credit Card data to store that data inside salesforce.com, rather than having to maintain a separate data store in-house, allowing them to take full advantage of the benefits of on-demand.”

To date, I’ve been tracking some sensitive data in Salesforce.com (VPN and system access IP information, including login names and user passwords). For security, I’ve locked access to these fields down with custom profiles – but I’ve still been very leery of storing this data in a text format, especially when I open up my instance to Salesforce.com Customer Support for resolution of open cases. So I decided to give Encrypted Fields a test.


Turning Encrypted Fields On
You can’t use Encrypted Fields unless you first get it enabled by Salesforce.com. To do this, you need to open a Case with Salesforce. While logged in to Salesforce, click “Help & Training” and then select the “My Cases” tab. Click on the “Log a Case” link.

It can take upwards of a week to get this feature enabled (I put my request in on a Wednesday, and it was enabled the following Sunday).


Adding Custom Encrypted Fields
Once enabled, you will see a new data type option when creating new Custom Fields:



On subsequent screens, when defining the custom field, you can specify a mask for the field. User profiles who have the “View Encrypted Data” configuration enabled will be able to view the field normally. Users who do not have the “View Encrypted Data” profile will see the mask. For instance, if you created a “Credit Card” custom field with the mask type set to “Last Four Characters Clear”, a user without appropriate permissions to view encrypted data would see a credit card number as XXXX-XXXX-XXXX-1234. They would see the credit card number in this format when viewing the data in reports, on page layout views, etc.

NOTE: User profiles that have the “Modify All Data” permission will not be able to see the value of encrypted data fields. Only user profiles with “View Encrypted Data” setting enabled can see the content of these fields in their non-encrypted form.


You still need to administer your profile settings, and ensure that the right users have access to the encrypted data. However, now you can set it up so that all users can see the field, and only a select few users can see the data in a non-encrypted format.

This is particularly helpful if you have a group of users who will be entering the field information in routinely – but once the data is entered, you don’t want them to be able to view the data. These Users can see if the field is empty or filled with some value, and if a mask type is selected, they can see the last few digits (such as when confirming credit card information during a follow-up call).


Nitty Gritty
There are some limitations with the encrypted data field. The field length is restricted to 175 characters in size, and it cannot be type cast as Unique or External ID. An encrypted field cannot be configured with a default value.

You can’t use encrypted fields in filters (such as list view filters or report filters). In other words, a user can’t create a report or list view showing all credit cards ending in 1234 – even if the configured mask type for that field normally allows them to see the last 4 digits in the encrypted field. You can display the encrypted field in the list view or report results (i.e., it can be a column in your report, it just can’t be used as a filter setting for that report).

Similarly, you can’t use the encrypted fields in SOQL “where/order” clauses, formula fields, workflow rules, workflow field updates, approval process entry criteria, and approval step criteria.

If you clone a record that has encrypted custom fields, Salesforce will copy the data from the field ONLY if the user has the “view encrypted data” permission.

If you use encrypted fields in an email template, the results will always be displayed with the selected mask settings (XXXX-XXXX-XXXX-1234), even if the user creating the template has the “view encrypted data” priv.

If you manipulate the data with APEX code, the value is always unmasked, regardless of the permissions of the user who triggered the apex code.

When the data is displayed in a Visualforce page or a custom s-control, the value will be displayed based on the users “view encrypted data” profile settings.

The View Encrypted Data field is disabled for all user profiles – even the Administrator profile. I found this one to be the most annoying, but I understand the reason for it. If you are an administrator, and need access to this data, you’ll need to clone the Standard Administrator profile and give that cloned profile the ability to see encrypted data.

You can’t convert your existing custom fields to encrypted fields. Instead, you’ll need to create your new custom encrypted fields (blank), and then use a tool like the Apex Data Loader to export all existing data, and then import it into the encrypted field. Once you’ve done that, you can go and delete the old non-encrypted fields.

Want more information? Search the Salesforce.com Help & Training section, searching for “Encrypted Custom Fields” for more details.