这款Salesforce博客是开发商在Force.com开发和定制方面的经验。日常开发人员面临的问题以及它们犯下的错误有时对广泛的开发人员和管理员有助于有趣。
所以让我们开始史诗!
不要纠结:
曾几何时 我正在VF页面上开发,并提供了一个报告的链接(VisualForce页面中的标准Salesforce报告:
因此,我在我的vf页面中硬编码了报告的网址。 URL在沙箱中正常工作,我很开心。一旦我完成了开发,我将迁移到生产环境的更改,最后当我在网站上测试了应用程序时,我无法查看单击链接的报告。
但我稍后知道我无法修改生产环境中的APEX类,我需要尽快修复它,所以这一切都是一个大的烂摊子!
在仔细审查障碍之后,我发现我已经硬编码了我的报告网址,因为环境发生了改变了URL已停止工作。
所以我终于想到了使用动态URL的概念,并使用下面的一些代码片段:
“url.getsalesforceBaseURL()。ToexternalForm()+'/'+ ReportId”
最后的判决:> DO NOT HARDCODE!!!
避免SOQL错误:
在开发中,您遇到了错误的错误,例如“system.limitexception:太多SOQL查询:101”?
这个错误 system.Limitexception. :太多SOQL查询:101是由于事实,您正在击中州长限制。
我们尊敬的州长限制说,您可以在上下文中运行总共100个SOQL查询,您正在击中限制。
在对同一个彻底的研究之后,我发现触发的所有触发器将在单个上下文或呼叫中进行计数。我们需要确保触发的SOQL总数应小于100。
为了通过这一点,我多次更改了我的代码,以这样的方式触发必须小于100。
有时我也喜欢如果(只有我们需要更改上下文)在需要异步运行代码时,使用@future注释。
我肯定总是那个我使用的SOQL查询不应该在循环中。
有一些最佳实践,您必须遵循避免此错误(以避免击中调速器限制)。
//wiki.developerforce.com/page/Best_Practice:_Avoid_SOQL_Queries_Inside_FOR_Loops
http://wiki.developerforce.com/page/Apex_Code_Best_Practices
//www.salesforce.com/us/developer/docs/apexcode/Content/apex_gov_limits.htm
始终遵循上述实践,以确保您在工作场所享受微笑..
具有挑战性的部分是人们无法增加总督限制,只能遵循最佳实践。
Streamline在同一对象上的多个触发器
所以这是一个更棘手的情况:
一旦我在尊重的对象案例上工作(简而言之),可以自动为客户经理分配。所以我写了一个“在插入前的”触发器。
我发现有时分配的客户经理正如预期的那样,有时候不会!
我被困惑了!!
就像始终我开始挖掘检查调试日志,手动测试等等。
最后,调试日志是一个“Maseeha”告诉我,我确实有两个触发器,因为哪个系统无法识别执行顺序。 可能这些代码由其他一些开发商起草(当然是我当前和以前的同事)起草。 我坐在他们身边,最后突出了一个触发器,对象上具有相同的事件。
因此,在实践中,避免对象上具有相同事件的多个触发器,因为它可能有时脱掉您。
ullkify代码
因此,在我的Salesforce发展职业的最初日期,我遇到了非常可怕和良好的学习当然为我。
让我们开始给你一些瞥见我的书面代码,只处理一个记录 :
trigger BeforeInsert_Account on Account (before insert){ //This only handles the first record in the Trigger.new collection but if more than 1 Account initiated this trigger, those additional records will not be processed Account objAccount= Trigger.new[0]; List<Contact> contacts = [SELECT ID,salutation,firstName,lastName,email FROM Contact WHERE accountId = :acct.Id]; //and something something }
我测试了触发器,它的工作正常,我的工作是由我的工作完成的,然后突然有一天触发器击中了调速器的限制。
就像总是我被困惑了。我知道,我的一个甜蜜的同事已经写了一批插入账户,这是整个唯一的原因。
因为我无法问我的甜蜜同事撤消批处理课程,我需要做点什么。
挖掘后,我发现如果一批记录调用我的APEX代码,则所有这些记录都需要作为批量处理,击中调控器限制。
问题是,只有一个帐户记录被处理,因为代码仅在触发器中仅明确访问触发器中的第一个记录.New [0]。相反,触发器应正确处理触发器中的整个帐户集合。
以下是如何从批处理处理所有传入记录的示例:
trigger BeforeInsert_Account on Account (before insert){ //This only handles the first record in the Trigger.new collection but if more than 1 Account initiated this trigger, those additional records will not be processed Account objAccount= Trigger.new[0]; List<Contact> contacts = [select ID, salutation,firstName,lastName,email FROM Contact WHERE accountId = :acct.Id]; //and something something…… }
请注意,该代码的该修订版本如何遍历整个触发器。使用用于循环的整个触发器。现在,如果使用单个帐户或最多200个帐户调用此触发,则所有记录将被正确处理。
所以始终缩小策略来写宽容的代码。这是练习,虽然它不容易但是很好!
遵循申请表现的一般设计指南
根据我在设计VisualForce的经验,您可以使用良好的弹出窗口和图像开发一个非常丰富的UI,但是当用户开始使用它时,它将成为NetTlesome用于单击或导航到按钮。
我已经写了这些一般指导方针以避免绩效影响:
- 始终在特定任务周围设计页面,在任务之间具有明智的工作流程和导航。该点应在任何地方连接。
- 切勿使用功能和数据过载页。 VisualForce页面具有无界数据或大量组件,行和字段具有较差的能力和性能,并且它们冒着击中调速器限制的视图状态,堆大小,记录限制和总页面大小。
- 始终尝试推回请求以包括非基本功能。
- 必须构建原型以验证疑虑。
参考:
最近的评论