<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-3011483083044505303</atom:id><lastBuildDate>Thu, 23 May 2013 13:01:13 +0000</lastBuildDate><category>email-to-case</category><category>apex</category><category>admin</category><category>Release</category><category>daysBetween</category><category>now</category><category>categorize</category><category>AppExchange</category><category>Security</category><category>service</category><category>day of the week</category><category>Sales</category><category>Apex REST</category><category>popup</category><category>Objective-C</category><category>email</category><category>formula</category><category>reRender</category><category>Error</category><category>Chatter</category><category>iOS</category><category>cron</category><category>Android</category><category>if</category><category>Cloud</category><category>classify</category><category>email to case</category><category>hack</category><category>Mobile</category><category>Social</category><category>SOQL</category><category>bucket</category><category>wrapper</category><category>CSS</category><category>round</category><category>attribute</category><category>Javascript</category><category>Loops</category><category>Visualforce</category><category>Dreamforce</category><category>Design</category><category>SaaSy</category><category>Workflow</category><category>email service</category><category>chart</category><category>API</category><category>SDK</category><category>case</category><category>Pattern</category><category>Describe</category><category>regex</category><category>Touch</category><category>report</category><category>Business Time</category><category>administration</category><category>Rating</category><category>matcher</category><title>CRM Science</title><description>Working with Apex and Visualforce to Make Salesforce.com Even Better!</description><link>http://blog.crmscience.com/</link><managingEditor>noreply@blogger.com (Ami Assayag)</managingEditor><generator>Blogger</generator><openSearch:totalResults>47</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/CrmScience" /><feedburner:info uri="crmscience" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:browserFriendly></feedburner:browserFriendly><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3011483083044505303.post-1215235026836571041</guid><pubDate>Wed, 22 May 2013 18:03:00 +0000</pubDate><atom:updated>2013-05-22T14:03:39.841-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">API</category><category domain="http://www.blogger.com/atom/ns#">AppExchange</category><category domain="http://www.blogger.com/atom/ns#">apex</category><category domain="http://www.blogger.com/atom/ns#">Design</category><category domain="http://www.blogger.com/atom/ns#">cron</category><category domain="http://www.blogger.com/atom/ns#">Apex REST</category><title>Syncing Salesforce Changes to an External System with Future/Schedule Architecture</title><description>Many integration projects involve syncing Salesforce data to external systems. For example, you may need to sync contacts and leads along with their related events and tasks to a home-grown portal, or sync financial information to an external accounting system, or sync sales data to a system that allows better mobile experience for certain verticals.&lt;br /&gt;
&lt;br /&gt;
The business logic for some of these projects is very complex, but the general design of the solution usually follow known patterns. However, certain requirements present several considerations that make writing the more common integration code a bit trickier. Here are a few such considerations:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Sync events get fired by triggers, but triggers can’t make callouts, so syncing code must run asynchronously (@future).&lt;/li&gt;
&lt;li&gt;Trigger execution order is not guaranteed, so it is possible that your sync trigger will be fired by a process that is already running asynchronously (which will create a runtime error).&lt;/li&gt;
&lt;li&gt;Depending on the activity and the number of objects that get synced, you can reach callout limits.&lt;/li&gt;
&lt;li&gt;Packaged sync applications often clash with other packages that also work asynchronously. Packaged apps also have wide variability of activity, so there is a good chance to hit callouts limits.&lt;/li&gt;
&lt;li&gt;Any runtime error results in a sync event that is not transmitted to the external system.&lt;/li&gt;
&lt;li&gt;Any delayed process needs to run soon after the triggering event occurred. Also, a record that is triggered again before its delayed processing occurs, should not be transmitted twice (unless needed by the external system).&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
To avoid some of these issues, or at least make it less likely for a transaction to be lost, I’ve come up with a design pattern that combines both almost-immediate (future) and delayed (scheduled) methods to communicate with external systems that need to be synced. The basic idea for this design pattern is to always try the immediate processing as the first option, but also allow for a scheduled job to be created if immediate processing is not possible at the time.&lt;br /&gt;
&lt;br /&gt;
Here’s how it’s done… Please note, that I omitted (added as a comment) any business logic that is not important for the design pattern.&lt;br /&gt;
&lt;br /&gt;
First of all, create two new objects to handle scheduled syncing:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;An object called Synchronize__c to hold Ids of records that need to be synced, as well as any additional information that is needed when processing jobs. For example you may want to save the type of trigger that fired the sync event (insert or update). This object will be queried by a scheduled process, and allow the scheduled processing to reuse the normally triggered sync code.&lt;/li&gt;
&lt;li&gt;An object called&amp;nbsp; CronJob__c to hold Cron Job Ids so we can keep track of what jobs were created and be able to remove them after they execute. This is necessary because querying the cron job object does not give you all the info you need to clean up old jobs.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-ZBpdOhOKZvI/UZmWgxfWyOI/AAAAAAAAAOI/mNxgeqrLXJU/s1600/FutureScheduleArch.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="138" src="http://1.bp.blogspot.com/-ZBpdOhOKZvI/UZmWgxfWyOI/AAAAAAAAAOI/mNxgeqrLXJU/s400/FutureScheduleArch.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Next, create a schedulable class called SynchronizeSched.cls that will be used to execute scheduled code. Keep it empty until the rest of the code is written: &lt;br /&gt;
&lt;script class="brush: java" type="syntaxhighlighter"&gt;
global class SynchronizeSched implements Schedulable{
    global void execute(SchedulableContext SC) {    }
}
]]&gt;
&lt;/script&gt;  &lt;br /&gt;
Next, create a class (Synchronize.cls) to handle all the business logic and special processing. The next four methods will be added to this class, starting with a static class called ProcessFutureCallout that receives a set of Ids. Since the execution is starting from a trigger, specify @future(callout = true) before the method declaration to allow the class to make a callout. This method is what you would normally write to sync records to an external system, and will include any business logic that needs to run before the callout, the actual callout, and the response handling. &lt;br /&gt;
&lt;script class="brush: java" type="syntaxhighlighter"&gt;
public with sharing class Synchronize {

    // this method makes the callouts and processes the response
    @future(callout = true)
    public static void ProcessFutureCallout(set&lt;id&gt; IdsToProcess) {       
        // using normal design patterns, do the following:
        // Prepare transaction...
        // authenticate if needed...
        // do callout...
        // process the response...
    }
}
]]&gt;
&lt;/script&gt;  &lt;br /&gt;
Now we can create a method called ScheduleCallout that can handle the delayed sync. This method will be called instead of ProcessFutureCallout when an asynchronous call cannot be made immediately. Within the method, we need to save the Ids of all the records that need to be synced, as well as any other important info, to the newly created object Synchronize__c. Then, create a cron job and save its Id to the new object CronJob__c. Note that in this example, the job is scheduled 1 to 2 minutes into the future. By adding two minutes to now, the scheduled job will run on the second to next whole minute. I think that this is the shortest time period that should be scheduled because if you add just one minute to now(), you run the risk that the code would execute around a whole minute and create a job that cannot be scheduled (You'll get the error "Based on configured schedule, the given trigger will never fire"). Of course, the delayed job can be scheduled for an hourly or daily sync. Not included in the sample, but a good addition, is a quick check that a scheduled job is not already created before creating a new one. &lt;br /&gt;
&lt;script class="brush: java" type="syntaxhighlighter"&gt;
    // Schedule a job for 1 to 2 minutes from now.
    public static void ScheduleCallout(set&lt;id&gt; IdsToProcess) {
        
        // save transaction to the database. May need to check db to make sure the Ids are not already scheduled
        list&lt;synchronize__c&gt; syncs = new list&lt;synchronize__c&gt;();
        for (id i : IdsToProcess)
            syncs.add(new Synchronize__c(IdToProcess__c = i, SomeOtherInfo__c = 'xyz'));
        if (!syncs.isEmpty())
            insert syncs;

        // build the expression for the scheduled time
        datetime dt = system.now().addMinutes(2);
        string ScheduledTime = '0 '         // add seconds
                    + dt.minute() + ' '     // add minutes (1 to 2 min from now)
                    + dt.hour() + ' '       // add day of month
                    + dt.day() + ' '        // add day of month
                    + dt.month() + ' '      // add month
                    + '? '                  // add day of week (not specified)
                    + dt.year() + ' ';      // add year
                    
        // set a name for the job
        string jobName = 'MyPackage_' + dt.year() + dt.dayOfYear() + dt.hour() + dt.minute() + dt.millisecond();

        // declare the schedulable class
        SynchronizeSched con = new SynchronizeSched();   
        
        //  Scheduling the job
        string cronJobId = system.schedule(jobName, ScheduledTime, con); 

        // save the cron job id so we can remove executed jobs later
        list&lt;cronjob__c&gt; syncs = new list&lt;cronjob__c&gt;();
            CronJob__c cron = new CronJob__c(CronJobId__c = cronJobId);
        insert cron;
    }
]]&gt;
&lt;/script&gt;  &lt;br /&gt;
Now create a method ProcessTrigger to be used as the entry point from the trigger. At the beginning of the method, add the normal logic that figures out if you need to process the changed record(s). Once you know which records need to be synced, you can figure out if it is possible to continue processing asynchronously. If it is not possible, you can schedule the changed records for later execution. This method can check for all kind of governor limits and react as needed. &lt;br /&gt;
&lt;script class="brush: java" type="syntaxhighlighter"&gt;
    // method that is called from the trigger to execute the business logic
    public static void ProcessTrigger(list&lt;someobject__c&gt; newRecs, list&lt;someobject__c&gt; oldRecs) {
    
        set&lt;id&gt; IdsToProcess = new set&lt;id&gt;();

        // Do business logic here....
        // business logic results in a set of Ids (IdsToProcess) that need to be further processed...
        
        // determine if it is possible to continue in async mode or if scheduling is required to continue 
        if (system.isFuture() || system.isBatch()) {
            // can't call a @future method because this execution is already future or batch
            // schedule the callout instead
            ScheduleCallout(IdsToProcess);

        } else {

            // determine how many future calls were made in the last 24 hours         
         Integer futuresCount;
         Integer futuresAllowed;
         // Logic to get number of future calls in last 24 hours and max future calls for org....

            if (futuresCount &gt; futuresAllowed) {
             // over future calls limit for the day so can't make a future call now 
             // schedule the callout instead
             ScheduleCallout(IdsToProcess);
            } else {
                // safe to call a @future method
                ProcessFutureCallout(IdsToProcess);
            }
        }
    }
]]&gt;
&lt;/script&gt;  We have to create one more method called ProcessScheduledCallout to handle the scheduled logic. The schedulable class will call this method to run the delayed sync. This method actually does not do much other than get info from the database, call ProcessFutureCallout, and then clean up the database. Since ProcessFutureCallout already has all the logic we need, there is no point rewriting that here. &lt;script class="brush: java" type="syntaxhighlighter"&gt;
    // this method is called by the scheduler
    public static void ProcessScheduledCallout() {
        
        set&lt;id&gt; IdsToProcess;
        set&lt;string&gt; cronJobIds;

        // get record ids that need to be synced from Synchronize__c....
        // add all ids to IdsToProcess.

        // execute the callout
        ProcessFutureCallout(IdsToProcess);
        
        // get executed cron jobs from CronJob__c.
        // add all ids to cronJobIds.

        // get rid of the scheduled job
        for (CronTrigger CronJobs : [select Id from CronTrigger WHERE Id in :cronJobId AND NextFireTime != null])
            System.abortjob(CronJobs.Id);

        // remove the processed records from Synchronize__c and CronJob__c
    }
]]&gt;
&lt;/script&gt;  &lt;br /&gt;
Lastly, update the schedulable class from the first step to call the ProcessScheduledCallout() method: &lt;br /&gt;
&lt;script class="brush: java" type="syntaxhighlighter"&gt;
global class SynchronizeSched implements Schedulable{
    global void execute(SchedulableContext SC) {
        Synchronize.ProcessScheduledCallout();
    }
}

]]&gt;
&lt;/script&gt;  </description><link>http://blog.crmscience.com/2013/05/syncing-salesforce-changes-to-external.html</link><author>noreply@blogger.com (Ami Assayag)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-ZBpdOhOKZvI/UZmWgxfWyOI/AAAAAAAAAOI/mNxgeqrLXJU/s72-c/FutureScheduleArch.png" height="72" width="72" /><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3011483083044505303.post-6648123219178144844</guid><pubDate>Mon, 20 May 2013 16:03:00 +0000</pubDate><atom:updated>2013-05-20T12:03:00.627-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">API</category><category domain="http://www.blogger.com/atom/ns#">apex</category><category domain="http://www.blogger.com/atom/ns#">Apex REST</category><title>Parsing JSON \/Date to Salesforce Datetime</title><description>If you're working on a lot of custom integrations, you are bound to 
eventually see dates and datetimes that are represented like this: 
"\/Date(1198908717056)\/". These dates show up in JSON as strings, and 
their numeric value represent milliseconds since January 1st 1970 UTC. I
 believe that this is a Microsoft standard mostly used by .net. &lt;br /&gt;
&lt;br /&gt;
Here's a quick and useful method that parses these ".net type" datetimes
 into salesforce datetimes. Simply parse out the numeric value using the
 parenthesis as guides, cast as long, and use the very useful datetime 
method newInstance() to calculate the actual date.&lt;br /&gt;
&lt;br /&gt;
&lt;script class="brush: java" type="syntaxhighlighter"&gt;

