S-Controls for Dummies


Published on

Published in: Economy & Finance, Technology
  • Be the first to comment

No Downloads
Total Views
On Slideshare
From Embeds
Number of Embeds
Embeds 0
No embeds

No notes for slide

S-Controls for Dummies

  1. 1. S-Controls for Dummies Chris Sommers, Salesforce.com Senior Sales Engineer, Global Enterprise Accounts Track: Enterprise Edition Administrators
  2. 2. Safe Harbor Statement <ul><li>“ Safe harbor” statement under the Private Securities Litigation Reform Act of 1995: This presentation may contain forward-looking statements the achievement of which involves risks, uncertainties and assumptions. If any such risks or uncertainties materialize or if any of the assumptions proves incorrect, our results 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. </li></ul><ul><li>The risks and uncertainties referred to above include - but are not limited to - risks associated with the integration of Sendia Corporation’s technology, operations, infrastructure and personnel with ours; unexpected costs or delays incurred in integrating Sendia with salesforce.com, which could adversely affect our operating results and rate of growth; any unknown errors or limitations in the Sendia technology; any third party intellectual property claims arising from the Sendia technology; customer and partner acceptance and deployment of the AppExchange and AppExchange Mobile platforms; interruptions or delays in our service or our Web hosting; our new business model; breach of our security measures; possible fluctuations in our operating results and rate of growth; the emerging market in which we operate; our relatively limited operating history; our ability to hire, retain and motivate our employees and manage our growth; competition; our ability to continue to release and gain customer acceptance of new and improved versions of our CRM service; unanticipated changes in our effective tax rate; fluctuations in the number of shares outstanding; the price of such shares; foreign currency exchange rates and interest rates. </li></ul><ul><li>Further information on these and other factors that could affect our financial results is included in the reports on Forms 10-K, 10-Q and 8-K and in other filings we make with the Securities and Exchange Commission from time to time, including our Form 10-K for the fiscal year ended January 31, 2006. These documents are available on the SEC Filings section of the Investor Information section of our website at www.salesforce.com /investor . </li></ul><ul><li>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 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, except as required by law. </li></ul>
  3. 3. Agenda <ul><li>What are S-Controls? </li></ul><ul><li>When to use S-Controls </li></ul><ul><li>S-Controls Techniques & Examples </li></ul><ul><li>AJAX Introduction </li></ul><ul><li>Examples and Resources </li></ul><ul><li>Take Home Exercises </li></ul>
  4. 4. What are Custom S-Controls? <ul><li>Light-weight web applications/tools hosted by salesforce.com and executed on the client browser </li></ul><ul><li>An s-control can contain any type of content that can be displayed or run in a browser </li></ul><ul><ul><li>Java Applet </li></ul></ul><ul><ul><li>ActiveX Control </li></ul></ul><ul><ul><li>HTML / JavaScript / AJAX </li></ul></ul><ul><li>S-Controls are activated via Custom Links, Web Tabs, Web Apps or HYPERLINK custom formulae fields in salesforce.com (after 4 th Quarter release, executable in Detail Pages of records, and Custom Buttons) </li></ul>
  5. 5. S-Control Options <ul><li>No back-office access </li></ul><ul><li>State persistence </li></ul><ul><li>Versioning issues </li></ul><ul><li>IE Specific </li></ul><ul><li>COM calling COM </li></ul>ActiveX Java Applet JSP / ASP AJAX <ul><li>Rich UI </li></ul><ul><li>Can be “trusted” </li></ul><ul><li>Tricky deployment </li></ul><ul><li>eg. Salesforce.com Mail Merge </li></ul><ul><li>Rich UI </li></ul><ul><li>Can be “trusted” </li></ul><ul><li>Cross-browser </li></ul><ul><li>JVM versioning </li></ul><ul><li>SOAP stack deployment </li></ul><ul><li>Large footprint </li></ul><ul><li>Java developer </li></ul><ul><li>Rich UI </li></ul><ul><li>Good access to internal systems </li></ul><ul><li>Familiar dev environment </li></ul><ul><li>Need a hosting stack </li></ul><ul><li>Expensive development </li></ul><ul><li>Packaging and sharing is difficult </li></ul><ul><li>Pretty rich UI </li></ul><ul><li>Simple API access </li></ul><ul><li>Asynchronous </li></ul><ul><li>Familiar html environment </li></ul><ul><li>Javascript / cross-browser </li></ul><ul><li>Quick and easy cycle </li></ul><ul><li>Easy to package and share </li></ul>
  6. 6. When to Use Custom S-controls (Value!) <ul><li>Consider using Custom S-controls if you… </li></ul><ul><li>Want to enhance the Salesforce UI </li></ul><ul><ul><li>streamline a process </li></ul></ul><ul><ul><li>reduce number of clicks </li></ul></ul><ul><li>Know that your process flow is closed loop, i.e., no outside databases or data sources </li></ul><ul><li>Have less than 500 records to create or update per session </li></ul><ul><li>Have few means to host a custom web application yourself </li></ul>
  7. 7. <ul><li>User Interface Enhancement </li></ul><ul><ul><li>Add your own UI </li></ul></ul><ul><ul><li>Advanced Capabilities (trees, graphs etc) </li></ul></ul><ul><li>Build Custom Logic </li></ul><ul><ul><li>Client-side Workflow (wizard) </li></ul></ul><ul><ul><li>“Mass” Change to records </li></ul></ul>When to Use Custom S-controls
  8. 8. When NOT to Use Custom S-controls <ul><li>Do NOT use Custom S-controls if you… </li></ul><ul><li>Are looking to build heavy-weight, computationally intensive extensions to Salesforce </li></ul><ul><li>Are seeking a complex integrate with a system external to Salesforce.com (simple web-service and HTTP post/get will work!) </li></ul><ul><li>Have more than 500 records to create or update per session </li></ul>
  9. 9. Example: Pre-populate / create records in One Click <ul><li>What: One-click creation of a record </li></ul><ul><li>Why: Efficiency, user adoption </li></ul><ul><li>Value: Simplicity, adoption, data quality </li></ul><ul><li>Example: One click to log a case (eg. Password Reset) </li></ul><ul><ul><li>Create a Custom Link on a Contact page to create a Case and prepopulate the fields (and save) </li></ul></ul><ul><li>How: In the app, from a Contact, click on “New Case”. Copy the URL – this is your web link BASE. </li></ul><ul><ul><li>https://na1.salesforce.com/500/e?retURL=%2F0033000000M1lut&def_contact_id=0033000000M1lut </li></ul></ul>
  10. 10. Log Password Reset Case Tip: After Winter ’07 Launch, use a Custom Button Instead
  11. 11. Example: Pre-populate / create records <ul><li>Remove everything up to and including the “.com” </li></ul><ul><ul><li>Need to make it server agnostic </li></ul></ul><ul><ul><ul><li>/500/e?retURL=%2F{!Contact_ID}&def_contact_id= </li></ul></ul></ul><ul><ul><ul><li>{!Contact_ID}&cas14=Password%20Reset&cas11=Phone&save=1 </li></ul></ul></ul><ul><ul><li>retURL is the page to which user should return after completing action </li></ul></ul><ul><ul><li>“ 003…” is the Contact ID. Replace this with merge field: “{!Contact_ID}” </li></ul></ul><ul><ul><li>Replace the second Contact ID with the same {!Contact_ID} </li></ul></ul><ul><li>Continue building out parameters </li></ul><ul><ul><li>View the page source, or use Form View in Firefox Web Developer to get the “name” of the fields you wish to pre-populate </li></ul></ul><ul><ul><ul><li>eg. Case Subject is “cas14”, Case Origin is “cas11” </li></ul></ul></ul>
  12. 12. Preventing Double-Tabbing <ul><ul><li><script language=&quot;Javascript&quot;> </li></ul></ul><ul><ul><li>function redirect() { </li></ul></ul><ul><ul><li>parent.frames .location.replace('/500/e?retURL=%2F{!Contact_ID} </li></ul></ul><ul><ul><li>&def_contact_id={!Contact_ID}&cas14=Password%20Reset </li></ul></ul><ul><ul><li>&cas11=Phone&save=1'); </li></ul></ul><ul><ul><li>} </li></ul></ul><ul><ul><li>redirect(); </li></ul></ul><ul><ul><li></script> </li></ul></ul>
  13. 13. Example: Parameterize Reports <ul><li>What: One-click dynamic generation of a report </li></ul><ul><li>Why: Efficiency, scalability </li></ul><ul><li>Value: Simplicity </li></ul><ul><li>Example: Generate a report dynamically passing filters </li></ul>Tip: After Winter ’07 Launch, use a Custom Button Instead
  14. 14. Example: Parameterize Reports <ul><li>How: </li></ul><ul><li>Create a report, filter by desired field </li></ul><ul><li>Copy the report URL </li></ul><ul><li>Create a Custom Link on the entity </li></ul><ul><li>In the custom link URL box, paste in the report URL </li></ul><ul><li>At the end of this URL string add the following text: ?pv0=[MERGE_FIELD] </li></ul><ul><ul><li>Eg. /00O30000001D5tZ?pv0={!Account_Name} </li></ul></ul><ul><ul><li>Use pv0 if your criteria filter is in position 1 in your report, pv1 if it is in the 2 nd position, and so on </li></ul></ul>
  15. 15. AJAX <ul><li>What: A synchronous J avascript A nd X ML </li></ul><ul><li>Why: Rapid Software, Component Development </li></ul><ul><li>Value: Adoption, low cost </li></ul><ul><li>Example: Mass Update Contact Addresses </li></ul><ul><ul><li>Before AJAX </li></ul></ul><ul><ul><li>With AJAX </li></ul></ul>
  16. 16. The AJAX Toolkit – Object Model
  17. 17. SforceClient Method Summary QueryMore (queryLocator, callback)   QueryResult Query (soql, callback)   QueryResult Login (userName, password, callback)   LoginResult Init (sessId, serverUrl)   void GetUserInfo (callback)   GetUserInfoResult GetUpdated (objectType, startDate, endDate, callback)   GetUpdatedResult getSessionId ()   String getServerUrl ()   String GetServerTimestamp (callback)   GetServerTimestampResult GetDeleted (objectType, startDate, endDate, callback)   GetDeletedResult DescribeTabs (callback)   DescribeTabSetResult[] DescribeSObject (objectType, callback)   DescribeSObjectResult DescribeLayout (objectType, callback)   DescribeLayoutResult DescribeGlobal (callback)   DescribeGlobalResult Delete (ids, callback)   SaveResult[] debugMessage (msg)              void Create (objects, callback)   SaveResult[] ConvertLead (leadConverts, callback)   ConvertLeadResult[] Update (objects, callback)   SaveResult[] timingDebugClear ()              void timingDebug (msg)              void setTimingDebugger (textarea)   void setSessionId (sid)   void setServerUrl (newurl)   void SetPassword (userId, password, callback)   SetPasswordResult setDebugContainer (container)   void setBatchSize (size)   void SendRequest2 (soapMessage, handler, operation, url)   void Search (searchString, callback)   SearchResult Retrieve (fieldList, objectType, idArray, callback)   SObject[] ResetPassword (userId, callback)   ResetPasswordResult
  18. 18. <ul><li>SforceClient </li></ul><ul><ul><li>https://www.salesforce.com/services/lib/ajax/beta3.3/sforceclient.js </li></ul></ul><ul><li>Dynamic SObject - DynaBean </li></ul><ul><li>S-Control Context and Merge Fields </li></ul><ul><li>Common Functions: </li></ul><ul><ul><li>Query Call </li></ul></ul><ul><ul><li>Retrieve </li></ul></ul><ul><ul><li>Create Call </li></ul></ul><ul><ul><li>Update Call </li></ul></ul><ul><ul><li>Delete Call </li></ul></ul><ul><ul><li>Save Call </li></ul></ul>AJAX - Key Components
  19. 19. sForceClient <ul><li>Within the <head> section: </li></ul><ul><ul><li><script src=&quot;https://www.salesforce.com/services/lib/ajax/beta3.3/sforceclient.js&quot; type=&quot;text/javascript&quot;></script> </li></ul></ul><ul><li>Instantiated on script inclusion </li></ul><ul><ul><li>sforceClient.init(&quot;{!API_Session_ID}&quot;, &quot;{!API_Partner_Server_URL_70}&quot;); </li></ul></ul><ul><li>Call sforceClient.init or sforceClient.Login </li></ul><ul><ul><li>sforceClient.init(&quot;{!API_Session_ID}&quot;, &quot;{!API_Partner_Server_URL_70}&quot;); </li></ul></ul>
  20. 20. Dynamic SObject - Dynabean <ul><li>Uses a single object - a Dynabean - to represent every available “table” in the database </li></ul><ul><li>Dynabean is a dynamic object that contains both data and metadata that determines its character </li></ul><ul><li>Example: </li></ul><ul><li> var myLead = new Sforce.Dynabean(“Lead&quot;) </li></ul><ul><ul><li>myLead.set(“FirstName”, “Stan”); </li></ul></ul><ul><ul><li>myLead.set(“LastName”, “Lee”); </li></ul></ul><ul><ul><li>myLead.set(“Company”, “ABC Company”); </li></ul></ul><ul><ul><li>var saveResult = sforceClient.Create(myLead)[0]; </li></ul></ul>
  21. 21. Query Call <ul><li>Example: </li></ul><ul><ul><li>var queryResult =sforceClient.Query(&quot;Select BillingCity, BillingCountry, from Account Where Id = '&quot; + accId + &quot;'&quot;); </li></ul></ul><ul><ul><li>var address = queryResult.records[0]; </li></ul></ul><ul><ul><li>var BillingCity = address.BillingCity; </li></ul></ul><ul><ul><li>var BillingCountry = address.get(“BillingCountry”); </li></ul></ul>
  22. 22. Example: Close Opportunity, Create Order and Order Items <ul><li>What: In one click from an Opportunity, need to: </li></ul><ul><ul><ul><li>Close Opportunity </li></ul></ul></ul><ul><ul><ul><li>Create Contract </li></ul></ul></ul><ul><ul><ul><li>Create Order with Contract Reference </li></ul></ul></ul><ul><ul><ul><li>Copy Opportunity Products to Order Items </li></ul></ul></ul><ul><li>Why: Too many clicks without, poor user-experience </li></ul><ul><li>Value: Minimizes user error, improves data quality and user satisfaction </li></ul>
  23. 23. Example: Search First, Create <ul><li>What: Enforce that users search for existing data before creating new records </li></ul><ul><ul><ul><li>Custom Web Tab (today) </li></ul></ul></ul><ul><ul><ul><li>Override Standard “New” button after Winter ’07 </li></ul></ul></ul><ul><ul><ul><li>Use search parameters to populate new records if desired </li></ul></ul></ul><ul><li>Why: Cleaner data – NO DUPLICATES </li></ul><ul><li>Value: Minimizes duplicates/improves data quality and user satisfaction </li></ul>
  24. 24. Create Call <ul><li>var accounts = new Array(); </li></ul><ul><li>accounts[0] = new Sforce.Dynabean (&quot;Account&quot;); </li></ul><ul><li>accounts[0].set(&quot;Name&quot;, &quot;test1&quot;); </li></ul><ul><li>accounts[1] = new Sforce.Dynabean (&quot;Account&quot;); </li></ul><ul><li>accounts[1].set(&quot;Name&quot;, &quot;test2&quot;); </li></ul><ul><li>var rc = sforceClient.Create(accounts); </li></ul><ul><li>if (dltypeof(rc) == &quot;array&quot;) { </li></ul><ul><li>// do something with the returned created ids </li></ul><ul><li>} else { </li></ul><ul><li>alert( rc.toString() ); </li></ul><ul><li>} </li></ul>
  25. 25. Update Call <ul><li>accs[0] = new Sforce.Dynabean (&quot;Account&quot;); </li></ul><ul><li>accs[0].set(&quot;Id&quot;, “{!Account_ID}&quot;); </li></ul><ul><li>accs[0].set(&quot;Name&quot;, &quot;test Updated&quot;); </li></ul><ul><li>var sr = sforceClient.Update(accs); </li></ul><ul><li>…… </li></ul><ul><li>var qr =sforceClient.Query(&quot;Select Id, MailingCountry from Contact Where AccountId = '&quot; + accId + &quot;'&quot;); </li></ul><ul><li>var updateObjects = new Array(); </li></ul><ul><li>for (var i=0;i<qr.records.length;i++){ </li></ul><ul><li>var contact = qr.records[i]; </li></ul><ul><li>contact.set(&quot; MailingCountry “, “United Kingdom”); </li></ul><ul><li>// push updated record into new array for update process </li></ul><ul><li>updateObjects.push(contact); </li></ul><ul><li>} </li></ul><ul><li>var saveResults = sforceClient.Update(updateObjects); </li></ul>
  26. 26. Delete Call <ul><li>var accounts = new Array(); </li></ul><ul><li>accounts[0] = new DynaBean(&quot;Account&quot;); </li></ul><ul><li>accounts[0].set(&quot;Name&quot;, &quot;test&quot;); </li></ul><ul><li>var sr = sforceClient.Create([accounts])[0]; </li></ul><ul><li>var dr = sforceClient.Delete([sr[0].id]); </li></ul><ul><li>if (dltypeof(dr) == &quot;array&quot;) { </li></ul><ul><li>for (var i=0;i<dr.length;i++) { </li></ul><ul><li>alert( dr[i].toString()); </li></ul><ul><li>} </li></ul><ul><li>} else { </li></ul><ul><li>alert( dr[i].toString()); </li></ul><ul><li>} </li></ul>
  27. 27. Calling an S-Control using HYPERLINK field <ul><li>For HYPERLINK custom formulae fields or for calling an scontrol from another scontrol </li></ul><ul><ul><li>Create a Custom Link as usual </li></ul></ul><ul><ul><li>Add to page layout </li></ul></ul><ul><ul><li>View record and right click on link-properties and copy the url section: </li></ul></ul><ul><li>/servlet/servlet.Integration?lid=00b30000000hXeL&eid=00130000005YmJ5 </li></ul><ul><li>lid = s-control id and eid = context entity record </li></ul><ul><ul><li>Replace the hard coded eid with the id of the current record </li></ul></ul>
  28. 28. Tools and Techniques <ul><li>Development Environment </li></ul><ul><ul><li>Text editor (Wordpad, 1 st Page 2000, Ultraedit) </li></ul></ul><ul><ul><li>Eclipse (javascript specific plugins) </li></ul></ul><ul><ul><li>Visual Studio .NET </li></ul></ul><ul><ul><li>Other standard IDEs </li></ul></ul><ul><li>Debugging </li></ul><ul><ul><li>MS Script Debugger (ok) </li></ul></ul><ul><ul><li>Visual Studio .NET (best) </li></ul></ul><ul><ul><li>Mozilla/Venkman Debugger (ok) </li></ul></ul><ul><ul><li>Mozilla Javascript Console </li></ul></ul>
  29. 29. Tools and Techniques <ul><li>Recommend installing Firefox and then adding the following extensions: </li></ul><ul><ul><li>Web Developer 0.9.3 </li></ul></ul><ul><ul><li>JavaScript Debugger 0.9.84 </li></ul></ul><ul><ul><li>View Rendered Source 1.0.01 </li></ul></ul><ul><li>Test with IE and Firefox. </li></ul><ul><ul><li>Handle cross browser exceptions </li></ul></ul><ul><ul><li>Firefox doesn’t allow cross site scripting </li></ul></ul><ul><ul><li>Firefox is stricter on language semantics </li></ul></ul><ul><ul><li>Firefox better for debugging </li></ul></ul>
  30. 30. Techniques - Debugging <ul><li>Debugging support in the toolkit </li></ul><ul><ul><li>setDebugContainer(element) </li></ul></ul><ul><ul><ul><li>sforceClient.setDebugContainer(document.getElementById(“mydiv”); </li></ul></ul></ul><ul><ul><ul><li>sforeceClient.setDebugContainer(document.getElementById(“myTextArea”); </li></ul></ul></ul><ul><ul><ul><li>sforceClient.debugMessage(“This is a point in the script.”); </li></ul></ul></ul><ul><ul><li>setMessageLog(textArea) </li></ul></ul><ul><ul><ul><li>Displays the SOAP requests and responses </li></ul></ul></ul><ul><ul><li>setTimingDebugger(textArea) </li></ul></ul><ul><ul><ul><li>displays the elapsed time to execute a method. </li></ul></ul></ul><ul><li>Javascript alert statement </li></ul><ul><ul><li>alert(“Error message = “+error); </li></ul></ul><ul><li>Debugger / output to the Javascript console </li></ul>
  31. 31. Passing parameters to an S-Control <ul><li>Yes: if the scontrol is called via HYPERLINK in a custom formulae field, YES, this is possible </li></ul><ul><li>No: if the scontrol is called via a Custom Link or Web Tab </li></ul><ul><li>Yes: within an scontrol additional parameters can be added to the URI for a call to a second scontrol </li></ul><ul><ul><li>HYPERLINK(&quot;/servlet/servlet.Integration?lid=01N3000000009KE&eid=&quot; & {!Id} & &quot;&address=billing&quot;, &quot;Test Link&quot;) </li></ul></ul><ul><ul><li>eid parameter can be accessed in the s-control to get the current entity context record if needed </li></ul></ul>
  32. 32. Other (Non AJAX) S-Controls Techniques <ul><li>Parameterise Reports </li></ul><ul><li>Pre-populate / create records </li></ul><ul><li>Preventing double tabbing on salesforce.com web links </li></ul><ul><li>Manipulating return urls and page chaining </li></ul><ul><li>Calling an S-Control </li></ul><ul><li>Passing parameters to an S-Control </li></ul><ul><li>Style Sheets – Replicating salesforce.com look and feel </li></ul><ul><li>Standalone AJAX application </li></ul><ul><li>Calling s-controls on home page HTML components </li></ul>
  33. 33. Style Sheets – Replicating salesforce.com look and feel <ul><li>Different style sheets per language and for ‘Salesforce Classic’ and the new interface </li></ul><ul><li>Need to pickup the right style sheet to maintain look and feel within the scontrol </li></ul><ul><li>userUiSkin returns a value indicating the CSS path that should be specified </li></ul><ul><ul><li>Salesforce1: /dCSS/Theme1/en/common.css </li></ul></ul><ul><ul><li>Salesforce2: /dCSS/Theme2/en/common.css </li></ul></ul><ul><li>common.css should be the only file you need to use to replicate the salesforce.com's look and feel. </li></ul><ul><li>For full details see tech note http://www.sforce.com/resources/tn-16.jsp </li></ul>
  34. 34. Standalone AJAX application <ul><li>Use divs to present / hide a login screen </li></ul><ul><li>Call sforceClient.Login(“username@somedomain.com”, “secret”); instead of sforceClient.init(sessionid, endpoint) to initialise sforceClient </li></ul><ul><li>If running as a standalone application use the ‘frontdoor’ urls when calling back into salesforce.com to prevent the user being prompted to login to salesforce.com through the web interface </li></ul><ul><li>https://<instance>.salesforce.com/secur/frontdoor.jsp?sid= {!API_Session_ID} &retURL=/<URI to required page> </li></ul>
  35. 35. Calling s-controls on home page HTML components <ul><li>Can be used to display dynamic content on the home page </li></ul><ul><li>S-controls and merge fields are not supported directly within the HTML component so uses an embedded iframe calling an scontrol web link </li></ul><ul><ul><li>Create an scontrol </li></ul></ul><ul><ul><li>Create a home page custom link and temporarily add it to a home page layout (to capture the URI) </li></ul></ul><ul><ul><li>Create an HTML component My Salesforce.com (name not important ) </li></ul></ul>
  36. 36. Calling s-controls on home page HTML components <ul><li>Check the ‘Show HTML’ check box </li></ul><ul><li>Add the following text to the HTML component: </li></ul><ul><li><IFRAME src =&quot;/servlet/servlet.Integration?lid=00b20000000i5QO&amp;eid=00520000000hTCf&quot; frameBorder=0 width=&quot;100%&quot; height=&quot;100%&quot;></IFRAME> </li></ul><ul><li>(Replace the lid and eid parameter values with those captured in the step above) </li></ul><ul><li>Note as no record has context from the home page you cannot use merge fields in the scontrol (other than {!API_Enterprise_Server_URL_60} and {!API_Session_ID} ) </li></ul>
  37. 37. Additional Examples <ul><li>AJAX Account create New Opp and Task.htm </li></ul><ul><ul><li>- this is a pure s-control that is designed to work from a web link on an account.  It creates an opportunity, amends the opp return url and opens the opp in edit mode. </li></ul></ul><ul><li>AJAX update address of all contacts on an account.htm </li></ul><ul><ul><li>- this one is another pure s-control again driven from the account which updates all the addresses of linked contacts to the account to have the account address.  This one shows a small popup window 'Updating Contact Addresses' as it does the processing and then self closes in this case as nothing has changed on the account it doesn't bother to refresh the underlying record. </li></ul></ul><ul><li>AJAX List of all cases and associated solutions.htm </li></ul><ul><ul><li>- this one can be used either as an s-control or as a standalone browser app.  It loops through all the cases and sees what solutions are associated with it and displays the results with clickable links to the cases and solutions referenced.  It is specific to na1 and when used standalone needs another login when the urls are clicked (urls do not use the 'frontdoor' notation). </li></ul></ul>
  38. 38. Resources <ul><li>AJAX Toolkit </li></ul><ul><ul><li>http://blog.sforce.com/sforce/2006/04/ajax_toolkit_be.html </li></ul></ul><ul><ul><li>Can host locally </li></ul></ul><ul><ul><li>Can include in document repository </li></ul></ul><ul><ul><ul><li>/servlet/servlet.FileDownload?file=[Document_ID] </li></ul></ul></ul><ul><li>www.salesforce.com/developer </li></ul><ul><ul><li>Tech Notes </li></ul></ul><ul><ul><li>Community forums – search on AJAX </li></ul></ul>