Pages

Friday, June 1, 2012

Using Change Sets

A question came to me this morning from someone who had certain components built out in a a sandbox and needed them to be replicated in production. The components in this scenarios were page layouts; something easy enough to rebuild manually, but if you have dozens of fields, either of these methods would be faster.

  1. Eclipse
  2. Change Sets

They both require a few additional steps, but both prevent you from having to reproduce your work. Since we are dealing with page layouts, the first thing you need to make sure of is that all the fields referenced in the page layout exist within your production instance. You'll definitely receive error messages upon trying to deploy a layout to an object that is missing fields.

Using Change Sets

The Change Sets method will be easier for non-developers that don't know their way around Eclipse. This method will allow you to build Outbound Change Sets bu adding and removing components, and then uploading them to any allowed Deployment Connection. Let's start there by allowing establishing a Deployment Connection between your sandbox and your production instance which will allow you to upload Outbound Change Sets to Production for deployement.
  1. First, within your production instance, click on your name at the top of the page, and then click on "Setup" On the left-hand side, under "App Setup," expand "Deploy" and click on "Deployment Connections"
  2. Find the name of your sandbox and click on the "Edit" link next to it
  3. Check off the box that says "Allow Inbound Changes" and then click on the "Save" button.
The next thing to do is to create an Outbound Change Set within your sandbox. For this scenario, the change set will include a page layout that I want to deploy within my production instance as well as a new field that I added to the object within the sandbox. One change set, two components, one deployment. Nice!
  1. Within your sandbox, click on your name at the top of the page again and then click on the "Setup" link
  2. On the left-hand side, navigate to "App Setup" --> "Deploy" and then click on "Outbound Change Sets"
  3. Click on the "New" button to create a new Outbound Change Set
  4. Provide a "Name" and "Description" for your change set.
  5. Click on the "Save" button.
  6. Within the "Change Set Components" section, click on the "Add" button.
  7. First, let's add the new field. Change the "Component Type" dropdown to "Custom Field"
  8. Next, find and select any fields that you also need to deploy that are not currently found in production.
  9. Click on the "Add to Change Set" button at the top of the page. Here's a quick tip -- make sure that you use the "Add To Change Set" button after you select something. Changing the component letter, page, or "Component Type" will clear any previous selections.
  10. Now it is time to do the same for the page layout. Change the "Component Type" to "Page Layout, find and select your new layout, and then click on "Add To Change Set" again.
  11. Your change set should have two components in it now.
  12. To push your Outbound Change Set to the Production instance for deployment, click on the "Upload" button.
  13. Choose your Production instance and then click on "Upload"

Within a few minutes you should receive an email, letting you know that your Change Set was uploaded to the production instance. Keep in mind that you don't always have to push from a sandbox to production. You can go from sandbox to sandbox or even production to sandbox.
Once you do receive that email, it is time to deploy it.
  1. Within your sandbox, click on your name at the top of the page again and then click on the "Setup" link
  2. On the left-hand side, navigate to "App Setup" --> "Deploy" and then this time click on "Inbound Change Sets"
  3. Click on your change set. Here you will be able to see information about the change set, including its components, any details, and its deployment history. You also have two options; "Validate" and "Deploy."
  4. Clicking on "Validate" goes through all of the actions required to deploy the change set without actually deploying it. This is always a safer bet as you can learn which components will be new, overwritten, or deleted. Sometimes you learn things from a validation that you didn't expect and can save yourself from making mistakes.
  5. "Deploy" first validates and if all is well will deploy your change set. Keep in mind that if you've added new layouts, they won't be assigned to a recordtype yet, so you'll have to do that manually. If you added fields, permissions won't be set up on that field as they would be if you were to manually create the field. The same goes for picklists options and their recordtype preferences.

Thursday, May 31, 2012

Server Monitoring - Disk Space Batch File

Weeks ago we began down a road, experimenting with the idea that you could monitor servers with Salesforce.  I did mislead you; Salesforce isn't doing the monitoring, but will be responsible for creating notifications (through workflow) and give additional metrics for future systems reporting.

We've already created an object called "Alerts" to place information into (records that could cause sys admins night sweats and tremors).  That object has two fields, basically who (the node) triggered the alert and what (the conditions) the alert is for.

The next step is to create and schedule a batch. The batch below will take two parameters - the drive letter that you want to monitor and the low disk space threshold in MBs (i.e., "Disk_Space_Alert.bat C 20480" would monitor the C:\ and create an alert when the amount of disk space was 20480MBs/20GBs or less)
@ECHO OFF
setlocal