// method to convert ".net type" json datetime to sfdc datetime - '\/Date(1198908717056)\/'
public datetime getDateTimeValue(string str) {
    datetime ret = null;
    if (str != null)
        ret = datetime.newInstance(long.valueOf(str.substring(str.indexOf('(')+1, str.indexOf(')'))));
    return ret;
}
]]&gt;
&lt;/script&gt;
</description><link>http://blog.crmscience.com/2013/05/parsing-json-date-to-salesforce-datetime.html</link><author>noreply@blogger.com (Ami Assayag)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3011483083044505303.post-7361465823805660381</guid><pubDate>Tue, 14 May 2013 00:05:00 +0000</pubDate><atom:updated>2013-05-14T08:36:23.368-04:00</atom:updated><title>Reports:  Export Details VS Printable View</title><description>&lt;span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 15px; line-height: 20px;"&gt;Ever generate a report, click on the "Export Details' button only to find out that once opened in Excel, the report&amp;nbsp;&lt;/span&gt;&lt;span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 15px; line-height: 20px;"&gt;looks nothing like what you saw in your browser window. What's going on here?&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 15px; line-height: 20px;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 15px; line-height: 20px;"&gt;Here's a very simple Contact report grouped by Contact Owner. &amp;nbsp;You can see there is a distinct grouping by Owner (dark blue bar).&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 15px; line-height: 20px;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-U8u-zPVtXgI/UZF-VIDwVxI/AAAAAAAAAbU/q7ibAkYI3jQ/s1600/Selection_028.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/-U8u-zPVtXgI/UZF-VIDwVxI/AAAAAAAAAbU/q7ibAkYI3jQ/s320/Selection_028.png" width="291" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 15px; line-height: 20px;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 15px; line-height: 20px;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 15px; line-height: 20px;"&gt;However, when you click on "Export Details," this is what you get:&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 15px; line-height: 20px;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-WOnuHBXD6vs/UZF-uti_wMI/AAAAAAAAAbc/65DlTn2ff7c/s1600/Selection_029.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="185" src="http://4.bp.blogspot.com/-WOnuHBXD6vs/UZF-uti_wMI/AAAAAAAAAbc/65DlTn2ff7c/s320/Selection_029.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 15px; line-height: 20px;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 15px; line-height: 20px;" /&gt;
&lt;span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 15px; line-height: 20px;"&gt;The "Export Details" button does exactly that... it exports the details of the report; meaning every line that makes up your report will be rendered as a new line in your .xls or .csv. This is regardless of whether or not you have clicked on the "Show Details" or "Hide Details" button. Of course, you could rework the resulting spreadsheet and do the grouping yourself, but why would you do that?&lt;/span&gt;&lt;br /&gt;
&lt;br style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 15px; line-height: 20px;" /&gt;
&lt;span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 15px; line-height: 20px;"&gt;Rather than eagerly clicking on the "Export Details button," take the "Printable View" button for a test drive. It will render your report again as an .xls file, but retain the grouping as you see it on your report.&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 15px; line-height: 20px;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 15px; line-height: 20px;"&gt;Here's the same report, exported with the "Printable View" button:&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 15px; line-height: 20px;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-JuhE1aGQyaQ/UZF_Bksn3tI/AAAAAAAAAbk/vOkYtXk31jo/s1600/Selection_030.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="279" src="http://1.bp.blogspot.com/-JuhE1aGQyaQ/UZF_Bksn3tI/AAAAAAAAAbk/vOkYtXk31jo/s320/Selection_030.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 15px; line-height: 20px;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;br style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 15px; line-height: 20px;" /&gt;
&lt;span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 15px; line-height: 20px;"&gt;If you want to see the details, click on the "Show Details" button prior to clicking on the "Printable View" button. This will show each line item as well as the summarized headers. If you don't want details, make sure that you've clicked on the "Hide Details" button.&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 15px; line-height: 20px;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 15px; line-height: 20px;"&gt;Note that&amp;nbsp;&lt;/span&gt;&lt;span style="color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif;"&gt;&lt;span style="font-size: 15px; line-height: 20px;"&gt;when you choose "Export Details," you are prompted to chose an export file encoding format (ISO, Unicode, etc) and export file format (.csv or .xls). &amp;nbsp;If using the "Printable View" option, you will always get a .xls file. &amp;nbsp;Within your spreadsheet editor, you can always choose to save with another file extension and encoding format.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 15px; line-height: 20px;" /&gt;
&lt;span style="background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 15px; line-height: 20px;"&gt;In case you were wondering, this also works for Matrix reports!&lt;/span&gt;</description><link>http://blog.crmscience.com/2013/05/reports-export-details-vs-printable-view.html</link><author>noreply@blogger.com (Kirk Steffke)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-U8u-zPVtXgI/UZF-VIDwVxI/AAAAAAAAAbU/q7ibAkYI3jQ/s72-c/Selection_028.png" height="72" width="72" /><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3011483083044505303.post-4293115436491200719</guid><pubDate>Wed, 08 May 2013 13:23:00 +0000</pubDate><atom:updated>2013-05-14T09:22:58.595-04:00</atom:updated><title>Download Our Chrome Extension:  Admin Assistant</title><description>&lt;br /&gt;
&lt;div class="separator" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em; text-align: center;"&gt;
&lt;a href="https://chrome.google.com/webstore/detail/crm-science-admin-assista/planmenddmekajogfkcfaijafiaobiei?hl=en" target="_blank"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-o5AwQdXn37w/UYj7FK2s4SI/AAAAAAAAAaw/cBC7OdU7I9U/s1600/App_Exchange_280x205.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Our &lt;a href="https://chrome.google.com/webstore/detail/crm-science-admin-assista/planmenddmekajogfkcfaijafiaobiei?hl=en" target="_blank"&gt;Admin Assistant&lt;/a&gt; extension provides Salesforce.com administrators (and developers!) with additional time-saving tools and settings shortcuts to facilitate the day to day functions and responsibilities they may be faced with.&lt;br /&gt;
&lt;br /&gt;
If you attended the PhillyForce meetup during Philly Tech Week, you may have seen my session on my Salesforce Chrome Extensions. &amp;nbsp;If you didn't, check out the recorded demo of that session at the bottom of this post.&lt;br /&gt;
&lt;br /&gt;
As Salesforce.com user, have you ever had the feeling that "there should be an easier way" or have stared at a long list of check boxes and thought, "I have to do this for every one of these?" &amp;nbsp;These are the reasons I created the&amp;nbsp;&lt;a href="https://chrome.google.com/webstore/detail/crm-science-admin-assista/planmenddmekajogfkcfaijafiaobiei?hl=en" target="_blank"&gt;Admin Assistant&lt;/a&gt;&amp;nbsp;extension.&lt;br /&gt;
&lt;br /&gt;
Here's a subset of the features included in &lt;a href="https://chrome.google.com/webstore/detail/crm-science-admin-assista/planmenddmekajogfkcfaijafiaobiei?hl=en" target="_blank"&gt;Admin Assistant v1.0&lt;/a&gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Mass Delete: &lt;/b&gt;&amp;nbsp;On List Views, you often have a series of records with checkboxes next to them. &amp;nbsp;Natively, there is no "Delete" option that will wipe out the selected records with one click. &amp;nbsp;This feature will delete any of the selected records.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Maybe you're testing a new piece of Apex code or building out a new workflow that generates a lot of junk records. &amp;nbsp;How many times have you wanted to delete a few of these records and been in this situation?&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/--Pd2Z3gq4uM/UVwy5mqW5NI/AAAAAAAAAZU/1xky7n170-M/s1600/Selection_062.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="188" src="http://1.bp.blogspot.com/--Pd2Z3gq4uM/UVwy5mqW5NI/AAAAAAAAAZU/1xky7n170-M/s400/Selection_062.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both;"&gt;
&lt;br /&gt;&lt;/div&gt;
Deleting each of the four Contact records above would require you to click on the "Del" link on each row, confirm that you want to delete the record, rinse, and then repeat multiple times. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Show Max Results:&lt;/b&gt; &amp;nbsp;Show Max - on pages that list schema components like workflow rules, actions, and email templates, there is often a "Show More" link. &amp;nbsp;This feature displays a maximum number of the possible results on one page with one click.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-2AA3gXTa_ag/UYj9QA4EdcI/AAAAAAAAAbE/H1yeYRB9FNo/s1600/Selection_021.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-2AA3gXTa_ag/UYj9QA4EdcI/AAAAAAAAAbE/H1yeYRB9FNo/s1600/Selection_021.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Chatter Chat:&lt;/b&gt; &amp;nbsp;If Chatter is enabled in your org, a floating "Chat Window" appears in the bottom right hand corner of your screen. &amp;nbsp;This can be turned on or off.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-VjyFUF8oRCA/UYj8_4Lq-NI/AAAAAAAAAa8/qZkM5ujw7M4/s1600/Selection_020.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-VjyFUF8oRCA/UYj8_4Lq-NI/AAAAAAAAAa8/qZkM5ujw7M4/s1600/Selection_020.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Various Profile Settings: &lt;/b&gt;&amp;nbsp;At the field level, check or uncheck all of the "Visible" or "Read-Only" boxes. &amp;nbsp;At the Object level, check or uncheck all of the CRUD/View All/Modify All boxes. &amp;nbsp;For Tabs, quickly display or hide all Salesforce tabs.&lt;br /&gt;
&lt;br /&gt;
Screenshots:&lt;br /&gt;
&lt;img height="250" src="https://lh6.googleusercontent.com/4qog4X-cthFTkatUth7RC82YAUokUx0t0h4bazQRFHvfUI3uUKKKh7az8RsgiBuJ_yUFH0QO=s640-h400-e365-rw" width="400" /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;img height="250" src="https://lh3.googleusercontent.com/FGC26Hy3IYap9itWIz6srypuBQhLbkNIoXfkwHnvxXX-fLHGs4tB8Vd4S5D3I-2QzYTrGPoQqw=s640-h400-e365-rw" width="400" /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;img height="250" src="https://lh6.googleusercontent.com/qSGjxyTO3z9CsxipWktKkEAxvxVcHYjTnKMHhgQmm5xCqkND6wi3UaFd3_8BHGtQYYJHay5Ouz4=s640-h400-e365-rw" width="400" /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;img height="250" src="https://lh4.googleusercontent.com/nUJ0YA3Ba_0w_8UyLMIZEvbjaTGZWmIW92Aw7vu-2TWGh_Y5ChvycO6sBSV4uexSQRHPLTb9jA=s640-h400-e365-rw" width="400" /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Here's the demonstration from our&amp;nbsp;&lt;a href="http://www.youtube.com/playlist?list=PLJ-a0n_wxrlrB15B1hwVz3gpkTjYVE27M" target="_blank"&gt;Philly Tech Week '13 PhillyForce Meetup&lt;/a&gt;:&lt;br /&gt;
&lt;iframe allowfullscreen="" frameborder="0" height="315" src="http://www.youtube.com/embed/83n0exVxI7s?list=PLJ-a0n_wxrlrB15B1hwVz3gpkTjYVE27M#t=40m45" width="560"&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Download it here: &lt;br /&gt;
&lt;a href="https://chrome.google.com/webstore/detail/crm-science-admin-assista/planmenddmekajogfkcfaijafiaobiei?hl=en" target="_blank"&gt;Admin Assistant in the Chrome Web Store&lt;/a&gt;&lt;br /&gt;
&lt;a href="https://appexchange.salesforce.com/listingDetail?listingId=a0N3000000B3JQOEA3" target="_blank"&gt;Admin Assistant on the AppExchange&lt;/a&gt;</description><link>http://blog.crmscience.com/2013/05/adminassistant.html</link><author>noreply@blogger.com (Kirk Steffke)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-o5AwQdXn37w/UYj7FK2s4SI/AAAAAAAAAaw/cBC7OdU7I9U/s72-c/App_Exchange_280x205.png" height="72" width="72" /><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3011483083044505303.post-3917974645495165119</guid><pubDate>Tue, 09 Apr 2013 14:48:00 +0000</pubDate><atom:updated>2013-04-26T09:19:04.088-04:00</atom:updated><title>Download Our Chrome Extension: Code and Query Keeper</title><description>&lt;a href="https://chrome.google.com/webstore/detail/mhkebppabmgknkobbnhmfochanfgnlfc" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="203" src="http://1.bp.blogspot.com/-9Zu42Vv8cSQ/UWI_FUjcwSI/AAAAAAAAAaA/_qlnUL_LjCI/s320/Promo_440x280._CQK.png" style="cursor: move;" width="320" /&gt;&lt;/a&gt;We're very excited to announce the release of our Chrome browser extension, the &lt;a href="https://chrome.google.com/webstore/detail/crm-science-code-query-ke/mhkebppabmgknkobbnhmfochanfgnlfc" target="_blank"&gt;Code and Query Keeper&lt;/a&gt;! &lt;br /&gt;
&lt;br /&gt;
If you're like me, you've copied and pasted snippets of code and various SOQL queries into just about everything for future reference. &amp;nbsp;Notepad, Notepad++, gedit, Evernote, Google Keep... the list goes on.&lt;br /&gt;
&lt;br /&gt;
This happens all the time when writing new code, whether it's something you commonly do (specific coding patterns), frequently do (testing various scenarios), or rarely do and just need a quick reference. &lt;br /&gt;
&lt;br /&gt;
While using Salesforce.com's Workbench (&lt;a href="https://workbench.developerforce.com/"&gt;https://workbench.developerforce.com&lt;/a&gt;), The &lt;a href="https://chrome.google.com/webstore/detail/crm-science-code-query-ke/mhkebppabmgknkobbnhmfochanfgnlfc" target="_blank"&gt;CRM Science Code and Query Keeper&lt;/a&gt; will allow you to capture the code you have written in the Apex Execute block or the SOQL query you have in the query box. &amp;nbsp;You can give your script or query a name, save it, and later insert or append it into the box on the page.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-IDTC_g6tQK4/UWI7m-RhFmI/AAAAAAAAAZk/ZkEZuw2DmfY/s1600/Screenshot_SOQL.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="250" src="http://3.bp.blogspot.com/-IDTC_g6tQK4/UWI7m-RhFmI/AAAAAAAAAZk/ZkEZuw2DmfY/s400/Screenshot_SOQL.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-tXzPc0kZsZA/UWI7oguR1gI/AAAAAAAAAZs/dm57g9oiI4c/s1600/Screenshot_Script.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="250" src="http://3.bp.blogspot.com/-tXzPc0kZsZA/UWI7oguR1gI/AAAAAAAAAZs/dm57g9oiI4c/s400/Screenshot_Script.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Within the extension, you can also freely view, edit, and clone your snippets.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-AK6006tDb_k/UWI7x9QpglI/AAAAAAAAAZ0/to7MPgdEtPs/s1600/Screenshot_Edit.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="250" src="http://1.bp.blogspot.com/-AK6006tDb_k/UWI7x9QpglI/AAAAAAAAAZ0/to7MPgdEtPs/s400/Screenshot_Edit.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Here's the demonstration from our &lt;a href="http://www.youtube.com/playlist?list=PLJ-a0n_wxrlrB15B1hwVz3gpkTjYVE27M" target="_blank"&gt;Philly Tech Week '13 PhillyForce Meetup&lt;/a&gt;:&lt;br /&gt;
&lt;iframe allowfullscreen="" frameborder="0" height="315" src="http://www.youtube.com/embed/83n0exVxI7s?list=PLJ-a0n_wxrlrB15B1hwVz3gpkTjYVE27M#t=40m45" width="560"&gt;&lt;/iframe&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Download it here: &amp;nbsp;&lt;a href="https://chrome.google.com/webstore/detail/crm-science-code-query-ke/mhkebppabmgknkobbnhmfochanfgnlfc" target="_blank"&gt;Code and Query Keeper in the Chrome Web Store&lt;/a&gt;</description><link>http://blog.crmscience.com/2013/04/download-our-chrome-extension-code-and.html</link><author>noreply@blogger.com (Kirk Steffke)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-9Zu42Vv8cSQ/UWI_FUjcwSI/AAAAAAAAAaA/_qlnUL_LjCI/s72-c/Promo_440x280._CQK.png" height="72" width="72" /><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3011483083044505303.post-5576436633327207446</guid><pubDate>Mon, 11 Mar 2013 14:50:00 +0000</pubDate><atom:updated>2013-05-19T12:03:32.707-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Error</category><category domain="http://www.blogger.com/atom/ns#">SOQL</category><category domain="http://www.blogger.com/atom/ns#">apex</category><category domain="http://www.blogger.com/atom/ns#">Loops</category><title>How Many Lines of Code Does It Take To Create a Set of Ids?</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-gKVjkYeHaLg/UTqw-DrwM_I/AAAAAAAAANc/Nqef3R1cYIU/s1600/HowToAvoidLoops.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-gKVjkYeHaLg/UTqw-DrwM_I/AAAAAAAAANc/Nqef3R1cYIU/s1600/HowToAvoidLoops.png" /&gt;&lt;/a&gt;&lt;/div&gt;
I was recently cleaning up a piece of hideous code (feel free to replace with an expletive - it was that bad) that we took over from a different consultancy. The original object infrastructure involved many custom objects with several of them being relationship objects (i.e. many to many). Even after I fixed occurrences of SOQL and DML inside loops, eliminated unnecessary looping, and other generally bad design patterns, the bigger requests were hitting the 200001 executed statements limit error. I had to dig deeper and eliminate more loops.
&lt;br /&gt;
&lt;br /&gt;
Since this class was dealing with so many relationship tables, there were several places were the code was constructing lists of ids based on a lookup field values. For example. Let's say that you have the Id of a record in obj__c, but what you really need is a Set&lt;id&gt; of all the lookup values in the field LookupToDiffObj__c on the obj__c object. Normally you would use a couple of soql queries and some looping to get it done, resulting in a few hundred lines of executed code. What if you had to do that several times for several objects for thousands of records at a time?
&lt;br /&gt;&lt;br /&gt;
That's what I needed to solve, and after putting some thought into it I came up with the following handy pattern that achieves all that in one line of executable code (that counts as 2 SOQL queries).
&lt;br /&gt;
&lt;br /&gt;
&lt;script class="brush: java" type="syntaxhighlighter"&gt;
&lt;![CDATA[
Map&lt;Id, DiffObj__c&gt; diffObjMap = 
        new Map&lt;Id,DiffObj__c&gt;(
                [SELECT Id, OtherFieldsIfNeeded__c
                 FROM DiffObj__c
                 WHERE Id IN (SELECT LookupToDiffObj__c
                              FROM Obj__c
                              WHERE Id IN :recIds
                              AND SomeOtherField__c = :someValue)]);
//
// now use diffObjMap.keySet() with other 
// SOQL statements or elsewhere
//
// as an added benefit, you can use 
// diffObjMap.values() to operate on the records if needed
//

]]&gt;

&lt;/script&gt;
&lt;br /&gt;</description><link>http://blog.crmscience.com/2013/03/how-many-lines-of-code-does-it-take-to.html</link><author>noreply@blogger.com (Ami Assayag)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-gKVjkYeHaLg/UTqw-DrwM_I/AAAAAAAAANc/Nqef3R1cYIU/s72-c/HowToAvoidLoops.png" height="72" width="72" /><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3011483083044505303.post-6787694803879179143</guid><pubDate>Mon, 18 Feb 2013 14:24:00 +0000</pubDate><atom:updated>2013-02-18T09:24:00.034-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">SOQL</category><category domain="http://www.blogger.com/atom/ns#">bucket</category><category domain="http://www.blogger.com/atom/ns#">apex</category><category domain="http://www.blogger.com/atom/ns#">Visualforce</category><category domain="http://www.blogger.com/atom/ns#">chart</category><category domain="http://www.blogger.com/atom/ns#">report</category><title>Fun With SOQL: Cubed Results</title><description>GROUP BY CUBE is an awesome feature of SOQL that nobody talks about. It 
is a very handy tool when you need to create complex visualforce reports
 because you can get aggregate results for different grouping of values 
in a single SOQL call. &lt;br /&gt;
&lt;br /&gt;
Let's say that you want to create a graphical summary of the Opportunity
 object, and need to get the count and total of the Opportunity amounts 
of every combination of Stage, Type, and Lead Source. Well, you're in 
luck, because with Just one "cubed" SOQL call you can get enough data to
 fill a visualforce page with interesting charts:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;script class="brush: java" type="syntaxhighlighter"&gt;

&lt;![CDATA[
List&lt;aggregateresult&gt; CubedSummary;
CubedSummary = [SELECT Type, StageName, LeadSource,
                       GROUPING(Type) grpType, GROUPING(StageName) grpStage, GROUPING(LeadSource) grpSource,
                       count(Id) cnt, sum(Amount) amtSum
                 FROM Opportunity
                 GROUP BY CUBE (Type, StageName, LeadSource)
                 ORDER BY GROUPING(Type), GROUPING(StageName), GROUPING(LeadSource), Type, StageName];
]]&gt;

&lt;/script&gt;



&lt;br /&gt;
The above statement returns:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;The count and subtotal for every combination of Stage, Type, and Lead Source (That's as many rows as the number of Stage picklist values times the number of Type picklist values times the number of Lead Source picklist values).&lt;/li&gt;
&lt;li&gt;The count and subtotal for each two field combination where the values of the third field does not come into consideration (all two field combinations).&lt;/li&gt;
&lt;li&gt;The count and subtotal for each field value regardless of the value in the other two fields (for each of the three fields).&lt;/li&gt;
&lt;li&gt;The count and total for all the values.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
Here is how this works:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;The GROUP BY CUBE section determines which field values get aggregated. &lt;/li&gt;
&lt;li&gt;The GROUPING() in the SELECT section provides a way for you to evaluate what subtotal each row corresponds to - a zero in that function means that the row is grouped by the specified field, and a one means that it doesn't (seems counter intuitive, but that's how it works). See example of that below.&lt;/li&gt;
&lt;li&gt;The aggregate results in the SELECT provide the data. A nice addition here could be using Account for one of the grouped results and use COUNT_DISTINCT(Account) to get count of unique accounts as opposed to unique opportunities.&lt;/li&gt;
&lt;li&gt;The ORDER BY section is very important because it helps you process the data. By sorting the GROUPING() functions first, the results come up in a predictable order that you can take advantage of in an Apex loop.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
Here is an example of how you can harvest the cubed results:
&lt;br /&gt;
&lt;script class="brush: java" type="syntaxhighlighter"&gt;

