5. Safe Harbor
Safe harbor statement under the Private Securities Litigation Reform Act of 1995: This presentation may contain forward-looking
statements that involve risks, uncertainties, and assumptions. If any such uncertainties materialize or if any of the assumptions
proves incorrect, the results of salesforce.com, inc. could differ materially from the results expressed or implied by the forward-
looking statements we make. All statements other than statements of historical fact could be deemed forward-looking, including any
projections of subscriber growth, earnings, revenues, or other financial items and any statements regarding strategies or plans of
management for future operations, statements of belief, any statements concerning new, planned, or upgraded services or
technology developments and customer contracts or use of our services.
The risks and uncertainties referred to above include – but are not limited to – risks associated with developing and delivering new
functionality for our service, our new business model, our past operating losses, possible fluctuations in our operating results and
rate of growth, interruptions or delays in our Web hosting, breach of our security measures, risks associated with possible mergers
and acquisitions, the immature market in which we operate, our relatively limited operating history, our ability to expand, retain, and
motivate our employees and manage our growth, new releases of our service and successful customer deployment, our limited
history reselling non-salesforce.com products, and utilization and selling to larger enterprise customers. Further information on
potential factors that could affect the financial results of salesforce.com, inc. is included in our annual report on Form 10-K for the
most recent fiscal quarter ended July 31, 2011. This document and others are available on the SEC Filings section of the Investor
Information section of our Web site.
Any unreleased services or features referenced in this or other press releases or public statements are not currently available and
may not be delivered on time or at all. Customers who purchase our services should make the purchase decisions based upon
features that are currently available. Salesforce.com, inc. assumes no obligation and does not intend to update these forward-
looking statements.
6. Nos prochains évènements à Paris!
Salesforce1 Tour à Paris
Webinar en Français: Data Model & Relationships
Prenez le lead sur notre communauté de Développeurs en France !
Plus d‟information sur www.developer.salesforce.com
June
26th
April
29th
A vous
de jouer
8. Salesforce is a Platform Company. Period.
-Alex Williams, TechCrunch
600MAPI Calls
Per Day
6BLines of Apex
4M+Apps Built on
the Platform
72BRecords
Stored
Salesforce1 Platform
12. Warehouse Application Requirements
Track price and inventory on hand for all
merchandise
Create invoices containing one or more
merchandise items as a line items
Present total invoice amount and current
shipping status
13. Warehouse Data Model
Merchandise
Name Price Inventory
Pinot $20 15
Cabernet $30 10
Malbec $20 20
Zinfandel $10 50
Invoice
Number Status Count Total
INV-01 Shipped 16 $370
INV-02 New 20 $200
Invoice Line Items
Invoice Line Merchandise Units
Sold
Unit Price Value
INV-01 1 Pinot 1 15 $20
INV-01 2 Cabernet 5 10 $150
INV-01 3 Malbec 10 20 $200
INV-02 1 Pinot 20 50 $200
15. Introduction to Apex
Object-Oriented Language
Dot Notation Syntax
Case Insenstive
“First Class” Citizen on the Platform
16. Apex Anatomy
Chapter 1:
public with sharing class myControllerExtension implements Util {
private final Account acct;
public Contact newContact {get; set;}
public myControllerExtension(ApexPages.StandardController stdController) {
this.acct = (Account)stdController.getRecord();
}
public PageReference associateNewContact(Id cid) {
newContact = [SELECT Id, Account from Contact WHERE Id =: cid LIMIT 1];
newContact.Account = acct;
update newContact;
}
}
Class and Interface based
Scoped Variables
Inline SOQL
Inline DML
17. Developer Console
Browser Based IDE
Create and Edit Classes
Create and Edit Triggers
Run Unit Tests
Review Debug Logs
18. Apex Triggers
Event Based Logic
Associated with Object
Types
Before or After:
Insert
Update
Delete
Undelete
19. Controlling Flow
trigger LineItemTrigger on Line_Item__c (before insert,
before update) {
//separate before and after
if(Trigger.isBefore) {
//separate events
if(Trigger.isInsert) {
System.debug(‘BEFORE INSERT’);
DelegateClass.performLogic(Trigger.new);
20. Static Flags
public with sharing class AccUpdatesControl {
// This class is used to prevent multiple calls
public static boolean calledOnce = false;
public static boolean ProdUpdateTrigger = false;
}
21. Chatter Triggers
trigger AddRegexTrigger on Blacklisted_Word__c (before insert, before update) {
for (Blacklisted_Word__c f : trigger.new)
{
if(f.Custom_Expression__c != NULL)
{
f.Word__c = '';
f.Match_Whole_Words_Only__c = false;
f.RegexValue__c = f.Custom_Expression__c;
}
}
}
23. Unit Testing in Apex
Built in support for testing
– Test Utility Class Annotation
– Test Method Annotation
– Test Data build up and tear down
Unit test coverage is required
– Must have at least 75% of code covered
Why is it required?
24. Unit Testing
• Declare Classes/Code as
Test
• isTest Annotation
• testmethod keyword
• Default data scope is test
only
25. Testing Context
// this is where the context of your test begins
Test.StartTest();
//execute future calls, batch apex, scheduled apex
// this is where the context ends
Text.StopTest();
System.assertEquals(a,b); //now begin assertions
26. Testing Permissions
//Set up user
User u1 = [SELECT Id FROM User WHERE Alias='auser'];
//Run As U1
System.RunAs(u1){
//do stuff only u1 can do
}
32. Apex Batch Processing
Governor Limits
– Various limitations around resource usage
Asynchronous processing
– Send your job to a queue and we promise to run it
Can be scheduled to run later
– Kind of like a chron job
33. Batchable Interface
global with sharing class WHUtil implements Database.Batchable<sObject>
{
global Database.QueryLocator start(Database.BatchableContext BC)
{ //Start on next context }
global void execute(Database.BatchableContext BC, List<sObject> scope)
{ //Execute on current scope }
global void finish(Database.BatchableContext BC)
{ //Finish and clean up context }
}
47. Apex Form
Required for standard salesforce post
Incurs Viewstate Overhead
<apex:form>
…
</apex:form
aspdoifuapknva894372h
4ofincao98vh0q938hfoq
iwnbdco8q73h0o9fqubov
ilbodfubqo3e8ufbw
48. Interacting with Apex
ActionFunction allows direct binding of variables
ActionFunction requires ViewState
JavaScript Remoting binds to static methods
JavaScript Remoting uses no ViewState
Transient, Private and Static reduce Viewstate
49. Apex Remote Action
Static
No View State
Invoked through JS API
Invokes JS Callback
@remoteAction
global static String myMethod(String
inputParam){
...
}
50. Calling Apex Remote Action
Visualforce.remoting.Manager.invokeAction(’
{!$RemoteAction.RemoteClass.methodName}'
,
param,
function(result, event) {
//...callback to handle result
});
52. Event Object: Failure Example
{
"statusCode":400,
"type":"exception",
"action":"IncidentReport",
"method":"createIncidentReport",
"message":"List has more than 1 row for assignment to SObject",
"data": {"0":
{"Merchandise__c":"a052000000GUgYgAAL","Type__c":"Accident","Desc
ription__c":"This is an accident report"}},
"result":null,
"status":false
}
53. Interacting with the Publisher: Allow Submit
Make Submit Active
Payload true/false
Sfdc.canvas.publisher.publish(
{
name: "publisher.setValidForSubmit",
payload:true
});
54. Interacting with the Publisher: Subscribe to Submit
Attach to Submit Event
Sfdc.canvas.publisher.subscribe({
name: "publisher.post",
onData:function(e) {
// This subscribe fires when the user hits 'Submit'
in the publisher
postToFeed();
}});
55. Interacting with the Publisher: Close Publisher
Make the Submit Happen
Sfdc.canvas.publisher.publish({name:
"publisher.close", payload:
{ refresh:"true"}});
59. Only has to be accessible from the user‟s
browser
Authentication via OAuth or Signed
Response
JavaScript based SDK
Within Canvas, the App can make API calls
as the current user
apex:CanvasApp allows embedding via
Visualforce
Any Language, Any Platform
How Canvas Works
67. Nos prochains évènements à Paris!
Salesforce1 Tour à Paris
Webinar en Français: Data Model & Relationships
Prenez le lead sur notre communauté de Développeurs en France !
Plus d‟information sur www.developer.salesforce.com
June
26th
April
29th
A vous
de jouer
70. Double-click to enter title
Double-click to enter text
@forcedotcom
@pchittum
@dcarroll
#forcedotcom
71. Double-click to enter title
Double-click to enter text
Join A
Developer User Group
http://bit.ly/fdc-dugs
PARIS DUG:
http://www.meetup.com/Paris-
Salesforce-Developer-User-Group/
Leader: Mohamed EL MOUSSAOUI
72. Double-click to enter title
Double-click to enter text
Become A
Developer User Group Leader
Email:
April Nassi
<anassi@salesforce.com>
73. Thank You
Peter Chittum
Developer Evangelist
@pchittum
pchittum@salesforce.com
Hervé Maleville
Platform Architect
@hmaleville
herve.maleville@salesforce.com
Editor's Notes
Change this slide to match the local internet requirements.The bit.ly link points to the latest HTML draft of the new workbook. This is different than the official workbook on developer.force.com and there are schema differences, so attendees cannot mix and match.
Highlight that this is not just a day of talking to them, this is a dialogue and they should ask questions as they like – even ones that don’t pertain to the current “section”. Projects they’re working on, features they have heard about, etc.
THERE IS NOT A CURRENT ONLINE VERSION OF THE NEW WORKBOOK DRAFT
Safe Harbor
Safe Harbor
Safe Harbor
Safe Harbor
Let’s have an exercise in requirements gathering. Here is some of the core needs for our Warehouse application. What nouns here should we be looking at to model our data with?
Here is an overview of what our data model will look like. Recommended: Break into a demo of building data in the browser, either custom object wizard or schema builder depending on audience/workbooks
For when declarative logic is not enough, we provide Apex. Apex is a cloud-based programming language, very similar to Java – except that you can code, compile and deploy all right from your Salesforce instance. You’ll see how we can create robust programmatic functions right from your browser.
For when declarative logic is not enough, we provide Apex. Apex is a cloud-based programming language, very similar to Java – except that you can code, compile and deploy all right from your Salesforce instance. You’ll see how we can create robust programmatic functions right from your browser.
Result is the return from the invoked method.Event is an object that represents data returned from the callback to communicate the state of the call (success, failure, HTTP code, This could do with examples on what to do with the result.
This is an excerpt showing some of the important attributes. The full JSON response taken from this example is below:{"statusCode":400,"type":"exception","tid":2,"ref":false,"action":"IncidentReport","method":"createIncidentReport","message":"List has more than 1 row for assignment to SObject","where":"","data":{"0":{"Merchandise__c":"a052000000GUgYgAAL","Type__c":"Accident","Description__c":"asdfasdf"}},"vfTx":true,"vfDbg":true,"result":null,"status":false}
For when declarative logic is not enough, we provide Apex. Apex is a cloud-based programming language, very similar to Java – except that you can code, compile and deploy all right from your Salesforce instance. You’ll see how we can create robust programmatic functions right from your browser.