27
Force.com IDE (Apex and Visualforce) Internet Passcode Z6ZT Caleb Sidel, Strategic Growth, Inc.

Force IDE (Apex and Visualforce ) Internet Passcode Z6ZT

  • Upload
    butch

  • View
    51

  • Download
    0

Embed Size (px)

DESCRIPTION

Force.com IDE (Apex and Visualforce ) Internet Passcode Z6ZT. Caleb Sidel, Strategic Growth, Inc. Agenda. Install Force.com IDE How to run a SOQL query from the IDE How to modify Objects, Workflow, etc (dangerous, but fun!) How to create an Apex Trigger (just the shell) - PowerPoint PPT Presentation

Citation preview

Page 1: Force IDE (Apex and Visualforce ) Internet Passcode Z6ZT

Force.com IDE(Apex and Visualforce)

Internet Passcode Z6ZT

Caleb Sidel, Strategic Growth, Inc.

Page 2: Force IDE (Apex and Visualforce ) Internet Passcode Z6ZT

Agenda Install Force.com IDE

How to run a SOQL query from the IDE How to modify Objects, Workflow, etc (dangerous, but fun!) How to create an Apex Trigger (just the shell) How to create a Visualforce Page (just the shell) How to run testMethods

What is the Developer Console? Running testMethods Running queries Running anonymous script statements (dangerous, but

fun!) Apex Trigger – Create a Case from an Opportunity Visualforce – De-dupe before Saving an Account Community Resources Technical Resources

2

Page 3: Force IDE (Apex and Visualforce ) Internet Passcode Z6ZT

Install Force.com IDE IDE Install Guide

https://developer.salesforce.com/page/Force.com_IDE_Installation

Eclipse 4.3 Kepler http://

www.eclipse.org/downloads/packages/eclipse-ide-java-developers/keplerr

Java https://www.java.com/en/download/

To Check your Java Version on a PC Run CMD At the command prompt type ‘java –version’

To Check your Java Version on a Mac Open TERM At the prompt type ‘java –version’

3

Page 4: Force IDE (Apex and Visualforce ) Internet Passcode Z6ZT

Project Browser SOQL query using the .schema Objects, Workflow, etc. New Apex Trigger New Visualforce Page New Apex Class

Helper Controller Extension

Run a single Test Class/All Test Classes

4

Page 5: Force IDE (Apex and Visualforce ) Internet Passcode Z6ZT

New Project

5

Page 6: Force IDE (Apex and Visualforce ) Internet Passcode Z6ZT

SOQL & Schema Browsing

6

Page 7: Force IDE (Apex and Visualforce ) Internet Passcode Z6ZT

Metadata

7

Page 8: Force IDE (Apex and Visualforce ) Internet Passcode Z6ZT

Metadata Ever want to turn off every Workflow for an

Object? Open the object’s XML file, copy the contents into a

text editor, then set <active>false</active> for everything in Eclipse, then revert back when done.

Ever want to know where a field is used? Maybe you have data being changed and you can’t

figure out why – maybe it is referenced in a field update or a trigger!

8

Page 9: Force IDE (Apex and Visualforce ) Internet Passcode Z6ZT

New Apex/Visualforce

9

Page 10: Force IDE (Apex and Visualforce ) Internet Passcode Z6ZT

Developer Console Queries Running Tests (All vs One) Anonymous Script Statements

(aka living on the edge)

10

Page 11: Force IDE (Apex and Visualforce ) Internet Passcode Z6ZT

Developer Console - Query

11

Page 12: Force IDE (Apex and Visualforce ) Internet Passcode Z6ZT

Developer Console – Run Tests

12

Page 13: Force IDE (Apex and Visualforce ) Internet Passcode Z6ZT

Developer Console – Anonymous

13

Page 14: Force IDE (Apex and Visualforce ) Internet Passcode Z6ZT

Code Examples Apex Trigger – Create a Case from an

Opportunity Visualforce – De-dupe before saving a Lead

14