&lt;![CDATA[

for (AggregateResult ar: CubedSummary) {
    if (integer.valueof(ar.get('grpType')) == 1 &amp;&amp;
        integer.valueof(ar.get('grpStage')) == 1 &amp;&amp;
        integer.valueof(ar.get('grpSource')) == 0) {
        // these are the rows that are grouped by source only (subtotals for unique source values)
        // ... add values to a chart class ...

    } else if (integer.valueof(ar.get('grpType')) == 0 &amp;&amp;
        integer.valueof(ar.get('grpStage')) == 0 &amp;&amp;
        integer.valueof(ar.get('grpSource')) == 1) {
        // these are the rows that are grouped by type and stage but ignore source
        // ... add values to another chart class ...
    }
    // do more if elses
}
]]&gt;

&lt;/script&gt;
&lt;br /&gt;
You can find GROUP BY CUBE in the documentation &lt;a href="http://www.salesforce.com/us/developer/docs/api/Content/sforce_api_calls_soql_select_groupby_cube.htm" target="_blank"&gt;here&lt;/a&gt;.</description><link>http://blog.crmscience.com/2013/02/fun-with-soql-cubed-results.html</link><author>noreply@blogger.com (Ami Assayag)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3011483083044505303.post-1320604570680688751</guid><pubDate>Mon, 11 Feb 2013 15:16:00 +0000</pubDate><atom:updated>2013-02-22T11:31:26.310-05:00</atom:updated><title>Change Sets 101</title><description>Say you're a new Salesforce Admin and you need to make changes to your org. &amp;nbsp;You're already following best practices by making changes to your sandbox and not production (right?) and everything is working the way it should. &amp;nbsp;Now it's time to push those changes to production, but how?&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Change Sets&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;
&lt;/b&gt; The process is simple enough:&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Create an Outbound Change Set&lt;/li&gt;
&lt;li&gt;Add Components to that Change Set&lt;/li&gt;
&lt;li&gt;Upload the Change Set to another sandbox (you can do that) or production&lt;/li&gt;
&lt;li&gt;Validate and Deploy the Inbound Change Set in the org the Change Set was uploaded to&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
&lt;br /&gt;
Before any of that can be done, you need to establish a Deployment Connection between your sandbox and your production instance which will allow you to upload Outbound Change Sets to Production for deployment. &lt;br /&gt;
&lt;br /&gt;
NOTE: &amp;nbsp;You can establish Deployment Connections between two sandboxes as well for those times you need to push changes from one sandbox to another. &amp;nbsp;The rest of this post assumes you're pushing from a sandbox org to a production org.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;u&gt;Create Deployment Connection&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;First, within your production instance, click on your name at the top of the page, and then click on "Setup"&lt;br /&gt;
On the left-hand side, under "App Setup," expand "Deploy" and click on "Deployment Connections"&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-28se8KPtY3s/T8jsunC118I/AAAAAAAAAj8/He9SJABvMU8/s1600/Deploy_Deployment_Connections_1.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="113" src="http://2.bp.blogspot.com/-28se8KPtY3s/T8jsunC118I/AAAAAAAAAj8/He9SJABvMU8/s400/Deploy_Deployment_Connections_1.JPG" width="215" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Find the name of your sandbox and click on the "Edit" link next to it&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-JiZ-sDMeNEU/T8js6skOAfI/AAAAAAAAAkI/UMJ_Grlti7A/s1600/Deploy_Deployment_Connections_2.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="21" src="http://3.bp.blogspot.com/-JiZ-sDMeNEU/T8js6skOAfI/AAAAAAAAAkI/UMJ_Grlti7A/s400/Deploy_Deployment_Connections_2.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Check off the box that says "Allow Inbound Changes" and then click on the "Save" button&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://1.bp.blogspot.com/-XrodCwdV9fQ/T8jtQNmWcAI/AAAAAAAAAkU/WcOddMQ8rJ8/s1600/Deploy_Deployment_Connections_3.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"&gt;&lt;img border="0" height="142" src="http://1.bp.blogspot.com/-XrodCwdV9fQ/T8jtQNmWcAI/AAAAAAAAAkU/WcOddMQ8rJ8/s400/Deploy_Deployment_Connections_3.JPG" width="400" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;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!&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
&lt;b&gt;&lt;u&gt;Create Outbound Change Set&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Within your sandbox, click on your name at the top of the page again and then click on the "Setup" link&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;On the left-hand side, navigate to "App Setup" --&amp;gt; "Deploy" and then click on "Outbound Change Sets"&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-iCTWJG7dFFQ/T8jufTfbSnI/AAAAAAAAAkg/my7ON1VVUTk/s1600/Outbound_1.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="115" src="http://3.bp.blogspot.com/-iCTWJG7dFFQ/T8jufTfbSnI/AAAAAAAAAkg/my7ON1VVUTk/s400/Outbound_1.JPG" width="208" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Click on the "New" button to create a new Outbound Change Set&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-LoHJDHIRURc/T8jutJLDrfI/AAAAAAAAAks/rVFu0AKeL04/s1600/Outbound_2.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="62" src="http://2.bp.blogspot.com/-LoHJDHIRURc/T8jutJLDrfI/AAAAAAAAAks/rVFu0AKeL04/s400/Outbound_2.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Provide a "Name" and "Description" for your change set.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-enNoHbdSYrc/T8jwMHZaHuI/AAAAAAAAAk4/DVUISeCU1xk/s1600/Outbound_3.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="242" src="http://1.bp.blogspot.com/-enNoHbdSYrc/T8jwMHZaHuI/AAAAAAAAAk4/DVUISeCU1xk/s400/Outbound_3.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Click on the "Save" button. &lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Within the "Change Set Components" section, click on the "Add" button.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-wTSEsQyRyYQ/T8jwza4fyzI/AAAAAAAAAlE/dS218dJb1Rc/s1600/Components_1.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="105" src="http://3.bp.blogspot.com/-wTSEsQyRyYQ/T8jwza4fyzI/AAAAAAAAAlE/dS218dJb1Rc/s400/Components_1.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;First, let's add the new field.  Change the "Component Type" dropdown to "Custom Field"&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://1.bp.blogspot.com/-yLLPPqFuDXM/T8jxSaeBrzI/AAAAAAAAAlQ/WTOxbtyB5Pw/s1600/Components_2.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"&gt;&lt;img border="0" height="142" src="http://1.bp.blogspot.com/-yLLPPqFuDXM/T8jxSaeBrzI/AAAAAAAAAlQ/WTOxbtyB5Pw/s400/Components_2.JPG" width="400" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Next, find and select any fields that you also need to deploy that are not currently found in production.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-dN-OUvgvAjs/T8jxu8dKhxI/AAAAAAAAAlc/QAaiG4puPVk/s1600/Components_3.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="18" src="http://4.bp.blogspot.com/-dN-OUvgvAjs/T8jxu8dKhxI/AAAAAAAAAlc/QAaiG4puPVk/s400/Components_3.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;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.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-hRsuNq03sxg/T8jyNy83E_I/AAAAAAAAAlo/aBSvJGBC-XE/s1600/Components_4.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="40" src="http://1.bp.blogspot.com/-hRsuNq03sxg/T8jyNy83E_I/AAAAAAAAAlo/aBSvJGBC-XE/s400/Components_4.JPG" width="195" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;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. &lt;br /&gt;
&lt;/li&gt;
&lt;/ol&gt;
Your change set should have two components in it now.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-3x7k8E2bm04/T8jywXnOU9I/AAAAAAAAAl0/HODFHOQ8AcQ/s1600/Change_Set_1.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="67" src="http://2.bp.blogspot.com/-3x7k8E2bm04/T8jywXnOU9I/AAAAAAAAAl0/HODFHOQ8AcQ/s400/Change_Set_1.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;b style="text-align: left;"&gt;&lt;u&gt;&lt;br /&gt;
&lt;/u&gt;&lt;/b&gt;&lt;/div&gt;
&lt;u&gt;&lt;b&gt;Upload a Change Set&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
1. &amp;nbsp;To push your Outbound Change Set to the Production instance for deployment, click on the "Upload" button.&lt;/div&gt;
&lt;div class="separator" style="clear: both;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both;"&gt;
&lt;a href="http://2.bp.blogspot.com/-qf2UxaCWH8Y/T8jzEzbo32I/AAAAAAAAAmA/TTsv0ky1TXU/s1600/Change_Set_2.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"&gt;&lt;img border="0" height="50" src="http://2.bp.blogspot.com/-qf2UxaCWH8Y/T8jzEzbo32I/AAAAAAAAAmA/TTsv0ky1TXU/s400/Change_Set_2.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both;"&gt;
&lt;span style="text-align: center;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both;"&gt;
&lt;span style="text-align: center;"&gt;2. &amp;nbsp;Choose your Production instance and then click on "Upload"&lt;/span&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both;"&gt;
&lt;a href="http://1.bp.blogspot.com/-5XGxzh3Lvw0/T8jzVGR-AZI/AAAAAAAAAmM/G0D7rASq9R8/s1600/Change_Set_3.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"&gt;&lt;img border="0" height="82" src="http://1.bp.blogspot.com/-5XGxzh3Lvw0/T8jzVGR-AZI/AAAAAAAAAmM/G0D7rASq9R8/s400/Change_Set_3.JPG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both;"&gt;
3. &amp;nbsp;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.&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;&lt;u&gt;Validation and Deployment&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Once you do receive that email, it is time to deploy it.&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Within the org you've uploaded your Change Set to, click on your name at the top of the page again and then click on the "Setup" link &lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;On the left-hand side, navigate to "App Setup" --&amp;gt; "Deploy" and then this time click on "Inbound Change Sets"&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-HNqRvET-FmU/T8jz8hc7ieI/AAAAAAAAAmY/giPzNXRhtJ0/s1600/Inbound_1.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="119" src="http://4.bp.blogspot.com/-HNqRvET-FmU/T8jz8hc7ieI/AAAAAAAAAmY/giPzNXRhtJ0/s400/Inbound_1.JPG" width="197" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;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."&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-zHUczf4vYfA/T8j0nsvhIHI/AAAAAAAAAmk/Jq4RkJZ2snU/s1600/Inbound_2.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="38" src="http://2.bp.blogspot.com/-zHUczf4vYfA/T8j0nsvhIHI/AAAAAAAAAmk/Jq4RkJZ2snU/s400/Inbound_2.JPG" width="198" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;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.&amp;nbsp; &lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;"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 Record Type 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 Record Type preferences. &lt;/li&gt;
&lt;/ol&gt;
</description><link>http://blog.crmscience.com/2013/02/change-sets-101.html</link><author>noreply@blogger.com (Kirk Steffke)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-28se8KPtY3s/T8jsunC118I/AAAAAAAAAj8/He9SJABvMU8/s72-c/Deploy_Deployment_Connections_1.JPG" height="72" width="72" /><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3011483083044505303.post-2738860315007893017</guid><pubDate>Wed, 06 Feb 2013 14:28:00 +0000</pubDate><atom:updated>2013-02-06T09:28:02.826-05:00</atom:updated><title>EmailMessage Status Values</title><description>I was working with the &lt;a href="http://www.salesforce.com/us/developer/docs/api/Content/sforce_api_objects_emailmessage.htm"&gt;EmailMessage Object&lt;/a&gt; last night and ran into a question I've spent time answering before.  I was writing a SOQL query string to return EmailMessage records based on their Status.&lt;br /&gt;
&lt;br /&gt;
This didn't work:&lt;br /&gt;
&lt;script class="brush: java" type="syntaxhighlighter"&gt;
&lt;![CDATA[
list&lt;EmailMessage&gt; tmpList = [SELECT Id, Status FROM EmailMessage WHERE Status = 'New'];
]]&gt;
&lt;/script&gt;&lt;br /&gt;
I knew the data type for the Status field was a picklist/string, so I looked at the results of this:&lt;br /&gt;
&lt;script class="brush: java" type="syntaxhighlighter"&gt;
&lt;![CDATA[
SELECT Id, Status FROM EmailMessage LIMIT 100;
]]&gt;
&lt;/script&gt;&lt;br /&gt;
The results yielded numbers 0 through 4:&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-wS6vgSiScGU/URJjfivPEGI/AAAAAAAAASw/sEPy6Fphjm0/s1600/Selection_081.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="244" width="320" src="http://2.bp.blogspot.com/-wS6vgSiScGU/URJjfivPEGI/AAAAAAAAASw/sEPy6Fphjm0/s320/Selection_081.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Here are the values and the Statuses they represent:&lt;br /&gt;
'0' = New&lt;br /&gt;
'1' = Read&lt;br /&gt;
'2' = Replied&lt;br /&gt;
'3' = Sent&lt;br /&gt;
'4' = Forwarded&lt;br /&gt;
&lt;br /&gt;
The Spring '13 Release notes describe the ability to enable "Email Drafts and Approvals" (Page 63 of the PDF).  Later, on page 189, there is a code sample that creates an outbound Draft; note the Status value of '5'.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-5tQlxMNCOH0/URJoHXp9PBI/AAAAAAAAATM/wTe0AoFDyU8/s1600/Selection_082.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="160" width="294" src="http://3.bp.blogspot.com/-5tQlxMNCOH0/URJoHXp9PBI/AAAAAAAAATM/wTe0AoFDyU8/s320/Selection_082.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
</description><link>http://blog.crmscience.com/2013/02/emailmessage-status-values.html</link><author>noreply@blogger.com (Kirk Steffke)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-wS6vgSiScGU/URJjfivPEGI/AAAAAAAAASw/sEPy6Fphjm0/s72-c/Selection_081.png" height="72" width="72" /><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3011483083044505303.post-4167226113435011041</guid><pubDate>Mon, 04 Feb 2013 13:42:00 +0000</pubDate><atom:updated>2013-02-04T08:42:30.159-05:00</atom:updated><title>Potential Org Issues With Future Releases</title><description>With Spring '13 currently deployed to Sandbox orgs and soon to Developer and Production orgs, there are &lt;a href="http://www.salesforce.com/customer-resources/releases/" target="_blank"&gt;tons of new features&lt;/a&gt; to utilize within your future projects. &amp;nbsp;I was recently excited about a new &lt;a href="http://www.salesforce.com/us/developer/docs/apexcode/index_Left.htm#StartTopic=Content/apex_class_system_cases.htm?SearchType=Stem" target="_blank"&gt;Cases Class&lt;/a&gt;&amp;nbsp;called ".getCaseIdFromEmailThreadId." &lt;br /&gt;
&lt;br /&gt;
Remember that "Ref" tag formula from &lt;a href="http://blog.crmscience.com/2012/12/formula-ref-tag-for-email-to-case.html" target="_blank"&gt;this post&lt;/a&gt;? &amp;nbsp;You know, the unique ID that is attached to emails when using the Email-to-Case functionality? &amp;nbsp;I was working on another project in which an email web service was required and I needed to take the "ref" tag and identify the Case ID of the associated Case.&lt;br /&gt;
&lt;br /&gt;
Then I read the &lt;a href="https://na1.salesforce.com/help/doc/en/salesforce_spring13_release_notes.pdf" target="_blank"&gt;Spring '13 Release Notes&lt;/a&gt;&amp;nbsp;and was delighted to find the Cases.getCaseIdFromEmailThreadID method. &amp;nbsp;I wrote a quick code block to test it out:&lt;br /&gt;
&lt;script class="brush: java" type="syntaxhighlighter"&gt;
&lt;![CDATA[
ID theCaseID = Cases.getCaseIdFromEmailThreadID('yourThreadID');
]]&gt;
&lt;/script&gt;&lt;br /&gt;
Unfortunately, I received this dreaded message.&lt;br /&gt;
&lt;span style="background-color: white; font-family: Arial, Helvetica, Verdana, sans-serif; font-size: 12px; line-height: 20px;"&gt;&lt;span style="color: red;"&gt;Error: Compile Error: Method does not exist or incorrect signature: Cases.getCaseIdFromEmailThreadId(String)&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
I opened a Case with Salesforce in hopes of a quick remedy to save me from coding it myself. &amp;nbsp;The answer to my problem was that this org already had a custom "Cases" class. &amp;nbsp;This custom class was being referenced as opposed to the new Salesforce provided feature.&lt;br /&gt;
&lt;br /&gt;
The moral of the story is, Salesforce introduced this new feature into my org in which their class conflicted with my class and I only discovered the issue when I tried using the new method. &amp;nbsp;Lots of developers may use a common class naming convention in which the class name mirrors the Objects in which they work with. &amp;nbsp;Lots of developers may try to use future new Salesforce Classes/Methods only to be stopped in their tracks while scratching their heads. &amp;nbsp;Hopefully, this&amp;nbsp;possible&amp;nbsp;conflict is the first thing they think of.</description><link>http://blog.crmscience.com/2013/02/potential-org-issues-with-future.html</link><author>noreply@blogger.com (Kirk Steffke)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3011483083044505303.post-7838731270298380017</guid><pubDate>Wed, 09 Jan 2013 15:30:00 +0000</pubDate><atom:updated>2013-01-09T10:30:02.725-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Mobile</category><category domain="http://www.blogger.com/atom/ns#">Objective-C</category><category domain="http://www.blogger.com/atom/ns#">apex</category><category domain="http://www.blogger.com/atom/ns#">Android</category><category domain="http://www.blogger.com/atom/ns#">iOS</category><category domain="http://www.blogger.com/atom/ns#">Visualforce</category><category domain="http://www.blogger.com/atom/ns#">SDK</category><title>Salesforce Mobile SDK - Eclipse Setup and Android App</title><description>&lt;br /&gt;
This is the fourth and final post of the Salesforce Mobile SDK Series. &amp;nbsp;Here's what you've missed if you're new to the series:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="http://blog.crmscience.com/2012/11/salesforce-mobile-sdk-introduction.html"&gt;Salesforce Mobile SDK - Introduction&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.crmscience.com/2012/11/mobile-sdk-visualforce-connected-app.html"&gt;Salesforce Mobile SDK - Mobile Visualforce Page and the Connected App&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.crmscience.com/2012/12/salesforce-mobile-sdk-xcode-setup-and.html%20Done" target="_blank"&gt;Salesforce Mobile SDK - Xcode Setup and iOS App&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
In the last post, we set up Xcode for iOS development using the Visualforce Page we created in part 2. In this post, we'll do the same for Android within Eclipse.&lt;br /&gt;
&lt;br /&gt;
1) &amp;nbsp;If not already installed on your machine, download Eclipse (I'm using Classic 4.2.1) here: &amp;nbsp;&lt;a href="http://www.eclipse.org/downloads/"&gt;http://www.eclipse.org/downloads/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
2) &amp;nbsp;Locate and download installer_r21-windows.exe under the "Download for Other Platforms" sections here: &amp;nbsp;&lt;a href="http://developer.android.com/sdk/index.html" style="background-color: white; color: #1155cc; font-family: arial, sans-serif; font-size: 13px;" target="_blank"&gt;http://developer.android.com/&lt;wbr&gt;&lt;/wbr&gt;sdk/index.html&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
3) &amp;nbsp;After you've downloaded the Android SDK installer, execute it to begin the installation wizard steps. &amp;nbsp;A check will be performed to ensure you have a JDK installed (I had v1.7 installed).&lt;br /&gt;
&lt;br /&gt;
4) &amp;nbsp;When the installation has completed, make sure a check is in the box to "Start SDK Manager..." and then click on the "Finish" button.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-zVH8bh9mcAI/UMY3pRlvfGI/AAAAAAAAAH0/ap6r20f51vU/s1600/Selection_016.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="259" src="http://3.bp.blogspot.com/-zVH8bh9mcAI/UMY3pRlvfGI/AAAAAAAAAH0/ap6r20f51vU/s320/Selection_016.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
5) &amp;nbsp;When the SDK Manager window opens, select the "Tools" folder, the latest version of Android (4.2 below), along with any others you want to install at this point and click on the "Install Packages" button. &amp;nbsp;Click on the "Accept All" radio to accept the terms of all packages and wait for the install to complete.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-RTy-M0Rblh0/UMY4VRjIZTI/AAAAAAAAAH8/wgxhJNr1ISA/s1600/Selection_017.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="165" src="http://4.bp.blogspot.com/-RTy-M0Rblh0/UMY4VRjIZTI/AAAAAAAAAH8/wgxhJNr1ISA/s320/Selection_017.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
6) &amp;nbsp;After installation is completed, set up a new Virtual Device by clicking on "Tools" and then "Managed AVDs..."&lt;br /&gt;
&lt;br /&gt;
7) &amp;nbsp;Click on the "New...' button, provide the following details, and click on the "OK" button&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-NnO8MkCkDUs/UMY8XPWdnjI/AAAAAAAAAIY/5HHeJywyDOA/s1600/Selection_018.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://2.bp.blogspot.com/-NnO8MkCkDUs/UMY8XPWdnjI/AAAAAAAAAIY/5HHeJywyDOA/s400/Selection_018.png" width="265" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
8) &amp;nbsp;Download and install Git from: &amp;nbsp;&lt;a href="https://help.github.com/articles/set-up-git"&gt;https://help.github.com/articles/set-up-git&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
9) &amp;nbsp;Clone the Salesforce Mobile SDK by opening a command prompt window and entering: git clone git://github.com/forcedotcom/SalesforceMobileSDK-Android.git&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-i0-TdIGqrEU/UMZFsW4ebjI/AAAAAAAAAJA/-wd5ghaT5rE/s1600/Selection_020.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="48" src="http://3.bp.blogspot.com/-i0-TdIGqrEU/UMZFsW4ebjI/AAAAAAAAAJA/-wd5ghaT5rE/s320/Selection_020.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
10) &amp;nbsp;Open Eclipse&lt;br /&gt;
&lt;br /&gt;
11) &amp;nbsp;Choose a new location for your workspace and click on the "OK" button&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-ANQuz-Enh3I/UMZLD4NsMeI/AAAAAAAAAJU/Y1ilf58b170/s1600/Selection_021.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="197" src="http://3.bp.blogspot.com/-ANQuz-Enh3I/UMZLD4NsMeI/AAAAAAAAAJU/Y1ilf58b170/s400/Selection_021.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
12) &amp;nbsp;If prompted, although you already downloaded them, choose "Install new SDK" and check "Install the latest available version of the Android API's." &amp;nbsp;Choose an option in regards to sending your user usage to Google, and then choose "Accept All" and then click on the "Install" button&lt;br /&gt;
&lt;br /&gt;
13) &amp;nbsp;Click on File --&amp;gt; Import...&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-T06ozGN9Bhw/UMZMLZKNh8I/AAAAAAAAAJc/gxW9t0iZHHw/s1600/Menu_023.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-T06ozGN9Bhw/UMZMLZKNh8I/AAAAAAAAAJc/gxW9t0iZHHw/s320/Menu_023.png" width="201" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
14) &amp;nbsp;General --&amp;gt; Existing Projects into Workspace&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-segYidH4m0w/UMZMRIHhG3I/AAAAAAAAAJk/WP9UjX_usP8/s1600/Selection_024.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/-segYidH4m0w/UMZMRIHhG3I/AAAAAAAAAJk/WP9UjX_usP8/s320/Selection_024.png" width="307" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
15) &amp;nbsp;First import the SalesforceSDK from ../Downloads/SalesforceMobileSDK-Android/native/SalesforceSDK (your location may vary, depending on your Git configuration)&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-Rt-C7aqcnvo/UMZN6LuJ9SI/AAAAAAAAAJs/bZ-G5ANG_As/s1600/Selection_025.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://3.bp.blogspot.com/-Rt-C7aqcnvo/UMZN6LuJ9SI/AAAAAAAAAJs/bZ-G5ANG_As/s400/Selection_025.png" width="312" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
16) &amp;nbsp;Then import the VFConnector sample app from ../Downloads/SalesforceMobileSDK-Android/hybrid/SampleApps/VFConnector&amp;nbsp;(your location may vary, depending on your Git configuration)&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-qQ23RltV0mc/UMZN_sX_6_I/AAAAAAAAAJ0/cnpkD0qVW3M/s1600/Selection_026.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://4.bp.blogspot.com/-qQ23RltV0mc/UMZN_sX_6_I/AAAAAAAAAJ0/cnpkD0qVW3M/s400/Selection_026.png" width="313" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
17) &amp;nbsp;Navigate to your Project --&amp;gt; Assets --&amp;gt; &amp;nbsp;WWW folder and edit the bootconfig.js file as we did in part 3/4 to point the project to our Visualforce page:&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-TAV8I-hVE9c/UNAAxYpisPI/AAAAAAAAARc/Z3TfBA_XYnE/s1600/Selection_029.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="28" src="http://2.bp.blogspot.com/-TAV8I-hVE9c/UNAAxYpisPI/AAAAAAAAARc/Z3TfBA_XYnE/s640/Selection_029.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
18) &amp;nbsp; Click on the "Run" button and choose the AVD we created in Step 7. &amp;nbsp;The emulator should start up within a few moments if not already running.&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-YXSIulbh7yo/UNACGsj9crI/AAAAAAAAAR0/3qrNapZ3aTw/s1600/Selection_030.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="288" src="http://2.bp.blogspot.com/-YXSIulbh7yo/UNACGsj9crI/AAAAAAAAAR0/3qrNapZ3aTw/s320/Selection_030.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
19) &amp;nbsp;Unlock the device and depending on the state of the installation, you'll either find your app under the App drawer menu or it will pop open automatically.&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-H5pG9kVEGtQ/UNACuh6kVgI/AAAAAAAAAR8/ekBMDT_v_5w/s1600/Selection_031.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-H5pG9kVEGtQ/UNACuh6kVgI/AAAAAAAAAR8/ekBMDT_v_5w/s320/Selection_031.png" width="194" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
There you have it! &amp;nbsp;Quick and easy mobile applications, based off of a single Visualforce page, for two platforms with minimal coding. &amp;nbsp;The most difficult part of the process for those without mobile app development experience is the configuration of the environment. &amp;nbsp;Something always goes wrong and a little Googling will help in most cases. &amp;nbsp;Hopefully you've found these four blog entries helpful as a quick introduction to the Salesforce Mobile SDK. &amp;nbsp;Good luck!&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
</description><link>http://blog.crmscience.com/2013/01/salesforce-mobile-sdk-eclipse-android.html</link><author>noreply@blogger.com (Kirk Steffke)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-zVH8bh9mcAI/UMY3pRlvfGI/AAAAAAAAAH0/ap6r20f51vU/s72-c/Selection_016.png" height="72" width="72" /><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3011483083044505303.post-6635181273177231959</guid><pubDate>Wed, 19 Dec 2012 13:58:00 +0000</pubDate><atom:updated>2012-12-19T08:58:00.089-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Error</category><category domain="http://www.blogger.com/atom/ns#">AppExchange</category><category domain="http://www.blogger.com/atom/ns#">apex</category><category domain="http://www.blogger.com/atom/ns#">Apex REST</category><category domain="http://www.blogger.com/atom/ns#">Release</category><title>Salesforce to Fix Issue With Oauth 2.0 User-Pass Flow</title><description>