REM - This issues the DIR command on the disk letter provided, pipes it
REM - into FINDSTR, looks for the line where "free" is located, and places that
REM - line into a temp file
REM - Then it converts that line into tokens and assigns the number of free bytes
REM - to the FREE_BYTES variable
dir %1: 2>&1 | findstr free > temp

for /f "tokens=3,4*" %%f in ( temp ) do (
     set FREE_BYTES=%%f
)

REM - This removes commas and decimal points from FREE_BYTES

set FREE_BYTES=%FREE_BYTES:.=%
set FREE_BYTES=%FREE_BYTES:,=%

REM - The following line takes the number of free bytes and uses Powershell
REM - to calculate the number of MBs and assigned as a string variable
REM - This was done due to batch files numbers being limited to 32-bits of precision


FOR /F %%B IN ('powershell %FREE_BYTES%/1024/1024') DO (
    SET FREE_M_BYTES=%%B
)

REM - Next the decimals are removed and assigned to an integer variable

FOR /F "tokens=1* delims=,." %%B IN ("%FREE_M_BYTES%") DO (
    SET /A FREE_M_BYTES_INT = %%B
)

REM - Here we assign the threshold limit parameter to a variable

set /A LIMIT=%2

REM - Next, if the number of free MBs is less or equal to the limit
REM - a CSV is created. First the headers, then the alert fields
REM - After the file is created, process.bat is called to initiate the insert
REM - into Salesforce. Don't forget to install Data Loader, change your path
REM - and see my next post about the config file


IF %FREE_M_BYTES_INT% LEQ %LIMIT% (
    echo RESOURCE, DETAILS > alert.csv
    echo %COMPUTERNAME%, Low Space on %1 - %FREE_M_BYTES_INT% MB remaining >> alert.csv
    C:Program Files (x86)salesforce.comData Loaderbinprocess.bat ../conf Disk_Space_Alert
)

So in a nutshell:
  1. Create the batch file
  2. Schedule the batch file
  3. When scheduling, you'll need to specify the disk letter and the MB limit (i.e., "Disk_Space_Alert.bat C 20480")
  4. The program will launch, check the amount of disk space on the specified drive
  5. The batch will then convert bytes to MBs and compare it to the limit specified
  6. If the limit is met or exceeded, a CSV is created and formatted with information about the issue
  7. Finally, the batch calls another batch file that initiates a Data Loader insert
In the next post, I'll discuss using the SF Data Loader from the command line and how my config file is set up.

Where'd He Go?

Hope you aren't feeling too neglected with my blogging absence!  I've been going through various life changes and preparing for the road ahead. 

Since my last post, I've peacefully and respectfully parted ways with my previous employer and excited to announce that I will be providing Salesforce administration and development consulting services as I further develop my own company on the force.com platform.

If you're interested in hiring, bouncing ideas off of, having a cup of coffee with, hitting the gym with, or any other activity in general where you want to discuss Salesforce projects with me, feel free to shoot me an e-mail at kirk@salesforcery.com.

There should be plenty of updates in the future weeks.  Summer '12 is out now with some great features and I'm already one post into a series on server monitoring (talk about a cliff-hanger).  Thanks to all the visitors that I've picked up on this blog over the past year; it's only going to get better!

...and seriously, it doesn't cost anything to email me, so here's that link again:  kirk@salesforcery.com.

-Kirk


Thursday, April 19, 2012

Server Monitoring - Alerts Object