Page 15: Force IDE (Apex and Visualforce ) Internet Passcode Z6ZT

Trigger Create a Case from an Opportunity

Have you ever wanted to create a project once an Opportunity is Closed/Won? Or a survey when a Case is Closed? Or create an Order when an Opportunity is Closed/Won?

15

Page 16: Force IDE (Apex and Visualforce ) Internet Passcode Z6ZT

Trigger (GOOD)List<Case> casesToInsert = new List<Case>();for(Opportunity o : Trigger.new){ //Filter out the Id or Keyword etc if(o.IsWon) { Case c = new Case(); c.Subject = o.Name; c.Description = o.Description; c.AccountId = o.AccountId; c.Oppoprtunity__c = o.Id; //You can set origin, type, status, etc

//NEVER do a QUERY or a DML (insert, update, delete, upsert) INSIDE A LOOP!!! casesToInsert.add(c); }}

//Done with the loop, what about the insert?if(casesToInsert.size() > 0){ //DO NOT do a try/catch and ignore the error //insert below will cause the entire trigger to fail if there is even 1 case with an error. //maybe this is good? insert casesToInsert;

//If you’d rather you can use Database.insert() and handle errors one at a time. //Sometimes this is good. Just don’t “hide” the errors in System.debug() statements. //throw them or email them or something!}

16

Page 17: Force IDE (Apex and Visualforce ) Internet Passcode Z6ZT

Trigger (BAD)List<Case> casesToInsert = new List<Case>();for(Opportunity o : Trigger.new){ //Filter out the Id or Keyword etc if(o.IsWon) { Case c = new Case(); c.Subject = o.Name; c.Description = o.Description; c.AccountId = o.AccountId; c.Oppoprtunity__c = o.Id; //You can set origin, type, status, etc

//NEVER do a QUERY or a DML (insert, update, delete, upsert) INSIDE A LOOP!!! insert c; //BAD! BAD!!!! }}

//Done with the loop, what about the insert?if(casesToInsert.size() > 0){ //BAD try { insert casesToInsert; } catch (Exception exp) { //This exception only goes to a log when you monitor it. No one will ever know of the error :( System.debug(exp); } }

17

Page 18: Force IDE (Apex and Visualforce ) Internet Passcode Z6ZT

Visualforce Page There are a ton of de-dupe before saving a Lead

apps out there, so don’t actually code this in a real org! But it makes for a simple example

There are lots of ways of going about this. This is how I like to do it: First set yourself up with Development Mode (see next

slide) Then, in your Salesforce org/browser enter the URL

https://naX.salesforce.com/apex/DeDupePage The wizard will walk you through creating the page!

18

Page 19: Force IDE (Apex and Visualforce ) Internet Passcode Z6ZT

Development Mode

19

Page 20: Force IDE (Apex and Visualforce ) Internet Passcode Z6ZT

Visualforce Page – The Page (pre Extension)

20

<apex:page standardController="Lead“ > <apex:form > <apex:pageBlock mode="edit" > <apex:pageMessages /> <apex:pageBlockButtons > <apex:commandButton value="Save" action="{!Save}" /> <apex:commandButton value="Cancel" action="{!Cancel}" /> </apex:pageBlockButtons> <apex:sectionHeader title="Lead"/> <apex:pageBlockSection title="Details" columns="1" > <apex:inputField value="{!Lead.Firstname}" /> <apex:inputField value="{!Lead.Lastname}" required="true" /> <apex:inputField value="{!Lead.Company}" required="true" /> <apex:inputField value="{!Lead.Email}" required="true" /> </apex:pageBlockSection> </apex:pageBlock> </apex:form></apex:page>

Page 21: Force IDE (Apex and Visualforce ) Internet Passcode Z6ZT

Visualforce Page If you’ve created your Visualforce Page via the

Salesforce “browser” UI then once you add an “extension” or “controller” to your Page (see next slide) Salesforce will generate the Controller shell code for you!

Then you can refresh your IDE and edit the Controller there to get type ahead and other IDE goodness

21

Page 22: Force IDE (Apex and Visualforce ) Internet Passcode Z6ZT

Visualforce Page – The Page (post Extension)

22

<apex:page standardController="Lead" extensions="VFC_LeadDeDupeExt" > <apex:form > <apex:pageBlock mode="edit" > <apex:pageMessages /> <apex:pageBlockButtons > <apex:commandButton value="Save" action="{!customSave}" /> <apex:commandButton value="Cancel" action="{!Cancel}" /> </apex:pageBlockButtons> <apex:sectionHeader title="Lead"/> <apex:pageBlockSection title="Details" columns="1" > <apex:inputField value="{!Lead.Firstname}" /> <apex:inputField value="{!Lead.Lastname}" required="true" /> <apex:inputField value="{!Lead.Company}" required="true" /> <apex:inputField value="{!Lead.Email}" required="true" /> </apex:pageBlockSection> </apex:pageBlock> </apex:form></apex:page>

Page 23: Force IDE (Apex and Visualforce ) Internet Passcode Z6ZT

Visualforce Page – The Controller

23

public with sharing class VFC_LeadDeDupeExt { ApexPages.StandardController stdController; private Lead currentLead;

public VFC_LeadDeDupeExt(ApexPages.StandardController controller) { stdController = controller; currentLead = (Lead)controller.getRecord(); } public PageReference customSave() { List<Lead> duplicates = [SELECT Id FROM Lead WHERE Email = :currentLead.Email]; if(duplicates != null && duplicates.size() > 0) { ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.ERROR,'Error: A duplicate email address was found with Id: ' + duplicates[0].Id)); return null; } //try //{ return stdController.save(); //} //catch (Exception exp) //{ //TODO display pretty errors //} return null; }

}

Page 24: Force IDE (Apex and Visualforce ) Internet Passcode Z6ZT

Common Force.com Terms Trigger – custom code that runs on save (like a workflow rule) Visualforce – custom code that makes the screen look however

your heart desires Batch Apex – apex code that can run on Millions upon Millions of

records Scheduled Apex – apex code that runs at a set time each day

(up to 5 times per day (shhhh - there is an exception via Developer Console)) Force.com API (SOAP) – the “old fashioned” (i.e. good) way to

integrate data into/out of salesforce Force.com API (REST API) – the “new fashioned” way to do

real-time or highspeed integrations of small transactional data Native vs Non-Native Applications – Native applications run

100% on Force.com (and if we stretch, this also means Heroku). Non-native applications require a separate server to run a portion of the code. Why write non-native? That code supports non-Salesforce use cases. That code requires massive data volumes/complexities that Force.com would otherwise limit. That code was cheaper to write in Ruby/Java than Force.com.

24

Page 25: Force IDE (Apex and Visualforce ) Internet Passcode Z6ZT

Community Resources Developer Site:

http://developer.force.com/ Developer Discussions:

http://boards.developerforce.com/sforce/?category.id=developers

Linked In Community:Salesforce.com Professional CommunitySalesforce.com Certified ProfessionalsAustin Force.com Developer Group

Meetup Site

25

Page 26: Force IDE (Apex and Visualforce ) Internet Passcode Z6ZT

Technical Resources Introduction to the Force.com Database How to Create a Custom Object Introduction to Force.com Apex Code VisualForce Webinar (skip to 9:45) – nice overview VisualForce Quick Start (VisualForce

Developer's Guide p15-25, 32-39) Creating a Developer Edition Account Apex Language Reference and Wiki VisualForce Developer's Guide and Wiki Force.com Developer’s Guide Force.com Web Services API Developer's Guide Developer Technical Wiki

26

Page 27: Force IDE (Apex and Visualforce ) Internet Passcode Z6ZT

Contact Information More contact information then even I know what

to do with!

[email protected]

512.814.5775

Twitter: @calebsidel LinkedIn: www.linkedin.com/in/csidel Dreamforce Chatter

27