We recently hit an issue with one of our clients where an external service was trying to authenticate &lt;span id="j_id0:j_id18"&gt;&lt;span id="j_id0:j_id18:j_id19:j_id42"&gt;&lt;span id="j_id0:viewCaseForm:j_id133"&gt;against Salesforce with oauth 2.0 user-pass flow&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; but kept receiving "&lt;span id="j_id0:j_id18"&gt;&lt;span id="j_id0:j_id18:j_id19:j_id42"&gt;&lt;span id="j_id0:viewCaseForm:j_id133"&gt;unknown_error.retry
 your request" from Salesforce. We searched online and used #askforce 
but the only fix we found was to loging using the Salesforce instance, 
which does not work for us as we are trying to &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span id="j_id0:j_id18"&gt;&lt;span id="j_id0:j_id18:j_id19:j_id42"&gt;&lt;span id="j_id0:viewCaseForm:j_id137"&gt;access Apex REST in a managed package that will be available on the AppExchange&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; sometime soon.&lt;br /&gt;
&lt;br /&gt;
So we opened a case through the partner portal which was quickly 
confirmed and escalated. Within a week, we receive a response that &lt;span id="j_id0:j_id18"&gt;&lt;span id="j_id0:j_id18:j_id19:j_id42"&gt;&lt;span id="j_id0:viewCaseForm:commentPanel"&gt;&lt;span id="j_id0:viewCaseForm:j_id218:3:j_id224"&gt;Tier 3 have &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span id="j_id0:j_id18"&gt;&lt;span id="j_id0:j_id18:j_id19:j_id42"&gt;&lt;span id="j_id0:viewCaseForm:commentPanel"&gt;&lt;span id="j_id0:viewCaseForm:j_id218:3:j_id224"&gt;&lt;span id="j_id0:j_id18"&gt;&lt;span id="j_id0:j_id18:j_id19:j_id42"&gt;&lt;span id="j_id0:viewCaseForm:commentPanel"&gt;&lt;span id="j_id0:viewCaseForm:j_id218:3:j_id224"&gt;identified the &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;issue and that R&amp;amp;D is working on a patch that will likely to be released today (&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span id="j_id0:j_id18"&gt;&lt;span id="j_id0:j_id18:j_id19:j_id42"&gt;&lt;span id="j_id0:viewCaseForm:commentPanel"&gt;&lt;span id="j_id0:viewCaseForm:j_id218:3:j_id224"&gt;&lt;span id="j_id0:j_id18"&gt;&lt;span id="j_id0:j_id18:j_id19:j_id42"&gt;&lt;span id="j_id0:viewCaseForm:commentPanel"&gt;&lt;span id="j_id0:viewCaseForm:j_id218:3:j_id224"&gt;19th Dec 2012)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;They did not elaborate much further even though we prodded for some more geeky details, except to say that &lt;span id="j_id0:j_id18"&gt;&lt;span id="j_id0:j_id18:j_id19:j_id42"&gt;&lt;span id="j_id0:viewCaseForm:commentPanel"&gt;&lt;span id="j_id0:viewCaseForm:j_id218:0:j_id224"&gt;"the issue was due to internal issue" and that "the patch will be released on all instances".&lt;br /&gt;
  &lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Kudos to Salesforce for a quick turnaround!</description><link>http://blog.crmscience.com/2012/12/salesforce-to-fix-issue-with-oauth-20.html</link><author>noreply@blogger.com (Ami Assayag)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3011483083044505303.post-6194418964548677126</guid><pubDate>Tue, 18 Dec 2012 15:00:00 +0000</pubDate><atom:updated>2012-12-18T10:00:04.861-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">service</category><category domain="http://www.blogger.com/atom/ns#">email service</category><category domain="http://www.blogger.com/atom/ns#">case</category><category domain="http://www.blogger.com/atom/ns#">email-to-case</category><category domain="http://www.blogger.com/atom/ns#">email</category><category domain="http://www.blogger.com/atom/ns#">email to case</category><category domain="http://www.blogger.com/atom/ns#">formula</category><title>Formula:  Ref Tag for Email-to-Case</title><description>&lt;br /&gt;