The first thing that I'm going do is create the object in which my alerts are going to live in Salesforce.  For this example, I'm going to create a dedicated custom object for this.  You may want to use Chatter or even incorporate it into your existing structure; perhaps you have some sort of IT inventory (who doesn't?) objects that you can connect to.

The basics of what we need are:
  • The resource - what device is having an issue
  • The alert - details about the issue the resource is having (low disk space for our usage)
This is how I'm configuring the object on the "New Custom Object" page:


I've checked off both "Allow Reports" and "Allow Activities."  Ideally, when the alerts are configuring and being dumped into Salesforce, I will be building workflow to send off some e-mails.  Then I'll begin building a few reports for any notifications over the course of time - scheduled weekly emails of low system resources sounds kind of cool.  Imagine that patterns you could observe over the course of a few months.  I've also enabled notes and attachments as I imagine this could be used for future issue identification and resolution as well.  Feel free to create a tab for this if you'd like.

Once the object is created, I've got my shell of an object with the basic fields:
  • Alert Name - auto number
  • Created By
  • Last Modified By
  • Owner
Now I'm going to add my two custom fields mentioned above and listed below:
  • Resource
  • Details

I've required that the "Resource" field be populated at the field level.  Don't forget to set the correct permissions for these fields based on profiles on the following screen.

Not a lot of rocket science in this post, but at least now we've got our object for which we'll insert our alert records into.  The next posts will be a little more exciting and cover creating and scheduling a batch file for performing a disk space checks and creating a Windows Perfmon alert.













Friday, March 23, 2012

Server Monitoring - Project Description

It's a very Salesforce Friday; the weather is nice, my fingers are flying, and most importantly my code is saving without errors!

I'm hoping the description got your attention on this one and you wondering how in the world Salesforce is going to monitor your servers.  Well, I've fed your assumptions a half-truth.  At this point, Salesforce isn't going to be doing the monitoring (yet?); it will be simply providing to you notifications.

I know, I know - you've got high-end systems in place doing all the server monitoring you could ever dream of full of alerts, notifications, bells, whistles, and some Rita's Water Ice on top of that too (you know, in honor of it being Spring).  Don't overlook the point of this series; it isn't to just create a custom object that will trigger some workflow.  It's about being able to tie together three or four different pieces of software to build an entire system that leverages the flexibility of Salesforce (and because all roads will inevitably lead to Salesforce).  Not just a system, but something that can easily be expanded an built upon.

Here's what I'm thinking:

Monitor a server
Use Perfmon - Memory Usage
Use a command-line utility - Hard disk utilization

Create Alerts
What's wrong with who

Import Process
Get that info into Salesforce so we can use it
Where's the data going to live?

Dashboard/Workflow
What are you going to do with that data?

Stay tuned!  We're going to have some fun with Perfmon, batching, Data Loader, and some VF.

Thursday, March 15, 2012

One View to Rule Them All

Scenario:  I was working on customizing a project management app and needed a quick view named "My Projects" that would allow a user to see only the projects in which they were listed as the "Project Manager."

"Project Manager" was a custom User lookup field.  It seemed erroneous to instruct users to create their own views.  There had to be a way that I could create it once and it would provide the correct results for each user.

When you are on the "Create New View" screen, unlike when you are writing a workflow rule, you don't have the ability to create formula based criteria; only the "Filter By Additional Fields" field-operator-value drop downs are available.
IdeaExchange:  https://sites.secure.force.com/success/ideaView?id=08730000000K149AAC




Unfortunately, the Owner of a Project record won't necessarily be the Project Manager, so using the "My Projects" filter won't work (wouldn't it be nice if for any "My" option, a list of User lookup fields would appear that you could select from?)
IdeaExchange:  https://sites.secure.force.com/success/ideaView?id=08730000000grYFAAY


To create one view to rule them all, I ended up creating a formula field that would compare the current user's ID to the Project Manager field and return either 0 or 1.


IF($User.Id = Project_Manager__c, 1,0)


Now that you have your field, any record that you are looking at in which your User ID matches the ID found in the Project Manager field, the "PM is Me" formula field should read "1."


That being so, you can create your view with a single criterion:

That's that!



Monday, February 13, 2012

There's a Hole in My Bucket!

Ah, for many Salesforce users, Spring '12 was rolled out over the weekend. There are lots of new features that I've been chewing on in the pre-release sandbox and a few surprises.

One of the new features is the ability to create report "Buckets." Buckets let you create groups for a field's data without needing to create a formula field. I can't tell you how many formula fields I've created just to display the information I want to see on a report correctly. Of course - these bucket fields exist only on the report you're creating, so if you want to base workflow off of the field, it is off to the formula field editor for you.

Say you've got your list of clients, all equally important to you (of course), but you'd like to group them by the amount of assets they've brought to you. I'm not saying my Gold level clients are going to receive any special treatment over the Bronze level - I just want to know... really.

I'm going to classify my clients, using three tiers:
Gold: Anyone over 3,000,000
Silver: Between 1,000,000 and 3,000,000
Bronze: Below 1,000,000

1)  To create a new Bucket field, within a new/existing report, click on the "Add Bucket" link within the fields section.



2)  Next, double-check your "Source Column, give your Bucket field a name, and define your ranges:

3)  Click on the "OK" button and you'll see your newly created "Service Level" field within your report grid:


 
Unfortunately, like many initial rollouts of SF (I'm looking at you lookup field filters), it is lacking the ability to create and use filters.

What if I had a client that has been with me from day one.  Sounds like an instant Gold Service Level criterion to me.  It would be great to be able to include something like "Initial Contract Date < 1/1/2005" = Gold, else follow the ranged criteria.

For more information, check out this video, by my new favorite SF video narrator:  http://www.youtube.com/watch?v=QFYEtBtLHG4