tag:blogger.com,1999:blog-22325389879068032752024-03-12T12:04:58.922-07:00The Simon Lawrence Application Development BlogSimon Lawrencehttp://www.blogger.com/profile/06468439024017853489noreply@blogger.comBlogger41125tag:blogger.com,1999:blog-2232538987906803275.post-8133751370405309032018-01-17T04:38:00.000-08:002018-01-17T06:09:04.805-08:00Get developing advanced UX fast and free with Salesforce and SkuidI always appreciate it when a technology provider offers a free entry path for developers to get their hands on their product, to have a play, poke around and see what it can do. I can't think of a better marketing tool than letting the people who will be responsible for deploying a product familiarise themselves with it first, and if it's any good - potentially become advocates and inadvertent salespeople themselves.<br />
<br />
Skuid and Salesforce are brilliant example of this. If you want to try your hand at developing on the Salesforce platform, all it takes in 3 minutes and an e-mail address. If you then want to try your hand at building some of the most glamorous and productive user interfaces using Skuid, you can be equally up and running within the time it takes to boil a kettle too.<br />
<br />
Here is my quick low down on how to do that.<br />
<br />
First, get yourself a Salesforce Developer Edition. Navigate your browser to<br />
<br />
<a href="https://developer.salesforce.com/signup">https://developer.salesforce.com/signup</a><br />
<br />
and fill in the easy form. Remember the beauty of Salesforce Usernames is that they have to be in the <b>form</b> of an e-mail address; but not an actual e-mail address. They also have to be unique across <b>all</b> of Salesforce, so I normally go for a clever little intuitive trick like "<i>simon.lawrence@myfirstskuid.com"</i> - pretty guaranteed to be unique, memorable, and in the form of an e-mail.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4Llxp2YXNRExtqNLY82SNQlHJs3iVjndErRkc6cOOb6tQXA-H_3tfMURikOdXheOtdnpKAlCTzaFkusZ-cWaMtMi7ZQMoSopXWcbjl4qf7S_icSDbDE7l8f2iwViF_9Unoo-oIpzAfVf1/s1600/DeveloperEdition.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="897" data-original-width="1443" height="395" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh4Llxp2YXNRExtqNLY82SNQlHJs3iVjndErRkc6cOOb6tQXA-H_3tfMURikOdXheOtdnpKAlCTzaFkusZ-cWaMtMi7ZQMoSopXWcbjl4qf7S_icSDbDE7l8f2iwViF_9Unoo-oIpzAfVf1/s640/DeveloperEdition.jpg" width="640" /></a></div>
<br />
<br />
<br />
So, now you have a Salesforce instance so you just need to get Skuid <i>in</i> there and working. For this get yourself another tab (tabs are fun) and navigate to the AppExchange page for Skuid: <a href="https://appexchange.salesforce.com/appxListingDetail?listingId=a0N30000009wyDjEAI">https://appexchange.salesforce.com/appxListingDetail?listingId=a0N30000009wyDjEAI</a><br />
<br />
Click<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEju4hUEIrWFTYNj8x7XHpVJVCm5xndLfTgG4svpD7t4w-EQc1-DllR3PcwUq_3fFTUOzvaeP9oXHDwL7lGlKwpzg7q2EG7uRR1KCzMoVJmaUdxXrzAd3iiZcysKoHBS6G4CiWOMgHd-Quop/s1600/getitnow.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="60" data-original-width="150" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEju4hUEIrWFTYNj8x7XHpVJVCm5xndLfTgG4svpD7t4w-EQc1-DllR3PcwUq_3fFTUOzvaeP9oXHDwL7lGlKwpzg7q2EG7uRR1KCzMoVJmaUdxXrzAd3iiZcysKoHBS6G4CiWOMgHd-Quop/s1600/getitnow.jpg" /></a></div>
<br />
<br />
<br />
<br />
<br />
At the bottom of the page and install Skuid in a <b>Production</b> Org. Make sure you are not logged into any other Salesforce orgs! There is a confirmation page showing where it will be installed, and sometimes you are forced to re-authenticate to be sure. Install it for all users (probably) and wait a few minutes for it to chun over (this is the moment to boil that kettle).<br />
<br />
It might tell you it will e-mail you when it's finished, or it might just take you to your Installed Packages, depending on how fast the Cloud is feeling.<br />
<br />
Either way, just sip your tea/coffee/vodka and and in a few minutes Skuid will be there.<br />
<br />
Once it's installed, click on the App Manager icon (loads of little dots) and then select "Skuid Central" from your "All Items" list.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEis_QvQGDw2gygFDx5dwireWfZJSf33ET-ge2PGE4sQa0Dcd9hUmqaY2cJQozZe8oQeNxBIaZbuN0Dyk06VilviAlA72CNBxTsw5VrQaKUJ1JZcndMJNx-Okx6vGOCV1hFH74fqjKxcyRWj/s1600/appmanager.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="861" data-original-width="1421" height="386" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEis_QvQGDw2gygFDx5dwireWfZJSf33ET-ge2PGE4sQa0Dcd9hUmqaY2cJQozZe8oQeNxBIaZbuN0Dyk06VilviAlA72CNBxTsw5VrQaKUJ1JZcndMJNx-Okx6vGOCV1hFH74fqjKxcyRWj/s640/appmanager.jpg" width="640" /></a></div>
<br />
<br />
You are now up and running in Skuid! You will see the "Lets Get Started" page and the black banner that will soon become your best friend.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjz0Ip49BPkGCnNXnDZA8MaGh7RH_Rx0tnj3SlRxo4iVGjOvhlK9oz88BQuQE6wlXXV8eEVOpvwkvP8JMIJhcJCioWGEp_qMnve8EdFD3kACOONYg4otipQjyrV9tqK3tebRQnO-KrCoLlL/s1600/skuidgetstarted.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="419" data-original-width="1423" height="188" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjz0Ip49BPkGCnNXnDZA8MaGh7RH_Rx0tnj3SlRxo4iVGjOvhlK9oz88BQuQE6wlXXV8eEVOpvwkvP8JMIJhcJCioWGEp_qMnve8EdFD3kACOONYg4otipQjyrV9tqK3tebRQnO-KrCoLlL/s640/skuidgetstarted.jpg" width="640" /></a></div>
<br />
<br />
<br />
<b>But that's not quite it!</b><br />
<br />
You only have a 30 day trial at the moment, and you are not going to want to lose all your hard Skuiding (* not an official verb) in a months time... so...<br />
<br />
...here's <b>my favorite bit,</b> if you head to the Skuid sign up page at <a href="https://www.skuid.com/free-trial/" target="_blank">https://www.skuid.com/free-trial/</a>, there is a link at the bottom to turn your 30 day trial into an unlimited, full installation to play in forever.<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgX5bEsSshXzJUFCnlN0DtxJUdkNIhxyF0nlmKcTzQ9THZmQMRxHDRH9820LB8YUiCu6VFGAtjnkKnSZEDAh1EKnPhQRD2BBiBCTg8QcoJ_kRSUBkypg1tuzbDSafKafbd4mRWquOHoAxSz/s1600/unlimited.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="258" data-original-width="743" height="222" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgX5bEsSshXzJUFCnlN0DtxJUdkNIhxyF0nlmKcTzQ9THZmQMRxHDRH9820LB8YUiCu6VFGAtjnkKnSZEDAh1EKnPhQRD2BBiBCTg8QcoJ_kRSUBkypg1tuzbDSafKafbd4mRWquOHoAxSz/s640/unlimited.jpg" width="640" /></a></div>
Click that link and fill in the form (change the radio button to Salesforce when it asks you what type of licence you want) - this will contact Skuid, and very shortly someone will flip the switch to make your Skuid licence endless and all-powerful (you don't need to wait for that though).<br />
<br />
FYI your OrgId is shown on the "Company Information" page - available from the Setup menu:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBvRMRE4mUXoaUbS9NvJrBPc2LEifLknNxIVJspDl7Gol_JXx22yz0E8xS_lREJML8wrFidktIPTAYOdh7D1dtoUimLVFM1E-tlTim6Tqc9olXryEblNQgQRfeh6WDfmoLqBpY2RWq33wj/s1600/companyinfo.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="639" data-original-width="1312" height="310" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBvRMRE4mUXoaUbS9NvJrBPc2LEifLknNxIVJspDl7Gol_JXx22yz0E8xS_lREJML8wrFidktIPTAYOdh7D1dtoUimLVFM1E-tlTim6Tqc9olXryEblNQgQRfeh6WDfmoLqBpY2RWq33wj/s640/companyinfo.jpg" width="640" /></a></div>
<br />
<br />
<br />
So you are away! Get back over to that Salesforce tab and start writing <i>Bespoke UX at Blazing Speed!</i>Simon Lawrencehttp://www.blogger.com/profile/06468439024017853489noreply@blogger.com221tag:blogger.com,1999:blog-2232538987906803275.post-31589495247613220892017-05-12T02:39:00.000-07:002017-05-12T02:39:16.008-07:00TrailheaDX here we come!There is a new Salesforce conference event on the horizon, and I think it's going to be a good one!<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzX3gODCgITszm5273hxUrcsFZoRe-9wu5pidzteybFaCfJeMUv4ZWml6QRRtlFNOmF49gK2uZ7Z8xcIEqRL4P5YDfTqCEHID0ZMObb8ubiGHiqx_H42cr_ymuqf9kXYW1KI8yPDsJGs5Y/s1600/2017-05-12+10_08_19-Stairs.jpg+%25E2%2580%258E-+Photos.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="197" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzX3gODCgITszm5273hxUrcsFZoRe-9wu5pidzteybFaCfJeMUv4ZWml6QRRtlFNOmF49gK2uZ7Z8xcIEqRL4P5YDfTqCEHID0ZMObb8ubiGHiqx_H42cr_ymuqf9kXYW1KI8yPDsJGs5Y/s200/2017-05-12+10_08_19-Stairs.jpg+%25E2%2580%258E-+Photos.png" width="200" /></a>I missed Dreamforce 2016, through my own misadventure (I literally got married the weekend before) - and I also missed Dreamforce 2015 - because I had attended the previous three years, and Desynit had a swathe of excited new developers so it only seemed fair to let them attend whilst I held the fort back here in Bristol. I thought with a two-year hiatus, if I worked real hard, and was real nice to the management - my application for Dreamforce 2017 would be met with open arms....<br />
<br />
Imagine my horror then; when Desynit announced conference attendees for the year, they told me I wouldn't be attending Dreamforce 2017 either! Three swings and three misses, what had I done wrong?!<br />
<br />
Well - what had I done <i><b>RIGHT -</b></i> because Desynit then announced they weren't going to send me to Dreamforce this year, they are going to send me to <span style="font-size: large;">TrailheaDX </span>instead!<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiU73XvCki4hyphenhyphenrMRPCxVcidCgX8hI3VKzmDbpuHxDb2LrpQlsCK1XsPkQNHJAFMPRvDZKsFHvpJuHqO72aFYQhqej-X4zpklgoAY4I7CobQvpKx0L0LqYUNDXAPKbB36jQoWv7rGlyAHrky/s1600/610.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiU73XvCki4hyphenhyphenrMRPCxVcidCgX8hI3VKzmDbpuHxDb2LrpQlsCK1XsPkQNHJAFMPRvDZKsFHvpJuHqO72aFYQhqej-X4zpklgoAY4I7CobQvpKx0L0LqYUNDXAPKbB36jQoWv7rGlyAHrky/s320/610.gif" width="320" /></a></div>
<br />
My fellow Salesforce developer Dorian Sutton and I will be jetting off to San Francisco at the end of June to take part in what I personally believe could be a turning point in the "Computer Science Conference" world.<br />
<br />
Previously there have been two types of IT Conference - there is the Dreamforce style - which let's be honest is a flashy party full of salespeople and free branded pens (which break before you get them home). It is a <i>fun </i>party, and it's always nice to meet so many people and see so many sessions - but to the development world it's also a little like being an exhibit at a zoo; and also typically pretty overwhelming.<br />
<br />
On the other side of the coin, there are IT conferences (typically held in educational institutions) where the loudest noise you will hear for 3 days is someone dropping a tea spoon at one of the coffee stations. Back-to-back sessions (often led by sponsored bigCo experts) make sure no-one is forced to suffer the indignity of having to talk to a stranger for any length of time and half the attendees are actually just there to get away from their colleagues and cubicles - and are back in their hotel rooms by 17:29 each day.<br />
<br />
<b><span style="color: #38761d;"><span style="font-size: large;">Enter TrailheaDX. </span></span></b><br />
<br />
TrailheaDX - to me - looks like an incredibly exciting opportunity to finally have a technically oriented conference environment, without too much of the "whooping" and t-shirt cannon hype, but still actually in Technicolour™, with some life and vibrancy to it. <br />
<br />
You know it's going to be good, because the <i>actual</i> Salesforce platform developers and engineers will be there, talking to people and leading sessions.<br />
<br />
If you look at the session list it is absolutely cutting edge. Advanced Lightning Components, Einstein the DX CLI - this isn't just people revamping a presentation they gave 6 months ago (and 6 months before that); it's new and exciting, and for once - the Safe Harbour statement might actually mean something to <b>me</b>!<br />
<br />
<span style="color: #38761d;"><b><span style="font-size: large;">The CLI</span></b></span><br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjebSqZu6zTsowUjXI7a1p0r7RFpPvuWrGWNEs70kAwaClJ_Zmh-_C7QX4ilpiwsU9DWCM58yL9K9lBWrShlVsOv9Ut0D40dZ8ANpVJ-CE5i-hA6fjx5qFaFmN2gQVIQ3FAIH02hSBGOL7m/s1600/2017-05-12+10_30_52-2017-05-12+10.30.21.jpg+%25E2%2580%258E-+Photos.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjebSqZu6zTsowUjXI7a1p0r7RFpPvuWrGWNEs70kAwaClJ_Zmh-_C7QX4ilpiwsU9DWCM58yL9K9lBWrShlVsOv9Ut0D40dZ8ANpVJ-CE5i-hA6fjx5qFaFmN2gQVIQ3FAIH02hSBGOL7m/s200/2017-05-12+10_30_52-2017-05-12+10.30.21.jpg+%25E2%2580%258E-+Photos.png" width="155" /></a>This is the biggy for me, at Desynit we have spent hour and hours, over months and months trying to work out, and improve our version control, release processes, disaster recovery, forward-working enviroments and everything that every over branch of programming has at least some options for.<br />
<br />
We have Bitbucket, and scripts, and can often be found begging each other to try to follow the convoluted processes we have that basically make every change request cost sweat and blood. The DX CLI<b> promises to solve all these problems for us and make our lives bliss</b> (remember that safe harbour statement I mentioned earlier?!)<br />
<br />
But we are seriously looking forward to this, the whole team will be waiting with baited breath for our return from TrailheaDX to report back what the upcoming changes will be for Metadata control and Git integration to Salesforce.<br />
<br />
<br />
So if you are going to be there.... get in touch with me on <a href="https://twitter.com/srlawr" target="_blank">Twitter</a>, and perhaps we can meet up for that awkward coffee that I'm hoping I actually won't have to do; but more importantly, we can retweet each others experiences, which is far more interesting anyway.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />Simon Lawrencehttp://www.blogger.com/profile/06468439024017853489noreply@blogger.com36tag:blogger.com,1999:blog-2232538987906803275.post-36642290085448923742017-01-16T03:02:00.002-08:002017-01-16T03:07:13.562-08:00Take the lead - in your local Developer community<span style="font-size: small;"><span style="font-family: inherit;">Related Reading: <a href="http://sfdc.co/b0hTzP" target="_blank">The Salesforce Developer Career eBook</a><br /><br />Ever wonder who those super-stars are who run one of the hundreds of Developer User Groups around the world? Do you see the DUG Leaders getting shout-outs in Salesforce Podcasts, keynotes and blogs and think 'who are these heroes, and where did they come from?' ...<br /><br />Well the answer is, they are actually most likely folks just like you; and therefore you can be one too!</span></span><br />
<br />
<div class="slate-resizable-image-embed slate-image-embed__resize-right" contenteditable="false" data-imgsrc="https://media.licdn.com/mpr/mpr/AAEAAQAAAAAAAAkGAAAAJGU2M2ZiNjlhLWE0MTAtNDIwNC05NzY1LTg3OTc2MjhkZDI4OQ.jpg" style="background: transparent none repeat scroll 0px 0px; border: 0px none; box-sizing: border-box; clear: both; float: right; font-style: normal; font-weight: normal; letter-spacing: normal; line-height: 32px; margin: 0px 0px 0px 32px; outline: 0px none; padding: 0px; position: relative; text-align: left; text-indent: 0px; text-transform: none; transition: all 0.223s ease 0s; vertical-align: baseline; white-space: pre-wrap; word-spacing: 0px;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://media.licdn.com/mpr/mpr/AAEAAQAAAAAAAAkGAAAAJGU2M2ZiNjlhLWE0MTAtNDIwNC05NzY1LTg3OTc2MjhkZDI4OQ.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://media.licdn.com/mpr/mpr/AAEAAQAAAAAAAAkGAAAAJGU2M2ZiNjlhLWE0MTAtNDIwNC05NzY1LTg3OTc2MjhkZDI4OQ.jpg" style="background: transparent none repeat scroll 0px 0px; border: 0px none; box-sizing: border-box; display: block; height: auto; margin-top: 0px; max-width: 100%; outline: 0px none; padding: 0px; transition: all 0.223s ease 0s, all 0.223s ease 0s; vertical-align: baseline; width: 432px;" width="400" /></a></div>
<ul class="slate-image-embed__toolbar" style="background: transparent none repeat scroll 0px 0px; border: 0px none; box-sizing: border-box; font-weight: 400; height: 48px; left: 0px; line-height: 32px; list-style-type: disc; margin: 0px 0px 3.2rem; opacity: 0; outline: 0px none; padding: 0px 0px 8px; position: absolute; text-align: center; top: 0px; transition: all 0.332s ease-in 0s; vertical-align: baseline; width: 432px;"><span style="color: black;"><span style="font-family: inherit; font-size: small;"><span style="color: white;">
</span></span><span style="font-size: small;">
</span>
</span>
<li style="background: transparent none repeat scroll 0px 0px; border: 0px none; box-sizing: border-box; display: inline-block; list-style-type: inherit; margin: 0px 4px; outline: 0px none; padding: 0px; vertical-align: baseline;"><span style="color: black;"><span style="font-family: inherit; font-size: small;"><button class="slate-image-embed-button__resize-left slate-image-embed-button" style="background-color: rgba(0, 0, 0, 0.7); border-radius: 20px; border: 0px none; box-sizing: border-box; cursor: pointer; display: inline-block; font-weight: 600; height: 40px; line-height: 40px; outline-width: 2px; overflow: hidden; padding: 0px; position: relative; text-align: center; text-decoration: none; text-indent: -999px; transition-duration: 167ms; transition-timing-function: cubic-bezier(0, 0, 0.2, 1); vertical-align: middle; width: 40px; z-index: 0;"><svg style="height: 100%; width: 100%;"><svg height="24px" preserveaspectratio="xMinYMin meet" viewbox="0 0 24 24" width="24px" x="0" y="0"><g class="large-icon" style="fill: currentColor;"><path d="M21,5H3V3H21V5Zm0,2H15V9h6V7ZM11,9H5v6h6V9m1-2a1,1,0,0,1,1,1v8a1,1,0,0,1-1,1H4a1,1,0,0,1-1-1V8A1,1,0,0,1,4,7h8Zm9,4H15v2h6V11Zm0,4H15v2h6V15Zm0,4H3v2H21V19Z"></path></g></svg></svg></button></span></span></li>
<span style="color: black;">
<span style="font-size: small;">
<span style="font-family: inherit;"><span style="color: white;">
</span></span>
</span>
</span>
<li style="background: transparent none repeat scroll 0px 0px; border: 0px none; box-sizing: border-box; display: inline-block; list-style-type: inherit; margin: 0px 4px; outline: 0px none; padding: 0px; vertical-align: baseline;"><span style="color: black;"><span style="font-family: inherit; font-size: small;"><button class="slate-image-embed-button__resize-middle slate-image-embed-button" style="background-color: rgba(0, 0, 0, 0.7); border-radius: 20px; border: 0px none; box-sizing: border-box; cursor: pointer; display: inline-block; font-weight: 600; height: 40px; line-height: 40px; outline-width: 2px; overflow: hidden; padding: 0px; position: relative; text-align: center; text-decoration: none; text-indent: -999px; transition-duration: 167ms; transition-timing-function: cubic-bezier(0, 0, 0.2, 1); vertical-align: middle; width: 40px; z-index: 0;"><svg style="height: 100%; width: 100%;"><svg height="24px" preserveaspectratio="xMinYMin meet" viewbox="0 0 24 24" width="24px" x="0" y="0"><g class="large-icon" style="fill: currentColor;"><path d="M21,5H3V3H21V5ZM15,9H9v6h6V9m1-2a1,1,0,0,1,1,1v8a1,1,0,0,1-1,1H8a1,1,0,0,1-1-1V8A1,1,0,0,1,8,7h8Zm5,12H3v2H21V19Z"></path></g></svg></svg></button></span></span></li>
<span style="color: black;">
<span style="font-size: small;">
<span style="font-family: inherit;"><span style="color: white;">
</span></span>
</span>
</span>
<li style="background: transparent none repeat scroll 0px 0px; border: 0px none; box-sizing: border-box; display: inline-block; list-style-type: inherit; margin: 0px 4px; outline: 0px none; padding: 0px; vertical-align: baseline;"><span style="color: black;"><span style="font-family: inherit; font-size: small;"><button class="slate-image-embed-button__resize-full-width slate-image-embed-button" style="background-color: rgba(0, 0, 0, 0.7); border-radius: 20px; border: 0px none; box-sizing: border-box; cursor: pointer; display: inline-block; font-weight: 600; height: 40px; line-height: 40px; outline-width: 2px; overflow: hidden; padding: 0px; position: relative; text-align: center; text-decoration: none; text-indent: -999px; transition-duration: 167ms; transition-timing-function: cubic-bezier(0, 0, 0.2, 1); vertical-align: middle; width: 40px; z-index: 0;"><svg style="height: 100%; width: 100%;"><svg height="24px" preserveaspectratio="xMinYMin meet" viewbox="0 0 24 24" width="24px" x="0" y="0"><g class="large-icon" style="fill: currentColor;"><path d="M20,5H4V3H20V5ZM18,9H6v6H18V9m1-2a1,1,0,0,1,1,1v8a1,1,0,0,1-1,1H5a1,1,0,0,1-1-1V8A1,1,0,0,1,5,7H19Zm1,12H4v2H20V19Z"></path></g></svg></svg></button></span></span></li>
<span style="color: black;">
<span style="font-size: small;">
<span style="font-family: inherit;"><span style="color: white;">
</span></span>
</span>
</span>
<li style="background: transparent none repeat scroll 0px 0px; border: 0px none; box-sizing: border-box; display: inline-block; list-style-type: inherit; margin: 0px 4px; outline: 0px none; padding: 0px; vertical-align: baseline;"><span style="color: black;"><span style="font-family: inherit; font-size: small;"><button class="slate-image-embed-button__resize-bleed slate-image-embed-button" style="background-color: rgba(0, 0, 0, 0.7); border-radius: 20px; border: 0px none; box-sizing: border-box; cursor: pointer; display: inline-block; font-weight: 600; height: 40px; line-height: 40px; outline-width: 2px; overflow: hidden; padding: 0px; position: relative; text-align: center; text-decoration: none; text-indent: -999px; transition-duration: 167ms; transition-timing-function: cubic-bezier(0, 0, 0.2, 1); vertical-align: middle; width: 40px; z-index: 0;"><svg style="height: 100%; width: 100%;"><svg height="24px" preserveaspectratio="xMinYMin meet" viewbox="0 0 24 24" width="24px" x="0" y="0"><g class="large-icon" style="fill: currentColor;"><path d="M17,5H7V3H17V5Zm2,4H5v6H19V9m1-2a1,1,0,0,1,1,1v8a1,1,0,0,1-1,1H4a1,1,0,0,1-1-1V8A1,1,0,0,1,4,7H20ZM17,19H7v2H17V19Z"></path></g></svg></svg></button></span></span></li>
<span style="color: black;">
<span style="font-size: small;">
<span style="font-family: inherit;"><span style="color: white;">
</span></span>
</span>
</span>
<li style="background: transparent none repeat scroll 0px 0px; border: 0px none; box-sizing: border-box; display: inline-block; list-style-type: inherit; margin: 0px 4px; outline: 0px none; padding: 0px; vertical-align: baseline;"><span style="color: black;"><span style="font-family: inherit; font-size: small;"><button class="slate-image-embed-button__resize-right slate-image-embed-button slate-image-embed-button__active" style="background-color: #008cc9; border-radius: 20px; border: 0px none; box-sizing: border-box; cursor: pointer; display: inline-block; font-weight: 600; height: 40px; line-height: 40px; outline-width: 2px; overflow: hidden; padding: 0px; position: relative; text-align: center; text-decoration: none; text-indent: -999px; transition-duration: 167ms; transition-timing-function: cubic-bezier(0, 0, 0.2, 1); vertical-align: middle; width: 40px; z-index: 0;"><svg style="height: 100%; width: 100%;"><svg height="24px" preserveaspectratio="xMinYMin meet" viewbox="0 0 24 24" width="24px" x="0" y="0"><g class="large-icon" style="fill: currentColor;"><path d="M3,3H21V5H3V3ZM3,9H9V7H3V9ZM19,9H13v6h6V9m1-2a1,1,0,0,1,1,1v8a1,1,0,0,1-1,1H12a1,1,0,0,1-1-1V8a1,1,0,0,1,1-1h8ZM3,13H9V11H3v2Zm0,4H9V15H3v2Zm0,4H21V19H3v2Z"></path></g></svg></svg></button></span></span></li>
<span style="color: black;">
<span style="font-size: small;">
<span style="font-family: inherit;"><span style="color: white;">
</span></span></span></span></ul>
<span style="color: black;"><span style="font-family: inherit; font-size: small;"><span style="color: white;"></span></span></span></div>
<span style="font-size: small;"><span style="font-family: inherit;"><br />Five years ago, the Directors at Desynit were talking to Chris Lewis and myself about some great times they used to have in London when they ran an occasional knees-up for the CA Plex developer community that they called Plex in the City. They just picked and broadcast a date and a pub, put it on some Plex forums, and developers turned up and had a great time. They made connections 14+ years ago that they still keep now, and every now and then the phone still rings at Desynit from someone looking for the "Plex development team" here..<br /><br />This led Chris and I to decide to start “Force by Forcewest” a developer user group for Force.com Developers in the Southwest of England.</span></span><br />
<br />
<div class="slate-resizable-image-embed slate-image-embed__resize-left" contenteditable="false" data-imgsrc="https://media.licdn.com/mpr/mpr/AAEAAQAAAAAAAAgWAAAAJDRkM2UxODI5LTg5MmQtNDhmNC04OTNiLTNiYjlkZmJlYTc1Yw.jpg" style="background: transparent none repeat scroll 0px 0px; border: 0px none; box-sizing: border-box; clear: both; float: left; font-style: normal; font-weight: normal; letter-spacing: normal; line-height: 32px; margin: 0px 32px 0px 0px; outline: 0px none; padding: 0px; position: relative; text-align: left; text-indent: 0px; text-transform: none; transition: all 0.223s ease 0s; vertical-align: baseline; white-space: pre-wrap; word-spacing: 0px;">
<ul class="slate-image-embed__toolbar" style="background: transparent none repeat scroll 0px 0px; border: 0px none; box-sizing: border-box; font-weight: 400; height: 48px; left: 0px; line-height: 32px; list-style-type: disc; margin: 0px 0px 3.2rem; opacity: 0; outline: 0px none; padding: 0px 0px 8px; position: absolute; text-align: center; top: 0px; transition: all 0.332s ease-in 0s; vertical-align: baseline; width: 432px;"><span style="color: black;"><span style="font-family: inherit; font-size: small;"><span style="color: white;">
</span></span><span style="font-size: small;">
</span>
</span>
<li style="background: transparent none repeat scroll 0px 0px; border: 0px none; box-sizing: border-box; display: inline-block; list-style-type: inherit; margin: 0px 4px; outline: 0px none; padding: 0px; vertical-align: baseline;"><span style="color: black;"><span style="font-family: inherit; font-size: small;"><button class="slate-image-embed-button__resize-left slate-image-embed-button slate-image-embed-button__active" style="background-color: #008cc9; border-radius: 20px; border: 0px none; box-sizing: border-box; cursor: pointer; display: inline-block; font-weight: 600; height: 40px; line-height: 40px; outline-width: 2px; overflow: hidden; padding: 0px; position: relative; text-align: center; text-decoration: none; text-indent: -999px; transition-duration: 167ms; transition-timing-function: cubic-bezier(0, 0, 0.2, 1); vertical-align: middle; width: 40px; z-index: 0;"><svg style="height: 100%; width: 100%;"><svg height="24px" preserveaspectratio="xMinYMin meet" viewbox="0 0 24 24" width="24px" x="0" y="0"><g class="large-icon" style="fill: currentColor;"><path d="M21,5H3V3H21V5Zm0,2H15V9h6V7ZM11,9H5v6h6V9m1-2a1,1,0,0,1,1,1v8a1,1,0,0,1-1,1H4a1,1,0,0,1-1-1V8A1,1,0,0,1,4,7h8Zm9,4H15v2h6V11Zm0,4H15v2h6V15Zm0,4H3v2H21V19Z"></path></g></svg></svg></button></span></span></li>
<span style="color: black;">
<span style="font-size: small;">
<span style="font-family: inherit;"><span style="color: white;">
</span></span>
</span>
</span>
<li style="background: transparent none repeat scroll 0px 0px; border: 0px none; box-sizing: border-box; display: inline-block; list-style-type: inherit; margin: 0px 4px; outline: 0px none; padding: 0px; vertical-align: baseline;"><span style="color: black;"><span style="font-family: inherit; font-size: small;"><button class="slate-image-embed-button__resize-middle slate-image-embed-button" style="background-color: rgba(0, 0, 0, 0.7); border-radius: 20px; border: 0px none; box-sizing: border-box; cursor: pointer; display: inline-block; font-weight: 600; height: 40px; line-height: 40px; outline-width: 2px; overflow: hidden; padding: 0px; position: relative; text-align: center; text-decoration: none; text-indent: -999px; transition-duration: 167ms; transition-timing-function: cubic-bezier(0, 0, 0.2, 1); vertical-align: middle; width: 40px; z-index: 0;"><svg style="height: 100%; width: 100%;"><svg height="24px" preserveaspectratio="xMinYMin meet" viewbox="0 0 24 24" width="24px" x="0" y="0"><g class="large-icon" style="fill: currentColor;"><path d="M21,5H3V3H21V5ZM15,9H9v6h6V9m1-2a1,1,0,0,1,1,1v8a1,1,0,0,1-1,1H8a1,1,0,0,1-1-1V8A1,1,0,0,1,8,7h8Zm5,12H3v2H21V19Z"></path></g></svg></svg></button></span></span></li>
<span style="color: black;">
<span style="font-size: small;">
<span style="font-family: inherit;"><span style="color: white;">
</span></span>
</span>
</span>
<li style="background: transparent none repeat scroll 0px 0px; border: 0px none; box-sizing: border-box; display: inline-block; list-style-type: inherit; margin: 0px 4px; outline: 0px none; padding: 0px; vertical-align: baseline;"><span style="color: black;"><span style="font-family: inherit; font-size: small;"><button class="slate-image-embed-button__resize-full-width slate-image-embed-button" style="background-color: rgba(0, 0, 0, 0.7); border-radius: 20px; border: 0px none; box-sizing: border-box; cursor: pointer; display: inline-block; font-weight: 600; height: 40px; line-height: 40px; outline-width: 2px; overflow: hidden; padding: 0px; position: relative; text-align: center; text-decoration: none; text-indent: -999px; transition-duration: 167ms; transition-timing-function: cubic-bezier(0, 0, 0.2, 1); vertical-align: middle; width: 40px; z-index: 0;"><svg style="height: 100%; width: 100%;"><svg height="24px" preserveaspectratio="xMinYMin meet" viewbox="0 0 24 24" width="24px" x="0" y="0"><g class="large-icon" style="fill: currentColor;"><path d="M20,5H4V3H20V5ZM18,9H6v6H18V9m1-2a1,1,0,0,1,1,1v8a1,1,0,0,1-1,1H5a1,1,0,0,1-1-1V8A1,1,0,0,1,5,7H19Zm1,12H4v2H20V19Z"></path></g></svg></svg></button></span></span></li>
<span style="color: black;">
<span style="font-size: small;">
<span style="font-family: inherit;"><span style="color: white;">
</span></span>
</span>
</span>
<li style="background: transparent none repeat scroll 0px 0px; border: 0px none; box-sizing: border-box; display: inline-block; list-style-type: inherit; margin: 0px 4px; outline: 0px none; padding: 0px; vertical-align: baseline;"><span style="color: black;"><span style="font-family: inherit; font-size: small;"><button class="slate-image-embed-button__resize-bleed slate-image-embed-button" style="background-color: rgba(0, 0, 0, 0.7); border-radius: 20px; border: 0px none; box-sizing: border-box; cursor: pointer; display: inline-block; font-weight: 600; height: 40px; line-height: 40px; outline-width: 2px; overflow: hidden; padding: 0px; position: relative; text-align: center; text-decoration: none; text-indent: -999px; transition-duration: 167ms; transition-timing-function: cubic-bezier(0, 0, 0.2, 1); vertical-align: middle; width: 40px; z-index: 0;"><svg style="height: 100%; width: 100%;"><svg height="24px" preserveaspectratio="xMinYMin meet" viewbox="0 0 24 24" width="24px" x="0" y="0"><g class="large-icon" style="fill: currentColor;"><path d="M17,5H7V3H17V5Zm2,4H5v6H19V9m1-2a1,1,0,0,1,1,1v8a1,1,0,0,1-1,1H4a1,1,0,0,1-1-1V8A1,1,0,0,1,4,7H20ZM17,19H7v2H17V19Z"></path></g></svg></svg></button></span></span></li>
<span style="color: black;">
<span style="font-size: small;">
<span style="font-family: inherit;"><span style="color: white;">
</span></span>
</span>
</span>
<li style="background: transparent none repeat scroll 0px 0px; border: 0px none; box-sizing: border-box; display: inline-block; list-style-type: inherit; margin: 0px 4px; outline: 0px none; padding: 0px; vertical-align: baseline;"><span style="color: black;"><span style="font-family: inherit; font-size: small;"><button class="slate-image-embed-button__resize-right slate-image-embed-button" style="background-color: rgba(0, 0, 0, 0.7); border-radius: 20px; border: 0px none; box-sizing: border-box; cursor: pointer; display: inline-block; font-weight: 600; height: 40px; line-height: 40px; outline-width: 2px; overflow: hidden; padding: 0px; position: relative; text-align: center; text-decoration: none; text-indent: -999px; transition-duration: 167ms; transition-timing-function: cubic-bezier(0, 0, 0.2, 1); vertical-align: middle; width: 40px; z-index: 0;"><svg style="height: 100%; width: 100%;"><svg height="24px" preserveaspectratio="xMinYMin meet" viewbox="0 0 24 24" width="24px" x="0" y="0"><g class="large-icon" style="fill: currentColor;"><path d="M3,3H21V5H3V3ZM3,9H9V7H3V9ZM19,9H13v6h6V9m1-2a1,1,0,0,1,1,1v8a1,1,0,0,1-1,1H12a1,1,0,0,1-1-1V8a1,1,0,0,1,1-1h8ZM3,13H9V11H3v2Zm0,4H9V15H3v2Zm0,4H21V19H3v2Z"></path></g></svg></svg></button></span></span></li>
<span style="color: black;">
<span style="font-size: small;">
<span style="font-family: inherit;"><span style="color: white;">
</span></span></span></span></ul>
<span style="color: black;"><span style="font-family: inherit; font-size: small;"><span style="color: white;"><img src="https://media.licdn.com/mpr/mpr/AAEAAQAAAAAAAAgWAAAAJDRkM2UxODI5LTg5MmQtNDhmNC04OTNiLTNiYjlkZmJlYTc1Yw.jpg" style="background: transparent none repeat scroll 0px 0px; border: 0px none; box-sizing: border-box; display: block; height: auto; margin: 0px; max-width: 100%; outline: 0px none; padding: 0px; transition: all 0.223s ease 0s, all 0.223s ease 0s; vertical-align: baseline; width: 432px;" /></span></span></span></div>
<span style="font-size: small;"><span style="font-family: inherit;">So we sent some e-mails, created a Facebook and Twitter page, and made a tiny flag which we stuck in an upside down plastic cup. When the date rolled around the two of us went nervously to the pub at the arranged time - and waited...<br /><br />..and you know what; out of the dark, developers turned up!<br /><br />We had a great time swapping stories, debating and drinking a few beers, and we agreed to do it again. I met some people on that very first meetup in 2011 whom I am still friends with today. More importantly, it went on to me discovering the vast and supportive Salesforce community - for which I now hope I am a useful part!<br /><br />It was at Dreamforce 2012 I saw a session by Andy Boettcher titled “How to run a Salesforce developer user group” - I thought I’d struck gold, a kindred spirit! I was first in line for the session, and so imagine my surprise when he introduced both April Nassi - head of Developer Relations at Salesforce, and the fact that already there were already dozens of groups all over the country. After the session I spoke to Andy and April, and she set me up with all the information I needed to run a local Salesforce developer user group… both the Meetup group page, the financial support Salesforce can offer for hiring meeting facilities and food/drink and within a couple of weeks, a great big box of t-shirts, caps, books and even a Salesforce iPod to use as a prize or giveaway!<br /><br />Within 6 months we were up and running, a new official Salesforce DUG for Bristol - and I was suddenly one of those heroes I thought the world of!<br /><br />If you have even the slightest desire to get involved in your local developer community, you have a couple of options: find your nearest one and go along, or if there isn’t one near enough be your own local hero and start it up! If you are worried about the work load - firstly, it’s really not that hard(!) and secondly, you will probably find within a meetup or two that there are a couple of other people who will be keen to get involved and help organise events with you.<br /><br />To find your nearby group head over to <a href="https://www.meetup.com/topics/salesforce/">https://www.meetup.com/topics/salesforce/</a> and check out the map.</span></span><br />
<div class="slate-resizable-image-embed slate-image-embed__resize-full-width" contenteditable="false" data-imgsrc="https://media.licdn.com/mpr/mpr/AAEAAQAAAAAAAAi6AAAAJDk4MzUzOTY5LWM5ZDAtNGQ2OS1hM2UwLTdkYjhmY2MzOTU5Mw.png" style="background: transparent none repeat scroll 0px 0px; border: 0px none; box-sizing: border-box; clear: both; font-style: normal; font-weight: normal; letter-spacing: normal; line-height: 32px; margin: 3.2rem 0px; outline: 0px none; padding: 0px; position: relative; text-align: center; text-indent: 0px; text-transform: none; transition: all 0.223s ease 0s; vertical-align: baseline; white-space: pre-wrap; word-spacing: 0px;">
<ul class="slate-image-embed__toolbar" style="background: transparent none repeat scroll 0px 0px; border: 0px none; box-sizing: border-box; font-weight: 400; height: 48px; left: 0px; line-height: 32px; list-style-type: disc; margin: 0px 0px 3.2rem; opacity: 0; outline: 0px none; padding: 0px 0px 8px; position: absolute; text-align: center; top: 0px; transition: all 0.332s ease-in 0s; vertical-align: baseline; width: 744px;">
<li style="background: transparent none repeat scroll 0px 0px; border: 0px none; box-sizing: border-box; display: inline-block; list-style-type: inherit; margin: 0px 4px; outline: 0px none; padding: 0px; vertical-align: baseline;"><span style="color: black;"><span style="font-family: inherit; font-size: small;"><button class="slate-image-embed-button__resize-left slate-image-embed-button" style="background-color: rgba(0, 0, 0, 0.7); border-radius: 20px; border: 0px none; box-sizing: border-box; cursor: pointer; display: inline-block; font-weight: 600; height: 40px; line-height: 40px; outline-width: 2px; overflow: hidden; padding: 0px; position: relative; text-align: center; text-decoration: none; text-indent: -999px; transition-duration: 167ms; transition-timing-function: cubic-bezier(0, 0, 0.2, 1); vertical-align: middle; width: 40px; z-index: 0;"><svg style="height: 100%; width: 100%;"><svg height="24px" preserveaspectratio="xMinYMin meet" viewbox="0 0 24 24" width="24px" x="0" y="0"><g class="large-icon" style="fill: currentColor;"><path d="M21,5H3V3H21V5Zm0,2H15V9h6V7ZM11,9H5v6h6V9m1-2a1,1,0,0,1,1,1v8a1,1,0,0,1-1,1H4a1,1,0,0,1-1-1V8A1,1,0,0,1,4,7h8Zm9,4H15v2h6V11Zm0,4H15v2h6V15Zm0,4H3v2H21V19Z"></path></g></svg></svg></button></span></span></li>
<span style="color: black;">
<span style="font-size: small;">
<span style="font-family: inherit;">
</span>
</span>
</span>
<li style="background: transparent none repeat scroll 0px 0px; border: 0px none; box-sizing: border-box; display: inline-block; list-style-type: inherit; margin: 0px 4px; outline: 0px none; padding: 0px; vertical-align: baseline;"><span style="color: black;"><span style="font-family: inherit; font-size: small;"><button class="slate-image-embed-button__resize-middle slate-image-embed-button" style="background-color: rgba(0, 0, 0, 0.7); border-radius: 20px; border: 0px none; box-sizing: border-box; cursor: pointer; display: inline-block; font-weight: 600; height: 40px; line-height: 40px; outline-width: 2px; overflow: hidden; padding: 0px; position: relative; text-align: center; text-decoration: none; text-indent: -999px; transition-duration: 167ms; transition-timing-function: cubic-bezier(0, 0, 0.2, 1); vertical-align: middle; width: 40px; z-index: 0;"><svg style="height: 100%; width: 100%;"><svg height="24px" preserveaspectratio="xMinYMin meet" viewbox="0 0 24 24" width="24px" x="0" y="0"><g class="large-icon" style="fill: currentColor;"><path d="M21,5H3V3H21V5ZM15,9H9v6h6V9m1-2a1,1,0,0,1,1,1v8a1,1,0,0,1-1,1H8a1,1,0,0,1-1-1V8A1,1,0,0,1,8,7h8Zm5,12H3v2H21V19Z"></path></g></svg></svg></button></span></span></li>
<span style="color: black;">
<span style="font-size: small;">
<span style="font-family: inherit;">
</span>
</span>
</span>
<li style="background: transparent none repeat scroll 0px 0px; border: 0px none; box-sizing: border-box; display: inline-block; list-style-type: inherit; margin: 0px 4px; outline: 0px none; padding: 0px; vertical-align: baseline;"><span style="color: black;"><span style="font-family: inherit; font-size: small;"><button class="slate-image-embed-button__resize-full-width slate-image-embed-button slate-image-embed-button__active" style="background-color: #008cc9; border-radius: 20px; border: 0px none; box-sizing: border-box; cursor: pointer; display: inline-block; font-weight: 600; height: 40px; line-height: 40px; outline-width: 2px; overflow: hidden; padding: 0px; position: relative; text-align: center; text-decoration: none; text-indent: -999px; transition-duration: 167ms; transition-timing-function: cubic-bezier(0, 0, 0.2, 1); vertical-align: middle; width: 40px; z-index: 0;"><svg style="height: 100%; width: 100%;"><svg height="24px" preserveaspectratio="xMinYMin meet" viewbox="0 0 24 24" width="24px" x="0" y="0"><g class="large-icon" style="fill: currentColor;"><path d="M20,5H4V3H20V5ZM18,9H6v6H18V9m1-2a1,1,0,0,1,1,1v8a1,1,0,0,1-1,1H5a1,1,0,0,1-1-1V8A1,1,0,0,1,5,7H19Zm1,12H4v2H20V19Z"></path></g></svg></svg></button></span></span></li>
<span style="color: black;">
<span style="font-size: small;">
<span style="font-family: inherit;">
</span>
</span>
</span>
<li style="background: transparent none repeat scroll 0px 0px; border: 0px none; box-sizing: border-box; display: inline-block; list-style-type: inherit; margin: 0px 4px; outline: 0px none; padding: 0px; vertical-align: baseline;"><span style="color: black;"><span style="font-family: inherit; font-size: small;"><button class="slate-image-embed-button__resize-bleed slate-image-embed-button" style="background-color: rgba(0, 0, 0, 0.7); border-radius: 20px; border: 0px none; box-sizing: border-box; cursor: pointer; display: inline-block; font-weight: 600; height: 40px; line-height: 40px; outline-width: 2px; overflow: hidden; padding: 0px; position: relative; text-align: center; text-decoration: none; text-indent: -999px; transition-duration: 167ms; transition-timing-function: cubic-bezier(0, 0, 0.2, 1); vertical-align: middle; width: 40px; z-index: 0;"><svg style="height: 100%; width: 100%;"><svg height="24px" preserveaspectratio="xMinYMin meet" viewbox="0 0 24 24" width="24px" x="0" y="0"><g class="large-icon" style="fill: currentColor;"><path d="M17,5H7V3H17V5Zm2,4H5v6H19V9m1-2a1,1,0,0,1,1,1v8a1,1,0,0,1-1,1H4a1,1,0,0,1-1-1V8A1,1,0,0,1,4,7H20ZM17,19H7v2H17V19Z"></path></g></svg></svg></button></span></span></li>
<span style="color: black;">
<span style="font-size: small;">
<span style="font-family: inherit;">
</span>
</span>
</span>
<li style="background: transparent none repeat scroll 0px 0px; border: 0px none; box-sizing: border-box; display: inline-block; list-style-type: inherit; margin: 0px 4px; outline: 0px none; padding: 0px; vertical-align: baseline;"><span style="color: black;"><span style="font-family: inherit; font-size: small;"><button class="slate-image-embed-button__resize-right slate-image-embed-button" style="background-color: rgba(0, 0, 0, 0.7); border-radius: 20px; border: 0px none; box-sizing: border-box; cursor: pointer; display: inline-block; font-weight: 600; height: 40px; line-height: 40px; outline-width: 2px; overflow: hidden; padding: 0px; position: relative; text-align: center; text-decoration: none; text-indent: -999px; transition-duration: 167ms; transition-timing-function: cubic-bezier(0, 0, 0.2, 1); vertical-align: middle; width: 40px; z-index: 0;"><svg style="height: 100%; width: 100%;"><svg height="24px" preserveaspectratio="xMinYMin meet" viewbox="0 0 24 24" width="24px" x="0" y="0"><g class="large-icon" style="fill: currentColor;"><path d="M3,3H21V5H3V3ZM3,9H9V7H3V9ZM19,9H13v6h6V9m1-2a1,1,0,0,1,1,1v8a1,1,0,0,1-1,1H12a1,1,0,0,1-1-1V8a1,1,0,0,1,1-1h8ZM3,13H9V11H3v2Zm0,4H9V15H3v2Zm0,4H21V19H3v2Z"></path></g></svg></svg></button></span></span></li>
<span style="color: black;">
<span style="font-size: small;">
<span style="font-family: inherit;">
</span></span></span></ul>
<span style="color: black;"><span style="font-family: inherit; font-size: small;"><img class="slate-image-embed__resize-full-width" src="https://media.licdn.com/mpr/mpr/AAEAAQAAAAAAAAi6AAAAJDk4MzUzOTY5LWM5ZDAtNGQ2OS1hM2UwLTdkYjhmY2MzOTU5Mw.png" style="background: transparent none repeat scroll 0px 0px; border: 0px none; box-sizing: border-box; display: inline-block; height: auto; margin: 0px auto; max-width: 100%; outline: 0px none; padding: 0px; text-align: center; transition: all 0.223s ease 0s, all 0.223s ease 0s; vertical-align: baseline; width: 744px;" /></span></span></div>
<span style="font-size: small;"><span style="font-family: inherit;">Have a browse over the <a href="http://developer.salesforce.com/page/Salesforce_Developer_User_Group_FAQ" target="_blank">DUG FAQs on the Salesforce developer blog</a><br /><br />Get in touch with <a href="http://twitter.com/SalesforceDevs" target="_blank">@Salesforcedevs on Twitter</a> where you will get answers to everything you need to know! The DUG Leaders have their own amazing leadership team directly within Salesforce, we have a Slack channel, a Mobilize feed, and a DUG leadership group, which has occasional worldwide conference calls for sharing ideas - getting updates from Salesforce and feeding back on our experience running the groups. It’s a great bunch of people to be a part of.</span></span>Simon Lawrencehttp://www.blogger.com/profile/06468439024017853489noreply@blogger.com16tag:blogger.com,1999:blog-2232538987906803275.post-80373905709056718522016-08-02T02:54:00.000-07:002016-08-02T02:54:26.328-07:00Discover new opportunities in IT, South Wales style!<span style="font-size: large;">August 13th 2016 sees the first ever <a href="http://www.surfforce.co/" target="_blank"><i><b>Surf Force</b></i></a> event, held in Aberavon, near Cardiff.</span><br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRdU86PIcd2J9o4fCV4b9RRejZ9d4h6rgL-dXohRv8EBr0nwTgQ9085xQMuk-fgcqgt3_G3o18P0_Zvw43bZkag5bAVe6j-kK2rCuR-uDZOH5hxRC2MVrcMAM9Ua3XqFISTOBUaJEfUEJb/s1600/2016-08-02+10_33_31-Simon+Lawrence+%2528%2540srlawr%2529+_+Twitter.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhRdU86PIcd2J9o4fCV4b9RRejZ9d4h6rgL-dXohRv8EBr0nwTgQ9085xQMuk-fgcqgt3_G3o18P0_Zvw43bZkag5bAVe6j-kK2rCuR-uDZOH5hxRC2MVrcMAM9Ua3XqFISTOBUaJEfUEJb/s200/2016-08-02+10_33_31-Simon+Lawrence+%2528%2540srlawr%2529+_+Twitter.png" width="195" /></a><b>But what is Surf Force?</b><br />
<br />
Surf Force is the brain child of Desynit's very own Shaun Holmes. a once award winning surfer, turned Salesforce expert. Shaun wants to combine his passion for this fun oceanic hobby with opening the doors for new opportunities in the IT sector in Wales, with one of the most innovative and welcoming computer technologies, Salesforce.<span id="goog_131529108"></span><br />
<span id="goog_131529107"></span><br />
<br />
<b>Why should you attend this <i>totally free</i> event?</b><br />
<br />
If you wish to, arriving a little earlier will get you a full on breakfast, and a couple of hours of free surfing lessons with a professional surfing school before the days main events...<br />
<br />
..If you aren't so keen on wrestling a shark, arriving at 12:00 gets you free access to up to 7 hours of informative speaker sessions, hands on experience and great opportunities to meet and network with some leading voices and personalities in the Salesforce development, employment and training sectors.<br />
<br />
(You'll also get a free t-shirt, free lunch, and some drinks at the Happy Hour that follows the main speakers of the day!)<br />
<br />
<span style="color: #a2c4c9;"><span style="font-size: large;">If you are thinking of finding new work in the IT industry, or expanding your existing horizons in an existing office/administrative role, this is a brilliant opportunity to see how easy it can be to make waves in the Salesforce world!</span></span><br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjn_uw2rIB4FkUjhgpIUqivN5Z8um5cHxZdP0AKHSQmrHxr-zerAmlgJf6VKgIiyUxuLqxPkVZUp09TLzq7zU06U2CEEGj1XlAXalAaKXOfQ_9SUMVaCd8KaHB6bfTjq7eit_A4WM41S0Z7/s1600/2016-08-02+10_36_44-Aberavon+Leisure+%2526+Fitness+Centre+-+Google+Maps.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="252" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjn_uw2rIB4FkUjhgpIUqivN5Z8um5cHxZdP0AKHSQmrHxr-zerAmlgJf6VKgIiyUxuLqxPkVZUp09TLzq7zU06U2CEEGj1XlAXalAaKXOfQ_9SUMVaCd8KaHB6bfTjq7eit_A4WM41S0Z7/s640/2016-08-02+10_36_44-Aberavon+Leisure+%2526+Fitness+Centre+-+Google+Maps.png" width="640" /></a></div>
<div style="text-align: center;">
<b><span style="font-size: x-small;"><span style="background-color: transparent; font-family: Arial; vertical-align: baseline; white-space: pre-wrap;">(Aberavon Leisure & Fitness Centre – Princess Margaret Way Aberavon Seafront, Aberavon, SA12 6QW)</span></span></b></div>
<br />
<span style="font-size: large;"><span style="font-size: small;">With speaking sessions from Entrepreneur <a href="http://www.surfforce.co/speakers/anna-bastek" target="_blank">Anna Bastek</a> and Technology Super-Innovator <a href="http://www.surfforce.co/speakers/dave-carroll" target="_blank">Dave Carroll</a>, alongside 5 other brilliant presenters, there is a lot to take away from this day.</span></span><br />
<br />
<span style="font-size: large;"><span style="font-size: small;">Meeting with the chief sponsors, such as <a href="http://www.surfforce.co/sponsor/mason-frank" target="_blank">Mason Frank</a> and<a href="http://www.surfforce.co/sponsor/impact-it-solutions" target="_blank"> Impact IT Solutions</a> at their expo stands will also give you a chance to see the great products, services and software they provide.</span></span><br />
<br />
<span style="font-size: large;"><span style="font-size: small;">All you need to do is <a href="https://www.eventbrite.com/e/surf-force-aberavon-wales-2016-salesforce-user-group-with-a-twist-tickets-26326907489" target="_blank">sign up now on Eventbrite</a>, and it's next stop - Surf City! </span></span><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzXrojk_Hwe3aAm379IykJHbV4OBZXAopTGSIMx8ZSxD4ztnuXc4lTo-uYAuAu0jAWtGpNmbfBgEikobp0q_Lwekx4SeorxHHS1YUcd5KHfj92PSOgXAFxkJ6478QMJAk-S1hhPpijkZAe/s1600/Cow2wKxXYAA4aes.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzXrojk_Hwe3aAm379IykJHbV4OBZXAopTGSIMx8ZSxD4ztnuXc4lTo-uYAuAu0jAWtGpNmbfBgEikobp0q_Lwekx4SeorxHHS1YUcd5KHfj92PSOgXAFxkJ6478QMJAk-S1hhPpijkZAe/s400/Cow2wKxXYAA4aes.jpg" width="400" /></a></div>
Simon Lawrencehttp://www.blogger.com/profile/06468439024017853489noreply@blogger.com7tag:blogger.com,1999:blog-2232538987906803275.post-73284131769299090842016-02-19T07:43:00.001-08:002016-02-19T07:43:04.358-08:00Navigate the Salesforce Advantage<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5cF-a_0yI5DL62lhgfrcfTFWaqWTJ1Bxu3XgTGeBFl8t7AiImWqoaxVrtrmIX4s-kfBcYugWBJsv72I0_hMJi8GJrabhmxVAAabHguONeBefS819ZBJbI2gLvcKA80dXGREvdnnaBjhJK/s1600/trailhead_trail_salesforce_advantage.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5cF-a_0yI5DL62lhgfrcfTFWaqWTJ1Bxu3XgTGeBFl8t7AiImWqoaxVrtrmIX4s-kfBcYugWBJsv72I0_hMJi8GJrabhmxVAAabHguONeBefS819ZBJbI2gLvcKA80dXGREvdnnaBjhJK/s200/trailhead_trail_salesforce_advantage.png" width="200" /></a>Arrr. Me hearties. Tis time for another Trailhead module review... this time, no battleships, but PIRATE ships, as we Navigate our way through the Salesforce Advantage Sea...<br />
<br />
<div class="p1">
<span class="s1"><b><a href="https://developer.salesforce.com/trailhead/trail/salesforce_advantage"><i><span style="font-size: large;">Navigate the Salesforce Advantage</span></i></a></b></span></div>
<br />
<div class="p1">
<span class="s1"><i><span style="font-size: large;">Learn about the key differentiators that drive our success: our core values, innovative technology, and vibrant ecosystem.</span></i></span></div>
<br />
<br />
So go throw on yer best sailing hat, grab yer cutless and join me on a sailing adventure across all that this great module has to offer!<br />
<br />
This here module is a little different to t'others ye might have done in the past.. it's not got the technicals, ye won't be needin' yer fiddly code or clicks, but what you will be gainin' is a mighty haul of treasured information on <i>why</i> Salesforce is the greatest ship to float on that there Internet, both for yourself, and yer piratin' business.<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOJ2HVYuHXbDKgm30ax6xENHsVQGiekB0xSv7NLvpMyItwoeyxlLwT7TH3TftQUtsZXbVk7KPC7hIGYgokx3IKLrlfj_SZIOMjRIocHoqfVPv1ED4RtPbSW8XqqkPKzixDMI5FLIc-lYJO/s1600/Screen+Shot+2016-02-18+at+21.46.53.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOJ2HVYuHXbDKgm30ax6xENHsVQGiekB0xSv7NLvpMyItwoeyxlLwT7TH3TftQUtsZXbVk7KPC7hIGYgokx3IKLrlfj_SZIOMjRIocHoqfVPv1ED4RtPbSW8XqqkPKzixDMI5FLIc-lYJO/s200/Screen+Shot+2016-02-18+at+21.46.53.png" width="190" /></a>B'fore ye gets to the wheel house though, yer gotta start down scrubbing barnacles off the belly of the boat.. Module 1 covers the 4 cornerstone philosophies of why Salesforce be the best in the market for not only Cloud CRM.. but every part of yer business. Don't fret too hard on the quiz, no-one is getting hung and drawn in this exam, it's as easy as taking candy from a French merchant ship. There be a truly <b>terrifying</b> picture of Marc Benioff from 1999 in there though, so brace yerself for that.<br />
<br />
Once yer've snagged yerself a ships wheel for your efforts... why not boast to all your buccaneer buddies over in LinkedIn, with the SSO link. All true pirates use LinkedIn you know.<br />
<br />
Module 2 be on all the bits of the great ship Salesforce from the Masts (lets say that's Sales cloud) to the decking (the AppExchange maybe?) it all be there ready and available for you to sale your way to success. A good pirate knows his way around his ship, and this module gives you an idea of how bigger boat you've got. Speaking of size, if ye get yer britches in a twist on the exam in this module... the answers are the longest, most expansive ones ;)<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimMePrhhRXvCDM62NHaPmlLtPHy0EJFVRm2ZvwaeFK6B_5QJYaCgGNZiJqgZdL8_lILXMC8C1KZ-2jymL7N6KSJfmutQ56Gdyy_KbZLIQqLSiQlgRI-XSHomdUWR6-zn7Qmf-xqifMP6-O/s1600/trailhead_module_advantage_salesforce_cloud_benefits.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimMePrhhRXvCDM62NHaPmlLtPHy0EJFVRm2ZvwaeFK6B_5QJYaCgGNZiJqgZdL8_lILXMC8C1KZ-2jymL7N6KSJfmutQ56Gdyy_KbZLIQqLSiQlgRI-XSHomdUWR6-zn7Qmf-xqifMP6-O/s200/trailhead_module_advantage_salesforce_cloud_benefits.png" width="200" /></a>Arrrgghhh!! Whats this?! Does a storm be a brewin'?! Oh... no... it's just the Clouds coming in, the second half of this module explains why not having to worry about all that computer hardware, servers, backup, multiple-OS configuration is so <i>amazing</i>.. Salesforce is one ship that's NOT afraid of a bit of cloudy weather, in fact, it was one of the pioneers of Sailing on the cloud, and will continue to be so for some time.<br />
<br />
Answer a couple more questions to get the next bit of yer ship together, the prop, now we're going places!<br />
<br />
The next module says it will take 5 minutes, and that's only if you decide to sit and ponder the quote from Parker Harris for 2 minutes... it's a bit of a doozy to be sure, but that's because it's the simplest concept ever - how to trust the Cloud. When you get to the quiz on this module... see if you can work out why I got question 2 wrong:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoLHvWCFNkFL3stZWtcykT42xbMnuKq0aEycQavsBSu3fsvLi1gUJorYi3wVkdTvxUmTxzp6yYjXI0-17_buIb4NdIq8-WR2mrv1rLI24sjAc4k0RgkaSSxGIrlQCAgmQLPMrpPpjj085V/s1600/Screen+Shot+2016-02-18+at+21.58.49.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="86" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoLHvWCFNkFL3stZWtcykT42xbMnuKq0aEycQavsBSu3fsvLi1gUJorYi3wVkdTvxUmTxzp6yYjXI0-17_buIb4NdIq8-WR2mrv1rLI24sjAc4k0RgkaSSxGIrlQCAgmQLPMrpPpjj085V/s640/Screen+Shot+2016-02-18+at+21.58.49.png" width="640" /></a></div>
<br />
It's harder than ye be believin'<br />
<br />
In <a href="https://developer.salesforce.com/trailhead/salesforce_advantage/salesforce_advantange_how_we_do_it/sa_how_multitenancy">learning the value of multitennancy</a> we find out what having all our pirate buddies about is about, and why its actually quite a cool thing. I wish when I lived on my own I had a door man, and if I'd lived in the cloud I could have done.<br />
<br />
The next chapter in this module is on MetaData, so we be startin' to get a little more technical.. but there is really only one thing you need to know about this module is that at 1:24 in the video.. <b style="font-style: italic;">a pig uses Salesforce1</b>. I think my next Developer Edition exploration will have to be a farm, I've never done that before! (oh, we're supposed to be pirates aren't we... ahem.. arrrhhhhh). The key to Davey Jones' locker here is that Metadata is <i>everything</i> you have defined in the cloud, and that it is yours, it is safe and secure, but it is based on the same powerful platform that some of the biggest and most successful businesses use.<br />
<br />
For a developer style ship mate, this next module is an interesting one, I feel like it gives the world a good impression of what we do, but no-one really likes seeing their job described as being "5 times faster" than usual... I can almost hear my deadlines screeching in around me ;) keep your cannons loaded though and you'll be able to keep those milestones at bay.<br />
<br />
I'll also be honest to the pirates code, and say that question three is a tricky one for me, because I freaking love coding. But I kept it together and fired the canon ball to the back of the net for another 100 points, and another badge on my pantaloons.<br />
<br />
The final module on this vast voyage starts with Community. This is a personal favourite of mine, as I am almost entirely submerged in what is really a <i>global</i> community of Salesforce developers and experts. As I organise the my local Developer User Group here in Bristol (UK), and attend our User Group, as well as other groups around the country.. I have also had the pleasure of attending Dreamforce in San Francisco, and the MVP summit in the same city.<br />
<br />
I have genuinely got to a point now, where it is as easy and quick for me to pop a question on the Internet to get help with a Salesforce question as it is to turn to the people in the room with me.<br />
<br />
The final chapter, err.... Meet an MVP?! Well, Hello! If you have made it this far into one of my blog posts, I already probably consider you a closer ship-mate than you'd imagine. Here be my pirate calling card.. get in touch whenever you need!<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirSo5CvKxqHgAkBmeZHzVTWldXWZndzBaNhUkgsR-QZVkl9p5hYEBkDu1TrANjQR5tcNQ0qpnB7doutlGZvznSghesyGFCIZVZu1Emb3dRwFtwQuogzwSKxPSV7zpgeAzGq6lXPa6sFVH8/s1600/pirateSrlawr.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="197" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirSo5CvKxqHgAkBmeZHzVTWldXWZndzBaNhUkgsR-QZVkl9p5hYEBkDu1TrANjQR5tcNQ0qpnB7doutlGZvznSghesyGFCIZVZu1Emb3dRwFtwQuogzwSKxPSV7zpgeAzGq6lXPa6sFVH8/s200/pirateSrlawr.jpg" width="200" /></a><br />
<br />
<div style="text-align: right;">
<span style="font-size: large;"><b>Captain Simon Lawrence</b></span></div>
<div style="text-align: right;">
<br /></div>
<div style="text-align: right;">
<a href="http://twitter.com/srlawr" target="_blank"><span style="font-size: x-large;">@srlawr</span></a></div>
<div style="text-align: right;">
<br /></div>
<div style="text-align: right;">
<a href="http://www.desynit.com/about-us/meet-the-team/simon-lawrence/">http://www.desynit.com/about-us/meet-the-team/simon-lawrence/</a></div>
<br />
<br />
<br />
If you need any other MVPs in the Bristol area, feel free to pop a tweet to my colleagues <a href="http://twitter.com/adtennant" target="_blank">@adtennant</a> or <a href="http://twitter.com/jenny_bamber" target="_blank">@jenny_bamber</a>, or indeed dig up Chris Lewis, Matthew Morris or Simon Goodyear.<br />
<br />
So that be the journey completed, get those badges on your profile! You're half way to having your own Pirate ship...<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjn4UXCLM1SDCkAQ_Z0xh1QZ9SufaRPbXaFz-JUMYRkgoQi0xfr19JR5HcsxVOTT4lKW53C1AgHrhyphenhyphenyFE-P6r3l45JrYGV9l-Zn1DI4SHPGKIQelWlFrfPFCPorTw_ESxi1VYGeU0l3Y_ci/s1600/Screen+Shot+2016-02-18+at+23.20.32.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="266" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjn4UXCLM1SDCkAQ_Z0xh1QZ9SufaRPbXaFz-JUMYRkgoQi0xfr19JR5HcsxVOTT4lKW53C1AgHrhyphenhyphenyFE-P6r3l45JrYGV9l-Zn1DI4SHPGKIQelWlFrfPFCPorTw_ESxi1VYGeU0l3Y_ci/s640/Screen+Shot+2016-02-18+at+23.20.32.png" width="640" /></a></div>
<br />
<br />Simon Lawrencehttp://www.blogger.com/profile/06468439024017853489noreply@blogger.com6tag:blogger.com,1999:blog-2232538987906803275.post-36179063144635161092016-02-15T03:57:00.000-08:002016-02-15T03:57:29.852-08:00The way of the Lightning ComponentThis is a quick walk through of how I wrote my first Lightning Component in Salesforce, to give myself a feel for the process, and develop my own skills in this up and coming technology.<br />
<div>
<br /></div>
<div>
But what to do? I didn't want to actually produce a piece of serious functionality, thats what I do at work all week anyway, but I also didn't want to create a piece of HTML that wrote "Hello World!" in a totally separate and useless app.... and then I had a thought, why don't I write an integration to the <a href="http://www.icndb.com/">Internet Chuck Norris Database</a>, providing a contacts name, and then display a "Chuck Norris" style quote on the contact page...? </div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2XpgaL4gvMH2P4Y1xHO8Y3K09SNax5ouUC91rry6GEd10dUPoc-7D2TitvXWSnOTAp6E3yk_UnzSS6C35qVrRHouihR1JGT-Q6Dr2RipF6Ha5jcBKu4Z3mkmt0h2ZYT-cTPMJVuZJ7DK_/s1600/Screen+Shot+2016-02-14+at+21.57.32.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="308" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2XpgaL4gvMH2P4Y1xHO8Y3K09SNax5ouUC91rry6GEd10dUPoc-7D2TitvXWSnOTAp6E3yk_UnzSS6C35qVrRHouihR1JGT-Q6Dr2RipF6Ha5jcBKu4Z3mkmt0h2ZYT-cTPMJVuZJ7DK_/s640/Screen+Shot+2016-02-14+at+21.57.32.png" width="640" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
(For those of you who didn't know, the ICNDB provides quotes about Hollywoods most bad ass actor, Chuck Norris, and it of course also provides a RESTful API - to which you can provide alternative first and last names, to receive some JSON with a quote tailored to that person)</div>
<div>
<br /></div>
<div>
So this was a fairly simple example, but it included a web call out, which is always interesting, and also meant I needed to embed the component on a standard view page, and pass information about that record to the component. I felt this was just the right amount of complexity. </div>
<div>
<br /></div>
<div>
<b>First off then: The component</b></div>
<div>
<br /></div>
<div>
It seemed logical to start with the component. I did all this work through the Developer Console, so some boiler plate was put in place with me as soon as I selected to build a new Lightning Component from the File menu.</div>
<div>
<br /></div>
<div>
All I needed to do was put some HTML in the aura:component tag, and putting some activity code into the client controller. So some <b>gotchas</b> - you can't make a web callout from the client controller in Javascript, logical I suppose, it is a bit wild - security wise; and a performance liability. I also had trouble getting the function to run from the "init" tag, so I put it behind a button for a while, but eventually it just started working under Init as well. I think perhaps I was just impatient!</div>
<div>
<br /></div>
<div>
ContactChucker.cmp</div>
<div>
<br /></div>
<div>
<div class="mycode">
<pre><aura:component controller="ChuckController" implements="force:appHostable,flexipage:availableForAllPageTypes">
<aura:attribute name="firstN" type="string" default="Chuck" />
<aura:attribute name="secondN" type="string" default="Norris" />
<aura:handler name="init" value="{!this}" action="{!c.requestQuote}" />
<ui:outputText value="{!v.quote}"/>
</aura:component>
</pre>
</div>
</div>
<div>
</div>
<div>
<br /></div>
<div>
In here we have a couple attributes, that bind to the data sent in from the Contact page (details below in the Visualforce section) and then an Aura:handler instructed to execute on init and the output text from the standard UI library for the quote, quite simple in the end.</div>
<div>
<br /></div>
<div>
The "Implements" section uses some standard Component libraries to tell Salesforce this component needs to work on all pages (Visualforce, standard view etc.etc.) and is "Hostable" - which is also something to do with placing it on Visualforce.</div>
<div>
<br /></div>
<div>
The action in the init tag calls the component method requestQuote - as described here:</div>
<div>
<br /></div>
<div>
ContactChuckerController.js</div>
<div>
<br /></div>
<div>
<div class="mycode">
<pre>({
<span class="Apple-tab-span" style="white-space: pre;"> </span>requestQuote : function(component, event, helper) {
var initAction = component.get("c.getChucked");
initAction.setParams({ firstN : component.get("v.firstN"), secondN: component.get("v.secondN") });
initAction.setCallback(this,function(response){
if (response.getState() === "SUCCESS"){
component.set("v.quote", response.getReturnValue());
}
});
$A.enqueueAction(initAction);
}
})
</pre>
</div>
<br /></div>
<div>
Just one simple function, which sets up a method call to our Apex controller called getChucked. I think all methods coming from the Apex need to start "get", and I don't know why the c. prefix is required. This had to be like this though because I couldn't call ICNDB from Javascript, so I use standard javascript to pull off an Asynchronous callout, I can set the parameters by GETTING the values from the attributes on the page, and passing them in with "setParams".. and then in the callback function I use the Component.set method to update the quote in the UI output text element.</div>
<div>
<br /></div>
<div>
Once I had this component ready, I needed to house it in a Lightning Application, which I did so by making a new Application from the developer console, and simply entering:</div>
<div>
<br /></div>
<div>
ContactChuckerApp.app</div>
<div>
<br /></div>
<div>
<div class="mycode">
<pre><aura:application access="GLOBAL" extends="ltng:outApp" >
<aura:dependency resource="c:ContactChucker" />
</aura:application>
</pre>
</div>
<br /></div>
<div>
Here I just needed to tell Salesforce the app was available to anything that wanted it, and that it would be output on Visualforce pages (the outApp base controller). That is really it.. In this form, the preview button comes up blank, because the app doesn't actually make a component, just depends on it... but to test it, instead of that being a dependancy, you can actually just include the c:contactchucker tag to initiate the component right in the app.</div>
<div>
<br /></div>
<div>
<b>A little Apex</b></div>
<div>
<b><br /></b></div>
<div>
So I now had a component, but it was trying to use a controller to make a call out that didn't exist.. so we better fix that. Here is the simple controller method to make the call out, as an @AuraEnabled method, and some clever innerclasses to facilitate the JSON deserialiser.</div>
<div>
<br /></div>
<div>
ChuckController.apx</div>
<div>
<br /></div>
<div>
<div class="mycode">
<pre>public class ChuckController {
@testVisible
private class JsonJoke {
public String type { get;set; }
public JokeValue value { get;set; }
}
@testVisible
private class JokeValue {
public String joke { get;set; }
}
@AuraEnabled
public static String getChucked(String firstN, String secondN) {
HttpRequest req = new HttpRequest();
req.setEndpoint('http://api.icndb.com/jokes/random?firstName=' + firstN + '&lastName=' + secondN);
req.setMethod('GET');
Http http = new Http();
HTTPResponse res = http.send(req);
JsonJoke jsjk = (JsonJoke)JSON.deserialize(res.getBody(), JsonJoke.class);
return jsjk.value.joke;
}
}
</pre>
</div>
<br /></div>
<div>
I hear what you are thinking though, with Apex, we need tests to be able to package or promote this work. Well, don't freak out, there is a really simple test to assert this behaviour that utilises the Apex testing MockHttp library:</div>
<div>
<br /></div>
<div>
ChuckControllerTest.apx</div>
<div>
<br /></div>
<div>
<div class="mycode">
<pre>@isTest
global class ChuckControllerTest {
global class NeverMockChuckService implements HttpCalloutMock {
global HTTPResponse respond(HTTPRequest req) {
HTTPResponse res = new HTTPResponse();
ChuckController.JokeValue jv = new ChuckController.JokeValue();
jv.joke = 'MS Dynamics';
ChuckController.JsonJoke jj = new ChuckController.JsonJoke();
jj.type = 'joke';
jj.value = jv;
res.setBody(JSON.serialize(jj));
return res;
}
}
@isTest
public static void auraComponent_HttpMocked_ReturnsResult() {
Test.setMock(HttpCalloutMock.class, new NeverMockChuckService());
String quote = ChuckController.getChucked('Simon','Lawrence');
System.assertEquals('MS Dynamics', quote);
}
}
</pre>
</div>
<br /></div>
<div>
There's 100% coverage in your pocket right there.</div>
<div>
<br /></div>
<div>
We have a bunch of code then, and basically a working component, but we have a little more to do to get it on the page and operating. First we need to get it into a chunk of Visualforce, which means two things: Making a Visualforce page (that uses the Contact controller, so it can be put on the details page) that actually renders the app and component, and then passing the Contacts name down into the app so it can be sent to ICNDB... This is what the Visualforce page ended up being:</div>
<div>
<br /></div>
<div>
ChuckPage.vfp</div>
<div>
<br /></div>
<div>
<div class="mycode">
<pre><apex:page standardController="Contact">
<apex:includeLightning />
<div id="chuckLine" />
<script>
$Lightning.use("c:ContactChuckerApp", function() {
$Lightning.createComponent("c:ContactChucker",
{ firstN: "{!Contact.firstName}",
secondN: "{!Contact.lastName}" },
"chuckLine",
function(cmp) {}
);
});
</script>
</apex:page>
</pre>
</div>
<br /></div>
<div>
This is a standard (and apparently famous) snippet for embedding a Lightning Component on a Visualforce page. Include the Javascript, set up an empty div container, and then use that Script tag to setup an instance of your app, and then inject the dependant component... (don't get too bogged down in namespaces here, it's all just "c" it turns out). The second parameter of the createComponent is a Javascript object that is bound to the attributes of the Component above.. <b>gotcha: </b>do <i>not</i> use reserved words or field names here, like 'contactName' as an attribute, or it will never work! I spent ages wondering why I couldn't pass the contact name in, until I switched over to firstN and lastN as my attributes, contactName simply would not be set.</div>
<div>
<br /></div>
<div>
The last <b>two things</b> to do now then is to put this piece of Visualforce on the standard Contact page layout, and ... have you realised the last thing? You need to make the icndb.com domain a REMOTE SITE in remote site settings, or Salesforce won't be allowed to talk to it.</div>
<div>
<br /></div>
<div>
That is it though! you now have your own bad-ass Chuck Norris quotes about your Contacts in Salesforce, curtesy of Lightning Components. Here are some personal favourites...</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1o6BtAeCBCF3l3A_giFCGF3ygY0eHFanqvseqEdnkPXPljo2YKd0dIV4yGl1_D5ZoNHRv5KbvJ9AaL2Tt4BeXfy2TqIDA1H3tFPvgXT_tqRmeriI1IL2F2vW7kepQIqLR03wdEjls8EDI/s1600/Screen+Shot+2016-02-14+at+22.00.54.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="154" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1o6BtAeCBCF3l3A_giFCGF3ygY0eHFanqvseqEdnkPXPljo2YKd0dIV4yGl1_D5ZoNHRv5KbvJ9AaL2Tt4BeXfy2TqIDA1H3tFPvgXT_tqRmeriI1IL2F2vW7kepQIqLR03wdEjls8EDI/s640/Screen+Shot+2016-02-14+at+22.00.54.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioa5Y1dYB0E8Bv1McY2hpvUddkOeKt3pGxmU1pu4nAzxvKRSXecaJ_2Ivdupao0VZS5jayXLRACbEFjWyAIkC3iQNyphKwXwBAnoe0edlrxpUxVOzTT-Ay6X692okzTRsu0zGIxETIYMnf/s1600/Screen+Shot+2016-02-14+at+22.00.24.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="169" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEioa5Y1dYB0E8Bv1McY2hpvUddkOeKt3pGxmU1pu4nAzxvKRSXecaJ_2Ivdupao0VZS5jayXLRACbEFjWyAIkC3iQNyphKwXwBAnoe0edlrxpUxVOzTT-Ay6X692okzTRsu0zGIxETIYMnf/s640/Screen+Shot+2016-02-14+at+22.00.24.png" width="640" /></a><br /><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQwcQ97LD0c292qnIYDuiRpguscSR3ul7bG8fuBR3JnoTkKpHhTtgxcWQFTdqNTqtQ_C64B6QSGfKETKBWUtuj4yJQXTJHZ-OPd8HKAlRZ_z1Hsp5dlqo8-CCU3KMYALKH5ucrF6bXjOHS/s1600/Screen+Shot+2016-02-14+at+22.01.41.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="112" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQwcQ97LD0c292qnIYDuiRpguscSR3ul7bG8fuBR3JnoTkKpHhTtgxcWQFTdqNTqtQ_C64B6QSGfKETKBWUtuj4yJQXTJHZ-OPd8HKAlRZ_z1Hsp5dlqo8-CCU3KMYALKH5ucrF6bXjOHS/s640/Screen+Shot+2016-02-14+at+22.01.41.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div>
<br /></div>
Simon Lawrencehttp://www.blogger.com/profile/06468439024017853489noreply@blogger.com5tag:blogger.com,1999:blog-2232538987906803275.post-11271641063530308872015-12-18T09:37:00.000-08:002015-12-19T08:22:17.046-08:00Get your smarts on over Advanced Salesforce formulaeSomething I have blogged and tweeted about a couple of times in the past is writing quality, advanced formula fields. Having a good grasp of Salesforce formulae reaches beyond just formula fields though, as we encounter this mark up in Workflows, Approvals, Validations rules and numerous other areas of the declarative side of the platform.<br />
<br />
Badly written formulae can quickly start to stack up in your org (and I mean that literally - if you know how Formula dependencies are inter-compiled) so why don't you <b>stop the rot</b> before it begins with a new <i>exciting</i> Trailhead module... Introducing:<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwIT_juGPQvv1MxjhQVBCPnDgT9WSLCKphYrYt5lMbJILZyx1bAKzDzrK-X-J1nM6ExGjOpSX6U_UarxW8Y3d5kK6OCcKRjixHmOI_yVX1UWXbiH11RspZ8tNsG47YSsZHR02tz2yBtAIb/s1600/2015-12-18+11_09_03-Advanced+Formulas+_+Salesforce+Trailhead.png" imageanchor="1"><img border="0" height="136" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwIT_juGPQvv1MxjhQVBCPnDgT9WSLCKphYrYt5lMbJILZyx1bAKzDzrK-X-J1nM6ExGjOpSX6U_UarxW8Y3d5kK6OCcKRjixHmOI_yVX1UWXbiH11RspZ8tNsG47YSsZHR02tz2yBtAIb/s640/2015-12-18+11_09_03-Advanced+Formulas+_+Salesforce+Trailhead.png" width="640" /> </a><br />
<br />
<br />
Trailhead reckons this module will take about 2 hrs 30 mins and we know from past experience those estimates are pretty accurate, but this module is nicely broken up into 7 chunks, none more than 30 minutes, so again, as we know from before we can easily fit these bitesize chunks into our regular, busy days. I'm actually on holiday today, and so I am going to secretly work through these modules as Laura fusses about the house doing Christmassy things.<br />
<br />
<u>So, First</u><br />
<u><br /></u>
<b>Laura:</b> Shopping on "notonthehighstreet.com" for a novelty cushion as a Christmas present<br />
<br />
<b>Simon:</b> Using Basic Logic in Checkbox Formulas<br />
<br />
The first thing I had to overcome is that as a "Latin English" advocate, the plural of formula to me should be <b>formulae</b>, but I will let this go, that is not the challenge here.. the challenge here is getting the basics down with formula fields, and understanding the core functions and operators. As I came into this module, I was honestly expecting the use of some things like ISBLANK() to be the climax of advanced formula fields, so even I am now a little nervous about how advanced this might actually get! There is even a little bonus Back to the Future reference in this module. Which you can't miss.<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSrvIh3jeh5TS-W-GTM5Lfzv0DlfxV0i-z0rePc1RrM6aVk3IfiPSqtVWwMl-_4mVGuuVReHarg72c8Q4X8EvENaoIJkTJ2oGczhQf0_X3HKSO1th3JQcZQa_Y8TDaOebHhU7M93U1r8nU/s1600/2015-12-18+11_27_33-Opportunity+Edit_+Burlington+Textiles+Weaving+Plant+Generator+%257E+Salesforce+-+Dev.png" imageanchor="1"><img border="0" height="112" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSrvIh3jeh5TS-W-GTM5Lfzv0DlfxV0i-z0rePc1RrM6aVk3IfiPSqtVWwMl-_4mVGuuVReHarg72c8Q4X8EvENaoIJkTJ2oGczhQf0_X3HKSO1th3JQcZQa_Y8TDaOebHhU7M93U1r8nU/s640/2015-12-18+11_27_33-Opportunity+Edit_+Burlington+Textiles+Weaving+Plant+Generator+%257E+Salesforce+-+Dev.png" width="640" /></a><br />
<br />
As a personal aside to this module, I would have to say that I have always found it useful/better to actually use the "Insert Field" button to drop fields into formulae... I also quite often use the Function picker on the right to build up my code. Even though typing these things isn't hard. I think it makes it more methodical (and does reduce typos) than just freehanding it all in. The logical flow which you might type "this and that if that or this" might not be the most efficient way to actually evaluate something, and using the function selector makes me evaluate that a little harder.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhB3GGR8MNrbvqlwaF5Zau4ZKLWACT1T2oPS4YjkIrx3xlgdXrznvcqO-rwEbUNwX6fkZlA8wO_Ah3ZuS02tzVHwX3HvlJbUzRaBgE6ta53qn2mkZIIMxlLi1ELqr_e0M3EjbYcvTFQvmuR/s1600/2015-12-18+11_22_23-Opportunity+Validation+Rule+%257E+Salesforce+-+Developer+Edition.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="111" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhB3GGR8MNrbvqlwaF5Zau4ZKLWACT1T2oPS4YjkIrx3xlgdXrznvcqO-rwEbUNwX6fkZlA8wO_Ah3ZuS02tzVHwX3HvlJbUzRaBgE6ta53qn2mkZIIMxlLi1ELqr_e0M3EjbYcvTFQvmuR/s320/2015-12-18+11_22_23-Opportunity+Validation+Rule+%257E+Salesforce+-+Developer+Edition.png" width="320" /> </a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="" style="clear: both; text-align: left;">
Anyway, no distractions by personal techniques. We are here to <b>earn all the badges</b>. And besides, Laura has stopped shopping... it appears someone in our family is getting one of these next week:</div>
<div class="" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsCmsAxlfNB2GPzcE42NZValxRA6gD06msWtmHykBLeYaPgaoxcTYIxoBJKnTKqec8lJtFg_OkMTNJNYj5Xiq4jkl9eKQI9ZkM8Kt_0TUXITFPpX0u5zkMoMgFlOHT7ALkoqCYG7dd6P3x/s1600/7475022714_456f084763_o.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="133" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsCmsAxlfNB2GPzcE42NZValxRA6gD06msWtmHykBLeYaPgaoxcTYIxoBJKnTKqec8lJtFg_OkMTNJNYj5Xiq4jkl9eKQI9ZkM8Kt_0TUXITFPpX0u5zkMoMgFlOHT7ALkoqCYG7dd6P3x/s200/7475022714_456f084763_o.jpg" width="200" /></a></div>
<div class="" style="clear: both; text-align: left;">
<br /></div>
<div class="" style="clear: both; text-align: left;">
(I'm lucky none of our relations read my blog...)</div>
<div class="" style="clear: both; text-align: left;">
<br /></div>
<div class="" style="clear: both; text-align: left;">
<u>Module 2</u></div>
<div class="" style="clear: both; text-align: left;">
<br /></div>
<div class="" style="clear: both; text-align: left;">
<b>Laura: </b>Making posh coffees with the machine in the kitchen</div>
<div class="" style="clear: both; text-align: left;">
<br /></div>
<div class="" style="clear: both; text-align: left;">
<b>Simon: </b> Using numbers, currencies and percentages in formulas</div>
<div class="" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
This is a really good topic, and probably one where I fall foul of the rules more often than not. There is a sub-section in here on the solid use cases for these three different, specific formula types. I'm afraid that I am a bit of a dinosaur myself, and I still don't "believe" in these rich variable types. I just make everything a number, and then deal with the formatting, processing and collateral damage of doing so myself. I could definitely learn something here.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
I have also have trouble in the past with "divide by zero" errors in formulae, so it is worth noting the final paragraphs on "treating blanks as zero" - but you should also get into the habit of thinking about zeros being valid amounts. How often do you create a number field with a default of zero for initial values? Consider using an "IF( field__x == 0, 1, field__x)" to instead "divide by 1" - which of course has "no effect" when there is a nill value. (obviously check this makes sense to the business logic first).</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Laura rattled through those coffees, so no time for screen shots. A quick espresso and onwards!</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<u>Module 3</u></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<b>Laura: </b>Gone upstairs, I think she's on the phone to her mum</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<b>Simon:</b> Using Date and Date/Time formula</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Ironic this because if I keep up Salesforcing on holiday, I might not get many more dates..</div>
<div class="separator" style="clear: both; text-align: left;">
</div>
<div class="separator" style="clear: both; text-align: left;">
Once again there was some interesting learning in here even for an old hand like myself. DATE functions in formula fields are incredibly powerful. Coming from other programming language libraries being able to call out instances of TODAY and LASTWEEK in reports and rules has always been quite simply dreamy.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
The challenge on this module is a little odd, in terms of "business value".. I would probably have one of our BA's go back to this client to establish quite why they wanted the current day of the week on their contact page, but it's still a good example that uses a clever trick outlined in the module ;) - as an extension to this, you could consider taking a Date of Birth field on the contact page, and get Salesforce to output the day of week this contact was born.. You could then even cross reference it with that famous poem about "<a href="https://en.wikipedia.org/wiki/Monday's_Child">babies born on a monday</a>" to augment a Description field...</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
Either way, stack up the points, and prepare to move on. I have to go out now, I have a feeling the conversation is going to be a distant background noise to me now as my head buzzes about the possibilities of the next module.<br />
<br />
<u>Module 4</u><br />
<br />
<b>Laura:</b> Back home scrolling instagram for wedding ideas<br />
<br />
<b>Simon:</b> Using Picklists in Formulas<br />
<br />
I know who's having more fun on the sofa right now (I hope she doesn't look over at my screen). There is one resounding rule regarding Picklists in formulae that they address right at the head of this module: <b>ISPICKVAL()</b> - never forget this.<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLcf6FKV7gW3LshdlHned8NcE04l3N0addVy9hB8LwZ5Bchbg8R76Tbm2R57xtfoENtCqzbbuUeJbilc89Hk7ZYVOsHs3eRsE9DZI1Bfk2wJpbKnf50g9onjqAz8srFGlJYcMfsR-5QQH_/s1600/2015-12-18+11_48_47-Using+Picklists+in+Formulas+Unit+_+Salesforce+Trailhead.png" imageanchor="1"><img border="0" height="68" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLcf6FKV7gW3LshdlHned8NcE04l3N0addVy9hB8LwZ5Bchbg8R76Tbm2R57xtfoENtCqzbbuUeJbilc89Hk7ZYVOsHs3eRsE9DZI1Bfk2wJpbKnf50g9onjqAz8srFGlJYcMfsR-5QQH_/s640/2015-12-18+11_48_47-Using+Picklists+in+Formulas+Unit+_+Salesforce+Trailhead.png" width="640" /></a><br />
<br />
As much as Picklists can LOOK like text, ACT like text and in Apex be TREATED like text - in formulae, you need to address them with the ISPICKVAL function to compare them. I have lost count of the number of times this has caught me out and you eventually conceed "ooohhh, it's a picklist, thats why it doesn't work.". This module makes a good highlight of this, and explains the options you have in the form of CASE and TEXT as well. Most comparisons I make though tend to need ISPICKVAL - as you are plucking out one possible status value for an sObject and then asserting a bunch of rules around it.<br />
<br />
<u>Module 5</u> - the game is up<br />
<br />
<b>Laura:</b> Discovered I was on Salesforce, has gone into the other room<br />
<br />
<b>Simon:</b> Using text in Formulas<br />
<br />
This must be one of the biggest uses of simple formula fields in Salesforce - text manipulation. The examples in this module are exactly on point - concatenating names, turning numerical values into words (like "Hot" and "Cold" leads) - but <i>did you know</i> you can do so much more with text in formula fields? Just last week I tasked one of my colleagues (a fairly new start) with the challenge of replacing a "dirty product" flag with a "red light image" - he stared at me in horror, until I told him to quickly Google it... if I'd know this module existed, I would have sent him straight over here instead.<br />
<br />
That is exactly what you are about to embark upon in the challenge. Generating a five-star-review icon in place of a "1-5" numerical grade for Lead quality. This kind of formula field should be kept somewhere safe, as once you know how to do it - you are going to want to put images ALL OVER your page layouts. (with a bit of tinkering, you can get a whole raft of standard salesforce icons, such as traffic lights and 5-star rating, but also Tab icons and other standard imagery, so go have a poke around...!)<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrMPzhN6JknZPgIzORGvaCfmgj6d-AB6RdULEWb_uOH1wZ6bnny6USvpPaFKW5i0ZIc1xQXNjEaA_wuEqHId3HtY6m5yZqnpLVH6llHvWyoZ1Vm68QpU3SMC8nYI6oNdY1hyib5sqWa4m7/s1600/2015-12-18+12_07_13-Force2b+Salesforce+Consultant+%25C2%25BB+Icons+available+Salesforce.com.png" imageanchor="1"><img border="0" height="132" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrMPzhN6JknZPgIzORGvaCfmgj6d-AB6RdULEWb_uOH1wZ6bnny6USvpPaFKW5i0ZIc1xQXNjEaA_wuEqHId3HtY6m5yZqnpLVH6llHvWyoZ1Vm68QpU3SMC8nYI6oNdY1hyib5sqWa4m7/s640/2015-12-18+12_07_13-Force2b+Salesforce+Consultant+%25C2%25BB+Icons+available+Salesforce.com.png" width="640" /></a><br />
<br />
I now have to go and make lunch I think, to re-establish communication lines here at home, especially as the next module starts with a video, and I don't have headphones to hand.<br />
<br />
<u>Two modules to go</u><br />
<br />
<b>Laura:</b> Has put her shoes on, I think I'm in luck - she's off for a walk<u> </u><br />
<br />
<b>Simon: </b>Levelling up with Advanced Formulas<br />
<br />
It seems we have now learnt everything we need to know about advanced formula fields, much like the prodigy in every kung foo movie - it is now time to use what we have learnt. There are some really good tips on best practice formula practises, especially for longer formulae, with a nice 12 month example (which as I read I was sure, this can be simplified) - that is then smashed down to a super-simple 4 liner.<br />
<br />
There is a really interesting article linked out from this module "<a href="http://resources.docs.salesforce.com/198/16/en-us/sfdc/pdf/salesforce_formula_size_tipsheet.pdf">Tips for reducing formula size</a>" - and I am genuinely going to print this out and keep it in my desk drawer at work. My comment in the second paragraph about inter-compiling formulae is addressed in this document, with really good examples of how re-using another formula field repeatedly inside other formula fields will really, really quickly blow you out of the water for maximum formula compile size. Give this a good read, I have found myself applying the "when all else fails use a workflow rule" chapter <i>at least </i>once.<br />
<br />
The challenge on this module involves building two formula fields, so read through all the points before starting on it.. you actually want to develop from the bottom up on the challenge bullet points as you will reference your second formula field in your first (which you can't do until you have it).<br />
<br />
<u>The final module</u><br />
<br />
So there has been a little beer drinking between the advanced formula module and now, but I have always maintained I do my best coding when I'm more "relaxed".. (I'm not sure how my employer would feel about that mind)<br />
<br />
<b>Laura:</b> Wrapping presents on the floor<br />
<br />
<b>Simon:</b> Troubleshooting Formula Errors<br />
<br />
As I read down these common formula errors, I couldn't help but notice that I was just slowly nodding my head along in agreement with everything they said. Anyone who has worked with formula fields for a few years would have to admit or agree to these errors at some point or other. My suggestion of using the "Insert Field" and double clicking method names really does mitigate errors relating to missing parentheses or parameters because the wizard will fill them in for you as you go.<br />
<br />
The second half of this module reiterates the details from the "Tips" document I mentioned earlier in this post - which does just go to indicate it's importance (I knew it!). Being aware of the compilation process and limits is half the battle to not having a problem with it.<br />
<br />
This final challenge is a bit of a "spot the bug" one - which if you've ever paid attention to the <a href="http://www.meetup.com/Bristol-Salesforce-Platform-Developer-User-Group/">Bristol Developer User Group</a> that I run - you will know is <b>something of a personal favourite hobby of mine</b> - so I was delighted to recreate this problem and fix it up. Not a problem in the end, just pay attention to your training and you will have this module complete in a heartbeat.<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-opKJwqSQOWIUMU-k2tPQwdTOpyAxnG6rME307f_GwHzhEdPIHBivsHCW9xEw9V_wOuGIOV59aUy1PgFzFuCOIJoNuJtVI4BBVdwKUK8I8hi1dwNs0pXEQUbAhPzqL3RIqkaSUAHOqeR6/s1600/2015-12-18+16_53_12-Troubleshooting+Formula+Errors+Unit+_+Salesforce+Trailhead.png" imageanchor="1"><img border="0" height="220" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi-opKJwqSQOWIUMU-k2tPQwdTOpyAxnG6rME307f_GwHzhEdPIHBivsHCW9xEw9V_wOuGIOV59aUy1PgFzFuCOIJoNuJtVI4BBVdwKUK8I8hi1dwNs0pXEQUbAhPzqL3RIqkaSUAHOqeR6/s640/2015-12-18+16_53_12-Troubleshooting+Formula+Errors+Unit+_+Salesforce+Trailhead.png" width="640" /></a><br />
<br />
<br />
Now I haven't <i>technically</i> earnt this badge yet, as I didn't complete all the challenges (I know, I know, shocked gasps!). But if you would like to find out more about this, or other trailhead modules - get in touch with me and join us on January 7th at 6pm GMT for the <a href="http://www.meetup.com/Bristol-Salesforce-Platform-Developer-User-Group/events/227339637/">Bristol Salesforce Developer User group</a> who will be having a Trailhead meetup that night. Attendance can be physical or digital - we can skype-project you if you want, and I will be earning ALL these new badges that night, for sure!<br />
<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcIdO_KXkAHOyIAFfUL6GhuFRmbrHsGsfbdR_8oh00WHiU46hI7MA1cIZ73RERMvQdJG_pkcMrhMFpJDsylyDZCn2hwlg4ASfNC0zMUQJEKtb5kbXMWsUbfXtJk8GrKfoRZKNr-Vlvac4k/s1600/trailhead_project_battle_station.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcIdO_KXkAHOyIAFfUL6GhuFRmbrHsGsfbdR_8oh00WHiU46hI7MA1cIZ73RERMvQdJG_pkcMrhMFpJDsylyDZCn2hwlg4ASfNC0zMUQJEKtb5kbXMWsUbfXtJk8GrKfoRZKNr-Vlvac4k/s200/trailhead_project_battle_station.png" width="200" /></a>Whilst I am writing a blog post about Trailhead - whether you need the practise or not - I have to point out that there is now a module for <a href="https://developer.salesforce.com/trailhead/project/workshop-battle-station?utm_campaign=trailhead&utm_source=sfdc&utm_medium=chatter-success">building a Space Battle Station now</a>.... no more boring warehouses for us! <br />
<br />
Go earn all the badges!Simon Lawrencehttp://www.blogger.com/profile/06468439024017853489noreply@blogger.com48tag:blogger.com,1999:blog-2232538987906803275.post-71741165364796210242015-09-02T01:50:00.003-07:002015-09-03T00:41:38.380-07:00The New Lightning Experience, in New Trailhead modules!As the new Lightning Experience begins to make bigger and bigger waves through the IT community, you know there is always going to be one piece of the platform way ahead of the game... Trailhead. No sooner had the Lightning Experience been announced, than they were announcing new modules, new points and new badges to be earnt - along with the kind of high quality, test-assured knowledge that Trailhead has become reknown for.<br />
<br />
So with the introduction of three new super modules, it seemed kind of obvious which one I would throw myself at first.<br />
<br />
<b><span style="font-family: inherit;"><span style="font-size: small;"><a href="https://developer.salesforce.com/trailhead/trail/lex_dev">Developer Trail - Lightning Experience ?</a></span></span></b><br />
<b><span style="font-family: inherit;"><span style="font-size: small;"><br /></span></span></b>
<b><span style="font-family: inherit;"><span style="font-size: small;"><a href="https://developer.salesforce.com/trailhead/trail/lex_admin_implementation">Admin Trail - Starting with Lightning Experience ?</a></span></span></b><br />
<b><span style="font-family: inherit;"><span style="font-size: small;"><br /></span></span></b>
<b><span style="font-family: inherit;"><span style="font-size: small;"><a href="https://developer.salesforce.com/trailhead/trail/lex_admin_migration">Admin Trail - Migrating to Lightning Experience ?</a></span></span></b><br />
<br />
I'm going head first into the developer module. Though it must be noted I will absolutely continue on to complete the admin modules too, as it's all super relevant information.<br />
<br />
Actually, the most exciting bit about these modules is.. they (currently) have a <b>safe harbour statement.</b><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjvo5DFqDAcFruDTMznv6AaReLAIBbRK72ozYbH_8MEzjlyE1Mo8HHM-rKSwtwpnyEccNPah_jQmHMvRoIHTPA9ytHdGaD96yRsoDEz7TK8UhlJVqz5L-TwCStjDSpxCWS6Ht7LhgYEHAt/s1600/2015-09-02+08_44_36-Getting+Started+with+Salesforce+and+Lightning+Unit+_+Salesforce+Trailhead.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="170" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjvo5DFqDAcFruDTMznv6AaReLAIBbRK72ozYbH_8MEzjlyE1Mo8HHM-rKSwtwpnyEccNPah_jQmHMvRoIHTPA9ytHdGaD96yRsoDEz7TK8UhlJVqz5L-TwCStjDSpxCWS6Ht7LhgYEHAt/s640/2015-09-02+08_44_36-Getting+Started+with+Salesforce+and+Lightning+Unit+_+Salesforce+Trailhead.png" width="640" /></a></div>
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmIS_PJRGa4l1zi7X4z9q3lS5vOQlS0v9hq0twXNmElgsPJvw-81Ko9uoXYXLjRuTbjNW2UZCzoj1cKTDNsr6Vpv4_RWjIgbWjxY4bS8Jf36vUnGQDRb_K5Hw9xdvg7clFaQ0vxft7nXaG/s1600/2015-09-02+08_49_06-2015-09-02+08.47.56.jpg+-+Windows+Photo+Viewer.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmIS_PJRGa4l1zi7X4z9q3lS5vOQlS0v9hq0twXNmElgsPJvw-81Ko9uoXYXLjRuTbjNW2UZCzoj1cKTDNsr6Vpv4_RWjIgbWjxY4bS8Jf36vUnGQDRb_K5Hw9xdvg7clFaQ0vxft7nXaG/s200/2015-09-02+08_49_06-2015-09-02+08.47.56.jpg+-+Windows+Photo+Viewer.png" width="168" /></a>You don't get much more wild than that, we really are trekkin' into unexplored territory. I best get my Trailblazer armour on in case we encounter any wild bugs.<br />
<br />
So now I'm fully kitted out, lets do this module!<br />
<br />
(by the way, if you think this post is long, it really did take me the full 8+ hours to work through this module. We ain't kidding around no more). <br />
<br />
Starting with <span style="color: yellow;">"Getting Started with the Salesforce Lightning Experience" </span>- this is very much a module for totally new entrants to Salesforce, so I won't lie - I skimmed it a little bit, but even I was forced to stop every now and then and just absorb the screenshots of the new interface. It's really exciting taking in all the new buttons, layouts and "curvey borders" the Lightning Experience is bringing to the Salesforce front end.<br />
<br />
Time for a test now though, not too challenging on this introduction module, but a couple of options that will make you smile.. such as what is the difference between Lightning and Classic: "One makes you shockingly productive, while the other remains classically amazing." - I personally think this is technically true, so chew that over when you are picking <i>your</i> option on the test!<br />
<br />
Anyway, I nailed my 100 points. Obviously...<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUtzVXY4Ab8sGxWtnjGr9FNtXOlaOE61cIij03lVR0XeZlatUrzBV64jTI2aCNiPTxYkGjth6PjELaa6FWVdFtoARyVC3CPXpvpbka6l8GDuDbNTEjCXKYasr5gQLE4vDrJ2Im7INFedlo/s1600/2015-09-02+09_23_52-Getting+Started+with+Salesforce+and+Lightning+Unit+_+Salesforce+Trailhead.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="177" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUtzVXY4Ab8sGxWtnjGr9FNtXOlaOE61cIij03lVR0XeZlatUrzBV64jTI2aCNiPTxYkGjth6PjELaa6FWVdFtoARyVC3CPXpvpbka6l8GDuDbNTEjCXKYasr5gQLE4vDrJ2Im7INFedlo/s400/2015-09-02+09_23_52-Getting+Started+with+Salesforce+and+Lightning+Unit+_+Salesforce+Trailhead.png" width="400" /></a></div>
<div style="text-align: center;">
<span style="font-size: x-small;">(I love how people actually tweet these boxes! <span style="color: cyan;">#SoProud</span>)</span></div>
<br />
<br />
The next chapter <span style="color: yellow;">"Deciding If Lightning Experience Is Right for You"</span> is actually a really interesting for myself, as a developer on many different client orgs. This is a huge question for every developer, and every business currently on Salesforce. Of course, there is going to come a time when the Lightning Experience <b>will</b> have to be right for you, but at the moment, and for the foreseeable future, this is a decision you need to make yourself. If you want to know the pros-and-cons of the switch in a nice, concise (mostly tabular) format.. this module will teach you a lot of what you need to know. Issues such as <b>Reports</b>, <b>Javascript</b> and what will happen to your <b>Visualforce and Apex</b> are all accounted for here.<br />
<br />
Once you have digested all the information, prove yourself once again with a quick exam at the bottom of the module. Remember, on the final question for adoption, you are looking for the <b>RIGHT</b> answer - not the one that will almost certainly happen in most businesses (confetti optional).<br />
<br />
<br />
The final chapter of the developer track Introduction to Lightning Experience is how you actually enable it. Assuming the previous modules made you suitably excited, you'll need to know how to get your hands on it, and also the limitations (and incredible powers) you have regarding its roll out.<br />
<br />
Preparing your org, and using the switcher is going to be a hectic day in anyones office, so being best prepared with the knowledge (and the gotchas) is going to be a good idea. Read this chapter carefully, pass the 2 question exam - and prepare the fanfare:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHMc_x0u_Ouz3-xlbF61jS55sOBj2k-LphGbGgMSolgw5O1sZlMOmRnxwQaHaMbovHCYQR909gGHk4vkOZZtaSJ6CDK5p3N86EwsxYDA3_kchO5dGRN_VV8jHaGXS3AWUVFpOAPJMSe_lb/s1600/2015-09-02+09_46_32-Enabling+Lightning+Experience+Unit+_+Salesforce+Trailhead.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="424" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHMc_x0u_Ouz3-xlbF61jS55sOBj2k-LphGbGgMSolgw5O1sZlMOmRnxwQaHaMbovHCYQR909gGHk4vkOZZtaSJ6CDK5p3N86EwsxYDA3_kchO5dGRN_VV8jHaGXS3AWUVFpOAPJMSe_lb/s640/2015-09-02+09_46_32-Enabling+Lightning+Experience+Unit+_+Salesforce+Trailhead.png" width="640" /></a></div>
<div style="text-align: left;">
<b><br /></b></div>
<div style="text-align: center;">
<span style="color: red;"><span style="font-size: x-large;"><b>!!! BADGES !!!</b></span></span></div>
<br />
<br />
And that, ladies and gentlemen is how we pass the basic module! We now know what Lightning Experience is, whether it is right for us, and if so, how to turn it on.<br />
<br />
<b>But the fun doesn't end there!</b><br />
<br />
Next up, <span style="color: yellow;">Lightning Experience Development</span>. I'm going to throw in right at the top of this chapter... that things get serious from here on in. No more joke answers about Windows 10 or Confetti, so put those reading glasses on and get learning fast. Just to prove this fact (and I did this just for you, reader)...<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiiwYHdwKKHkhYI-OMCV_JnkMwfgRZgyZ-gab99PttSG0bv0xdD_eNcXnoa9q209rFxcUADB3xT00H-rSu205pwO0ZE41caJDy_gezs4_NmnVO5rw-iqrOapb7oX31FPSIbDJe1Qdcm-3Zs/s1600/2015-09-02+09_58_19-User+Interface+Development+Considerations+Unit+_+Salesforce+Trailhead.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="135" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiiwYHdwKKHkhYI-OMCV_JnkMwfgRZgyZ-gab99PttSG0bv0xdD_eNcXnoa9q209rFxcUADB3xT00H-rSu205pwO0ZE41caJDy_gezs4_NmnVO5rw-iqrOapb7oX31FPSIbDJe1Qdcm-3Zs/s320/2015-09-02+09_58_19-User+Interface+Development+Considerations+Unit+_+Salesforce+Trailhead.png" width="320" /></a> I got completely flumoxed by the first test and made a right mess of it.<br />
<br />
<span style="color: cyan;">#NowhereToHide</span><br />
<br />
I don't even know why they put "Who hoo" on the 25 point DIV... *grump*<br />
<br />
<br />
Moving through the Development module, you encounter a great (and honest) list of "what does work" and "what doesn't work". Salesforce have been really good here, putting their hand up when needed to admit some features are missing in this early release, and other areas where they have made technical descisions to cut access to client and server side features we may have previously depended on.. like access to the page global Window properites in Javascript - in favour of native Lightning library commands.<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvE_RgSMsJBLqldhWWST_qbDhcFLhuNMhMELPoXu7NztEC8cS3jTeXoGNGYPInZBeP-99CR4j2WnX9YbFbYT7Ozxzh7K2aItyrClWnRecU1Q0usrSTSvBsj3lkrS3VaE5c1L6N6J6mr_gG/s1600/2015-09-02+10_31_33-Developer+Trail+-+Lightning+Experience+_+Salesforce+Trailhead.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="252" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvE_RgSMsJBLqldhWWST_qbDhcFLhuNMhMELPoXu7NztEC8cS3jTeXoGNGYPInZBeP-99CR4j2WnX9YbFbYT7Ozxzh7K2aItyrClWnRecU1Q0usrSTSvBsj3lkrS3VaE5c1L6N6J6mr_gG/s400/2015-09-02+10_31_33-Developer+Trail+-+Lightning+Experience+_+Salesforce+Trailhead.png" width="400" /></a>Next, we encounter Lighning Components - and their distinction from the Lightning Experience, before moving onto ISVs and Packaging, in which <i>I think</i> there is an interesting double negative hurdle in one of the test questions (but I am a part time Grammar Policeman).<br />
<br />
The last chapter in this modle is Understanding the Changes to the other development tools (note, this is not about IDEs like I thought!) This module covers all the other considerations you didn't even realise you hadn't thought about - like existing packages, Apex API versions and so on. Upon completion of this module. You are a bad ass development ready Lightning brain.<br />
<br />
The third module, is <span style="color: yellow;">Using Visualforce in the Lightning Experience.</span>There is a really curious question in the test for the first chapter in module, so pay attention to the material, and do a lot of scrolling up and down as you consider you answers! These modules really take you deep into the nuances of developing Visualforce in the new Lightning Experience. You thought you knew it all? Think again! I dropped points again on this chapter due to a (perhaps) cocky approach to the tests. Come on Simon, knuckle down!<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtVfaJACOwzcbE3ep9duXJYTUEEczPoosiyx88fuTu1XkW7iCB4I6t7Cze2anN5nMO1LrR9djd8ZpHF4pkZcxOj0OQdpCziaNdwHeTEBP1OeU0yew7vyl3IvI2whgGXdrYd8n2fuflpSkE/s1600/2015-09-03+08_26_52-Simon+Lawrence.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtVfaJACOwzcbE3ep9duXJYTUEEczPoosiyx88fuTu1XkW7iCB4I6t7Cze2anN5nMO1LrR9djd8ZpHF4pkZcxOj0OQdpCziaNdwHeTEBP1OeU0yew7vyl3IvI2whgGXdrYd8n2fuflpSkE/s200/2015-09-03+08_26_52-Simon+Lawrence.png" width="133" /></a>Luckily for me, the next chapter on sharing the UX between the different experiences was fairly concise, and the questions directly (and with no double negatives!) related to the material. I'm back on the 100 points bus. Here, I found it interesting to learn that the UX a user has in their settings might also/still be affected by what browser (specifically, old browsers) they are using. Worth noting on that first support call to a government agent complaining their IE 4.0 "Lightning Experience" is a little more like drizzle.<br />
<br />
The Navigating chapter tells us all about how we can move users about in the new UX. This chapter had my favourite pairing of questions - as the options were the same, making you directly realise the difference between the two modes, and also immediatly see the overlapping technology in the options applicable to both.<br />
<br />
I blitzed through the last two modules on design considerations (which I genuinly always enjoy) and the intreging "Features to avoid" module, which very honestly highlights the problems with certain related lists, Javascript functions and Visualforce customisations that we may be used to, but that don't play nice with the Lightning Experience.<br />
<br />
Time for another badge though! I can now use Visualforce in the Lightning Experience.<br />
<br />
Are you still with me here? You're doing well! <br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFjOwtp9pokKBk3J9KdimsxT9hk1jewxdezaAOZk7h-Uj1LWqi4kaNiDGW4-3Qpk7FZCOC_NEja6937y_yzzrBmbD9Z0Yjf96MdekaRG22XQZFyCzsZXG8nifjegiH-RpS8uEuq1cbXz42/s1600/trailhead_module_lightning_components.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFjOwtp9pokKBk3J9KdimsxT9hk1jewxdezaAOZk7h-Uj1LWqi4kaNiDGW4-3Qpk7FZCOC_NEja6937y_yzzrBmbD9Z0Yjf96MdekaRG22XQZFyCzsZXG8nifjegiH-RpS8uEuq1cbXz42/s200/trailhead_module_lightning_components.png" width="200" /></a>The fourth module is a daunting 9 chapter one, estimated at 4 hours work - It's <span style="color: yellow;">Lightning Components..</span>This module has been around for a little while now, in the other Tracks, but it finally now has context! This is also where we are really getting into the guts of developing in the new Lightning world. The is also the end of the Multiple Choice tests, and now you are forced to connect you developer edition and actually <b>make this stuff happen!</b> By the end of this module, you can actually say "I have made a Lightning Component". You can lean back, be proud, and stick that badge on your chest like the medal it is, because everyone loves Lego™!!<br />
<br />
<br />
As you stride into the fifth, and final module of this Trail, The <span style="color: yellow;">Lightning Design System </span>you might feel a little sad, but you probably feel more exhausted than anything else.. fear not though, the finish line is in sight. Here we introduce best practises for designing, and also examine how Salesforce bakes accesibility and responsive design into the component structure without you lifting a finger. We also look into BEM - and this is one of the few times I've actually been off and done the associated reading too - to find out about the cool CSS architecture that has been adopted.<br />
<br />
Next we move onto Grids - and some terminology and design patterns that date back to the start of Computer Science itself, there is a reason these ideas have done so well though, so take your time to learn the basics of component layout work here.<br />
<br />
By now your eyes are fully in code-reading mode, and that's good, because it's getting geekier and geekier in these modules, take a peak at the middle of the Salesforce Data chapter to see what I mean...<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7pdY2vfHvxAFcaRhr68fSl7E3vvOO9Ct9AD36-nhfIMD0D_iviZwzRrpqJAameRtDTDZS2-GmttLjJ425tasE-1h3bvgHm5XMfSjdaiYrFfeEIHyhOqv28uuB337GYIbifYVg0MVW5oXl/s1600/2015-09-02+14_37_49-Working+with+Salesforce+Data+Unit+_+Salesforce+Trailhead.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="492" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7pdY2vfHvxAFcaRhr68fSl7E3vvOO9Ct9AD36-nhfIMD0D_iviZwzRrpqJAameRtDTDZS2-GmttLjJ425tasE-1h3bvgHm5XMfSjdaiYrFfeEIHyhOqv28uuB337GYIbifYVg0MVW5oXl/s640/2015-09-02+14_37_49-Working+with+Salesforce+Data+Unit+_+Salesforce+Trailhead.png" width="640" /></a></div>
<br />
Ophh! Time to book that eye check ;)<br />
<br />
What we are looking at here though is the new Salesforce data integration code though. What good is a sexy component if it can't interact with your Salesforce data?<br />
<br />
<br />
The penultimate module is on introducing graphics and rich media into your components, and we even get to have a dig at Internet Explorer (oops, I may have given a hint to one of the answers there...). It's also nice to see that the author went that extra mile with their test data for the screen shots... I think I remember this account from the Developer Edition standard data records.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijXyWBe4qYQU-0hEykOhU2-W5DMZsApZaT-4QH1wRvfbOUhzREYEI73Mdj6RIYyu86dhnUPV4ggkh2OzUt6OF0Rq3GXPy2zrfhtSOCZNf87V4bcvSlchJSbsNgQRCIco-q0vsrIGXOjyfC/s1600/2015-09-02+14_56_13-Using+Images%252C+Icons+and+Avatars+Unit+_+Salesforce+Trailhead.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijXyWBe4qYQU-0hEykOhU2-W5DMZsApZaT-4QH1wRvfbOUhzREYEI73Mdj6RIYyu86dhnUPV4ggkh2OzUt6OF0Rq3GXPy2zrfhtSOCZNf87V4bcvSlchJSbsNgQRCIco-q0vsrIGXOjyfC/s1600/2015-09-02+14_56_13-Using+Images%252C+Icons+and+Avatars+Unit+_+Salesforce+Trailhead.png" /></a></div>
The final chapter, titled <span style="color: yellow;">Laying out a Record Home Page and Using Advanced Components </span>and with nothing less than a heading of "The Grand Finale" provides exactly what one would expect of such an EPIC trailhead module. It leads you down bringing all of the component work you have done over the last few hours (few, ha!) and you finally build a full and complete record home page for your Account objects. Look at it, beautiful:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdLkEiyrJBCscTca0be3gblzEL4AwCmUTi_mTCBjy7f_wk3f_YG4xfLwVrzoZ6a8PUA-G_yU88BVfqW7dboT9y-KzCobcgIRKnPxWl_ZfUc8Le3u3auUdI3BQoKaMIzVTLXPpd_QSsr0i1/s1600/Lightning-Design-System_images_unit6-complete.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="362" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdLkEiyrJBCscTca0be3gblzEL4AwCmUTi_mTCBjy7f_wk3f_YG4xfLwVrzoZ6a8PUA-G_yU88BVfqW7dboT9y-KzCobcgIRKnPxWl_ZfUc8Le3u3auUdI3BQoKaMIzVTLXPpd_QSsr0i1/s640/Lightning-Design-System_images_unit6-complete.png" width="640" /></a></div>
Two more questions and you are done! Take that module badge with pride, go and tell your boss you are now a fully experienced "Lightning Component Developer", put it in your family newsletter, or even better - go get a tattoo*. (now that would be a first!)<br />
<br />
If you really made it all the way to the end - drop me a tweet <a href="https://twitter.com/srlawr">@srlawr</a> - and I will give you an awesome shout out for your efforts!! <br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNQu_Jo2Cgw5BNHXqOq_9-SC-j5b_5WIoGvvTLHpK4peDHNUIal4wKDYsCATvuxPRO_agYoTebbMX8rlX1x598QIIsGXpJc4cqrbyS4auh3ssVDa-qlsaRZSFcnh8tr_dYn68K0vuZkg8J/s1600/2015-09-02+15_24_34-Developer+Trail+-+Lightning+Experience+_+Salesforce+Trailhead.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="176" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNQu_Jo2Cgw5BNHXqOq_9-SC-j5b_5WIoGvvTLHpK4peDHNUIal4wKDYsCATvuxPRO_agYoTebbMX8rlX1x598QIIsGXpJc4cqrbyS4auh3ssVDa-qlsaRZSFcnh8tr_dYn68K0vuZkg8J/s640/2015-09-02+15_24_34-Developer+Trail+-+Lightning+Experience+_+Salesforce+Trailhead.png" width="640" /></a></div>
<br />
* don't get a tattoo...<br />
<br />
<br />Simon Lawrencehttp://www.blogger.com/profile/06468439024017853489noreply@blogger.com6tag:blogger.com,1999:blog-2232538987906803275.post-21769691281386853832015-08-05T04:06:00.001-07:002015-08-05T05:27:38.150-07:00Blazing away with Trailhead Event Monitoring<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgZwpD451ZgxsVYv7Ur-HVss9B0-sGzz6iYb-C86UQpUwdcxihyW706k5LRFY9kpr4sjK-iyQlUwZCNPjjZGClV7Lzd2cfH87VccJ6iDKO1m7QekmhHT19IoJ5kDweatuZY2_u4SCB42Fg/s1600/trailhead_module_shield_event_monitoring.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhgZwpD451ZgxsVYv7Ur-HVss9B0-sGzz6iYb-C86UQpUwdcxihyW706k5LRFY9kpr4sjK-iyQlUwZCNPjjZGClV7Lzd2cfH87VccJ6iDKO1m7QekmhHT19IoJ5kDweatuZY2_u4SCB42Fg/s200/trailhead_module_shield_event_monitoring.png" width="200" /></a>If you work with, or within Salesforce - and you don't live under a rock - you must by now be familiar with the revolutionary interactive training tool called <a href="https://developer.salesforce.com/trailhead">TRAILHEAD</a>. This gamified, dynamic, challenging and rewarding tool provides chapters of training material and automated testing tools to lead developers and admins through the new (and core) features of the Salesforce platform. <br />
<br />
<br />
We have recently used Trailhead to onboard some new starters at Desynit, and they have been absolutely blown away by the quality of the material - and you know the best thing? New material is being published ALL THE TIME so even veterans of the Force like myself can keep learning, and scoring on Trailhead.<br />
<br />
For one, I have just this very minute finished writing up my <i>own </i>Trailhead content which I hope will be delivered at Dreamforce 2015 in San Francisco, but besides myself and my fellow MVPs, the Trailhead team have just release three whole new modules for the world to complete.<br />
<br />
These are:<br />
<br />
<a href="https://developer.salesforce.com/trailhead/trail/getting_started_crm_basics"><b>Admin Trail - CRM</b></a><br />
<br />
<a href="https://developer.salesforce.com/trailhead/module/dreamforce_intro"><b><b>Dreamforce Trail with Get Ready for Dreamforce module</b></b></a><br />
<br />
<a href="https://developer.salesforce.com/trailhead/module/event_monitoring"><b><b><b>Event Monitoring module</b></b></b></a><br />
<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8W4R-3VV7FzFDrjN5fBRTYoCiHPL4NSnQjmXEMSFRq-zh_BYhPLUif-cRckbKsNSLcbUU5XPsNlg_XnB92GVV0ShGE3_1_bPFOoxOG7q5aWCSLXeqz49cxhSPns0IpYnqJ5YC3ZSARoQi/s1600/1898122_10153786452225461_1872730606_n.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8W4R-3VV7FzFDrjN5fBRTYoCiHPL4NSnQjmXEMSFRq-zh_BYhPLUif-cRckbKsNSLcbUU5XPsNlg_XnB92GVV0ShGE3_1_bPFOoxOG7q5aWCSLXeqz49cxhSPns0IpYnqJ5YC3ZSARoQi/s200/1898122_10153786452225461_1872730606_n.jpg" width="200" /></a>I was personally particularly interested in the <b>Event Monitoring module</b>, a large part of my role these days is supporting and maintaining what are now considered large, and legacy Salesforce implementations, I spend a lot of time investigating and monitoring our client work for bugs and issues, and monitoring adoption and usage, so event monitoring is a big part of my life. <br />
<br />
This module drew my attention to the fact that there are some cool new tools to assist me in this, and I am keen to get that "Sherlock Holmes" badge on my profile.<br />
<br />
Here is the module overview - three lovely bitesize pieces of work to introduce me to this new world of sleuthing. <br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieQggTN-NiAwdGxykhRmg3PO1WjI625DRbzFEmOYfpofWMXhokkCr27yM_p5mPjNkUwz-jYD5j45EqSz0WPCY8w1Vnua_kPHjFVmuhNB_lu5NA7kpMn4DhVaRhZmuaGIfpfsSlEQcdPakz/s1600/2015-08-05+11_30_10-Event+Monitoring+_+Salesforce+Trailhead.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="422" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEieQggTN-NiAwdGxykhRmg3PO1WjI625DRbzFEmOYfpofWMXhokkCr27yM_p5mPjNkUwz-jYD5j45EqSz0WPCY8w1Vnua_kPHjFVmuhNB_lu5NA7kpMn4DhVaRhZmuaGIfpfsSlEQcdPakz/s640/2015-08-05+11_30_10-Event+Monitoring+_+Salesforce+Trailhead.jpg" width="640" /></a></div>
<br />
<br />
The first module <b>"Getting Started"</b> is exactly that - I immediately learnt a lot about the new logging features, and I'm immediately inspired to find out more about how I can use them in my day to day life. First though - I need to finish this module and pass the test. This is a multiple choice exam module (all the Event Monitoring modules are) so it's time to put my thinking hat on...<br />
<br />
<i>(if you are hoping for the answers here - think again!) </i><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_FfaYlgbIPg8J3Qo8JTtTPtX-SpDSPTEenq_LMIgLQ7VsZ0Sw5ymbAxS8AkwJ-goEKWyWCl4x0CaJrkhBuLACCOSeBB85CakX5IwO2EgwDsZqQ_lbFheUil4YgqDaaHrQg4o5GHB8ldmZ/s1600/2015-08-05+11_26_41-Get+Started+with+Event+Monitoring+Unit+_+Salesforce+Trailhead.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_FfaYlgbIPg8J3Qo8JTtTPtX-SpDSPTEenq_LMIgLQ7VsZ0Sw5ymbAxS8AkwJ-goEKWyWCl4x0CaJrkhBuLACCOSeBB85CakX5IwO2EgwDsZqQ_lbFheUil4YgqDaaHrQg4o5GHB8ldmZ/s640/2015-08-05+11_26_41-Get+Started+with+Event+Monitoring+Unit+_+Salesforce+Trailhead.jpg" width="640" /></a></div>
<br />
<b>Boom. 100 points.</b> This still gives me such a thrill as I stack up my score.<br />
<br />
This module took me about 15 minutes, exactly as estimated on the dashboard.<br />
<br />
Delving into the second module for Querying Event Log Files - you better be prepared for some slightly more hardcore questioning! (I'm not saying I got one wrong - but READ THE QUESTIONS CAREFULLY!). I learnt about using SOQL and the REST API to tug on my event information, and find out how we can monitor Logout events in my developer edition. This was a bit more of a technical module, and it appealed greatly to my developer side... A slightly quieter boom goes off as I earn another 50 points.<br />
<br />
Finally - Downloading and Visualizing logs, took me a little longer than the 15 minutes, as there is quite a lot of material, so overall I would say this module took me just under an hour. Not bad for 250 points though (ahem) - and I get that badge on my profile!!<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_WBsT-6a6PVuf4ykX4v92xFYlOdsTMAPwU7jjDO-jtglbrywHODLgisJlsLicwEOAkhmVhQPVl9hIIzuJ6vv83cw8CQLgdP47F-n3lNvIQGZZrLi5GXaPn-htNNnGvXsDFk-ibHOb1WA-/s1600/2015-08-05+11_38_38-Event+Monitoring+_+Salesforce+Trailhead.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="416" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_WBsT-6a6PVuf4ykX4v92xFYlOdsTMAPwU7jjDO-jtglbrywHODLgisJlsLicwEOAkhmVhQPVl9hIIzuJ6vv83cw8CQLgdP47F-n3lNvIQGZZrLi5GXaPn-htNNnGvXsDFk-ibHOb1WA-/s640/2015-08-05+11_38_38-Event+Monitoring+_+Salesforce+Trailhead.jpg" width="640" /></a></div>
<br />
<h2>
Wondering how to get started on Trailhead?</h2>
If getting into Trailhead is proving difficult for you, or you find these more advanced modules difficult or daunting - make sure you look into finding your <a href="https://developer.salesforce.com/dugs?title=page/Force.com_User_Groups">local Developer User Group</a> there are over 130 of them around the world, most meeting 6 - 12 times a year to talk about Salesforce, and the Force.com development experience.<br />
<br />
I run the <a href="http://www.meetup.com/Bristol-Salesforce-Platform-Developer-User-Group/">Developer User Group in Bristol</a> - down in the South West of England, and in July 2015 we held a Trailhead Developer night. A dozen of us got together, opened up our laptops (and opened up some beer and pizza) and had a 3 hours blast at Trailhead, earning over 35,000 points between us in the night.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoiC4rCD66PPJZel7drRNwK8nnVxFzezYU_lPRlQ8grmhmv62hM0_jal3mTtDz5UBg5Nchv0GwpoG8frs2uzAgyI4duHyIb9q_7b7GrsBSbJ8YglbBnrSA3WLgLo1_GGdTSe7BjFNDTOX0/s1600/2015-07-23+19.16.12-2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjoiC4rCD66PPJZel7drRNwK8nnVxFzezYU_lPRlQ8grmhmv62hM0_jal3mTtDz5UBg5Nchv0GwpoG8frs2uzAgyI4duHyIb9q_7b7GrsBSbJ8YglbBnrSA3WLgLo1_GGdTSe7BjFNDTOX0/s640/2015-07-23+19.16.12-2.jpg" width="640" /></a></div>
<br />
It was a great way to earn some points and badges, and we even got a little competitive and awarded cool "Trailhead Hoodies" to the highest achieving users. find your local DG and sign up to their next meetup <a href="https://developer.salesforce.com/dugs?title=page/Force.com_User_Groups">here</a>.<br />
<br />
<br />
<br />Simon Lawrencehttp://www.blogger.com/profile/06468439024017853489noreply@blogger.com6tag:blogger.com,1999:blog-2232538987906803275.post-49924356573423945762014-12-12T04:01:00.000-08:002014-12-12T04:07:46.940-08:00Happy Christmas!<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWG7usdn6g-cQsoOObgxoTjSOWApLsyNW7owCX0tklv-FIfVn7Wfv2N4rMxw0034XeT7MfxAnnqocyXUN6CHbJbNg4aO8x6mCi09N_S_HZQSyf66Xja6_4-Omsgn6wV-Q2H2O8LGEBoIOT/s1600/2014-12-12+11_39_53-The+Simon+Lawrence+Application+Development+Blog_+Merry+Christmas+from+Desynit.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiWG7usdn6g-cQsoOObgxoTjSOWApLsyNW7owCX0tklv-FIfVn7Wfv2N4rMxw0034XeT7MfxAnnqocyXUN6CHbJbNg4aO8x6mCi09N_S_HZQSyf66Xja6_4-Omsgn6wV-Q2H2O8LGEBoIOT/s1600/2014-12-12+11_39_53-The+Simon+Lawrence+Application+Development+Blog_+Merry+Christmas+from+Desynit.jpg" height="178" width="320" /></a>Wow, it hardly seems like two years since Desynit produced our "Merry Christmas" video (which you can find on my <a href="http://srlawr.blogspot.co.uk/2012/12/merry-christmas-from-desynit.html">Blog Post from 2012 here</a>) but it has been. Since then, we've grown so much as a company we have had to move office. We now have our own meeting room, <i>two</i> front doors and "Mac" users in the company. Things are changing fast.<br />
<br />
<br />
<span id="goog_572717166">One thing that hasn't changed though is our creative, and fun brand promotion and marketing initiatives. It seems almost every week these days I'm "borrowed" from my desk to snap a quick picture, proof-read a blog post, or take part in some complicated stunt to help promote a tweet, user group event or any one of the many channels of activity Desynit are involved in.</span><br />
<span id="goog_572717166"><br /></span>
<span id="goog_572717166">Luckily, this year, our Christmas message was a little easier than donning the old itchy beard... all I had to do was <a href="https://www.facebook.com/Desynit/photos/a.142715185831664.18297.114710818632101/529701483799697/">give away a bottle of craft beer</a> in fact! On the run in to Christmas (the last 12 working days) each of the team here is featuring in a social media post with a piece of seasonal technology advice, as a gift to the community. My top tip was for the best service "remember to shop small and local". I am a big advocate of using local businesses and services, and believe that knowing the people you are dealing with is really important. It's definitely something I advocate here at Desynit, always making sure to phone clients when needed/possible and make sure they are comfortable with their projects, and know the people behind the work - we're not just some factory churning out pages of code.</span><br />
<br />
<a href="https://www.facebook.com/Desynit/photos/a.142715185831664.18297.114710818632101/529701483799697/" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img alt="https://www.facebook.com/Desynit/photos/a.142715185831664.18297.114710818632101/529701483799697/" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhFmAKa6Eqidwuh8uphsHip_WPPrDbC-A5H1BBAv146kb95E_kO_30lt6lfIRs0OdETgwGCamK-qv07U0sZIwDKBF9fWu58jJ_qOa4uoZbWJWTMRTQM0DsnxvcvpBrviApknp9o88QClJr_/s1600/2014-12-12+11_59_15-Desynit+-+Timeline+Photos.jpg" height="187" width="200" /></a><span id="goog_572717166"><br /></span><br />
<span id="goog_572717166">Anyway, if you are reading this, you are too late to win the bottle of beer - that went to Python developer Tom Blockley, from <a href="http://www.teamrubber.com/">Team Rubber</a> but you can still have a laugh at a <span style="color: red;"><a href="https://www.facebook.com/Desynit/photos/a.142715185831664.18297.114710818632101/529701483799697/">"Elffed" up picture of me on the facebook post here.</a></span></span><br />
<br />
<span id="goog_572717166"><span style="font-size: large;">So Happy Christmas everyone, I hope you have a prosperous 2015!</span> </span><br />
<span id="goog_572717165"></span>Simon Lawrencehttp://www.blogger.com/profile/06468439024017853489noreply@blogger.com7tag:blogger.com,1999:blog-2232538987906803275.post-41040732139606356732014-09-23T04:24:00.003-07:002014-09-23T07:36:30.510-07:00Service Cloud's Support.EmailTemplateSelector ExampleA cool feature for Salesforce Service agents is being able to send e-mails back to customers directly from the Case Feed using the "Email" publisher action.<br />
<br />
Using things like Auto-response rules and Quick Text allows agents to manage customer queries with incredible power and ease, but one case scenario I found that has come up a number of times is wanting to have <i>almost</i> case specific boiler plate text pre-filled in the e-mail, such as salutations and signatures.<br />
<br />
It is definitely not uncommon to have more than one "product" or "channel" being managed through Service Cloud support cases, often by the same group of agents, changing their hats as different cases need attention, and so presenting the most appropriate Email Template for them to "fill in" as a response to a customer comes down to the "Enable Default Email Templates" feature..<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPi3ohDhBeeWN0lC53-9XbIoE4hRo1Z7-6EcZBypsTbsPYFbBBbujCI4o5EixCSHJBNM82GZ-xNUs-QMOitMEWk3nSp4Bo9fB0ptKPVkMiOfo6jRs7T7g3lXvu6iwrL8IzW1KgfSfsZdRH/s1600/2014-09-23+11_17_36-Support+Settings+~+salesforce.com+-+Enterprise+Edition.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPi3ohDhBeeWN0lC53-9XbIoE4hRo1Z7-6EcZBypsTbsPYFbBBbujCI4o5EixCSHJBNM82GZ-xNUs-QMOitMEWk3nSp4Bo9fB0ptKPVkMiOfo6jRs7T7g3lXvu6iwrL8IzW1KgfSfsZdRH/s1600/2014-09-23+11_17_36-Support+Settings+~+salesforce.com+-+Enterprise+Edition.jpg" height="42" width="640" /></a></div>
<br />
This can be found and enabled in <b>Setup > Customise > Cases > Support Settings</b> towards the bottom.. but don't go over then enabling it just yet, as you need to do some ground work first.<br />
<br />
Once enabled, this setting lets you use an Apex Class to determine which Email template you will use for this specific case. This literally throws the full power of Apex into the decision engine you are about to craft.<br />
<br />
I am going to talk you through using this feature to deliver <b><i>two</i></b> different e-mail templates which can be used depending on whether a case was delivered to the system by <b>email-to-case</b> or <b>web-to-case</b>.. and this assumes you have configured these two channels to set the "Origin" of the case to Email and Web. In each case we want to salute the customer, thank them for engaging on the relevant channel and then sign off with a different help desk name. The middle of the e-mail will be left blank for the agent to fill in their response.<br />
<br />
So<br />
<br />
<b>Step 1. Make the e-mail templates</b><br />
I won't molly coddle you through this process.<b> </b>Go into <b>Setup > Communication Templates > Email Templates</b> and using your favourite format, folder structure and style, craft two different e-mail templates for your support staff. My Email support one looks like this:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg90A3C-zQHaHTgf1K1pMEWTlOV7Rdk-IkUW_e2vE_vNYdVhFuOHDXbcmoa2IzTBdjELlPiPFKTHXokSB2hhMXzzAkwU8ncQRfzx9lHZ4jUomtY1egMSZG6u6-Rp6aTKZg44_VdMtiEzV73/s1600/2014-09-23+11_47_14-Text+Email+Template_+New+Template+~+salesforce.com+-+Developer+Edition.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg90A3C-zQHaHTgf1K1pMEWTlOV7Rdk-IkUW_e2vE_vNYdVhFuOHDXbcmoa2IzTBdjELlPiPFKTHXokSB2hhMXzzAkwU8ncQRfzx9lHZ4jUomtY1egMSZG6u6-Rp6aTKZg44_VdMtiEzV73/s1600/2014-09-23+11_47_14-Text+Email+Template_+New+Template+~+salesforce.com+-+Developer+Edition.jpg" height="418" width="640" /></a></div>
<br />
<br />
Once you have them...<br />
<br />
<b>Step 2. Create your Apex Class</b><br />
Now this really is the crux of it. You have to provide an Apex Class that implements the <span style="font-family: "Courier New",Courier,monospace;">Support.EmailTemplateSelector</span> interface, and implements the global method <span style="font-family: "Courier New",Courier,monospace;">global ID getDefaultEmailTemplateId(ID caseId)</span> in it. This returned ID is the template that will be placed into the Email box when a case is loaded into the Case Feed.<br />
<br />
So here is where you can get complicated, there are examples using dozens of templates, custom objects and custom settings to determine what template to load, so go nuts! In this simple example though, I am going to use the Case Origin to load a relatively named template, or return null (which will just use the default email format).<br />
<br />
This is all my class contains:<br />
<br />
<div class="mycode">
<pre>global class DefaultCaseEmailTemplates implements Support.EmailTemplateSelector {
global ID getDefaultEmailTemplateId(ID caseId){
// Load the relevant case details
Case thisCase = [SELECT Origin FROM Case WHERE Id=:caseId];
// Concatenate the "matching" support e-mail name
String templateName = thisCase.Origin.replace(' ', '_') + '_Support';
// Load the template Id by this name
List emailTemplate = [SELECT id
FROM EmailTemplate
WHERE DeveloperName = :templateName];
// If we got one, return it, otherwise return null
if (!emailTemplate.isEmpty()) {
// return the template Id
return emailTemplate.get(0).Id;
} else {
// returning null means the system just presents a blank response template
return null;
}
}
}</pre>
</div>
<br />
And it is as simple as that for this case scenario. "Web" origin will load a template called "Web_Support" and "Email" Origin will load "Email_Support" - if the user wants to add more channels to the origin, they can do so, and either add a new template (with "_Support" at the end) or just let it fall to the default. Lovely.<br />
<br />
<b>Step 3. Test that class</b><br />
Now, personally, I do test driven development, so this would be step 1.5 technically in this flow, but I have included it after the Apex Class, because I know how to keep an audience interested ;-)<br />
<br />
Testing this class isn't too difficult, but there is a trick or two - due to some old friends such as setting up system objects <i>and</i> user records in the same context. <span style="font-size: x-small;"> </span><br />
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<span style="font-size: x-small;">(One short fall of this test class is that it requires a user in the System Administrator profile to be available... I personally consider that a given though)</span></div>
<br />
Here is the simplest (single pass, positive scenario) test class for this. I suggest you augment this a little for your own implementation if you believe in good testing!<br />
<br />
<div class="mycode">
<pre>@isTest
public class DefaultCaseEmailTemplatesTest {
@isTest
static void LoadEmailTemplates_SuccesfulScenario_ReturnsTemplateId() {
Id templateId;
User thisUser = [SELECT Id FROM User WHERE profile.name ='System Administrator' LIMIT 1];
System.runAs(thisUser) {
templateId = insertTemplate();
}
Id caseId = insertCase();
DefaultCaseEmailTemplates dcet = new DefaultCaseEmailTemplates();
Id result = dcet.getDefaultEmailTemplateId(caseId);
System.assertEquals(templateId, result);
}
private static Id insertTemplate() {
EmailTemplate emailTemplate = new EmailTemplate(DeveloperName='test', Name='test', FolderId=UserInfo.getUserId(), TemplateType='Text');
insert emailTemplate;
return emailTemplate.Id;
}
private static Id insertCase() {
Case testCase = new Case(Origin='Email Just Ingredients');
insert testCase;
return testCase.Id;
}
}
</pre>
</div>
<br />
<br />
Ahh. I love it when a test class ends up 10 times the length of the code it is testing!<br />
<br />
<b>Step 4. Enable this class</b><br />
Now it is time to head back over to <b> </b><b>Setup > Customise > Cases > Support Settings</b> and set "Enable Default Email Templates" at this point it will ask for your class, so point it at it using the lookup box.,<br />
<br />
<b>Step 5. Test it out</b><br />
Head over to your Case page, or Case Feed page, for a case that has one of the Origins you specified, and click to open the Email publisher action (if you don't have this action, you will have to Google how to do that! (hint: it's under Actions on the Page Layout Editor) - and if everything has gone right, you should see you e-mail template loaded into the box, ready to be completed!<br />
<b> </b><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZj-7oyj28vmqdnV_-GWtNirzRJCgpAp4d33VIsAcofYn2KDTme4CQIedNReJdUcW6kbKbi4pDzbdedAjNkH5MhUlNlQSbdFk8E6qjm1Fc1OdEN_37jGoaXFUJNZUWQgDl_ileVbrKqo4V/s1600/2014-09-23+12_17_05-Case_+00001018+-+Console.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZj-7oyj28vmqdnV_-GWtNirzRJCgpAp4d33VIsAcofYn2KDTme4CQIedNReJdUcW6kbKbi4pDzbdedAjNkH5MhUlNlQSbdFk8E6qjm1Fc1OdEN_37jGoaXFUJNZUWQgDl_ileVbrKqo4V/s1600/2014-09-23+12_17_05-Case_+00001018+-+Console.jpg" height="286" width="640" /></a></div>
<b> </b><br />
<b> </b>If you load a case from a different origin, you will either get their adjusted template, or no template at all. Easy!<br />
<br />
Now - go make that Apex Class over-complicated!Simon Lawrencehttp://www.blogger.com/profile/06468439024017853489noreply@blogger.com7tag:blogger.com,1999:blog-2232538987906803275.post-39032245389034124002014-08-13T07:01:00.002-07:002014-08-14T02:53:39.998-07:00Why you should absolutely let your employees attend DreamforceDreamforce, the Salesforce flagship annual event is slowly getting closer and closer, and no doubt if you employ Salesforce administrators, developers, or <i>anyone</i> who engages the platform on a regular basis, they are probably just itching to be able to attend.<br />
<br />
Trouble is, it's a long event, a long way away (from anywhere that is not San Francisco) and not a cheap ticket... so how can you justify sending them?<br />
<br />
You could use this <a href="http://www.salesforce.com/dreamforce/DF14/why-attend.jsp">"ROI of Dreamforce" calculator</a> and it'll probably tell you your staff will be 28.3% more productive, or profitable, or something.. but if you want to really know why you should let your employees attend Dreamforce, here are a few hints..<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<b><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicJ2WB62baNZp0_PRDUeFp_NOLoqEVi4OaYLsHXxIeDIWge61tZwPBqCf1sWAOv_jQ4KDGAfDA2FKQJBN9UoGQmzCODNXfRetEXjufBO6LeREl5KQ5UrUNugAHfnwF-vCR2bQEC4xcJRHC/s1600/SAM_0581.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEicJ2WB62baNZp0_PRDUeFp_NOLoqEVi4OaYLsHXxIeDIWge61tZwPBqCf1sWAOv_jQ4KDGAfDA2FKQJBN9UoGQmzCODNXfRetEXjufBO6LeREl5KQ5UrUNugAHfnwF-vCR2bQEC4xcJRHC/s1600/SAM_0581.JPG" height="240" width="320" /></a></b></div>
They will absorb knowledge, inspiration and enthusiasm from some of
the greatest minds on the planet. Entrepreneurs and world leaders,
talking to a room of tens of thousands of delegates. They will see demonstrations of
products and platform developments they can hear <i>no where else on Earth</i> at that time.<br />
<br />
Your staff will <b>high-five strangers</b> mid presentation, and they will come back to work and they will high-five you.<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiip_7g9oj7swcB3a3eQbpEqzRVAwNPOyC4xk5XexNM86luUj16FZVoXQs-k1-q9VI1E6uYu32QYdNngO1CH6B5O7wRh4SoPew28MEENjdBLcNV0RbLRa_OWzQXlQimYccPw7yxjY2Z32N4/s1600/2012-09-21+DF12+San+Francisco+584.JPG" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiip_7g9oj7swcB3a3eQbpEqzRVAwNPOyC4xk5XexNM86luUj16FZVoXQs-k1-q9VI1E6uYu32QYdNngO1CH6B5O7wRh4SoPew28MEENjdBLcNV0RbLRa_OWzQXlQimYccPw7yxjY2Z32N4/s1600/2012-09-21+DF12+San+Francisco+584.JPG" height="240" width="320" /></a></div>
<b>Learning directly from their peers</b>.. there are literally thousands of sessions going on at Dreamforce, the schedule planner is a heartbreaking exercise of realising there is only one of you to go to <a href="http://bit.ly/df14infblog">Dreamforce</a>! You want to be everywhere. If you do choose to send people to Dreamforce, buy them extra notepads. Hell buy them iPads, and they will come back with more knowledge and tricks of the trade than they will get from a dozen "Pop up workshops" in awkward working lunch breaks...<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhO6bjCoN8PTxePespt3OGi9k53mou1XH3UCuBBR18p0LznljWPkBfaUcYlOqE6SWCWQIuAN2WKkCrRPXUCtWNfl-7LwjGK9XmR17a3Uj2belB-s0dgxX23A-uXApVgSiNq5s0QNGtXpPet/s1600/SAM_0830.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhO6bjCoN8PTxePespt3OGi9k53mou1XH3UCuBBR18p0LznljWPkBfaUcYlOqE6SWCWQIuAN2WKkCrRPXUCtWNfl-7LwjGK9XmR17a3Uj2belB-s0dgxX23A-uXApVgSiNq5s0QNGtXpPet/s1600/SAM_0830.JPG" height="240" width="320" /></a></div>
<b>Win a car</b>! Why not. No-one leaves Dreamforce without at least some cool swag. I got some Dre.Beats Headphones last year, for winning a challenge.. a challenge which taught me a world about DocuSign. I have now implemented this in my working life a number of times, and would never have been as capable to if it wasn't for Dreamforce. DocuSign also gave me a hoody, so I even <i><b>look</b></i> like a bad-ass professional now too.<br />
<br />
You want your staff looking like bad-ass professionals? Of course you do!<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrcQj9X2JKtMXMYrun70xHira7LW6oP4kn1E4dNl19QT_eqrGryOYvyHtdOf8adVNzLhNMQduaw_Vtdr3uk6HeS61mxq5xpoDPq3A4B1snzykxuPtfWrxSeEL0uLfAG71eTP7781x8ZEXq/s1600/SAM_0941.JPG" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrcQj9X2JKtMXMYrun70xHira7LW6oP4kn1E4dNl19QT_eqrGryOYvyHtdOf8adVNzLhNMQduaw_Vtdr3uk6HeS61mxq5xpoDPq3A4B1snzykxuPtfWrxSeEL0uLfAG71eTP7781x8ZEXq/s1600/SAM_0941.JPG" height="240" width="320" /></a></div>
<b>Memories</b>. You know that sighing noise some people make at 5:15 when they realise there is still quarter of an hour to go in the day? We don't have that at <a href="http://www.desynit.com/">Desynit</a>, we do things like smiling, fist-bumps and sometimes Shaun does a handstand walk across the office. This is all because we get to share in the awesome experience that is Dreamforce, and every time we tell people about it, they say "Wow, where you work must be really cool"<br />
<br />
And I just say "Hell yeah".<br />
<br />
Be that boss.<br />
<br />
<div style="text-align: center;">
<span style="font-size: medium;">Do not delay, get booked in and en route to <a href="http://bit.ly/df14infblog">Dreamforce</a> today! </span></div>
Simon Lawrencehttp://www.blogger.com/profile/06468439024017853489noreply@blogger.com1tag:blogger.com,1999:blog-2232538987906803275.post-78449476053713839642014-08-13T05:24:00.002-07:002014-08-14T02:56:56.461-07:00Why you should absolutely attend Dreamforce - For youThis is one of a pair of Blog posts, branded "for you" and "for your boss" - this is the "for you" edition.. "For your boss" can be found here:<br />
<br />
<a href="http://srlawr.blogspot.co.uk/2014/08/why-you-should-absolutely-let-your.html">Why you should absolutely let your employees attend Dreamforce </a><br />
<br />
So why would you want to attend Dreamforce? Well, let me explain it to you with a couple of pictures...<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKc6sA5tVOAB3sLfmf2jIYw1pKnnG_Oea5UwUcVdJZBw5ROlN4wQ27etEoP6mmCW5rLGR-u2IAl_YQ97pGDiB7axHTfh9ElcB3vS9oY3o3j6zfdVtw0WZfsoGK6cJeE7u4pvWeNgfa2ZBA/s1600/2012-09-21+DF12+San+Francisco+704.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKc6sA5tVOAB3sLfmf2jIYw1pKnnG_Oea5UwUcVdJZBw5ROlN4wQ27etEoP6mmCW5rLGR-u2IAl_YQ97pGDiB7axHTfh9ElcB3vS9oY3o3j6zfdVtw0WZfsoGK6cJeE7u4pvWeNgfa2ZBA/s1600/2012-09-21+DF12+San+Francisco+704.JPG" height="240" width="320" /></a></div>
<b><a href="http://bit.ly/df14infblog">Dreamforce</a> turns downtown San Francisco into a technology playground</b>. Every corner has a Salesforce flag, and almost every hotel can be dropped into to catch a session on Case Management, Community, Development, Certification and so on. You might think you'd get sick of seeing the logo at every turn, but trust me, you actually slowly fall in love with it.<br />
<br />
You become literally surrounded in Salesforce knowledge and enthusiasm. <br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQrb9xbcKC9eQ5-DsQu_HR1mY97jiBlFnfSSIiIevMaWTayiscbFqXsG8z02EEWFJu9cXq7zhYmsMt6Pix2g2DGT7ThgAZWVWOv6iUTUfV_WjvRt_Qz_Y3K3M0xHB2hTb_ZhCHIQS_M6-G/s1600/2012-09-21+DF12+San+Francisco+865.JPG" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQrb9xbcKC9eQ5-DsQu_HR1mY97jiBlFnfSSIiIevMaWTayiscbFqXsG8z02EEWFJu9cXq7zhYmsMt6Pix2g2DGT7ThgAZWVWOv6iUTUfV_WjvRt_Qz_Y3K3M0xHB2hTb_ZhCHIQS_M6-G/s1600/2012-09-21+DF12+San+Francisco+865.JPG" height="240" width="320" /></a></div>
<b>The bits of San Francisco that Dreamforce <i>doesn't</i> turn into a technology playground, it turns into a music festival</b>! Metallica, RHCP, Green Day, Blonde, and this year Bruno Mars all rock out 40ft stages, with free food and drink at the Dreamforce gala, where you will make more friends and connections than any stuffy "Speed Networking" event at your local town hall...<br />
<br />
Ever wondered why there is no heavily publicised "VIP" pass for <a href="http://bit.ly/df14infblog">Dreamforce</a>? <b>Everyone</b> is a VIP!! <br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNvt6dVDPEeuRByAJawjCIx_KZLFxRp67_RAneEM1o0eDCPcz8ObJcr7U-n-G-M-VNO8YfipXdUdkwFqbUOhQ5x-Zp-v_9xXZ0T2-nzF5-CCP5oSz3KcmqMWLAWbQSuyPWIqRRbHhmOfkC/s1600/SAM_0328.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNvt6dVDPEeuRByAJawjCIx_KZLFxRp67_RAneEM1o0eDCPcz8ObJcr7U-n-G-M-VNO8YfipXdUdkwFqbUOhQ5x-Zp-v_9xXZ0T2-nzF5-CCP5oSz3KcmqMWLAWbQSuyPWIqRRbHhmOfkC/s1600/SAM_0328.JPG" height="240" width="320" /></a></div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDZJhdcGmHlB09CrDyvlcat-47U7hZaY7KHg2jR_nzPHrdIQpzeZKuXqIWtGuPV7burcGmkB8EPPln6aStwIJ8fbO1Jwgf4EJCPnruioCa-BGvJqIY4VzmW5jOIAW5s9fK0qpMT2KnR6Ur/s1600/SAM_0877.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><br /></a>
<b>You will learn like, a thousand new things</b> - and that is not hyperbole! Every corner, every desk, every wall is plastered in screens, books and projectors. If you can carry them, there is a library of workbooks and the latest Fundamentals up for grabs (whilst stocks last) and with three main stages in the Developer Zone, and about 8 break out rooms, there are more sessions and presentations going on that you could see in a month, let alone 4 days.<br />
At my first <a href="http://bit.ly/df14infblog">Dreamforce</a> I didn't <i>leave</i> the Developer Zone all conference!<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDHinPAjuucelNARCrL4uIJ2-ofxIOliiifsXVkAB8itVo8v1oIlOXz8YZgCwtrS6YQo53MmJTqKAQc6y8kXyi9nxVEF5w0OEcXONzJ7IhJHqwAJoZrlGKj2rAlehZ7Ec87DAEuHQu6qf2/s1600/SAM_0942.JPG" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiDHinPAjuucelNARCrL4uIJ2-ofxIOliiifsXVkAB8itVo8v1oIlOXz8YZgCwtrS6YQo53MmJTqKAQc6y8kXyi9nxVEF5w0OEcXONzJ7IhJHqwAJoZrlGKj2rAlehZ7Ec87DAEuHQu6qf2/s1600/SAM_0942.JPG" height="240" width="320" /></a></div>
<b>Make your dreams come true, meet influential people</b>, maybe meet some idiots who make you feel better about how good <i>you</i> are at what you do(!!) but get on it and have a good time. If you try to attend every session in your schedule you will leave with a notepad full of notes. If you spend more time in the breakouts, you'll meet tonnes of amazing people (get a sweet photo with SaaSy) and STILL leave with a notepad full of notes, contacts and developer friends for life..<br />
<br />
Your face will hurt from the smiling by the time you are on the plane home.<br />
<br />
<div style="text-align: center;">
<span style="font-size: large;">Do not delay, get booked in and en route to <a href="http://bit.ly/df14infblog">Dreamforce</a> today! </span></div>
Simon Lawrencehttp://www.blogger.com/profile/06468439024017853489noreply@blogger.com1tag:blogger.com,1999:blog-2232538987906803275.post-69061792990637738192014-07-24T05:21:00.003-07:002014-07-29T02:39:17.094-07:00Adding a picture to a record in SalesforceThe concept of "Profile pictures" is pretty common these days, and default pictures of products or locations are standard fare for most CMS systems and websites. Getting a default picture displayed directly on a Salesforce record can be a little tricky. In this blog post I am going to talk through how I added my own, user manageable contact picture directly on the Contact record page (but you can re-purpose it however you like to other object types).<br />
<br />
[Incidentally I am aware of Social-Contact settings, but more often than not this doesn't provide a "suitable" photo of a contact - my facebook picture certainly isn't! - and it only works for Accounts and Contacts of course] <br />
<br />
Here is the goal we are after then:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtheYxeFWxQJYcvc_obGxOaGiqNPJn5ZxeWw1u8KgR4PohPQ5V4yasumBSsMAPdo-4lo-wWnYKmjYhclujJOUHLdfzXLuJKvDClBs71o8J94Ba_QTDyX0fVv-pkphOQ-B7wbNWh8WzY8GF/s1600/2014-07-24+13_17_38-Contact_+Mr.+Simon+Lawrence+~+salesforce.com+-+Developer+Edition.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtheYxeFWxQJYcvc_obGxOaGiqNPJn5ZxeWw1u8KgR4PohPQ5V4yasumBSsMAPdo-4lo-wWnYKmjYhclujJOUHLdfzXLuJKvDClBs71o8J94Ba_QTDyX0fVv-pkphOQ-B7wbNWh8WzY8GF/s1600/2014-07-24+13_17_38-Contact_+Mr.+Simon+Lawrence+~+salesforce.com+-+Developer+Edition.jpg" height="382" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
You can see the cool picture associated with the Contact there, and a button to "Upload new photo". Lets walk through the other cool functions of this simple feature, and then I'll tell you how I did it (copy-pastas can just scroll down for the code snippets).<br />
<br />
When you first create/arrive at a contact page without a picture, you are presented with this:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGEq3d2a9RbIMZp4GTgj3ScI2SJGiibJlfVbzUtt_Ie3wgnf69C1rKK7qw9v4VBN182qHC4W7HiLmV1y931XDPPB8gJ0TJJAYQYZw5Y_kAOQDp22H4Biy0AYfDDsFrbGbnRJT3-g0U1Jzh/s1600/2014-07-24+12_55_58-Contact_+Simon+Lawrence+~+salesforce.com+-+Developer+Edition.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGEq3d2a9RbIMZp4GTgj3ScI2SJGiibJlfVbzUtt_Ie3wgnf69C1rKK7qw9v4VBN182qHC4W7HiLmV1y931XDPPB8gJ0TJJAYQYZw5Y_kAOQDp22H4Biy0AYfDDsFrbGbnRJT3-g0U1Jzh/s1600/2014-07-24+12_55_58-Contact_+Simon+Lawrence+~+salesforce.com+-+Developer+Edition.jpg" height="216" width="640" /></a></div>
<br />
Clicking the "Upload photo" button presents this standard form:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2CWbqWN4z0m7KkjWNT53zHb51vef3_nMZA2YStlGUxBcs1HgIUrOgu-9-Z5ylXrDgwKCNf9dte1Qfxw5O4Dj53fIppAE82Uj3xHPPxIUzCaVhz4u7v4Rc1I-9qg8lqTqVxBB-uDqNTl_i/s1600/2014-07-24+12_56_39-Contact_+Simon+Lawrence+~+salesforce.com+-+Developer+Edition.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2CWbqWN4z0m7KkjWNT53zHb51vef3_nMZA2YStlGUxBcs1HgIUrOgu-9-Z5ylXrDgwKCNf9dte1Qfxw5O4Dj53fIppAE82Uj3xHPPxIUzCaVhz4u7v4Rc1I-9qg8lqTqVxBB-uDqNTl_i/s1600/2014-07-24+12_56_39-Contact_+Simon+Lawrence+~+salesforce.com+-+Developer+Edition.jpg" height="184" width="640" /></a></div>
<br />
Which in turn allows a user to select a local file and "Save" it to the Salesforce record. Now whenever they view the record, they will be presented with this photo, and a button to overwrite this file with a new photo, which takes them via the same form as above.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYetfpSda4HVprXJHkaCFVwAsZk1d2FkzTVgcs5lz3zaQmjYjY0W2zy6u-g8CkRRiZT6ui7CB_hTuevEo7y0QbEdy8DE1N-kp3FURhrFZphQdxu53IanmwzaWPS11C_eHFZbJAZdXKhach/s1600/2014-07-24+12_58_17-Contact_+Simon+Lawrence+~+salesforce.com+-+Developer+Edition.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYetfpSda4HVprXJHkaCFVwAsZk1d2FkzTVgcs5lz3zaQmjYjY0W2zy6u-g8CkRRiZT6ui7CB_hTuevEo7y0QbEdy8DE1N-kp3FURhrFZphQdxu53IanmwzaWPS11C_eHFZbJAZdXKhach/s1600/2014-07-24+12_58_17-Contact_+Simon+Lawrence+~+salesforce.com+-+Developer+Edition.jpg" height="226" width="640" /></a></div>
The process actually taken here is that the form uploads a file to the "Notes and Attachments" of the record, with a specific filename (set in the Controller). The controller is careful to make sure there is only ever one of these files (in the obscure case another file is added manually, the first is retrieved by the page, and next time the profile picture is updated, it will clear out all spurious files)<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4XGCZc3HvA9HnX9b9yOiLIzsJOzr_LjyBsPHMJdAT-55L4FWB4f8OT63vvqDZqocCr8lXAZ_ZKS_Jg2PlWObQltNirGRuH8IJ9pYj6u76rB9oVLcPwS5CecAIQR3kcshictH9ni_hnLwN/s1600/2014-07-24+12_59_27-Contact_+Simon+Lawrence+~+salesforce.com+-+Developer+Edition.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4XGCZc3HvA9HnX9b9yOiLIzsJOzr_LjyBsPHMJdAT-55L4FWB4f8OT63vvqDZqocCr8lXAZ_ZKS_Jg2PlWObQltNirGRuH8IJ9pYj6u76rB9oVLcPwS5CecAIQR3kcshictH9ni_hnLwN/s1600/2014-07-24+12_59_27-Contact_+Simon+Lawrence+~+salesforce.com+-+Developer+Edition.jpg" height="66" width="640" /></a></div>
<br />
By doing this, we don't need any new "rich text fields" on our record, or indeed anything more complicated than a Visualforce snippet and Apex Controller extension.<b></b><br />
<br />
The visualforce page:<br />
<br />
<br />
<div class="mycode">
<pre><apex:page standardController="Contact" extensions="ContactPhotoUploadController" showHeader="false" standardStyleSheets="true" sidebar="false">
<apex:form id="contentForm">
<div style="height:170px;">
<apex:pageBlock mode="maindetail">
<apex:pageblocksection columns="1" rendered="{!displaying}">
<apex:image height="150" value="{!URLFOR($Action.Attachment.Download, currentPicture)}" rendered="{!currentPicture != null}"/>
<apex:outputPanel rendered="{!currentPicture == null}"><em>No picture currently available</em></apex:outputPanel>
</apex:pageblocksection>
<apex:pageblocksection columns="1" rendered="{! !displaying}">
<p>Use the button to below to select a new file and then press "Save"</p>
<apex:inputFile value="{!profilePicFile}" />
<p>Or press Cancel to return.</p>
</apex:pageBlockSection>
</apex:pageBlock>
</div>
<apex:commandButton value="Upload new photo" action="{!toggle}" rerender="contentForm" rendered="{!displaying && currentPicture!=null}"/>
<apex:commandButton value="Upload photo" action="{!toggle}" rerender="contentForm" rendered="{!displaying && currentPicture==null}"/>
<apex:commandButton value="Cancel" action="{!toggle}" rendered="{! !displaying}"/>
<apex:commandButton value="Save" action="{!saveFile}" rendered="{! !displaying}"/>
</apex:form>
</apex:page>
</pre>
</div>
<br />
This handles the display (or not) of the picture, form and relevant buttons.. and also sets the height that we will be working with (which is relevant when we come to add this to the page layout in a second).<br />
<br />
Here is the controller extension that facilitates the uploading of the file and retrieving it when the page is loaded:<br />
<div class="mycode">
<pre>public with sharing class ContactPhotoUploadController {
Private Static FINAL String fixedFileName = 'profilePhoto.jpg';
public boolean displaying { get; set; }
public Contact pageContact;
public Blob profilePicFile { get; set; }
public Id currentPicture { get; set; }
/** Constructor, grab record, and check/load an existing photo */
public ContactPhotoUploadController(ApexPages.StandardController controller) {
pageContact = (Contact)controller.getRecord();
List<attachment> currentPictures = [SELECT Id FROM Attachment WHERE parentId = :pageContact.Id AND name = :fixedFileName LIMIT 1];
if(currentPictures.size() != 0) {
currentPicture = currentPictures.get(0).Id;
}
displaying = true;
}
/** toggle switches between the photo display and photo upload form */
public void toggle() {
displaying = !displaying;
}
/** saveFile clears any existing profile picture, retrieves the data from the form, and saves it under the relevant filename*/
Public Pagereference saveFile() {
// first, we cannot have any conflicting files
List<attachment> savedPicture = [SELECT Id, name, body FROM Attachment WHERE parentId = :pageContact.Id AND name = :fixedFileName];
if(savedPicture.size() > 0) {
delete savedPicture;
}
// Now, we save the new blob
Attachment a = new Attachment(parentId = pageContact.Id, name = fixedFileName, body = profilePicFile);
insert a;
currentPicture = a.Id;
displaying = true;
return null;
}
}
</pre>
</div>
<br />
Once you have this basic Visualforce page up and running, all you need to do is go over and configure your Contact (in this case) Page Layout, and add the Visualforce page to the screen, and set it to a height of <b>30px greater than the style height of the div</b> - this is to fit the buttons in underneath.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgT0n2U_LTe26S9zMDko4qZAaP4nn6DbJGLf5Z4d7dYywfDO_O-Tj9nZxtRzaif4mHn8eRORQae0yT0d0enbbZhYKXygPhVDWNafFABl8m7nl3irKUKMwXjeWcUYJx_Ao9Qrw_VTN69pNTY/s1600/2014-07-24+13_12_37-Edit+Page+Layout_+Contact+Layout+~+salesforce.com+-+Developer+Edition.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgT0n2U_LTe26S9zMDko4qZAaP4nn6DbJGLf5Z4d7dYywfDO_O-Tj9nZxtRzaif4mHn8eRORQae0yT0d0enbbZhYKXygPhVDWNafFABl8m7nl3irKUKMwXjeWcUYJx_Ao9Qrw_VTN69pNTY/s1600/2014-07-24+13_12_37-Edit+Page+Layout_+Contact+Layout+~+salesforce.com+-+Developer+Edition.jpg" height="386" width="640" /></a></div>
<br />
<br />
Boom, there you go, now users can add and edit a default photo on any kind of record page (you just need to tweak the controller to use the standard controller of another object).<br />
<br />
Please note, in this blog post example I have neglected to address any kind of permissions or security considerations.. so remember if you decide to implement this to think about which users should be able to load, or upload photos to records. That's the kind of rich, useful developer love you would get from a Desynit based implementation ;-)<br />
<br />
<span style="font-size: large;">If you have any queries about this, or would like a complete implementation of this brought to your Salesforce org. Please don't hesitate to get in touch with me directly, or give <a href="http://www.desynit.com/">Desynit</a> a call and we can sort you out!</span>Simon Lawrencehttp://www.blogger.com/profile/06468439024017853489noreply@blogger.com25tag:blogger.com,1999:blog-2232538987906803275.post-54227839160502897112014-07-09T04:03:00.003-07:002014-07-09T04:13:59.774-07:00Salesforce Summer is here!<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9Co0JTgICuBK5mOxrVgSmzibTKBhKXDZAytdnqbFf-k77nGIkzI71L-sXF0EWMJFysPJfT3S6VQiH8soWuvcwXaUpiuA7iWOXY2lWyJlB1sKkm6pSVNoDAsZ_IVMf46QQV-8CT6ns7_dC/s1600/2014-07-08+17_25_36-Force.com+Home+Page+~+salesforce.com+-+Developer+Edition.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9Co0JTgICuBK5mOxrVgSmzibTKBhKXDZAytdnqbFf-k77nGIkzI71L-sXF0EWMJFysPJfT3S6VQiH8soWuvcwXaUpiuA7iWOXY2lWyJlB1sKkm6pSVNoDAsZ_IVMf46QQV-8CT6ns7_dC/s1600/2014-07-08+17_25_36-Force.com+Home+Page+~+salesforce.com+-+Developer+Edition.jpg" /></a>Summer is almost upon us, and I don't just mean that every now and then the rain stops over here in England, I mean in just a couple of weeks the Salesforce release cycle will turn another notch, and one-by-one, all of our Salesforce instances will be the eager recipient of a whole flurry of new and exciting features. So we get to stare up and down the setup menu for the intreging little "<b><span style="color: red;">New!</span></b>" text next to menu items, and then spend a whole afternoon exploring the brilliant things to see and do. <br />
<br />
<br />
If you want to find out everything there is to know about the coming release, I can recommend you read the <a href="https://help.salesforce.com/help/pdfs/en/salesforce_summer14_release_notes.pdf">Salesforce Summer'14 Release Notes</a> - <i>but</i> seeing as they are 340 pages long, and you might have a busy day lined up ahead of you, let me take you though some of the most interesting bits from my point of view.<br />
<br />
Incidentally, the release dates for each org are available on the <a href="http://trust.salesforce.com/trust/maintenance/">Salesforce Trust Scheduled Maintenance page</a> and you should be getting the white prompt page forewarning you of your instance update now when you log in. <br />
<br /><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjq0PhU1nk4EanTQheQJgg8rhiXRYc6dyR9K_rat3EmwY_DYm1KayCMfPCgchTMFMMD15ua_KXADgUquLZPsycGqA9qdvEXgOdwcDZDF6_HpsBMMFA7LGw5rSXIxECAYgYaZkdlDKnn99to/s1600/34.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjq0PhU1nk4EanTQheQJgg8rhiXRYc6dyR9K_rat3EmwY_DYm1KayCMfPCgchTMFMMD15ua_KXADgUquLZPsycGqA9qdvEXgOdwcDZDF6_HpsBMMFA7LGw5rSXIxECAYgYaZkdlDKnn99to/s1600/34.png" height="215" width="320" /></a></div>
So, first of all, I think we need to look at the most important aspect of the new release, because it is a feature that will affect many of us every day, many times a day.<br />
<br />
It's the new logo.<br />
<br />
It's a Snorkel. I Love it!<br />
<br />
But moving on.<br />
<br />
<br />
The key developer changes to my project work in this Salesforce Release are:<br />
<br />
<span style="color: white;"><b>Longer text fields</b> </span>- The maximum length of Long and Rich Text fields has been increased from 32,768 to 131,072 characters - they still defaults to the usual length, and existing fields will not be changed. Exciting times for super-verbose users.<br />
<br />
<b><span style="color: white;">More lookups and external IDs</span> </b>- Salesforce are always happy
to deliver bigger limits as soon as the technology and hardware
facilitates it, and it seems that with Summer'14 the database layer is
able to deliver more capacity for relationships and external IDs (which,
of course, means more indexes) so you can now have 40 (instead of 25)
relationships and 7 (instead of 3) external IDs.<br />
<br />
<span style="color: white;"><b>THREE TIMES THE API CALLS</b></span> - Sorry, I had to shout that one. At least twice in recent memory, I have seen a developer edition max out it's API calls in 24 hours and seen said developer skulk off to the <strike>pub</strike> coffee shop because they can no longer work. Especially when the Developer Console was ridiculously API hungry, or someone was running tests from Sublime Text. Well, now they can work three times as long, because Developer Editions now get 15,000 API calls instead of the old 5,000.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYzsZ5TOoUOKYdemi-lYAilQQLrTXbsw4PGxpFogFKpMibvhzpc-u0bI0ZTThXfoKpi_HBuYBwStQsRoEB17XSUPqfCxbWOQxDbL70mvQkaeJxYZQ4uwF32NdkssYFreadHNSkXq-7UO5r/s1600/apilimit.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYzsZ5TOoUOKYdemi-lYAilQQLrTXbsw4PGxpFogFKpMibvhzpc-u0bI0ZTThXfoKpi_HBuYBwStQsRoEB17XSUPqfCxbWOQxDbL70mvQkaeJxYZQ4uwF32NdkssYFreadHNSkXq-7UO5r/s1600/apilimit.jpg" height="83" width="640" /></a></div>
<br />
<br />
<b><span style="color: white;">Improved Setup search</span> </b>- lets you directly search for custom objects and fields in the Setup menu search, saving us all that time going through "Create > Objects > ObjectName > Scrollscrollscroll"<br />
<br />
<b><span style="color: white;">Publisher Actions for Chatter Off Organisations</span> </b>- This is a
common one for me, we have a lot of clients who are yet to accept the
leap to enabling Chatter in their organisation. Before now this meant a
lot of Salesforce1 and the incredible power of Publisher Actions was
denied to them as well. <i>Not any more!</i> Publisher actions to directly update records straight from the button are now available to those businesses.<br />
<br />
<span style="color: white;"><b>Proper find in the Developer Console</b></span> - At last, a proper find, find next and find/replace tool will be available in the developer console! And even better, real search "across all files" will let you find that snippet of code you can't remember where you put it. They are also releasing the ability to re-format your indentation properly, but as a legitimate developer, I always indent my work correctly first time, every time... (yeahright). You can get to all of this through a new "Edit" menu item appearing soon.<br />
<span style="color: white;"><br /></span>
<span style="color: white;"><b>No limit on the Describe methods</b></span> - Did I mention Salesforce like to smash down their own governor limits? Well, here's another one for the scrap heap. Take a quick look at this <a href="http://salesforce.stackexchange.com/search?q=describe+call+limit">search result page on the Salesforce Stack Exchange</a> and you will see that people have been battling with this ceiling for a little while now. So... should we get a SFSE moderator to just delete all these questions now?! :D<br />
<br />
<span style="color: white;"><b>Full name functionality</b></span> - Found that you add a custom field "Middle name" to Contact for every other human-contact-heavy client case? Well, now (via a switch on from Salesforce) this is a standard field for Lead, Contact and Account sObjects (it is also on the Name and User objects).<br />
<br />
...and that's just the big stuff...<br />
<br />
In the whole new domain of mobile applications, developers will see awesome new features in both SalesforceA and Salesforce1. I noticed for Spring'14 the Developer Certification now recommends you go through the mobile release training materials too, because the Salesforce1 Mobile App is not just a bolt on, or a piece of configuration, it is it's entirely own development suite now. My <i>user</i> highlight for Salesforce1 this release is <span style="color: white;"><b>Approval processes</b> -</span> Just like with change sets, approval
processes are always rocking up to the party a little bit late, but they
have finally made it into Salesforce1, users can now submit their
records for approval from within the app. A slightly glaring hole plugged beautifully (and quickly).<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhItMNjeLp25cR6XuB0KwneibBu6aV48Sggo6mDQNTj8b7vABDK3fRj6gI0QWVMYk7IN2sfcr3r3HtNg7wKqrjde-naGCqLRSJhRXIhVrhM_uEWV-_YhWWYq7b9sLuWorSaXGB3aEc-WlgZ/s1600/2014-07-09+11_52_21-Salesforce.com+Reveals+Next+Mobile+App+-+InformationWeek.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhItMNjeLp25cR6XuB0KwneibBu6aV48Sggo6mDQNTj8b7vABDK3fRj6gI0QWVMYk7IN2sfcr3r3HtNg7wKqrjde-naGCqLRSJhRXIhVrhM_uEWV-_YhWWYq7b9sLuWorSaXGB3aEc-WlgZ/s1600/2014-07-09+11_52_21-Salesforce.com+Reveals+Next+Mobile+App+-+InformationWeek.jpg" /></a></div>
My developer highlight for Summer'14 Salesforce1 (and I feel I have saved the best for last) is called the Account and Community Switcher - which is a complicated way of saying you can switch between orgs <b>within</b> Salesforce1 without having to log the whole app out. This is especially apt for me, as you can see from this tweet.. <a href="https://twitter.com/srlawr/status/455297547649945601">"Hmm. I wanna test this new app on <b>@salesforce1</b>... But I simply can't log out of my work org on my phone?? "Logout > Yes" just does nothing?!"</a> I have something of a problem switching orgs on my phone (short of uninstalling the app and reinstalling it).<br />
<br />
To swap orgs, you simply open the left hand nav, and at the top there is a picklist which will list all of the other orgs connected to the user currently logged in to the app on the device, and you can just tap another account to jump across. Sandbox <b>heaven</b>!! Thank you Salesforce.<br />
<br />
<br />
(Of course - 6 months ago I would have been over the moon that Salesforce1 is now properly supported on Blackberry (and Windows) phones, but pfft who still has a Blackberry?!) <br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRCsVUHMdeYO8naGU54mBf8LRCHAlTxpfCKke9wAQj7n-VFzafwY7-Nj6T0oYqkcZx3miOAOgcAYVgpDQ2uNbR4IaXXp4H0z9OU6G7fo85Pu_yEmuaYlvnYRxDPF7pcSJyiIsA0ZajOOws/s1600/winter14_wyd2xv.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRCsVUHMdeYO8naGU54mBf8LRCHAlTxpfCKke9wAQj7n-VFzafwY7-Nj6T0oYqkcZx3miOAOgcAYVgpDQ2uNbR4IaXXp4H0z9OU6G7fo85Pu_yEmuaYlvnYRxDPF7pcSJyiIsA0ZajOOws/s1600/winter14_wyd2xv.png" height="70" width="69" /></a></div>
Final thought for the day, I wonder what the Southern Hemisphere think of the Salesforce release cycle names then, "Summer?" - "Not here mate!" pretty sure we already have all the Winter'14 features down in Oz.. Simon Lawrencehttp://www.blogger.com/profile/06468439024017853489noreply@blogger.com0tag:blogger.com,1999:blog-2232538987906803275.post-34646528739251526772014-04-23T08:05:00.001-07:002015-07-27T06:45:58.444-07:00Modifying the "New Email on Case" Template in SalesforceIf you are using Email-to-Case on Salesforce, there is a super handy standard feature that will send an e-mail out to the case owner when a new incoming e-mail is filed against one of their cases.<br />
<br />
This is an option turned on via <b>Setup > Customize > Cases > Email-to-Case</b> and then checking the box "Notify Case Owners on New Emails.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnzpB0tgopGaQ9UHDDx6j1R_eFqEdFTaalxQFp6JBHl5q55Q4f9esM9A_P5NVHBVpd4MVCzarGisxsR9yR-a1O1acH4WBJZAb3xwdLiise-fsjLlewqrCpCaDGedTex3rAhDeCOgJvEXwp/s1600/2014-04-11+12_13_08-Email-to-Case+Settings+~+salesforce.com+-+Enterprise+Edition.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnzpB0tgopGaQ9UHDDx6j1R_eFqEdFTaalxQFp6JBHl5q55Q4f9esM9A_P5NVHBVpd4MVCzarGisxsR9yR-a1O1acH4WBJZAb3xwdLiise-fsjLlewqrCpCaDGedTex3rAhDeCOgJvEXwp/s1600/2014-04-11+12_13_08-Email-to-Case+Settings+~+salesforce.com+-+Enterprise+Edition.jpg" /></a></div>
<br />
Then, when an incoming e-mail is detected by your Email-to-Case config and associated with a Case, the owning user will get an e-mail that reads:<br />
<br />
<div style="border: 1px solid grey; padding: 2em;">
An email has been received for case 00003630: Case system test.<br />
<br />
Please click the link below to review the new email and respond appropriately.<br />
<br />
[https://na13.salesforce.com/02sf00000000000]<br />
<br />
NOTE: It is not recommended that you forward this email because its association with the original case may be lost.</div>
<br />
<span style="font-family: inherit;"><span style="font-size: small;">and then the body of the email from the customer.</span></span>.<br />
<br />
The requirement that led me to end up writing this was to replace the link in the middle of the e-mail for a client, but I can imagine a whole host of reasons this message might want customising in client systems.. but, if you are setting out on that road, like me, you will probably find quite quickly it is not a standard or custom e-mail template that you can edit. It is fixed, and can only be turned on; and off.<br />
<br />
So what do you have to do if you want to edit it? You have to turn it off and replicate the functionality. <br />
<br />
Turning it off can be done by following the navigation steps above and then de-selecting the checkbox. Now, when a new e-mail enters a case via Email-to-Case, there will be no notification. Now, you need to build a <b>workflow rule</b> to replicate the functionality.<br />
<br />
That is not as simple as it sounds though. Here are the steps we will have to go through:<br />
<br />
<ul>
<li>Create a workflow rule on Email Message that will be triggered when a new incoming case e-mail is inserted</li>
<li>Because Email Message workflows cannot dispatch Email Messages
themselves, we will have to do a field update instead, which we perform
on the parent Case </li>
<li>Add a workflow rule to the Case object to send the owner an e-mail when it is updated by the previous workflow</li>
</ul>
First we need the field on Case to update; lets make this field a Date field, as it is something we can set with a formula value quite easily and it gives us an audit value that maybe just one day might be useful to someone!<br />
<br />
Access your case fields via <b>Setup > Customize > Cases & Fields </b>and click to create a new field. Call the field "Last Emailed" so the API name is Last_Emailed__c and set it's type to "Date/Time"- make it not required and with no default. I would leave field permissions at the defaults, but then remove it from all page layouts (for the moment at least).<br />
<br />
Now we have our field, we need to cause it's update, and then effect it's action to dispatch an e-mail. First let's set it, and we are going to do this when a new Email Message is received on a case.<br />
<br />
Click through <b>Setup > Create > Workflow & Approvals > Workflow Rules </b>and click to create a new rule.<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEii4KtjDWnlltO47gtT4R9Jv-pAL33xUNijFik1in7ndPcwZDZFJCYCDidOeR-d8GuO__taG3Yf6XV6Fk4fYSo3CKp2knBnCb0LjsW3hh227DuxRv0KdEl5hxur3mNkUu4pgJwXx_f7XrQ3/s1600/2014-04-23+15_26_45-Edit+Rule+Custom+Notification+Email+~+salesforce.com+-+Developer+Edition.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="204" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEii4KtjDWnlltO47gtT4R9Jv-pAL33xUNijFik1in7ndPcwZDZFJCYCDidOeR-d8GuO__taG3Yf6XV6Fk4fYSo3CKp2knBnCb0LjsW3hh227DuxRv0KdEl5hxur3mNkUu4pgJwXx_f7XrQ3/s1600/2014-04-23+15_26_45-Edit+Rule+Custom+Notification+Email+~+salesforce.com+-+Developer+Edition.jpg" width="320" /></a>On the first page, select "Email Message" from the object drop down (this may only be there if Email-to-Case is enabled). Call it something like "Custom Notification Email" and have it fire whenever a record is created. Set your Rule Criteria to be a Formula, and for the formula enter "true" so every message triggers this Workflow.<br />
<br />
On the next page of the Workflow, click to add a <b>New Workflow Action </b>and then select <b>New Field Update</b> and populate it as such so that it will update the case field we have just created to the value of the Formula method "NOW()":<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguNnUjxie8rPm7ixuo_JbdMBdMgoiKZvLs36FZuMEVywlmhKGrexBvQKAinwZ7SNFVbYAD_wCehk4lwLGloGRYU6-di5PoKQLTbFkzsDRA_GRnHCW2WH9kbouVcrU1rEB_6jPkHpG32Vn4/s1600/2014-04-23+15_42_46-Edit+Field+Update_+Update+Case+Date+~+salesforce.com+-+Developer+Edition.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="366" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEguNnUjxie8rPm7ixuo_JbdMBdMgoiKZvLs36FZuMEVywlmhKGrexBvQKAinwZ7SNFVbYAD_wCehk4lwLGloGRYU6-di5PoKQLTbFkzsDRA_GRnHCW2WH9kbouVcrU1rEB_6jPkHpG32Vn4/s1600/2014-04-23+15_42_46-Edit+Field+Update_+Update+Case+Date+~+salesforce.com+-+Developer+Edition.jpg" width="640" /></a></div>
<br />
Once this is done, and you are presented with the Workflow, here is a catchy step. Click to Edit the field update you have just created, select the check box to "Re-evaluate Workflow Rules afer Field Change" and save it.<br />
<br />
<span style="color: yellow;"><b>Edit: July 2015</b></span><br />
<br />
<span style="color: yellow;">Thank you readers for your comments that this stage is no longer possible! I recreated the steps and lo-and-behold, you cannot mark this field update to re-evaluate. How weird.<b> </b></span><br />
<div class="separator" style="clear: both; text-align: center;">
<span style="color: yellow;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhpUSDcaXXUMMgSaL79Z29J5wCRJb0GY7z8RfgoEIAKKcX8qntmuhI1JVAaHhagQHn-orNysXTo_MrjlrZvXqZhdpQ-5yMjbgBWAcAVz1C5QsQ-cIa17fJf2BOCAlhhW_UbXNs5o1rwpDG/s1600/2015-07-27+14_35_34-salesforce.com+-+Developer+Edition.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="74" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhhpUSDcaXXUMMgSaL79Z29J5wCRJb0GY7z8RfgoEIAKKcX8qntmuhI1JVAaHhagQHn-orNysXTo_MrjlrZvXqZhdpQ-5yMjbgBWAcAVz1C5QsQ-cIa17fJf2BOCAlhhW_UbXNs5o1rwpDG/s640/2015-07-27+14_35_34-salesforce.com+-+Developer+Edition.jpg" width="640" /></a></span></div>
<span style="color: yellow;"><b> </b> </span><br />
<span style="color: yellow;">Therefore, we need to find an alternative way to send the e-mail based on this first workflow evaluating. Well seeing as it's now 2015, why not use Process Builder! Process Builder comes later in the order of execution than Workflow, so I can't see why you couldn't create a process based on the same conditions/premise as this post - that sent an e-mail when the Case "Last_Emailed__c" field was updated.</span><br />
<span style="color: yellow;"><br /></span>
<span style="color: yellow;">I don't have time right now to test this sorry :( but if anyone has any luck with that route, please let me know in the comments. Just replace the word "Workflow" with "Process builder" for the rest of this article, and the complicated screen shots for the lovely new screenshots that a Process might have!</span><br />
<span style="color: yellow;"><br /></span>
<span style="color: yellow;"><b>Resume original post:</b></span><br />
<br />
Finally, complete the Workflow setup and <b>remember to activate it!</b> This is the most commonly made workflow mistake is forgetting to activate! We now have the second stage of our process complete.<br />
<br />
Before we can make our final Workflow rule to dispatch a custom e-mail, we better make sure we have our custom e-mail template ready to use. Click through <b>Setup > Communication Templates > Email Templates</b> and make a new template (the details of the process for which I will not cover here as it is well documented).<br />
<br />
Now we can make that final Workflow rule. Go back to <b>Setup > Create > Workflow & Approvals > Workflow Rules </b>and click to create another new rule. This time, we are making it on "Case".<br />
<br />
Give you rule a name, and select "created, and every time it's edited" as your evaluation criteria. This time, the rule criteria is important, as we don't want to send an e-mail everytime any change is made to a case, therefore, select the formula criteria entry again, and this time enter<br />
<br />
ISCHANGED(Last_Emailed__c) <br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEju4HqJVCsr-VnNEWQO_KB5gA1O2F-jpZKJ4HzgJ7HS9-VkPk_TNSgRrDlIq2J7PxQJJk7XHkW_NlY_Px3blY7ILcVU0HYrMSjJ7dnlZ8SrGXPFIJKLdd2R5VirJmbOXcrHP9IJrXj9QDDc/s1600/2014-04-23+15_59_21-New+Workflow+Rule_+Case+~+salesforce.com+-+Developer+Edition.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="299" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEju4HqJVCsr-VnNEWQO_KB5gA1O2F-jpZKJ4HzgJ7HS9-VkPk_TNSgRrDlIq2J7PxQJJk7XHkW_NlY_Px3blY7ILcVU0HYrMSjJ7dnlZ8SrGXPFIJKLdd2R5VirJmbOXcrHP9IJrXj9QDDc/s1600/2014-04-23+15_59_21-New+Workflow+Rule_+Case+~+salesforce.com+-+Developer+Edition.jpg" width="640" /></a></div>
<br />
This means the Workflow will only fire if the "Last_Emailed__c" field has changed from it's previous value (i.e. the first workflow rule caused it).<br />
<br />
Once we have this, get into your new Workflow rule, add an Email alert, choose your custom template (this is the point you might want to set off your success fireworks) and pick the "Owner" as the recipient. Fiddle with any other settings you like, then save your Workflow, <b>activate it</b>, and sit back and watch as new incoming e-mails cause the dispatch of a <b><i>custom notification email</i></b> to the case owner to inform them of this message.<br />
<br />
<br />
<br />Simon Lawrencehttp://www.blogger.com/profile/06468439024017853489noreply@blogger.com35tag:blogger.com,1999:blog-2232538987906803275.post-14064200848892992602014-03-24T05:12:00.000-07:002014-03-25T04:31:27.592-07:00Packt Publishing - BOGOF on 2000 IT books!<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_RQQui7tLEUoYV4WoG2y1BVDnAspc9cYGRiXwi5aSHtYLnLQLkXw1poSh2JGeZ-WIEex-J7U8aUopBjmg6CzO_Eh-Zx20InKt_B74OPJhaacDtMelvTf6q7wPlKRT_5f6q_Ui8rDQkKqy/s1600/9818EN_Cover.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_RQQui7tLEUoYV4WoG2y1BVDnAspc9cYGRiXwi5aSHtYLnLQLkXw1poSh2JGeZ-WIEex-J7U8aUopBjmg6CzO_Eh-Zx20InKt_B74OPJhaacDtMelvTf6q7wPlKRT_5f6q_Ui8rDQkKqy/s1600/9818EN_Cover.jpg" height="200" width="161" /></a><br />
Recently you may have seen recently I was reviewing the <a href="http://www.amazon.co.uk/Visualforce-Developers-Guide-W-A-Chamil-Madusanka-ebook/dp/B00G48GHHW">Visualforce Developers Guide by W.A</a><a href="http://./">.</a> Chamil Madusanka (full blog post is still in draft!), published by <a href="http://www.packtpub.com/">PACKT Publishing</a>, who in their own words are "one of the most prolific and fast-growing tech book publishers in the world".<br />
<br />
Along with the Developers Guide, my colleague Christopher Alun Lewis has reviewed <a href="http://www.packtpub.com/visualforce-development-cookbook/book">Kier Bowdens Visualforce Development Cookbook</a> - which I am also now reading and is another fantastic publication keeping us all up to date with the best Salesforce design patterns and practises.<br />
<br />
Having been through these two great publications, I am now always on the look out for the next PACKT title, and it has come to my attention, that for TWO MORE DAYS ONLY!! (that is until March 26th 2014) in celebration of reaching 2000 published titles PACKT are offering a "<b>Buy one Get one Free</b>" across their entire range of eBooks. That means there a literally hundreds of fantastic software titles just waiting to get swept up on every aspect of Software Engineering. You could honestly get the two books mentioned above for the price of one (but I'd recommend browsing their full range before decided what to get!).<br />
<br />
If you follow <a href="http://bit.ly/1j26nPN"><b>this link through to PACKT publishing</b></a>, you can buy as many eBooks as you like, and when you get to the checkout, you will immediately notice you are only paying for half of them!<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5ddu982cGEbuo4CqIUpVyQ6B5gND21e6JxunNcYtIspYdp5wgHeEMslOM2teM_DdJHiHL5mIG0WtWuIRMVISFyNTbeHNao2UVfDB0e1sn5hyn4LMhit9Nog6hapdC4fizxzbPRInidD0G/s1600/2000th-Book-Home-Page-Banner.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5ddu982cGEbuo4CqIUpVyQ6B5gND21e6JxunNcYtIspYdp5wgHeEMslOM2teM_DdJHiHL5mIG0WtWuIRMVISFyNTbeHNao2UVfDB0e1sn5hyn4LMhit9Nog6hapdC4fizxzbPRInidD0G/s1600/2000th-Book-Home-Page-Banner.png" /></a></div>
<br />
Don't waste any time on this one, as there isn't much time left. Have a word with your line manager about getting some technical reference material in and go crazy. You're never too old to learn how to do your job better, and to know a little more!<br />
<span style="font-size: x-small;"><br /></span>
<span style="font-size: x-small;">I would like to make it clear that by participating in this BOGOF campaign promotion, PACKT Publishing are furnishing me with a free book from their library.</span><br />
<span id="goog_873709508"></span><span id="goog_1863927340"></span><span id="goog_1863927341"></span><br />
<span id="goog_873709507"></span>Simon Lawrencehttp://www.blogger.com/profile/06468439024017853489noreply@blogger.com0tag:blogger.com,1999:blog-2232538987906803275.post-1472837979980257022014-02-11T03:33:00.001-08:002014-05-08T02:10:01.902-07:00Getting stacked with Salesforce!<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi08A8mbXDrRnZ3UJkk4FezgJreS_lZ_BxCkW13SglioGTI1FgUrYlMIxGqLwpRUW-XNLs3demaZ9EJpxAG1u-j6IZhGfe7YPPo063zwzsGtVpFb8sB2LB0lI2G5ix78d0tjS547uDGK1eG/s1600/2014-02-11+11_28_14-Stack+Overflow.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi08A8mbXDrRnZ3UJkk4FezgJreS_lZ_BxCkW13SglioGTI1FgUrYlMIxGqLwpRUW-XNLs3demaZ9EJpxAG1u-j6IZhGfe7YPPo063zwzsGtVpFb8sB2LB0lI2G5ix78d0tjS547uDGK1eG/s1600/2014-02-11+11_28_14-Stack+Overflow.jpg" /></a></div>
For the last two years (thanks to a successful Area51 Beta) Salesforce has had it's own branch of the Stack Overflow product, in which users can ask, answer, discuss and vote on Salesforce issues, problems and features they are working on. This is the <a href="http://salesforce.stackexchange.com/">Salesforce (beta) StackExchange</a>.<br />
<br />
Over the last two years, this product has exploded in the Salesforce developer domain, with (at the time of writing, in February 2014) statistics in the region of:<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFSqk8dtnW8JmsrESZgQT8xHBu92NR8uf-qQQ8ezVySqT5S7IFetDQPhBMaEtr9Hjwrk9PbcUfY0DFiqggSrQssXwiSibwQFVM64ML49PY0SlFCFrfiJ2k4bYO6GLlgqwGrxP4GlDkdcFA/s1600/2014-02-11+11_27_44-Salesforce+Stack+Exchange.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFSqk8dtnW8JmsrESZgQT8xHBu92NR8uf-qQQ8ezVySqT5S7IFetDQPhBMaEtr9Hjwrk9PbcUfY0DFiqggSrQssXwiSibwQFVM64ML49PY0SlFCFrfiJ2k4bYO6GLlgqwGrxP4GlDkdcFA/s1600/2014-02-11+11_27_44-Salesforce+Stack+Exchange.jpg" style="cursor: move;" /></a><br />
<table><tbody>
<tr><td class="stats-value">8,729</td><td class="stats-label">questions</td></tr>
<tr><td class="stats-value">12,841</td><td class="stats-label">answers</td></tr>
<tr><td class="stats-value">90%</td><td class="stats-label">answered</td></tr>
<tr><td class="stats-value">4,330</td><td class="stats-label">users</td></tr>
<tr><td class="stats-value">11,338</td><td class="stats-label">visitors/day</td><td class="stats-label"><br /></td><td class="stats-label"><br /></td><td class="stats-label"><br /></td><td class="stats-label"><br /></td></tr>
</tbody></table>
<br />
<br />
With useage, and success rates like that, it's easy to see why the StackExchange is becoming <b>the</b> go to place for Salesforce questions, with answers typically being provided in a matter of minutes, to some of the most complicated questions.<br />
<br />
With thousands of users, from every timezone in the world logging in every minute of the day, it is clear to see why and how if you have a query about Salesforce, there is going to be someone out there who has experienced this before, or has the knowledge to guide you through to a solution.<br />
<br />
But is that the real reason the StackExchange is so popular? Of course not, it's all about <b>badges</b> and <b>reputation</b> of course!! One of the most addictive types of gamification in the modern arena is earning <b>reputation</b> from your peers for assisting them, and by providing the <i>best</i> service <i>over</i> your peers!<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5t1lUqLacVAKRi3jJHiSvjERDLrakdAZY-RP2KJ5lXXRpLuRvaZuCrg3kiraKRQMrI0lT6POnm8z-_vjMwHPRRnWvZMaiIqTugZ4EFhh_jCIAMk1hRRQIxsWk1bfujd3C_ViUhK9PgvqZ/s1600/2014-02-20+11_58_19-User+Simon+Lawrence+-+Salesforce+Stack+Exchange.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5t1lUqLacVAKRi3jJHiSvjERDLrakdAZY-RP2KJ5lXXRpLuRvaZuCrg3kiraKRQMrI0lT6POnm8z-_vjMwHPRRnWvZMaiIqTugZ4EFhh_jCIAMk1hRRQIxsWk1bfujd3C_ViUhK9PgvqZ/s1600/2014-02-20+11_58_19-User+Simon+Lawrence+-+Salesforce+Stack+Exchange.jpg" /></a></div>
<br />
The model has completely hooked me. I even find myself logging on from my smartphone during bus rides to see if there is a question I can help out with! The buzz of finding someone you can assist is matched only by the excitement in your hands as you rattle out an answer at a typing speed that would make the Clerk of the Houses of Parliament blush.<br />
<br />
The other great aspect of the <b>reputation</b> model, is the philanthropy, as well as enjoying earning it by assisting your community, you have the power to <b>award</b> it as well, if you see an answer that you wholeheartidly agree with, you can vote it up, making it clear to the community that this is a quality answer, and also awarding the user reputation in the process.<br />
<br />
Good questions, equally, can be voted up if you think them especially pertinent, and even the smallest aspect - comments - can be flagged as useful or helpful making sure everyone knows which snippets of text are good or bad.<br />
<br />
Some of the questions that I have asked and answered include:<br />
<br />
<h1 itemprop="name">
<span style="font-size: small;"><a class="question-hyperlink" href="http://salesforce.stackexchange.com/q/3719/165">Getting the value of an inputField on the page</a></span></h1>
Which has been viewed over 3,500 times.<br />
<br />
<div class="answer-link">
<span style="font-size: small;"><b><a class="answer-hyperlink " href="http://salesforce.stackexchange.com/q/25027/165">Can you redirect to a Custom Object List Page from a Controller?</a></b></span><br />
<br /></div>
<div class="answer-link">
</div>
<div class="answer-link">
and <b> </b></div>
<div class="answer-link">
<span style="font-size: small;"><b><br /></b></span></div>
<div class="answer-link">
<div class="answer-link">
<span style="font-size: small;"><b><a class="answer-hyperlink " href="http://salesforce.stackexchange.com/q/27202/165">How can I compare datetimes in a SOQL query to return a list to a Visualforce page?</a></b></span><br />
<br /></div>
<div class="answer-link">
</div>
<div class="answer-link">
My answer for which was selected from several options, after a extended exchange of comments between users trying to solve the developers problem. </div>
<div class="answer-link">
<br /></div>
<div class="answer-link">
I can safely say I will be using the Salesforce StackExchange to both ask and answer problems on Salesforce.com for the foreseeable future.</div>
</div>
<br />Simon Lawrencehttp://www.blogger.com/profile/06468439024017853489noreply@blogger.com0tag:blogger.com,1999:blog-2232538987906803275.post-20500712880342286952014-01-10T04:32:00.000-08:002014-01-16T03:09:35.741-08:00Getting your Certified Force.com Certification<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgqQZTY0ramv1asNXMrnmO85NuAmnZbSjQ7zZdxiC5BFuOdTLSp3vqZW93xZ5ieTzanyaaETHpQpAcRGmxyODTVc5Yqx0xHJZ0-5YEUbpo0gy-7fuCKxiG5Gw_yfO0MpdcmtLlZkNypRk7/s1600/2014-01-08+18.48.51.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgqQZTY0ramv1asNXMrnmO85NuAmnZbSjQ7zZdxiC5BFuOdTLSp3vqZW93xZ5ieTzanyaaETHpQpAcRGmxyODTVc5Yqx0xHJZ0-5YEUbpo0gy-7fuCKxiG5Gw_yfO0MpdcmtLlZkNypRk7/s1600/2014-01-08+18.48.51.jpg" height="239" width="320" /></a>On January 8th I had the pleasure of presenting a case at the South West UK Salesforce Developer meetup, which is an event that happens every other month in Bristol UK, where the regions Salesforce developers, CTOs, and Force.com-curious meet up for a couple of pints, some short talks, and a lot of technical debate about living on the Force.com Platform.<br />
<br />
The theme of our January meetup was "Certification" - which we thought was appropriate, what with this being the time for resolutions and making plans. I co-presented the first talk which was an introduction to certification process through the <b>Certified Force.com Developer</b> option. The second presentation was by Christopher Alun Lewis on his experience of the <a href="http://christopheralunlewis.blogspot.co.uk/2014/01/bristol-dug-fxfw-new-year-new.html" target="_blank">Advanced Force.com Developer</a>.<br />
<br />
Here are my slides from the talk, which I was asked to share by some of the audience, and below them a quick script covering what I spoke about on each, to support the otherwise vague bullet points!
<br />
<br />
<iframe frameborder="0" height="400" marginheight="0" marginwidth="0" scrolling="no" src="http://www.slideshare.net/slideshow/embed_code/29877037" width="476"></iframe>
<br />
Slide 1: On this deck, this is an into slide.<br />
<br />
Slide 2: Welcome to the South West DUG presentation on becoming a Certified Force.com Developer, I myself have been certified for about 18 months now, and Julio, who will be telling us all about his experience with certification, has been qualified himself for 6 months.<br />
<br />
Slide 3: What is the Certified Force.com Developer qualification then? It's a badge, that you can quite literally wear (see slide 4) to indicate that you are a competent Force.com developer, familiar with the platform and it's features and functions. If you want to pitch yourself to clients and employers as a Salesforce developer, it really should be seen as the minimum entry criteria. It is an exam based qualification, which is taken in an invigilated enviroment, and consists of 60 multiple choice questions about developing on the Force.com Platform, of which you must get 41 right. You have 90 minutes to do so, and once you have submitted your answers, the examination software instantly tells you if you have Passed or Failed.<br />
<br />
Slide 4: An example of putting the badge into place!<br />
<br />
Slide 5: So how do you go about getting certified down in the South west of England? Our test centre is in Bath, by the river, about 10-15 minute walk from the train station, so it's really not hard to get to. A bigger consideration is perhaps that it does cost $200 USD to take the exam and you do need to book in advance (normally a week or two at least) on the certification website. Once you have the qualification, you should also note that it has to be kept up to date, and this is done via 3 annual maintenance exams. These are done on your home PC in your own time (within a 5-6 month window) and involve answering 6 more multiple choice questions on the latest features, or platform core concepts, to show you are still a valid, involved developer. The first year comes free with your qualification, but after that you must pay $100pa to keep the certification valid.<br />
<br />
Slide 6: What is it they are looking for then when you walk through that examination door? The Certified Force.com Developer is not about code, or syntax, or APIs or Libraries. It's about understanding the Force.com platform, and knowing WHEN to code and WHEN to click. You need to show a good understanding of configuration driven solutions, or when you would be forced to code. You do not need to know the code you would use though. The second part of this slide is taken from certification.salesforce.com verbatim, and breaks down the core concepts the exam will cover. Be familiar with ALL of these areas, you cannot pass by being a total expert in some, and know nothing of others.<br />
<br />
Slide 7: The tools of the trade then, how do you go about actually passing the exam? Your first choice would of course be the course. Salesforce 401 covers the exact requirements for the Certified Force.com Developer qualification. But in the UK you would probably be looking at taking part in a 5 day, virtual classroom experience for the best part of £3,000... if you got the time and the money, I guess go for it, but failing that, the fundamentals book, and a bit of hands on experience with the Platform will serve you just as well. All the Certified Force.com Developers I know have self-taught/learnt on the job. I do know some of the qualified trainers on the 401 track through, and they are bloody nice people :)<br />
<br />
Slide 8: <a href="http://jufeappdev.blogspot.co.uk/2014/01/being-certified-forcecom-developer.html" target="_blank">This is Julio's story, </a>.. another great read on the Certified Force.com Developer road.<br />
<br />
Slide 9: So this is my story, now you know the facts of life. I had been working on the platform for about a year when the time came for me to get the certification. I came from being a Java developer, with 6 years commercial experience and a Computer Science degree, so I felt ready for a new examination challenge. I would say one of the biggest benefits for me was working alongside an existing Certified Force.com Developer, so any time I had a question both about the platform or the certification process, I could ask him, and he could put my mind at ease about the logistics and process of the exam. I booked my exam in with about 2 months notice, to let me gear up for it, and the last thing I did, was take 2 weeks out (of life) and just ploughed through the entire fundamentals book, doing the exercises and extensions, to remind myself of the core concepts, and all the bits (like reports and, security) that we don't really think about properly during our day to day work. On the day, I took about 75 of the 90 minutes to answer, review and submit my winning score to the system, I chose not to beat myself up for the full time period, because I would only end up over thinking choices and changing right answers.<br />
<br />
Slide 10: So, any questions? If not... here's one for you..<br />
<br />
Slide 11: This is the actual example question off the certification.salesforce.com website for Certified Force.com Developers. Can you answer it? I'm not going to tell you the right answer, but chuck me a comment in the section below with your thoughts!<br />
<br />
Well. Thanks for reading through that journey with me! If you'd like to know more, please get in touch and I will field your questions, you can also tweet me on <a href="https://twitter.com/srlawr" target="_blank">@srlawr</a> if you like. If you live in the south west UK, get in touch with your local <a href="http://www.meetup.com/Bristol-Salesforce-Platform-Developer-User-Group/" target="_blank">Salesforce Developer User Group </a>for free beer and chats like these.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4ChQSp33fg9nBhhPwa9x0ZMgGx2KYTGZEtZxVEAVCoZkeKFCRoPIvWeHZHV5ARKvLjzVvKSZNnTeCJSTp-iTUjDx4JiPAdQCI8cn6Ar_f5_rUKizYWQpLnowL_kcDVHRwfDTgO2ctaVcR/s1600/2014-01-08+19.10.25.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg4ChQSp33fg9nBhhPwa9x0ZMgGx2KYTGZEtZxVEAVCoZkeKFCRoPIvWeHZHV5ARKvLjzVvKSZNnTeCJSTp-iTUjDx4JiPAdQCI8cn6Ar_f5_rUKizYWQpLnowL_kcDVHRwfDTgO2ctaVcR/s1600/2014-01-08+19.10.25.jpg" height="476" width="640" /></a></div>
Simon Lawrencehttp://www.blogger.com/profile/06468439024017853489noreply@blogger.com18tag:blogger.com,1999:blog-2232538987906803275.post-4049436061505667212013-11-28T07:53:00.000-08:002013-11-28T07:53:03.808-08:00Know your apps from your appsHaving just been at Dreamforce 2013 with Desynit, we have all come away with bright, wide eyes, staggering forward repeating the word "app, app, app" like a mob of geeky zombies. Filling the "app gap" has been cited as our number one priority, and the new Salesforce <b>1</b> Platform has basically been given to us as an incredible "free tonne of bricks" to start doing this.<span style="color: #999999;"></span><br />
<br />
But it appeared during discussions that this concept is starting to confuse a few people, and after a few whiteboard sessions explaining similar concepts over and over, I decided a blog post was in order on <span style="color: red;"><span style="font-size: large;">"what is the difference between an app, an app, and an app?"</span></span><br />
<br />
It's a good question actually, and typically we use a couple of pre-cursors to help us separate the types of app, and it's important you know the difference before you go applying the term to your business.<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3k8YiVX5CjLd_6M_hlg_HsLupIY_UYVcreozS7amWfUMFmwdCUVTPFa3YnuI-cLACWR3rnuCmNNPRkuqRhtzsAUaFxw5zEC0TWM2QrEEP3fstefu50u0_7lMDX6-5xuEdmgKmdZjXu-4o/s1600/icon-native.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3k8YiVX5CjLd_6M_hlg_HsLupIY_UYVcreozS7amWfUMFmwdCUVTPFa3YnuI-cLACWR3rnuCmNNPRkuqRhtzsAUaFxw5zEC0TWM2QrEEP3fstefu50u0_7lMDX6-5xuEdmgKmdZjXu-4o/s1600/icon-native.png" /></a></div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPIOTfIPmnOnKyYmCl3-ZMCK8Lcnpo8Y-ymf85e-9OYbkCE-dS5sok35QhPRtJJr0BwmUeubZj0WxzWwP2BWZ6TD1DLQoXclFpWM7Qxya7tHOH-NPGJxMOntW42LrKouIjhECzLug6_KJt/s1600/appstore.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"></a>The traditional, and predominant use of the term "app" is referring to what we technically call a <b>"native app" </b>and these are specifically (and expensively) written pieces of software designed to run on a certain type of device. Everything you download from the AppStore™ for your iPhone™ is ultimately a native app for your Apple™ devices.<br />
<br />
These native apps are written in the appropriate programming language for the device they are intended to run on (ObjectiveC for Apple™ devices, Java for Android etc.etc.) and are typically fairly difficult to port between the different devices. They communicate with your Salesforce org via the various APIs sending data back and forth over secure external connections.<br />
<br />
They are also written, compiled and released at a set moment in time, and do not change from that point (other than by lengthy update processes). This means if your underlying Salesforce data structure or business processes change, your expensive app might become redundant.<br />
<br />
One worldwide example of a native app could be seen in downloading the<i> facebook app </i>available to almost every mobile device in existence.<br />
<br />
The second most common use of the term is referring to <b>"web apps"</b> these are slightly newer to the scene in their most popular format as it has taken longer for mobile and tablet devices to consistently come up to speed supporting the predominant technologies, HTML5 and CSS3.<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8EVhMcNMG9m6GSnUIE7gd1ZnEl3zzGyvsh1pJBQCX-wtsSdEV0mVswL_psF4WO0w5VDhr2AB2Aimd5eTR-xK6sJ9bu2m5HIuA4d3xGTY6-PzLVPkwxTT8chb13KaF7nYpVFwLejqAgXzA/s1600/HTML5_Logo_500.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8EVhMcNMG9m6GSnUIE7gd1ZnEl3zzGyvsh1pJBQCX-wtsSdEV0mVswL_psF4WO0w5VDhr2AB2Aimd5eTR-xK6sJ9bu2m5HIuA4d3xGTY6-PzLVPkwxTT8chb13KaF7nYpVFwLejqAgXzA/s200/HTML5_Logo_500.png" width="200" /></a>The key to web apps is that they are not "downloaded" and stored on the mobile device, but are instead "accessed" - typically though the phones standard web browser - and are so cleverly written they provide a rich and functional experience. The actual compilation and markup is generated by the webservers, off on the internet, and the interfaces then rendered out by the phone. A lot of interesting libraries and technologies exist (such as Dojox.mobile and PhoneGap) that can detect the "type" of device being used and then make the web page mimic the native control's appearances giving the user a very consistent experience, but in fact actually running almost no logical code on the device at all.<br />
<br />
Some of the huge perks of these apps is that they quite simply run on any device that can access the internet. They can be seemlessly updated on the servers, and the user receives the updated version immediately, and because they are probably typically provided by, or hosted on the users core system, have unrivalled access to the company data.<br />
<br />
An example of a web app can loosely be seen by accessing the <i>facebook website</i> on a mobile device (typically accessible on http://m.facebook.com) - you will receive a rich and integrated Facebook experience, but without a native app, purely through the browser.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhN2n-pqNB4aXfulGg3ov8JsQsIkIqJPrCPP6a2jFPPnvpFU8pVVkv9qAdWPSf-SnVQlqGEbpWFXP24cnA3Uvmy5wNpqigJ-p6SrVKG8i_W-g2UafjSpncbyzRlYGMe0YwahVPypLyXea7i/s1600/icon-hybrid.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhN2n-pqNB4aXfulGg3ov8JsQsIkIqJPrCPP6a2jFPPnvpFU8pVVkv9qAdWPSf-SnVQlqGEbpWFXP24cnA3Uvmy5wNpqigJ-p6SrVKG8i_W-g2UafjSpncbyzRlYGMe0YwahVPypLyXea7i/s1600/icon-hybrid.png" /></a></div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGj8NTpFNmqM8g706ZE-OZqSKOIwGGCaJ1X2E04lXwTHkkdlxjLMAo9yEl7Y10z9BOn-TeML5xgR1esciJrbyI2SfE0dEWchw_L6ez8JBSMJJXFbAR8F8fAof50oxahUHghTbB3N8ZJK6F/s1600/icon-hybrid.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><br /></a><br />
The final kind of app a user might experience is called a <b>"hybrid app"</b> and you might not be surprised to hear that this is a mixture of the two app types mentioned above. Hybrid apps - such as the latest and greatest Salesforce 1 Platform typically have a native container, that the user downloads to their mobile device, but this then delivers rich web content through windows, or frames to the companies web service.<br />
<br />
Hybrid apps, whilst therefore still limited to distribution through appstores on the relevant hardware (basically; sorry Blackberry users) can harness the full power of the devices features and hardware, whilst delivering an up-to-date web services.<br />
<br />
<b>In summary</b> the original interpretation of the term "app" being a native piece of software for a phone, is - in this developers opinion - possibly now one of the more restrictive and life-limited meanings. The huge cost and limited flexibility means that unless you directly intend to take advantage of the increased local processing power/storage and access to the device hardware it really isn't the most sensible option any more. I am convinced that more and more apps will at the very least be naturally evolving into Hybrids, the incredible power demonstrated by Salesforce 1 shows how you can be seamlessly passed between native and web services without any interruption or hassle for the end user.<br />
<br />
<br />
<br />
<br />
<br />Simon Lawrencehttp://www.blogger.com/profile/06468439024017853489noreply@blogger.com0tag:blogger.com,1999:blog-2232538987906803275.post-18566243247380155802013-09-18T04:59:00.002-07:002013-09-18T04:59:43.274-07:00Never forget Salesforce ActionSupport events are case sensitive!I'm pretty sure this is repeated around the world, but I thought one more blog post throwing it's weight behind it wouldn't hurt. Developers, do not forget that Visualforce ActionSupport events ARE case sensitive.<br />
<br />
The Actionsupport DOM events include "onchange", "onclick", "ondblclick", "onfocus", "onkeydown", "onkeyup", "onmousedown", "onmousemove" and so on and so on, and these are all in <b>lowercase</b>, despite the occasional new Javascript convention to camelCase them.<br />
<br />
That easily cost me half an hour of visualforce debugging, and not for the first time!<br />
<br />
Now, as a quick test to make sure you were paying attention, why won't my daysbox element rerender in this code snippet?? Use your eyes, and your minds..<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYSsvdFkQoOF7sKuORFSzTQ0FLF9VIDdbdZtCXPJHi43f-FvvvCXicvjUhawxUvwd2S6YS9d22iJBytO3wlb_k8HtSsaYs4fh9AC6sQTJLvtQFjjw9oJUpML0M6mVwM7gIqC_lGcj19oub/s1600/2013-09-18+12_56_00-Visualforce+Page_+DsyCaseComments+~+salesforce.com+-+Enterprise+Edition.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="46" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYSsvdFkQoOF7sKuORFSzTQ0FLF9VIDdbdZtCXPJHi43f-FvvvCXicvjUhawxUvwd2S6YS9d22iJBytO3wlb_k8HtSsaYs4fh9AC6sQTJLvtQFjjw9oJUpML0M6mVwM7gIqC_lGcj19oub/s640/2013-09-18+12_56_00-Visualforce+Page_+DsyCaseComments+~+salesforce.com+-+Enterprise+Edition.png" width="640" /></a></div>
<br />
<br />
<br />Simon Lawrencehttp://www.blogger.com/profile/06468439024017853489noreply@blogger.com0tag:blogger.com,1999:blog-2232538987906803275.post-7734436623124616252013-07-29T02:27:00.000-07:002013-10-09T02:21:17.174-07:00Reducing SOQL queries in Triggers by updating on IDI have recently been battling the SOQL query limit on a large Force.com project I'm working on.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsz8dh12deCVyd1ufWJ2pHZIJe8zPKfoHy0iC33tIbDCXlVFRm2CtSPXiTnul0vMEHJxXAisS0kA-u6toPFsHTE6P8gn1ie_iRfTfnXtmJL8_BaK03EWOGh6MQtzPyXfSl8bjr5GM2rakc/s1600/trigger.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="140" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjsz8dh12deCVyd1ufWJ2pHZIJe8zPKfoHy0iC33tIbDCXlVFRm2CtSPXiTnul0vMEHJxXAisS0kA-u6toPFsHTE6P8gn1ie_iRfTfnXtmJL8_BaK03EWOGh6MQtzPyXfSl8bjr5GM2rakc/s200/trigger.png" width="200" /></a></div>
One of the biggest problems we have is with SOQL in Triggers, over and over again, we were using SOQL to load a list of parent/related objects, modifying their contents and then updating them.<br />
<br />
Then one day, I realised, we didn't need to do this at all. <br />
<br />
Here is an example of a trigger that "passed" a status field from an updated object back to it's parent:<br />
<br />
<div class="mycode">
<pre>trigger UpdateParent on Child__c (after insert, after update)
{
// get the list of parent object IDs
List<id> Ids = new List<id>();
for(Child__c thisChild : Trigger.new) {
Ids.add(thisChild.ParentRef__c);
}
// Load up the list of parent objects and map them out for altering and updating</id></id>
List<parent__c> parentList = [SELECT Id FROM Parent__c WHERE Id IN :Ids];
Map<id parent__c=""> parentMap = new Map<id parent__c="">();
for(Parent__c thisParent : parentList) {
parentMap.put(thisParent.Id, thisParent);
}</id></id></parent__c>
// This is our list of parents to finally update
List<parent__c> parentsToSave = new List<parent__c>();
// Finally we're ready to go through each child in the trigger and update it's parent</parent__c></parent__c>
for(Child__c thisChild : Trigger.new)
{
Parent__c par = parentMap.get(thisChild.ParentRef__c);
par.Child_Status__c = thisChild.Status__c;
parentsToSave.add(par);
}
// update the parents.
update parentsToSave;
}</pre>
</div>
<br />
<br />
That's actually pretty hefty, it's a lot of maps and lists, and the SOQL query right in the middle there, just to update one field on a related object. I think this technique is a bastardisation of the Force.com Fundamentals teachings, which has emphasis on batchification, and in it's example, probably has a lot more cause to go through this process. For me though, this could be simplified by taking advantage of a simple Force.com fact:<br />
<br />
<b>If you create an instance of an sObject, and assign a valid record ID to it, you can update or upsert it exactly as if it was originally loaded to memory.</b><br />
<br />
This means, that as we already have our parent object IDs in a reference field, we don't need to LOAD them, we can just conjure up new ones, update the relevant field, and update them. That makes the above trigger look like this:<br />
<br />
<div class="mycode">
<pre>trigger UpdateParent on Child__c (after insert, after update)
{
// This is our list of parents to finally update
List<parent__c> parentsToSave = new List<parent__c>();
// Now we can just go through each child in the trigger "instantiate" it's parent</parent__c></parent__c>, update and, update!
for(Child__c thisChild : Trigger.new)
{
Parent__c par = new Parent__c();
par.Id = thisChild.ParentRef__c;
par.Child_Status__c = thisChild.Status__c;
parentsToSave.add(par);
}
// update the parents.
update parentsToSave;
}
</pre>
</div>
<br />
<br />
I can literally feel my governor limits squeeling with joy already!! No SOQL, half the script statements, a quarter of the lists and maps. Fantastic.<br />
<br />Simon Lawrencehttp://www.blogger.com/profile/06468439024017853489noreply@blogger.com6tag:blogger.com,1999:blog-2232538987906803275.post-7909798318865926682012-12-17T02:59:00.001-08:002012-12-17T03:06:47.198-08:00Merry Christmas from DesynitI'm devastated to tell you that I wasn't in the office the day that this little productive gem was filmed, but all the same, Merry Christmas from <a href="http://www.desynit.com/" target="_blank">Desynit</a> and the Simon Lawrence Application Development Blog...<br />
<br />
<div style="text-align: center;">
<iframe allowfullscreen="allowfullscreen" frameborder="0" height="315" src="http://www.youtube.com/embed/tKtzkMIMAto?rel=0" width="560"></iframe>
</div>
<div style="text-align: center;">
</div>
<div style="text-align: center;">
<br /></div>
Don't forget to <a href="http://www.facebook.com/Desynit?ref=ts&fref=ts">like Desynit on Facebook</a> to make us feel all loved and popular, and if you so wish to know more about what I do (typically outside of programming) <a href="https://twitter.com/srlawr">dig me up on twitter too</a>.<br />
<br />
Merry Christmas!Simon Lawrencehttp://www.blogger.com/profile/06468439024017853489noreply@blogger.com1tag:blogger.com,1999:blog-2232538987906803275.post-62862128544715529152012-09-26T01:45:00.002-07:002012-12-17T03:05:14.354-08:00Outputting the Salesforce 18 character IDThose familiar with <a href="http://www.salesforce.com/" target="_blank">Salesforce</a> record IDs, and more specifically their use within the Salesforce API will probably know that they come in both 15 and 18 character variations.<br />
<br />
The 15 digit ID, as seen in the URL of any record within Salesforce, is a <u>case sensitive</u> ID, and can be confidently used internally within your org for managing objects.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmK9HqXfXKAxpFnl4-_GA-VHqjxsdhgNS88ePLgXA-W_MNDnb5vFZvg0n6jsb5UztyaTMsDIN4JCV8L-6j1JQGbBUoFY4Bywzkqfkw4yKqq_73lkh-9_e1QT79mWuLudF1s_eoobo6pLVr/s1600/15digitID.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjmK9HqXfXKAxpFnl4-_GA-VHqjxsdhgNS88ePLgXA-W_MNDnb5vFZvg0n6jsb5UztyaTMsDIN4JCV8L-6j1JQGbBUoFY4Bywzkqfkw4yKqq_73lkh-9_e1QT79mWuLudF1s_eoobo6pLVr/s1600/15digitID.PNG" /></a></div>
<br />
<br />
If you intend to use, load or manipulate records with an external program, for example, exporting data via reports or the API, you will probably need to use the 18 digit ID, which includes three extra "check digits" and is <u>not case sensitive</u>. It is important to remember, that functions like Excel's VLOOKUP are not case sensitive, nor, by default are MySQL queries.<br />
<br />
There are a number of functions and tools available to manually calculate the last three characters, and a really brilliant explainantion of how the digits are calculated, and their use can be found on the Astadia blog post <span style="font-size: small;"><span style="font-weight: normal;"><a href="http://astadiaemea.wordpress.com/2010/06/21/15-or-18-character-ids-in-salesforce-com-%E2%80%93-do-you-know-how-useful-unique-ids-are-to-your-development-effort/" target="_blank">15 or 18 Character IDs in Salesforce.com.</a></span></span><br />
<br />
This isn't an ideal solution though, which leaves you thinking that there must be a simpler way to get the 18 digit ID out of the front end of your organisation. And of course, you can, and once you know how, it's actually incredibly simple!<br />
<br />
All you need to do is create a new <b>custom formula field</b> on your object, give it a relevant name, set it's type to "text" and in the formula box enter:
<br />
<span style="font-size: small;"><span style="font-weight: normal;"><br /></span></span>
<span style="font-family: "Courier New",Courier,monospace;"><span style="font-size: large;"><span style="font-weight: normal;">CASESAFEID(Id)</span></span></span><br />
<span style="font-size: small;"><span style="font-weight: normal;"><br /></span></span>
and that's it! If you're feeling particularly lazy, it's even in the righthand box of "Functions" and you can just double click it to enter.<br />
<span style="font-size: small;"><span style="font-weight: normal;"><br /></span></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIuFxs3bi2xlJIVQLH_vLDeNBTKA5ocFHc3kHaeGwrv56KPOg7LNpcOlxXo3IOugfpLsQ-v8z0JOBW-fBozd9AjUBxFOdPbDLietcV8QPQuZP0hP4t3LNjIGdSYjO8jVTqqt2xxygtS7h0/s1600/formulafield.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="352" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIuFxs3bi2xlJIVQLH_vLDeNBTKA5ocFHc3kHaeGwrv56KPOg7LNpcOlxXo3IOugfpLsQ-v8z0JOBW-fBozd9AjUBxFOdPbDLietcV8QPQuZP0hP4t3LNjIGdSYjO8jVTqqt2xxygtS7h0/s640/formulafield.jpg" width="640" /></a></div>
<span style="font-size: small;"><span style="font-weight: normal;"><br /></span></span>
Save the field, alter your field level security settings, and add it to the relevant page layouts and this field will display the 18 digit ID on your Salesforce record.<br />
<br />
Now when you want to test, or work, with your Salesforce records, as they will have been saved in external applications and data exports, you can grab the 18 character ID straight off your page layout.<br />
<span style="font-size: small;"><span style="font-weight: normal;"><br /></span></span>
<span style="font-size: small;"><span style="font-weight: normal;"><br /></span></span>Simon Lawrencehttp://www.blogger.com/profile/06468439024017853489noreply@blogger.com3tag:blogger.com,1999:blog-2232538987906803275.post-21599884512978474992012-09-10T03:03:00.001-07:002012-09-10T08:49:24.504-07:00Dreamforce 2012: Integrating PayPal Mass Payments with Force.com<b>"Welcome to Dreamforce 2012"</b><br />
<br />
Everywhere you look at the moment in the Salesforce.com world, there are banners, blogs and news articles hailing the largest ever Enterprise IT conference.<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhR1c3Gm6MOh7UZnetkJTOazmEfFYlEu_Ko2OBxdEqr4vtQ48GCMq5V64Hek6EQBooUlQ6zN_R8vqz07i9U6DDKSLj6jhe8-x3Fw-9BCIxv12V9kxC0P7ZKG_mg5uFBtxSzyNfncuLUiinF/s1600/df.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhR1c3Gm6MOh7UZnetkJTOazmEfFYlEu_Ko2OBxdEqr4vtQ48GCMq5V64Hek6EQBooUlQ6zN_R8vqz07i9U6DDKSLj6jhe8-x3Fw-9BCIxv12V9kxC0P7ZKG_mg5uFBtxSzyNfncuLUiinF/s200/df.png" width="200" /></a></div>
<br />
It used to be held at the worlds biggest conference centre, the Moscone West in San Francisco; but now, it's held at the worlds biggest conference centre AND ten surrounding hotels and facilities. Not to mention closing off a few streets and booking out every hotel in the west of the city. With 70,000 attendees, and a gala headlined by the Red Hot Chilli Peppers, this is <i>the</i> CRM industry's flagship event. <br />
<br />
So who wouldn't want to give a presentation there? Especially on such an awesome topic as combining one of the worlds most popular and accessible payment gateways with the worlds coolest CRM<br />
(ok, it's just the inner-nerd in me that's getting so excited about those bits).<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhK10KrYqxtwOLayQdIa3GDrd_WVADvP2qTscIpD03V64rLE6rG7csy_jQWvhECpN8gQheoGA0jjlIUf8lqiPNvdludu_x4UDyTCdc5q25ZnrLr2v1OlmB4EANXYdTaKfMGPsyn6UC8sPGb/s1600/paypal-salesforce.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhK10KrYqxtwOLayQdIa3GDrd_WVADvP2qTscIpD03V64rLE6rG7csy_jQWvhECpN8gQheoGA0jjlIUf8lqiPNvdludu_x4UDyTCdc5q25ZnrLr2v1OlmB4EANXYdTaKfMGPsyn6UC8sPGb/s200/paypal-salesforce.png" width="190" /></a>Welcome then to the supporting blog post to this Dreamforce 2012 developer track session:<br />
<br />
<a href="http://www.salesforce.com/dreamforce/DF12/sessions.jsp#page=0&search=paypal&role[title]=Role&role[value]=All&industry[title]=Industry&industry[value]=All&product[title]=Product&product[value]=All" target="_blank">Integrating PayPal Mass Payments with Force.com</a><br />
<br />
If you are attending Dreamforce, you'll have access to the <a href="https://dreamevent.my.salesforce.com/apex/ActivityList?type=Dreamforce#a093000000VhYNGAA3" target="_blank">Chatter (touch!) session page here.</a><br />
<br />
So what can you expect from this session? Well, having found this post, I can promise you will be well placed to take the most away from this presentation (and if you are here after the session, you will find this blog, along with what I presented an incredibly valuable combination towards understanding the process).<br />
<br />
Firstly, let me link you up with the GitHub repository containing the integration code and demo files:<br />
<br />
<span style="font-size: large;"> </span><span style="font-size: large;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgiATZNTUMbfafqiG_vmBMFyGMTCNAzuNXhu52Fn1EmItFIiYaEYKuAsjjo68480Enm71e7BfB__5rfnTvxfBlhutxxFunpwWiCvO32W-rAd7Mqp2prXaHYtBYiAPf3uYfBXpjXsy0GG5wS/s1600/githubwhite.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgiATZNTUMbfafqiG_vmBMFyGMTCNAzuNXhu52Fn1EmItFIiYaEYKuAsjjo68480Enm71e7BfB__5rfnTvxfBlhutxxFunpwWiCvO32W-rAd7Mqp2prXaHYtBYiAPf3uYfBXpjXsy0GG5wS/s1600/githubwhite.png" /></a><a href="https://github.com/srlawr/PaypalSFDC">https://github.com/srlawr/PaypalSFDC</a></span><br />
<br />
Once I have clearance from Salesforce.com I will post the slides from the presentation up here too, but really, what you'll want is these two blog posts on the topic, which are the original works that landed me the Dreamforce presentation in the first place:<br />
<br />
<span style="font-size: large;"><a href="http://srlawr.blogspot.co.uk/2012/01/integrating-paypal-api-with.html" target="_blank">1) Salesforce - Paypal Masspay Integration</a></span><br />
<span style="font-size: large;"><br /><a href="http://srlawr.blogspot.co.uk/2012/02/processing-paypal-ipn-messages-with.html" target="_blank">2) Salesforce - Paypal IPN integration</a></span><br />
<br />
Working through these two blog posts should empower a talented developer to perform their own complete PayPal Mass Payments integration in a couple of days. If you don't have this kind of resource, or want to tap into my expert knowledge on the topic.. please get in touch with my employers <a href="http://www.desynit.com/" target="_blank">Desynit</a>, and I'm sure they will be more than happy to talk to you.<br />
<br />Simon Lawrencehttp://www.blogger.com/profile/06468439024017853489noreply@blogger.com2