If you're using Salesforce for customer service, chances are that you are using email from the Case object. &amp;nbsp;When you leverage the "Email-to-Case" feature, Salesforce will add to Case related emails a "ref:" tag. &lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-ySNwxeUH-3k/UMX8gGmWHMI/AAAAAAAAAHI/jd1-liSyQmI/s1600/Selection_011.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-ySNwxeUH-3k/UMX8gGmWHMI/AAAAAAAAAHI/jd1-liSyQmI/s1600/Selection_011.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Let's assume help@yourCompany.com is configured as your company's email-to-case Routing Address. &amp;nbsp;A customer needs assistance with one of your products and sends off an email requesting assistance.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-5ynV0hA5SP0/UMX8W21bz7I/AAAAAAAAAHA/073eAjGeg10/s1600/Selection_012.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="126" src="http://1.bp.blogspot.com/-5ynV0hA5SP0/UMX8W21bz7I/AAAAAAAAAHA/073eAjGeg10/s320/Selection_012.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
This tag is what allows Salesforce to automatically connect this email to the appropriate existing case. &amp;nbsp;If not found, a new Case is created and set up in accordance with the configuration of that Routing Address.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-quvvryzFsh0/UMX8peBM3eI/AAAAAAAAAHQ/JJOBaYWMWnA/s1600/Selection_013.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="459" src="http://2.bp.blogspot.com/-quvvryzFsh0/UMX8peBM3eI/AAAAAAAAAHQ/JJOBaYWMWnA/s640/Selection_013.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;So when the customer sends the email above, requesting assistance from help@yourCompany.com, you're email server or email client will be configured to forward messages sent to help@yourCompany.com to the Salesforce assigned email address, which looks like this:&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-ngKFeyL6d4k/UMX-45lVjVI/AAAAAAAAAHY/uDhZD5O9Ejs/s1600/Selection_014.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="84" src="http://4.bp.blogspot.com/-ngKFeyL6d4k/UMX-45lVjVI/AAAAAAAAAHY/uDhZD5O9Ejs/s640/Selection_014.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;
&lt;/div&gt;When the email address is forwarded to the Salesforce address highlighted above, the Salesforce email services look at the subject and body of the message for an existing "ref:" tag. &amp;nbsp;If one is found, the email is created as Activity History for the associated case. &amp;nbsp;If one isn't found, it looks at the configuration of the help@yourCompany.com Routing Address and creates a case. &amp;nbsp;This is why it is important to not remove the tag from your emails; doing so could result in duplicate or&amp;nbsp;unnecessary&amp;nbsp;cases.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-a8s8bV7a_x0/UMYAhhCstVI/AAAAAAAAAHg/pIkZ-_Qy7Fw/s1600/Selection_015.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="235" src="http://2.bp.blogspot.com/-a8s8bV7a_x0/UMYAhhCstVI/AAAAAAAAAHg/pIkZ-_Qy7Fw/s400/Selection_015.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;There may be scenarios where you need to know what the "ref:" tag for a Case is. &amp;nbsp;You might need to include this on e-mail templates for internally created cases for customers. &amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;How is this value constructed and what is the Salesforce Email-to-Case email service expecting?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;If you take a look at a "ref:" tag, you'll see it follows this pattern:&lt;/div&gt;&lt;div&gt;&lt;script class="brush: java" type="syntaxhighlighter"&gt;
&lt;![CDATA[
1stString.2ndString
]]&gt;
&lt;/script&gt;&lt;br /&gt;
&lt;/div&gt;To replicate this in a formula field, you can use this:&lt;br /&gt;
&lt;div&gt;&lt;script class="brush: java" type="syntaxhighlighter"&gt;
&lt;![CDATA[
{!"[ ref:_"&amp;
    LEFT($Organization.Id,4)&amp;
    "0"&amp;
    RIGHT(LEFT($Organization.Id,15),4)&amp;
    "._"&amp;
    LEFT(ID,4)&amp;
    "0"&amp;RIGHT(ID,5)&amp;
":ref ]"}
]]&gt;
&lt;/script&gt;&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;div&gt;I've seen a similar formula on the forums, but I've added a LEFT($Organization.Id,15). &amp;nbsp;Without this, I was generating the first portion of the "Ref:" tag using the 18 character ID of my org. &amp;nbsp;The resulting "Ref:" tag did not match the "Ref:" tag from the email I received in prior testing.&lt;br /&gt;
&lt;br /&gt;
Now you can use the new formula field on your Salesforce templates. &amp;nbsp;Alternately, you can follow this patter when developing your own Salesforce email handling services.&lt;/div&gt;</description><link>http://blog.crmscience.com/2012/12/formula-ref-tag-for-email-to-case.html</link><author>noreply@blogger.com (Kirk Steffke)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-ySNwxeUH-3k/UMX8gGmWHMI/AAAAAAAAAHI/jd1-liSyQmI/s72-c/Selection_011.png" height="72" width="72" /><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3011483083044505303.post-6550698946699686090</guid><pubDate>Tue, 11 Dec 2012 15:30:00 +0000</pubDate><atom:updated>2012-12-11T10:30:04.454-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">daysBetween</category><category domain="http://www.blogger.com/atom/ns#">day of the week</category><category domain="http://www.blogger.com/atom/ns#">formula</category><category domain="http://www.blogger.com/atom/ns#">Visualforce</category><title>Formula Example - What Day of the Week is/was it?</title><description>I found a post over at the &lt;a href="http://boards.developerforce.com/t5/Apex-Code-Development/bd-p/apex" target="_blank"&gt;Apex Code&lt;/a&gt; board at &lt;a href="http://developerforce.com/"&gt;DeveloperForce.com&lt;/a&gt;&amp;nbsp;from someone who needed assistance creating a formula to determine how many Fridays occurred between two given dates.&lt;br /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Easy enough, I thought. &amp;nbsp;I'll just use a date method w/in a loop and count how many times Friday occurs. &amp;nbsp;I didn't find any &lt;a href="http://www.salesforce.com/us/developer/docs/apexcode/Content/apex_methods_system_date.htm" target="_blank"&gt;date methods&lt;/a&gt; or &lt;a href="http://www.salesforce.com/us/developer/docs/apexcode/Content/apex_methods_system_datetime.htm" target="_blank"&gt;dateTime methods&lt;/a&gt;&amp;nbsp;that return the day of the week. &amp;nbsp;It seems like such a basic need; perhaps I glazed over it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;A quick Googlin' led me to one example, nearly 100 lines long. &amp;nbsp;It shouldn't be that difficult; I'd rather spend 100 lines showing you how to do the math and then 1 line of code using that math.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;A little more poking around and this is what I found:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;a = (x - y) (mod 7)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;a = Day of the week index&lt;/div&gt;&lt;div&gt;x = a date in which you know the day of the week&lt;/div&gt;&lt;div&gt;y = the date in which you want to know which day of the week it was or will be&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;In a nutshell, figure out the number of days between your two dates (x and y), divide that number by 7, and the remainder (mod 7) will tell you the day of the week, based off of the known day of x.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;We still need "x" - the copious amounts of calendar generators on the web all agree that 1/1/1900 was a Monday. &amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Let's see it in practice, using 12/11/2012 as an example or proof (just pretend you don't know it's Tuesday). &amp;nbsp;12/11/2012 will serve as our "y" variable.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;a = (12/11/2012 - 1/1/1900) (mod 7)&lt;/div&gt;&lt;div&gt;a = 41,252 (mod 7)&lt;/div&gt;&lt;div&gt;a = 41,252 divided by 7 leaves a remainder of 1&lt;/div&gt;&lt;div&gt;a = 1&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;Since we know 1/1/1900 was a Monday, we know that 1/2/1900 was a Tuesday, 1/3/1900 a Wednesday and so on all the way up to 1/8 when everyone has a case of the Monday's again. &amp;nbsp;There are 7 days between 1/8 and 1/1 and dividing 7 by 7 leaves you with a remainder of 0. &amp;nbsp;0 will represent Monday. &amp;nbsp;1/9/12 is a Tuesday and there are 8 days between 1/9 and 1/1. &amp;nbsp;Dividing 8 by 7 leaves you with a remainder of 1. &amp;nbsp;1 represents Tuesday. &amp;nbsp;The same logic tells you 2 is Wednesday, 3 is Thursday, 4 is Friday, 5 is Saturday, and 6 is Sunday. &amp;nbsp;In the example above, a = 1, therefore 12/11/2012 must fall on a Tuesday.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;So all we need to do now is plug in our dates and use a few methods that do exist.&lt;br /&gt;
&lt;br /&gt;
We'll use:&lt;br /&gt;
&lt;a href="http://www.salesforce.com/us/developer/docs/apexcode/Content/apex_methods_system_math.htm" target="_blank"&gt;math.mod()&lt;/a&gt;&lt;br /&gt;
&lt;a href="http://www.salesforce.com/us/developer/docs/apexcode/Content/apex_methods_system_date.htm" target="_blank"&gt;date.daysBetween()&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/div&gt;&lt;script class="brush: java" type="syntaxhighlighter"&gt;
&lt;![CDATA[
date unknownDate = date.newInstance(2012, 12, 11);
date knownDate = date.newInstance(1900, 1, 1);
integer a = math.mod(unknownDate.daysBetween(knownDate),7);
system.debug('a was:  ' + a);
]]&gt;
&lt;/script&gt; &lt;br /&gt;
&lt;br /&gt;
Go ahead, try executing that code and seeing what the debug output tells you.&lt;br /&gt;
&lt;br /&gt;
So now we have an easy mechanism for determining the day of the week for a given date.  Let's go the extra mile and see how we can easily create a bit of code now that determines how many how many of a certain day occurred between two dates.&lt;br /&gt;
&lt;br /&gt;
&lt;script class="brush: java" type="syntaxhighlighter"&gt;
&lt;![CDATA[
date calcDate = date.newinstance(1900, 1, 1);
date unknownStartDate = date.newinstance(2011, 12, 1);  // Input start date
date unknownEndDate = date.newinstance(2012, 12, 1);  // Input end date

integer friCount = 0;

do {
    /*  Calc the mod between mod and 1/7/1900 
        1/1/1900 was a Monday so...
        0 = Mon, 1 = Tues, 2 = Weds, 3 = Thurs, 4 = Fri, 5 = Sat, 6 = Sun
        If our equation performed on the current date w/in the loop
        results in -4, we know this date was a Friday and it should be
        added to our rolling count  
    */
    if(math.mod(unknownStartDate.daysBetween(calcDate),7) == -4){
        friCount++;
    }
    unknownStartDate = unknownStartDate.addDays(1);
} while (unknownStartDate &lt;= unknownEndDate);

system.debug('friCount:  ' + friCount);
]]&gt;
&lt;/script&gt; &lt;br /&gt;
&lt;br /&gt;
</description><link>http://blog.crmscience.com/2012/12/formula-example-what-day-of-week-iswas.html</link><author>noreply@blogger.com (Kirk Steffke)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3011483083044505303.post-6035590075738957252</guid><pubDate>Thu, 06 Dec 2012 16:00:00 +0000</pubDate><atom:updated>2012-12-06T11:00:06.016-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Mobile</category><category domain="http://www.blogger.com/atom/ns#">Objective-C</category><category domain="http://www.blogger.com/atom/ns#">apex</category><category domain="http://www.blogger.com/atom/ns#">Android</category><category domain="http://www.blogger.com/atom/ns#">iOS</category><category domain="http://www.blogger.com/atom/ns#">Visualforce</category><category domain="http://www.blogger.com/atom/ns#">SDK</category><title>Salesforce Mobile SDK - Xcode Setup and iOS App</title><description>This is part three of the Salesforce Mobile SDK Series. &amp;nbsp;Have you read parts one and two yet?&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="http://blog.crmscience.com/2012/11/salesforce-mobile-sdk-introduction.html"&gt;Salesforce Mobile SDK - Introduction&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.crmscience.com/2012/11/mobile-sdk-visualforce-connected-app.html"&gt;Salesforce Mobile SDK - Mobile Visualforce Page and the Connected App&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
So far we've learned the differences between native, hybird, and HTML5 apps, how to create a mobile Visualforce page, and how to create a Connected App to get our crucial Consumer Key and Secret. &amp;nbsp;The next step takes what you've done and turns it into a mobile app. &amp;nbsp;By the end of this post, you'll have an iOS app that handles authentication and delivers a multipage experience. &lt;br /&gt;
&lt;br /&gt;
Before you get started working with the Salesforce Mobile SDK, you'll need to set up your Mac environment.&lt;br /&gt;
&lt;br /&gt;
1) &amp;nbsp;Boot up your Mac and install Xcode from the App Store.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-veDnFsKHT9o/UKV5zXle2GI/AAAAAAAAADE/CwEAmiy5K_4/s1600/Selection_011.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="111" src="http://1.bp.blogspot.com/-veDnFsKHT9o/UKV5zXle2GI/AAAAAAAAADE/CwEAmiy5K_4/s200/Selection_011.png" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
2) &amp;nbsp;While that's downloading (it'll take a while), download and install GitHub: &amp;nbsp;&lt;a href="http://mac.github.com/" style="background-color: white; color: #1155cc; font-family: arial, sans-serif; font-size: 13px;" target="_blank"&gt;http://mac.github.com/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
3) &amp;nbsp;Pull in a local copy of the SalesforceMobileSDK-iOS project by using the "Clone in Mac" button here:&lt;span style="background-color: white; color: #222222; font-family: arial, sans-serif; font-size: 13px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;a href="https://github.com/forcedotcom/SalesforceMobileSDK-iOS" style="background-color: white; color: #1155cc; font-family: arial, sans-serif; font-size: 13px;" target="_blank"&gt;https://github.com/&lt;wbr&gt;&lt;/wbr&gt;forcedotcom/&lt;wbr&gt;&lt;/wbr&gt;SalesforceMobileSDK-iOS&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-_ZcS--I-kPs/UKV7xiTW4CI/AAAAAAAAADM/kBS_1tpN9O0/s1600/Selection_001.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="25" src="http://2.bp.blogspot.com/-_ZcS--I-kPs/UKV7xiTW4CI/AAAAAAAAADM/kBS_1tpN9O0/s640/Selection_001.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
4) &amp;nbsp;While you're waiting, you'll want to clone the MobileComponents as well:&amp;nbsp;&lt;a href="https://github.com/forcedotcom/MobileComponents" style="background-color: white; color: #1155cc; font-family: arial, sans-serif; font-size: 13px;" target="_blank"&gt;https://github.com/&lt;wbr&gt;&lt;/wbr&gt;forcedotcom/MobileComponents&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
5) &amp;nbsp;Launch a Terminal window (Finder --&amp;gt; Applications --&amp;gt; Utilities --. Terminal) and navigate to the cloned SalesforceMobileSDK-iOS folder,&amp;nbsp;presumably in your home directory. &amp;nbsp;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;cd ~/SalesforceMobileSDK-iOS&lt;/li&gt;
&lt;li&gt;sudo ./install.sh&lt;/li&gt;
&lt;li&gt;sudo cd ..&lt;/li&gt;
&lt;li&gt;sudo chown -R &lt;i&gt;YourUserName&lt;/i&gt; SalesforceMobileSDK-iOS&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
6) &amp;nbsp;By now, Xcode should have downloaded and installed. &amp;nbsp;If not, wait for that to happen, then launch it (Finder --&amp;gt; Applications --&amp;gt; Xcode).&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
7) &amp;nbsp;If you've never launched Xcode before, you'll land on this screen. &amp;nbsp;Click on "Create a new Xcode project" if prompted and if not, click on File --&amp;gt; New --&amp;gt; Project...&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-NEAdNCTFcZA/UKWCIkeiPHI/AAAAAAAAADk/cVGHYK6u2R8/s1600/Selection_007.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://3.bp.blogspot.com/-NEAdNCTFcZA/UKWCIkeiPHI/AAAAAAAAADk/cVGHYK6u2R8/s200/Selection_007.png" width="181" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
8) &amp;nbsp;From the menu, choose iOS --&amp;gt; Application, highlight the "Hybrid Force.com App" icon, and then click on the "Next" button&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-NMgc1vj7r-4/UKWAdBzskMI/AAAAAAAAADc/Wdn8z83OaaA/s1600/Selection_004.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="214" src="http://3.bp.blogspot.com/-NMgc1vj7r-4/UKWAdBzskMI/AAAAAAAAADc/Wdn8z83OaaA/s320/Selection_004.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
9) &amp;nbsp;Provide the following details about your new app and then click on the "Next" button. &amp;nbsp;You can get the "Consumer Key" and the "Redirect URL" from within your Salesforce org by clicking on the "Setup" link and navigating to Create --&amp;gt; Apps --&amp;gt; Your Connected App Name. &amp;nbsp;For more details on creating the "Connected App," see &lt;a href="http://blog.crmscience.com/2012/11/mobile-sdk-visualforce-connected-app.html"&gt;part two&lt;/a&gt; of this series.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-XdyUAPtWN5s/UKWFiicmiGI/AAAAAAAAAD0/-12iY4oe6IE/s1600/Selection_008.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="295" src="http://4.bp.blogspot.com/-XdyUAPtWN5s/UKWFiicmiGI/AAAAAAAAAD0/-12iY4oe6IE/s400/Selection_008.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
10) &amp;nbsp;You'll now be prompted to choose a location to save your project file. &amp;nbsp;Navigate to your location of choice and click on the "Create" button.&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
11) &amp;nbsp;Once your project is created, highlight the "WWW" folder, right-click on it, and choose "Delete."&amp;nbsp;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-bBA5O2kIBWw/UKWHii6L0CI/AAAAAAAAAD8/_BUJZwEit0w/s1600/Selection_009.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-bBA5O2kIBWw/UKWHii6L0CI/AAAAAAAAAD8/_BUJZwEit0w/s1600/Selection_009.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
12) &amp;nbsp;When prompted, click on the "References Only" button.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-0VPvvuQZxyM/UKWHoN3bbfI/AAAAAAAAAEE/hC39ZftEmuw/s1600/Selection_010.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="78" src="http://1.bp.blogspot.com/-0VPvvuQZxyM/UKWHoN3bbfI/AAAAAAAAAEE/hC39ZftEmuw/s320/Selection_010.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
13) &amp;nbsp;Highlight your root project folder, right-click, and choose "Add Files to "Your Project"..."&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-or3_9mRH5FY/UKWIQUue3EI/AAAAAAAAAEM/Yx8XSgPIwU8/s1600/Selection_011.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="266" src="http://1.bp.blogspot.com/-or3_9mRH5FY/UKWIQUue3EI/AAAAAAAAAEM/Yx8XSgPIwU8/s320/Selection_011.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
14) &amp;nbsp;Navigate to your project directory, highlight the "WWW" folder, and then click on the "Add" button.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-iXf44rMfe98/UKWItarIBoI/AAAAAAAAAEU/2XnJ6OD2E3c/s1600/Selection_012.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="153" src="http://4.bp.blogspot.com/-iXf44rMfe98/UKWItarIBoI/AAAAAAAAAEU/2XnJ6OD2E3c/s320/Selection_012.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
15) &amp;nbsp;Expand the "WWW" folder in your project browser and click on bootconfig.js.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-CkDDNC_LJYY/UKWJ7Bq-fFI/AAAAAAAAAEc/yAj7XYjuX7Q/s1600/Selection_014.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-CkDDNC_LJYY/UKWJ7Bq-fFI/AAAAAAAAAEc/yAj7XYjuX7Q/s1600/Selection_014.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
16) &amp;nbsp;Find the line that begins with "var startData..." &amp;nbsp;This tells the application which page to load after authentication. &amp;nbsp;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-zdUot6pF6Og/UKWKNF12PaI/AAAAAAAAAEk/_3lew8RMIus/s1600/Selection_015.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="24" src="http://1.bp.blogspot.com/-zdUot6pF6Og/UKWKNF12PaI/AAAAAAAAAEk/_3lew8RMIus/s640/Selection_015.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Since we are building a hybrid app, we'll comment out the first line, uncomment the second line, and modify the path portion to reference the Visualforce page we created in &lt;a href="http://blog.crmscience.com/2012/11/mobile-sdk-visualforce-connected-app.html"&gt;part two&lt;/a&gt; of this series.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-mLLL-bUTmL4/UKWK-JRf5bI/AAAAAAAAAEs/t9rcQoJXEqk/s1600/Selection_016.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="26" src="http://4.bp.blogspot.com/-mLLL-bUTmL4/UKWK-JRf5bI/AAAAAAAAAEs/t9rcQoJXEqk/s640/Selection_016.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
17) &amp;nbsp;Now it's time to make sure the app runs. &amp;nbsp;Make sure all of your changes have been saved, and then click on Product --&amp;gt; Run. &amp;nbsp;This will start up either an iPad or iPhone simulator and with any luck, request your Salesforce credentials:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-aYdPiT9VQ8I/UKWMBuYQlvI/AAAAAAAAAE0/gLopo7kVN0M/s1600/Selection_018.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="242" src="http://4.bp.blogspot.com/-aYdPiT9VQ8I/UKWMBuYQlvI/AAAAAAAAAE0/gLopo7kVN0M/s320/Selection_018.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
18) &amp;nbsp;Enter your credentials and click on the "Login" button. &amp;nbsp;The app will then prompt you to provide permissions. &amp;nbsp;Click on the "Allow" button to continue.&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-J4uRAW-cg2E/UKWM7aUJ5lI/AAAAAAAAAE8/s-__P4WvCnw/s1600/Selection_019.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="174" src="http://2.bp.blogspot.com/-J4uRAW-cg2E/UKWM7aUJ5lI/AAAAAAAAAE8/s-__P4WvCnw/s320/Selection_019.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
After clicking on the "Allow" button, you'll see your mobile VF page. &amp;nbsp;If you tap/click around, you'll notice the interface and page navigation looks and feels like a native app.&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-Wm4gwY7ka3w/UL0lkqJoNtI/AAAAAAAAAGs/W7V-olVjU0A/s1600/Selection_008.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/-Wm4gwY7ka3w/UL0lkqJoNtI/AAAAAAAAAGs/W7V-olVjU0A/s320/Selection_008.png" width="167" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
In the next and final post of this series, you'll learn how to set up your Eclipse environment and use the the same Visualforce Page and Connected App to create an Android app.&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;</description><link>http://blog.crmscience.com/2012/12/salesforce-mobile-sdk-xcode-setup-and.html</link><author>noreply@blogger.com (Kirk Steffke)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-veDnFsKHT9o/UKV5zXle2GI/AAAAAAAAADE/CwEAmiy5K_4/s72-c/Selection_011.png" height="72" width="72" /><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3011483083044505303.post-2398123178018532169</guid><pubDate>Tue, 04 Dec 2012 15:00:00 +0000</pubDate><atom:updated>2012-12-04T10:00:03.367-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Sales</category><category domain="http://www.blogger.com/atom/ns#">Mobile</category><category domain="http://www.blogger.com/atom/ns#">Touch</category><category domain="http://www.blogger.com/atom/ns#">iOS</category><category domain="http://www.blogger.com/atom/ns#">hack</category><title>iPad-less Salesforce Touch Testing</title><description>Salesforce Touch became generally available in the Winter '13 release. &amp;nbsp;It is available in the Contact Manager, Group, Professional, Enterprise, Unlimited, and Developer Editions and according to the requirements, currently supports Apple iPads (2nd and 3rd generation) with iOS version 5 and up.&lt;br /&gt;
&lt;br /&gt;
Requirements: &amp;nbsp;&lt;a href="http://www.salesforce.com/docs/en/touch_faq_tablet/touch_faq_tablet_reqs.htm"&gt;http://www.salesforce.com/docs/en/touch_faq_tablet/touch_faq_tablet_reqs.htm&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Unfortunately, not everyone has an iPad to access, test out, or even debug the new Touch interface. &amp;nbsp;Fear not, a simple change in your browser settings will allow you nearly the same access. &lt;br /&gt;
&lt;br /&gt;
First, make sure that you have the new "Touch" feature enabled for your org and the users that you want to test with.&lt;br /&gt;
&lt;br /&gt;
1) &amp;nbsp;Log into Salesforce and access the "Setup" menu:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-s7HXnBnDZ1Y/UKL1GxcYuII/AAAAAAAAABk/hK8Fgbc_uo8/s1600/Setup.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="138" src="http://2.bp.blogspot.com/-s7HXnBnDZ1Y/UKL1GxcYuII/AAAAAAAAABk/hK8Fgbc_uo8/s320/Setup.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
2) &amp;nbsp;Under "Administration Setup," expand "Mobile Administration," "Salesforce Touch" and then click on "Settings:"&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-tg5NAKFDOgI/UKL1LdMZvCI/AAAAAAAAABs/W6F1ad3aQOA/s1600/Touch_Settings.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-tg5NAKFDOgI/UKL1LdMZvCI/AAAAAAAAABs/W6F1ad3aQOA/s1600/Touch_Settings.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
3) &amp;nbsp;Ensure that the "Enable the Salesforce Touch mobile browser app" setting is enabled&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-zR-2Fl9u28E/UKL1OkXxy7I/AAAAAAAAAB0/NKE38mxW17Q/s1600/Touch_Enable.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="56" src="http://2.bp.blogspot.com/-zR-2Fl9u28E/UKL1OkXxy7I/AAAAAAAAAB0/NKE38mxW17Q/s320/Touch_Enable.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
4) &amp;nbsp;Next, ensure that Touch is enabled for the user account you are testing with by expanding "Manage Users" under "Administration Setup" and clicking on "Users:"&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-h3qLdBYCV78/UKL1XJkZjjI/AAAAAAAAAB8/r20UZDZ1Zuc/s1600/Selection_001.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-h3qLdBYCV78/UKL1XJkZjjI/AAAAAAAAAB8/r20UZDZ1Zuc/s1600/Selection_001.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
5) &amp;nbsp;Find the&amp;nbsp;relevant&amp;nbsp;user(s) and ensure that "Touch User" is enabled:&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-dhlFzTKKiQY/UKL1hrQgrzI/AAAAAAAAACE/vRj7Qu-c9Nw/s1600/Selection_002.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-dhlFzTKKiQY/UKL1hrQgrzI/AAAAAAAAACE/vRj7Qu-c9Nw/s1600/Selection_002.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
Now that "Touch" is enabled in all of the right places, it's time to change your browser's user agent, effectively allowing your browser to mimic Safari. &amp;nbsp;Here's how to do that in Chrome.&lt;br /&gt;
&lt;br /&gt;
1) &amp;nbsp;Log out and change your URL to "login.salesforce.com"&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-3-mpa8PjROA/UKL2OckhZ0I/AAAAAAAAACM/_O0eKZOBUX8/s1600/Selection_003.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-3-mpa8PjROA/UKL2OckhZ0I/AAAAAAAAACM/_O0eKZOBUX8/s1600/Selection_003.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
2) &amp;nbsp;Click on Chrome's "Settings" button and navigate to Tools -&amp;gt; Developer Tools (Shift+CTRL+I)&lt;br /&gt;
&lt;br /&gt;
3) &amp;nbsp;Click on the Developer Tools settings button (the gear icon) in the bottom-right hand corner&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-K_miP7lZkVY/UKL3lc6e4KI/AAAAAAAAACc/DsLAQyRBJNM/s1600/Selection_004.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-K_miP7lZkVY/UKL3lc6e4KI/AAAAAAAAACc/DsLAQyRBJNM/s1600/Selection_004.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
4) &amp;nbsp;Click on the "Overrides" tab&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-ezJ1pDrZaOo/UKL3qiii7gI/AAAAAAAAACk/_6J23TlmvBQ/s1600/Selection_005.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-ezJ1pDrZaOo/UKL3qiii7gI/AAAAAAAAACk/_6J23TlmvBQ/s1600/Selection_005.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
5) &amp;nbsp;Ensure that "User Agent" is checked and choose one of the "iPad --iOS" profiles&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-JV8t71ZNYf4/UKL38TfbKiI/AAAAAAAAACs/9UXyWDYuhPQ/s1600/Selection_006.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-JV8t71ZNYf4/UKL38TfbKiI/AAAAAAAAACs/9UXyWDYuhPQ/s1600/Selection_006.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
6) &amp;nbsp;Refresh your Salesforce Login window and it should now look like this:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-_IL_DJYZxYg/UKL4Szqg2ZI/AAAAAAAAAC0/RxewtPYjDhM/s1600/Selection_007.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="170" src="http://4.bp.blogspot.com/-_IL_DJYZxYg/UKL4Szqg2ZI/AAAAAAAAAC0/RxewtPYjDhM/s320/Selection_007.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
If you're familiar with the Salesforce Mobile SDK, this will look familiar to you.&lt;br /&gt;
&lt;br /&gt;
Take note that if you are logging in with an account with an Administrator profile, you will not experience the Salesforce Touch interface after logging in, but will rather be redirected to the normal "Setup" page.&lt;br /&gt;
&lt;br /&gt;
If anyone has a one of those new, shiny, touchscreen Windows 8 machines, I'd love to hear if the interface is "Touchable."&lt;br /&gt;
&lt;br /&gt;
Not using Chrome? &amp;nbsp;Here's a &lt;a href="http://www.howtogeek.com/113439/how-to-change-your-browsers-user-agent-without-installing-any-extensions/" target="_blank"&gt;link&lt;/a&gt; that may include information on how to change your user-agent setting w/in your browser of choice.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</description><link>http://blog.crmscience.com/2012/12/ipad-less-salesforce-touch-testing.html</link><author>noreply@blogger.com (Kirk Steffke)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-s7HXnBnDZ1Y/UKL1GxcYuII/AAAAAAAAABk/hK8Fgbc_uo8/s72-c/Setup.png" height="72" width="72" /><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3011483083044505303.post-1760966179438527918</guid><pubDate>Thu, 29 Nov 2012 13:44:00 +0000</pubDate><atom:updated>2012-11-29T08:44:48.797-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">admin</category><category domain="http://www.blogger.com/atom/ns#">formula</category><category domain="http://www.blogger.com/atom/ns#">round</category><category domain="http://www.blogger.com/atom/ns#">if</category><category domain="http://www.blogger.com/atom/ns#">administration</category><category domain="http://www.blogger.com/atom/ns#">now</category><title>Formula Example - Days Until Quarter's End</title><description>Today I bring you two ways to accomplish the same thing; display the number of calendar days until the end of the quarter.  You probably wouldn't use these formulas to create a field (why show the number of days on every record?), but might use on a Visualforce page or email template.  You may even modify them to enhance a validation or workflow rule.&lt;br /&gt;
&lt;br /&gt;
The first way uses a series of nested &lt;a href="http://na9.salesforce.com/help/doc/en/customize_functions_a_h.htm#IF"&gt;IF()&lt;/a&gt; functions whereas the second way demonstrates how to arrive at that number using a &lt;a href="http://na9.salesforce.com/help/doc/en/customize_functions_a_h.htm#CASE"&gt;CASE()&lt;/a&gt;&amp;nbsp;function.  The CASE way has a small work around in it, explained below. &lt;br /&gt;
&lt;br /&gt;
Using nested IF functions:&lt;br /&gt;
&lt;script class="brush: java" type="syntaxhighlighter"&gt;

&lt;![CDATA[
IF(
    today() &lt;= DATEVALUE(text(year(today()))+'-3-31'),
    text(DATEVALUE(text(year(today()))+'-3-31')-today()),
        IF(
        today() &lt;= DATEVALUE(text(year(today()))+'-6-30'),
        text(DATEVALUE(text(year(today()))+'-9-30')-today()),
            IF(
            today() &lt;= DATEVALUE(text(year(today()))+'-9-30'),
            text(DATEVALUE(text(year(today()))+'-9-30')-today()),
                IF(
                    today() &lt;= DATEVALUE(text(year(today()))+'-12-31'),
                    text(DATEVALUE(text(year(today()))+'-12-31')-today()),
                    'Error'
                )
            )
        )  
)
]]&gt;
&lt;/script&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Typically a CASE function follows this pattern:  CASE(expression,​value1, result1, value2,​ result2,...,​ else_result) which leaves very little room for additional criteria.  Expression is usually the field you will look at the value of, valueX will be the value to look for, and resultX will be the text to display if valueX and resultX match.&lt;br /&gt;
&lt;br /&gt;
The issue we have is valueX will be any date between a given quarters start and end dates (displayed within the AND()s below).  Nothing prevents us from giving an expression of "1" (aka TRUE) and then providing the values as IF statements that return 1 or 0.  We just need to ensure that the datatypes compared match and the criteria doesn't overlap as the first to return 1 or TRUE ends our CASE function.&lt;br /&gt;
&lt;br /&gt;
Using the Case function w/ workaround:&lt;br /&gt;
&lt;script class="brush: java" type="syntaxhighlighter"&gt;
&lt;![CDATA[
        CASE(1,
          IF(
              AND(
                  TODAY() &gt;= DATEVALUE(TEXT(YEAR(TODAY()))+'-01-01'),
                  TODAY() &lt;= DATEVALUE(TEXT(YEAR(TODAY()))+'-03-31')
              ),1,0
            ),'YES',
         IF(
              AND(
                  TODAY() &gt;= DATEVALUE(TEXT(YEAR(TODAY()))+'-04-01'),
                  TODAY() &lt;= DATEVALUE(TEXT(YEAR(TODAY()))+'-06-30')
              ),1,0
            ),'YES', 
         IF(
              AND(
                  TODAY() &gt;= DATEVALUE(TEXT(YEAR(TODAY()))+'-07-01'),
                  TODAY() &lt;= DATEVALUE(TEXT(YEAR(TODAY()))+'-09-30')
              ),1,0
            ),'YES',    
         IF(
              AND(
                  TODAY() &gt;= DATEVALUE(TEXT(YEAR(TODAY()))+'-10-01'),
                  TODAY() &lt;= DATEVALUE(TEXT(YEAR(TODAY()))+'-12-31')
              ),1,0
            ), TEXT(DATEVALUE(TEXT(YEAR(TODAY()))+'-12-31')-TODAY())
        
        
        ,'ELSE')
    
]]&gt;
&lt;/script&gt; </description><link>http://blog.crmscience.com/2012/11/formula-example-days-until-quarters-end.html</link><author>noreply@blogger.com (Kirk Steffke)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3011483083044505303.post-1387032723761554410</guid><pubDate>Wed, 28 Nov 2012 16:00:00 +0000</pubDate><atom:updated>2012-11-28T11:34:43.628-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Mobile</category><category domain="http://www.blogger.com/atom/ns#">Objective-C</category><category domain="http://www.blogger.com/atom/ns#">apex</category><category domain="http://www.blogger.com/atom/ns#">Android</category><category domain="http://www.blogger.com/atom/ns#">iOS</category><category domain="http://www.blogger.com/atom/ns#">Visualforce</category><category domain="http://www.blogger.com/atom/ns#">SDK</category><title>Salesforce Mobile SDK - Mobile Visualforce Page and the Connected App</title><description>This is part two of the Salesforce Mobile SDK Series. &amp;nbsp;Part one is here: &lt;a href="http://blog.crmscience.com/2012/11/salesforce-mobile-sdk-introduction.html"&gt;&amp;nbsp;Salesforce Mobile SDK - Introduction&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
There's one common component between Android and iOS development when creating a hybrid app and that's the Visualforce page. &amp;nbsp;This ability to code it once and use it multiple places was repeatedly touted at Dreamforce '11 and '12. &amp;nbsp;This post will briefly go over the creation of such a page as well as the creation of a Connected App. &lt;br /&gt;
&lt;span style="background-color: white; color: #555555; font-family: Arial, Helvetica, Verdana, sans-serif; font-size: 12px; line-height: 20px;"&gt;&lt;br /&gt;
&lt;/span&gt; &lt;span style="background-color: white; color: #555555; font-family: Arial, Helvetica, Verdana, sans-serif; font-size: 12px; line-height: 20px;"&gt;"Connected App" is an application that can connect to salesforce.com over Identity and Data APIs. Connected Apps use the standard &lt;/span&gt;&lt;a class="external text" href="http://oauth.net/2/" rel="nofollow" style="background-color: white; background-image: none; border: 0px; color: #015ba7; font-family: Arial, Helvetica, Verdana, sans-serif; font-size: 12px; line-height: 20px; margin: 0px; outline: 0px; padding: 0px; text-decoration: none;" title="http://oauth.net/2/"&gt;OAuth 2.0&lt;/a&gt;&lt;span style="background-color: white; color: #555555; font-family: Arial, Helvetica, Verdana, sans-serif; font-size: 12px; line-height: 20px;"&gt;&amp;nbsp;protocol to authenticate, provide Single Sign-On, and acquire access tokens for use with&amp;nbsp;&lt;/span&gt;&lt;a class="external text" href="http://wiki.developerforce.com/page/Integration#Official_Documentation" rel="nofollow" style="background-color: white; background-image: none; border: 0px; color: #015ba7; font-family: Arial, Helvetica, Verdana, sans-serif; font-size: 12px; line-height: 20px; margin: 0px; outline: 0px; padding: 0px; text-decoration: none;" title="http://wiki.developerforce.com/page/Integration#Official_Documentation"&gt;Salesforce APIs&lt;/a&gt;&lt;span style="background-color: white; color: #555555; font-family: Arial, Helvetica, Verdana, sans-serif; font-size: 12px; line-height: 20px;"&gt;... &amp;nbsp;&lt;a href="http://wiki.developerforce.com/page/Connected_Apps"&gt;(read more)&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: white; color: #555555; font-family: Arial, Helvetica, Verdana, sans-serif; font-size: 12px; line-height: 20px;"&gt;&lt;br /&gt;
&lt;/span&gt; 1) &amp;nbsp;Our simple page will take advantage of a few external files, a .CSS file, and two .js &amp;nbsp;found in the CloudTunes sample included within the SalesforcemobileSDK-Samples package. &amp;nbsp;Grab the Static Resource named "cloudtunes_jQuery.resource" and it's accompanying meta.xml from here: &amp;nbsp;&lt;a href="https://github.com/forcedotcom/SalesforceMobileSDK-Samples/tree/master/CloudTunes-metadata/CloudTunes-force/staticresources"&gt;https://github.com/forcedotcom/SalesforceMobileSDK-Samples/tree/master/CloudTunes-metadata/CloudTunes-force/staticresources&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
2) &amp;nbsp;Open Eclipse/Force.com IDE and create a new project for your mobile Visualforce project&lt;br /&gt;
&lt;br /&gt;
3) &amp;nbsp;Copy cloudtunes_jQuery.resource and cloudtunes_jQuery.resource-meta.xml into your project, creating the "staticresources" folder if needed: &amp;nbsp;../Workspaces/ProjectFolder/Project/src/staticresources/&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-caQHu_BvPVg/UKXM7pD4HUI/AAAAAAAAAFM/16LBzuSMOkk/s1600/Selection_020.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="139" src="http://4.bp.blogspot.com/-caQHu_BvPVg/UKXM7pD4HUI/AAAAAAAAAFM/16LBzuSMOkk/s320/Selection_020.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4) &amp;nbsp;Jump back over to your IDE, right-click on your "src" folder and click on "Refresh" to pick up the new files.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-cIjp0OUCMlY/UKXOUqygXjI/AAAAAAAAAFU/glWxICrp6K0/s1600/Selection_022.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="131" src="http://3.bp.blogspot.com/-cIjp0OUCMlY/UKXOUqygXjI/AAAAAAAAAFU/glWxICrp6K0/s320/Selection_022.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
5) &amp;nbsp;Save the Static Resource to the server by right-clicking on your "src" folder within the project explorer, going to "Force.com" and clicking on "Save to Server."&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-vgJBypjfxqw/UKXP4YROBbI/AAAAAAAAAFc/wRjQ422E2w0/s1600/Selection_023.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="134" src="http://2.bp.blogspot.com/-vgJBypjfxqw/UKXP4YROBbI/AAAAAAAAAFc/wRjQ422E2w0/s320/Selection_023.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
6) &amp;nbsp;Now create a new Visualforce page by right-clicking on your project --&amp;gt; New -- &amp;gt; Visualforce Page. &amp;nbsp;Give it a name and click on the "Finish" button.&lt;br /&gt;
&lt;br /&gt;
7) &amp;nbsp;Below is how I've structured my page. &amp;nbsp;Take note of the different div data-role's. &amp;nbsp;Although I'm only creating one Visualforce page, my final product will have four different "screens" (Main, About CRM Science, Ami, and Kirk).&lt;br /&gt;
&lt;br /&gt;
&lt;script class="brush: java" type="syntaxhighlighter"&gt;
&lt;![CDATA[
&lt;apex:page showHeader="false" docType="html-5.0" standardStylesheets="false" cache="true"  &gt;
    &lt;html&gt;
        &lt;head&gt;
            &lt;title&gt;CRM Science&lt;/title&gt;
            &lt;link rel="stylesheet" href="{!URLFOR($Resource.cloudtunes_jQuery, 'jquery.mobile-1.0.1.min.css')}" /&gt;
            &lt;apex:includeScript value="{!URLFOR($Resource.cloudtunes_jQuery, 'jquery.min.js')}"/&gt;
            &lt;apex:includeScript value="{!URLFOR($Resource.cloudtunes_jQuery, 'jquery.mobile-1.0.1.min.js')}"/&gt;
            &lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /&gt;
            &lt;meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no;" /&gt;
        &lt;/head&gt;
   
        &lt;body&gt;
            &lt;div data-role="page" data-theme="b" id="mainpage"&gt;
                &lt;div data-role="header"&gt;
                    &lt;a href='#mainpage' id="logout" class='ui-btn-left' data-icon='home' &gt;Home&lt;/a&gt;
                    &lt;h1&gt;
CRM Science&lt;/h1&gt;
&lt;/div&gt;
&lt;div data-role="content"&gt;
                    &lt;div align="center"&gt;
                        &lt;apex:image value="{!$Resource.logo_CRMScience}"/&gt;
                    &lt;/div&gt;
&lt;ul id="the_list" data-inset="true" data-role="listview"
                        data-theme="c" data-dividertheme="b"&gt;
&lt;li&gt;&lt;a href="#CRMScience"&gt;CRM Science&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#AmiAssayag"&gt;AMI Assayag&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#KirkSteffke"&gt;Kirk Steffke&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div data-role="page" data-theme="b" id="CRMScience"&gt;
                &lt;div data-role="header"&gt;
                    &lt;a href='#mainpage' id="crm_science" class='ui-btn-left' data-icon='arrow-l' &gt;Back&lt;/a&gt;
                    &lt;h1&gt;
CRM Science&lt;/h1&gt;
&lt;/div&gt;
&lt;div data-role="content"&gt;
                    &lt;p&gt;
CRM Science is a full service Salesforce consultancy with extensive expertise in
                    building CRM and native Force.com applications. We concentrate on Salesforce.com
                    projects that improve relationship management, enhance business workflows, and
                    integrate external systems.
                    &lt;/p&gt;
&lt;p&gt;
CRM Science is lead by Ami Assayag, and takes on SFDC projects for one to four
                    developers/administrators.
                    &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div data-role="page" data-theme="b" id="AmiAssayag"&gt;
                &lt;div data-role="header"&gt;
                    &lt;a href='#mainpage' id="backAlbum" class='ui-btn-left' data-icon='arrow-l' &gt;Back&lt;/a&gt;
                    &lt;h1&gt;
Ami Assayag&lt;/h1&gt;
&lt;/div&gt;
&lt;div data-role="content"&gt;
                    &lt;p&gt;
I am a seasoned entrepreneur and CRM specialist who spent many years architecting enterprise
                    CRM applications, both proprietary and on existing CRM platforms.
                    &lt;/p&gt;
&lt;p&gt;
I spent several years developing a proprietary SaaS CRM solution for the alternative
                    asset management market, which was built exclusively on Force.com. The solution offered
                    a single portal through which both investors and investments can be managed, and information
                    can be easily collected and disseminated. The solution is now part of a full service fund
                    management firm.
                    &lt;/p&gt;
&lt;p&gt;
I co-founded a venture backed CRM solution for individuals and small businesses that
                     provided value throughout their sales and business development processes by incorporating
                     networking activities, social infusion, intelligence, and workflow into traditional CRM.
                    &lt;/p&gt;
&lt;p&gt;
I also served as an Entrepreneur in Residence at an east coast venture fund exploring the CRM space.
                    &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div data-role="page" data-theme="b" id="KirkSteffke"&gt;
                &lt;div data-role="header"&gt;
                    &lt;a href='#mainpage' id="backAlbum" class='ui-btn-left' data-icon='arrow-l' &gt;Back&lt;/a&gt;
                    &lt;h1&gt;
Kirk Steffke&lt;/h1&gt;
&lt;/div&gt;
&lt;div data-role="content"&gt;
                    &lt;p&gt;
Kirk is an experienced Salesforce.com developer, having spent the past few years
                    supporting a Philadelphia 100 and Inc. 5000 firm in the retirement space.
                    &lt;/p&gt;
&lt;p&gt;
While serving as a key employee in the company's IT department, Kirk spent much
                    of his time developing the many custom solutions that tie employees, external
                    proprietary systems, and Salesforce.com together, making the Force.com platform
                    an integral keystone in the company's success.
                    &lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/body&gt;
    &lt;/html&gt;
&lt;/apex:page&gt;
]]&gt;
&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
Now that we have the page, it's time to create a "Connected App" within our Salesforce org. &amp;nbsp;Again, a "Connected App" is defined as an app that leverages the Identity and Data APIs to connect to Salesforce. &amp;nbsp;If you're familiar with "Remote Apps," Connected Apps are meant to be an updated replacement, including additional features giving you the power to limit who can use the app and which security policies are used by the app. &amp;nbsp;After the app is created, we'll also receive our Consumer Key and Secret values that are used when creating the hybrid app in Xcode or Eclipse.&lt;br /&gt;
&lt;br /&gt;
Configuring a custom app is a straightforward process. &amp;nbsp;First you define the OAuth metadata with details like the app name, description, callback URL, operational IP range (optional), as well as info about enforceable mobile policies (also optional).&lt;br /&gt;
&lt;br /&gt;
1) &amp;nbsp;Navigate to Setup --&amp;gt; &amp;nbsp;App Setup --&amp;gt; Create --&amp;gt; Apps and click on the "New" button within the "Connected Apps" section.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-iL2-YEcfhVY/UKfJLLkCxXI/AAAAAAAAAFs/Q4NDYUluAuU/s1600/Selection_001.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="78" src="http://2.bp.blogspot.com/-iL2-YEcfhVY/UKfJLLkCxXI/AAAAAAAAAFs/Q4NDYUluAuU/s320/Selection_001.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
2) &amp;nbsp;Provide the "Basic Information" for your app.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-Y1sIuzfqUtI/UKfJ6--zTbI/AAAAAAAAAF0/RfMSKM1XVkg/s1600/Selection_004.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-Y1sIuzfqUtI/UKfJ6--zTbI/AAAAAAAAAF0/RfMSKM1XVkg/s1600/Selection_004.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
3) &amp;nbsp;Next, define the details for the API Integration. &amp;nbsp;For the Callback URL, I've defined "testsfdc:///mobilesdk/detect/oauth/done" and selected the "Access your basic information" OAuth scope.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-rFyn9TiDzuo/UKfKGlRtd7I/AAAAAAAAAF8/bzHaOxRN-wc/s1600/Selection_005.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-rFyn9TiDzuo/UKfKGlRtd7I/AAAAAAAAAF8/bzHaOxRN-wc/s1600/Selection_005.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
4) &amp;nbsp;Click on the "Save" button and you'll be taken to your new Connected App's record. &amp;nbsp;Notice the Version, Status, Consumer Key, and Consumer Secret fields.&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-UkGKbLKYjbA/UKfLmARLSaI/AAAAAAAAAGE/lFjFlQBpNBQ/s1600/Selection_001.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-UkGKbLKYjbA/UKfLmARLSaI/AAAAAAAAAGE/lFjFlQBpNBQ/s1600/Selection_001.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
Now you're ready to begin your hybrid app "development." &amp;nbsp;In the upcoming posts, you'll see how to configure your dev environments (Xcode or Eclipse) and how to use the Salesforce Mobile SDK to take advantage of the power of your Visualforce page.&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;br /&gt;&lt;/div&gt;
</description><link>http://blog.crmscience.com/2012/11/mobile-sdk-visualforce-connected-app.html</link><author>noreply@blogger.com (Kirk Steffke)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-caQHu_BvPVg/UKXM7pD4HUI/AAAAAAAAAFM/16LBzuSMOkk/s72-c/Selection_020.png" height="72" width="72" /><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3011483083044505303.post-1907909294145101054</guid><pubDate>Wed, 21 Nov 2012 16:00:00 +0000</pubDate><atom:updated>2012-11-21T11:02:40.186-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Mobile</category><category domain="http://www.blogger.com/atom/ns#">Objective-C</category><category domain="http://www.blogger.com/atom/ns#">apex</category><category domain="http://www.blogger.com/atom/ns#">Android</category><category domain="http://www.blogger.com/atom/ns#">iOS</category><category domain="http://www.blogger.com/atom/ns#">Visualforce</category><category domain="http://www.blogger.com/atom/ns#">SDK</category><title>Salesforce Mobile SDK - Introduction</title><description>It's hard to avoid the excitement that is being generated as a result of Salesforce.com's mobile SDK.  If you made the pilgrimage this September to Dreamforce in San Francisco or braved the rain at this month's Cloudforce in New York, you may have surely been exposed to the mobile SDK in one way or another.  This year's Dreamforce App took advantage of the Salesforce Touch Platform.  Several of the sessions at both events demonstrated just how easy it was to develop an app for both the Android and iOS platforms while minimizing the amount of code that had to be rewritten.   &lt;br /&gt;
&lt;br /&gt;
Using the Salesforce Touch Platform, you can develop apps in three ways - each has their own unique advantages and disadvantages.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Native&lt;/b&gt;&lt;br /&gt;
Coding is specific to the platform, meaning your using the traditional development tools and languages used in iOS and Android development.  This approach requires you to be well versed in Objective-C for iOS, Java for Android, and to be able to navigate their respective environments, Xcode and Eclipse.  Once developed, these apps are packaged and made available on the platforms' app market places.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;HTML5&lt;/b&gt;&lt;br /&gt;
Using stadard web technologies, like HTML5, Javascript, and CSS, web pages are created to mimic the look and feel of native apps.  However, these are not downloaded from the platforms' app market places, but are accessed via the mobile device's browser.  Many of the device's native hardware functions are not accessible using this approach.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Hybrid&lt;/b&gt;&lt;br /&gt;
Using the hybrid approach, you can take advantage of the write-once-run-anywhere philosophy and wrap an HTML5 page (or Visualforce page) within a native app container while having access to a device's hardware capabilities, without needing to know Objective-C or Java.&lt;br /&gt;
&lt;br /&gt;
Over a series of posts to follow, I will detail the creation of an HTML5 based Visualforce page and how to generate both an Android and iOS app, using the same page.  These posts will also detail the steps required to setup both development environments.</description><link>http://blog.crmscience.com/2012/11/salesforce-mobile-sdk-introduction.html</link><author>noreply@blogger.com (Kirk Steffke)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3011483083044505303.post-8991362761075601867</guid><pubDate>Tue, 20 Nov 2012 16:00:00 +0000</pubDate><atom:updated>2012-11-20T14:06:51.422-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">admin</category><category domain="http://www.blogger.com/atom/ns#">formula</category><category domain="http://www.blogger.com/atom/ns#">round</category><category domain="http://www.blogger.com/atom/ns#">if</category><category domain="http://www.blogger.com/atom/ns#">administration</category><category domain="http://www.blogger.com/atom/ns#">now</category><title>Formula Example - Case Days Open</title><description>Today's Formula&amp;nbsp;calculates either the number of days a case was open before being closed or the number of days the case has been open since it was created.&lt;br /&gt;
&lt;script class="brush: java" type="syntaxhighlighter"&gt;
&lt;![CDATA[
IF(
    IsClosed,
    ROUND(ClosedDate - CreatedDate, 0), 
    ROUND((NOW() - CreatedDate),0)
)
]]&gt;
&lt;/script&gt; &lt;br /&gt;
This formula uses 3 different functions:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="http://login.salesforce.com/help/doc/en/customize_functions_i_z.htm#IF"&gt;IF(logical_test, value_if_true, value_if_false)&lt;/a&gt;&amp;nbsp;-&amp;nbsp;Determines if expressions are true or false. Returns a given value if true and another value if false.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://login.salesforce.com/help/doc/en/customize_functions_i_z.htm#ROUND"&gt;ROUND(number, num_digits)&lt;/a&gt;&amp;nbsp;-&amp;nbsp;Returns the nearest number to a number you specify, constraining the new number by a specified number of digits.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://login.salesforce.com/help/doc/en/customize_functions_i_z.htm#NOW"&gt;NOW()&lt;/a&gt;&amp;nbsp;-&amp;nbsp;Returns a date/time representing the current moment.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
Here's a Case view that displays two cases, both open and closed, the fields referenced by the above formula and the formula field itself (# of Days Open).&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-a2ZYpMvBf4M/UKlFsz-rs9I/AAAAAAAAAGY/kYO5ELjQ6oU/s1600/Selection_001.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="113" src="http://2.bp.blogspot.com/-a2ZYpMvBf4M/UKlFsz-rs9I/AAAAAAAAAGY/kYO5ELjQ6oU/s640/Selection_001.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;</description><link>http://blog.crmscience.com/2012/11/formula-example-case-days-open.html</link><author>noreply@blogger.com (Kirk Steffke)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-a2ZYpMvBf4M/UKlFsz-rs9I/AAAAAAAAAGY/kYO5ELjQ6oU/s72-c/Selection_001.png" height="72" width="72" /><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3011483083044505303.post-8337031075674202788</guid><pubDate>Mon, 12 Nov 2012 14:39:00 +0000</pubDate><atom:updated>2012-11-12T09:39:00.621-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">SOQL</category><category domain="http://www.blogger.com/atom/ns#">regex</category><category domain="http://www.blogger.com/atom/ns#">Business Time</category><category domain="http://www.blogger.com/atom/ns#">apex</category><category domain="http://www.blogger.com/atom/ns#">Workflow</category><title>Using Business Time to Set Workflow Task Due Date</title><description>A couple of weeks ago I posted &lt;a href="http://blog.crmscience.com/2012/10/assigning-workflow-task-owner-to.html"&gt;a hack that enables assigning a workflow task to a related user on the triggering object&lt;/a&gt;. This works with a class called WorkflowInstructions that parses a task descriptions and looks for a familiar string format (a "workflow instruction"). Once a workflow instruction is found, the class processes the workflow task according to the instructions.
&lt;br /&gt;
&lt;br /&gt;
Since the code allows processing of several types of workflow instructions, here is another useful use case... setting activity cto a certain number of &lt;b&gt;business days&lt;/b&gt; from the case create date. For some reason, business hours is available in apex, but not when setting workflow tasks.
&lt;br /&gt;
&lt;br /&gt;
So here is what you need to add to the previous post code sample:
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Add a business hours variable to hold your selected business hours record.&lt;/li&gt;
&lt;li&gt;add 'businesstime' when checking for workflow instructions.&lt;/li&gt;
&lt;li&gt;add a method that processes the 'businesstime' workflow instruction.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;script class="brush: java" type="syntaxhighlighter"&gt;

&lt;![CDATA[
public with sharing class WorkflowInstructions {

    // static variable to determine if the trigger is running more than once in one execution context.
    // no need to rerun ProcessInstructions logic again if it is not the first pass.
    public static boolean alreadyRan = false;

    // prepare business hour object incase it is needed later
    static BusinessHours bh = [SELECT Id FROM BusinessHours WHERE IsDefault=true LIMIT 1];
    
    public static void ProcessInstructions (List&lt;task&gt; tasks) {
        
        for (Task t : tasks) {
            // check if this record was flagged with workflow instructions
            if (t.Description != null &amp;&amp; t.Description.toLowerCase().contains('#instruction')) {
 
                // go through each workflow instructions for this record
         string[] workflowInstructions = t.Description.toLowerCase().split('#instruction');
         for (integer i=1; i &lt; workflowInstructions.size(); i++) {
 
                    // check what type of instruction needs to be processed
                    // params[0] = 'instruction'
                    // params[1] = workflow instruction type
                    string[] params = workflowInstructions[i].split('#');
             
                    if (params.size() &gt;= 5 &amp;&amp; params[1]=='setfield')
                        // call the method that sets the field value
                        SetFieldInstruction(t, params);
                        // call the method that sets the field value
                    else if (params.size() &gt;= 6 &amp;&amp; params[1]=='businesstime')
                        // call the method that determine business time
                        BusinessTimeInstruction(t, params);

                    // after processing all the workflow instructions, clean up the task description with a regex replace
                    t.Description = t.Description.replaceall('#instruction#(.*?)#end#','');
                }
            }
        }
    }

    // this is business time workflow instruction
    // example: #instruction#businesstime#Case#createdDate#5#days#end#
    // example explanation: set activity due date to five business days from the case create date 
    // params[2] = Null or date reference (object name)
    // params[3] = Null or date reference (field name within param[2])
    // params[4] = interval (number of business hours/days)
    // params[5] = scale (hours/days)
    public static void BusinessTimeInstruction (Task t, string[] params) {
    
        datetime baselineDatetime = system.now();
            
        if (params[2] != null &amp;&amp; params[2].length() &gt; 0) { 
            // get the relevant date from the whatid and change the basline date
            List&lt;sobject&gt; sol = Database.query('SELECT ' + params[3] + ' FROM ' + params[2] + ' WHERE Id = \'' + t.whatId + '\' LIMIT 1');
            if (!sol.IsEmpty()) {
                baselineDatetime = datetime.valueof(sol[0].get(params[3]));
            }
        }

        // figure out the interval 
        integer interval = integer.valueOf(params[4]);
        if (params[5] == 'days')  // if scale is days, multiply by 11 (PCS has 11 hrs per work day)
            interval *= 11;

        // figure out when the activity should occur and add to the task 
        t.put('ActivityDate', date.valueof(BusinessHours.add(bh.id, baselineDatetime, interval * 60 * 60 * 1000L)));
    }
}
]]&gt;

&lt;/script&gt;

&lt;br /&gt;
You still need the code for the trigger as in the previous post:

&lt;script class="brush: java" type="syntaxhighlighter"&gt;

&lt;![CDATA[
trigger Task_Insert_WfInstructions on Task (before insert) {

    if (!WorkflowInstructions.alreadyRan) {
        // process the workflow instructions
        WorkflowInstructions.ProcessInstructions(trigger.new);
        
        // change the execution context flag to already ran.
        WorkflowInstructions.alreadyRan = true;
    }
}
]]&gt;

&lt;/script&gt;

And now, all you have to do to make the workflow work is to set up the workflow instruction in the description of the workflow task. The trigger will fire, then change the task activity due date, and then remove the instruction from the description. here is an example:
&lt;br /&gt;

&lt;br /&gt;
&lt;a href="http://3.bp.blogspot.com/-Hh0d8uSLBUY/UJ5psjHocKI/AAAAAAAAANA/9R7LeL-yHjY/s1600/WorkflowInstructionBusinessTime.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-Hh0d8uSLBUY/UJ5psjHocKI/AAAAAAAAANA/9R7LeL-yHjY/s1600/WorkflowInstructionBusinessTime.png" /&gt;&lt;/a&gt;

</description><link>http://blog.crmscience.com/2012/11/using-business-time-to-set-workflow.html</link><author>noreply@blogger.com (Ami Assayag)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-Hh0d8uSLBUY/UJ5psjHocKI/AAAAAAAAANA/9R7LeL-yHjY/s72-c/WorkflowInstructionBusinessTime.png" height="72" width="72" /><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3011483083044505303.post-8575462684109689651</guid><pubDate>Wed, 07 Nov 2012 02:32:00 +0000</pubDate><atom:updated>2012-11-06T21:32:22.466-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">classify</category><category domain="http://www.blogger.com/atom/ns#">bucket</category><category domain="http://www.blogger.com/atom/ns#">formula</category><category domain="http://www.blogger.com/atom/ns#">categorize</category><category domain="http://www.blogger.com/atom/ns#">report</category><title>Using Bucket Fields for Organized Reporting</title><description>Up until the Spring '12 release, if you wanted to categorize data within your reports, you had to create additional formula fields to do your classifications and then pull these new fields onto your report.  With the advent of reporting buckets, you can easily categorize records within your reports on the fly, directly from the report builder screens.&lt;br /&gt;
&lt;br /&gt;
For this example, let's say you have a set of Account records, each having the standard currency field "Annual Revenue" populated.  For reporting purposes, you want to categorize your Account records into three different tiers.&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;
&lt;b&gt;Gold:&lt;/b&gt;  Annual Revenue &amp;gt; 3,000,000&lt;br /&gt;
&lt;b&gt;Silver&lt;/b&gt;:  Annual Revenue between 1,000,000 and 3,000,000&lt;br /&gt;
&lt;b&gt;Bronze:&lt;/b&gt;  Annual Revenue below 1,000,000&lt;/blockquote&gt;
&lt;br /&gt;
Before buckets were introduced, you may have created a formula field that looks like this:&lt;br /&gt;
&lt;br /&gt;
&lt;script class="brush: java" type="syntaxhighlighter"&gt;

&lt;![CDATA[
IF(AnnualRevenue &gt; 3000000,'Gold',
    IF(AND(AnnualRevenue &gt;= 1000000, AnnualRevenue &lt;= 3000000),'Silver',
        IF(AND(AnnualRevenue &lt; 1000000, AnnualRevenue &gt; 0),'Bronze','Not Rated')
    )
)
]]&gt;
&lt;/script&gt; &lt;br /&gt;
While this works, you've just created a field for this very specific purpose.  &lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://2.bp.blogspot.com/-oUD8JDPyWZc/UJlvjx6ox8I/AAAAAAAAABU/lJOqGI259AI/s1600/bucket_4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="258" src="http://2.bp.blogspot.com/-oUD8JDPyWZc/UJlvjx6ox8I/AAAAAAAAABU/lJOqGI259AI/s320/bucket_4.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Bucketing can help you (and your non-admin employees) more efficiently do the same by following these steps:&lt;br /&gt;
&lt;br /&gt;
1) &amp;nbsp;To create a new Bucket field, within a new/existing report, click on the "Add Bucket" link within the fields section. &lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-tkDPMYeUvrM/UJlnn0Wu4ZI/AAAAAAAAAAs/-MxDYdBeGzw/s1600/bucket_1.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-tkDPMYeUvrM/UJlnn0Wu4ZI/AAAAAAAAAAs/-MxDYdBeGzw/s1600/bucket_1.PNG" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
2) &amp;nbsp;Next, specify a source field in the "Source Column," give your Bucket field a name, and define your ranges:﻿&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-muGEFdVa6WE/UJlotoJWHJI/AAAAAAAAAA4/CmziVi8SgTI/s1600/bucket_5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="276" src="http://4.bp.blogspot.com/-muGEFdVa6WE/UJlotoJWHJI/AAAAAAAAAA4/CmziVi8SgTI/s400/bucket_5.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
3) &amp;nbsp;Click on the "OK" button and you'll see your newly created "Service Level" field within your report grid:﻿&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-3S38Qy4H_Vg/UJlpkNgXqRI/AAAAAAAAABE/1CWeJ_8qDt0/s1600/bucket_6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-3S38Qy4H_Vg/UJlpkNgXqRI/AAAAAAAAABE/1CWeJ_8qDt0/s1600/bucket_6.png" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Unfortunately, the current bucketing offering lacks the ability to create and use filters.&lt;br /&gt;
&lt;br /&gt;
What if you had a client that has been with you from day one.  Sounds like instant "Gold" level client criterion to me.  It would be great to be able to include additional criteria, in this case something like "Initial Contract Date &amp;lt; 1/1/2005" = Gold, to the bucket calculations.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;u&gt;Additional Information:&amp;nbsp;&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;
Bucketing in Reports:  &lt;a href="http://www.youtube.com/watch?v=QFYEtBtLHG4"&gt;http://www.youtube.com/watch?v=QFYEtBtLHG4&lt;/a&gt;&lt;br /&gt;
Categorizing Data Quickly with Buckets:  &lt;a href="http://na9.salesforce.com/help/doc/en/reports_bucketing_overview.htm"&gt;http://na9.salesforce.com/help/doc/en/reports_bucketing_overview.htm&lt;/a&gt;</description><link>http://blog.crmscience.com/2012/11/using-bucket-fields-for-organized.html</link><author>noreply@blogger.com (Kirk Steffke)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-oUD8JDPyWZc/UJlvjx6ox8I/AAAAAAAAABU/lJOqGI259AI/s72-c/bucket_4.png" height="72" width="72" /><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3011483083044505303.post-5160439315231569753</guid><pubDate>Mon, 29 Oct 2012 14:03:00 +0000</pubDate><atom:updated>2012-11-10T09:38:04.820-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">SOQL</category><category domain="http://www.blogger.com/atom/ns#">regex</category><category domain="http://www.blogger.com/atom/ns#">apex</category><category domain="http://www.blogger.com/atom/ns#">Workflow</category><title>Assigning Workflow Task Owner to a Related User</title><description>I recently had to come up with a way to assign a workflow task to a related user on the triggering object. That functionality is not available Since a workflow task can only be assigned to the record owner, a specific user or a role. The object that causes the workflow to fire has several user lookup fields, and based on specific events, one of the users specified by these fields needs to be set as the assigned user for the task that is created by the workflow. 
&lt;br /&gt;
&lt;br /&gt;
I decided to use a trigger on the task object to get the job done. I also decided to write the code in a pretty generic way because I think that there may be other uses for this piece of code. So what I did is create a class called WorkflowInstructions that parses the task description, looking for a familiar string format (a "workflow instruction") and based on what it finds, do something (in this case, assign the task owner to a related user on the originally fired object). Not sure I am doing a good job explaining this in words, so lets get to the actual code...

&lt;br /&gt;
&lt;br /&gt;
&lt;script class="brush: java" type="syntaxhighlighter"&gt;

&lt;![CDATA[
public with sharing class WorkflowInstructions {

    // static variable to determine if the trigger is running more than once in one execution context.
    // no need to rerun ProcessInstructions logic again if it is not the first pass.
    public static boolean alreadyRan = false;
    
    public static void ProcessInstructions (List&lt;task&gt; tasks) {
        
        for (Task t : tasks) {
            // check if this record was flagged with workflow instructions
            if (t.Description != null &amp;&amp; t.Description.toLowerCase().contains('#instruction')) {
 
                // go through each workflow instructions for this record
         string[] workflowInstructions = t.Description.toLowerCase().split('#instruction');
         for (integer i=1; i &lt; workflowInstructions.size(); i++) {
 
                    // check what type of instruction needs to be processed
                    // params[0] = 'instruction'
                    // params[1] = workflow instruction type
                    string[] params = workflowInstructions[i].split('#');
             
                    if (params.size() &gt;= 5 &amp;&amp; params[1]=='setfield')
                        // call the method that sets the field value
                        SetFieldInstruction(t, params);
                    else if (params.size() &gt;= 6 &amp;&amp; params[1]=='SomeOtherInstruction')
                        // call some other method
                        DoSomeOtherInstruction(t, params);

                    // after processing all the workflow instructions, clean up the task description with a regex replace
                    t.Description = t.Description.replaceall('#instruction#(.*?)#end#','');
                }
            }
        }
    }

    // this is set-field workflow instruction
    // example: #instruction#setfield#Opportunity#Installer__c#Ownerid#end#
    // example explanation: set the task's Assigned To field to the value in Opportunity.Installer__c
    // params[2] = copy from object (object name to copy data from)
    // params[3] = copy from field (field name within param[2])
    // params[4] = copy to field (field name in task to copy data into)
    public static void SetFieldInstruction (Task t, string[] params) {

        if (params[2] != null &amp;&amp; params[2].length() &gt; 0) { 
            // get the relevant value from the whatid
            List&lt;sobject&gt; sol = Database.query('SELECT ' + params[3] + ' FROM ' + params[2] + ' WHERE Id = \'' + t.whatId + '\' LIMIT 1');

            if (!sol.IsEmpty())
             if (sol[0].get(params[3]) != null)
                    // set the copy to field (params[4]) to the value that was received
              t.put(params[4], sol[0].get(params[3]));
        }
    }
}    
]]&gt;

&lt;/script&gt;

&lt;br /&gt;
So now that we have a nice generic class,here is the code for the trigger:

&lt;script class="brush: java" type="syntaxhighlighter"&gt;

&lt;![CDATA[
trigger Task_Insert_WfInstructions on Task (before insert) {

    if (!WorkflowInstructions.alreadyRan) {
        // process the workflow instructions
        WorkflowInstructions.ProcessInstructions(trigger.new);
        
        // change the execution context flag to already ran.
        WorkflowInstructions.alreadyRan = true;
    }
}
]]&gt;

&lt;/script&gt;

&lt;br /&gt;
And now, all you have to do to make the workflow work is to set up the workflow instruction in the description of the workflow task. The trigger will fire, change the owner of the task to the related user, and then remove the instruction from the description. here is an example:
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-hX0tMWkR_Dw/UI2uVGJpQ-I/AAAAAAAAAMs/O3NqajQ2FVc/s1600/WorkflowInstruction.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-hX0tMWkR_Dw/UI2uVGJpQ-I/AAAAAAAAAMs/O3NqajQ2FVc/s1600/WorkflowInstruction.png" /&gt;&lt;/a&gt;&lt;/div&gt;
</description><link>http://blog.crmscience.com/2012/10/assigning-workflow-task-owner-to.html</link><author>noreply@blogger.com (Ami Assayag)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-hX0tMWkR_Dw/UI2uVGJpQ-I/AAAAAAAAAMs/O3NqajQ2FVc/s72-c/WorkflowInstruction.png" height="72" width="72" /><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3011483083044505303.post-2695908412220185111</guid><pubDate>Mon, 24 Sep 2012 18:27:00 +0000</pubDate><atom:updated>2012-09-24T14:27:47.930-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Dreamforce</category><category domain="http://www.blogger.com/atom/ns#">apex</category><title>Dreamforce Session Slides: Top Testing Tips</title><description>Here are the final slides from my session with &lt;a href="http://twitter.com/wesnolte" target="_blank"&gt;Wes Nolte&lt;/a&gt;&amp;nbsp;at Dreamforce last week.&lt;br /&gt;
&lt;br /&gt;
&lt;iframe frameborder="0" height="400" marginheight="0" marginwidth="0" scrolling="no" src="http://www.slideshare.net/slideshow/embed_code/14436668?hostedIn=slideshare&amp;amp;page=upload" width="476"&gt;&lt;/iframe&gt;
</description><link>http://blog.crmscience.com/2012/09/dreamforce-session-slides-top-testing.html</link><author>noreply@blogger.com (Ami Assayag)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3011483083044505303.post-2813709960742576348</guid><pubDate>Thu, 13 Sep 2012 02:53:00 +0000</pubDate><atom:updated>2012-09-12T22:53:08.012-04:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">AppExchange</category><category domain="http://www.blogger.com/atom/ns#">Dreamforce</category><title>AppExchange Listing DevZone Session at Dreamforce</title><description>&lt;div class="separator" style="clear: both; text-align: left;"&gt;
&lt;a href="http://1.bp.blogspot.com/-_4C5Fz87dAI/UDkrsfp_9vI/AAAAAAAAAKg/XVjMmTMNb84/s1600/DreamforceSmall.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="61" src="http://1.bp.blogspot.com/-_4C5Fz87dAI/UDkrsfp_9vI/AAAAAAAAAKg/XVjMmTMNb84/s320/DreamforceSmall.jpg" width="320" /&gt;&lt;/a&gt;I am now going to lead a DevZone session at dreamforce about the AppExchange listing process. I am going to use a &lt;a href="http://blog.crmscience.com/2012/03/step-by-step-guide-to-salesforce.html" target="_blank"&gt;blog post I wrote a few months ago&lt;/a&gt;&amp;nbsp;as a rough agenda, and hope to share a more personal account of my experience in this area.&amp;nbsp;&lt;/div&gt;
&lt;br /&gt;
Here is the official Dreamforce session info:&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Step By Step Guide To Salesforce AppExchange Listing&lt;/strong&gt;&lt;br /&gt;
When: Wednesday, September 19th: 4:30 PM - 5:30 PM&lt;br /&gt;
Where: Moscone Center West, DevZone Unconference A&lt;br /&gt;
Description: Developing and packaging Salesforce.com apps is not that complicated, if you already have experience with SFDC or know what to look for. However, starting a provider relationship with Salesforce and navigating through all the orgs, requests, cases, and account execs is a complex and confusing process. This is an account of a recent AppExchange listing.&lt;br /&gt;
&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;
&lt;a href="https://dreamevent.my.salesforce.com/apex/CalendarView#a093000000VurMQAAZ" target="_blank"&gt;Click here&lt;/a&gt; to see this session in the Dreamforce App, and to join the conversation on Chatter.</description><link>http://blog.crmscience.com/2012/09/appexchange-listing-devzone-session-at.html</link><author>noreply@blogger.com (Ami Assayag)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-_4C5Fz87dAI/UDkrsfp_9vI/AAAAAAAAAKg/XVjMmTMNb84/s72-c/DreamforceSmall.jpg" height="72" width="72" /><thr:total>0</thr:total></item></channel></rss>
