记录开发出现的问题
Q1:SObject row was retrieved via SOQL without querying the requested field:
A1:报错是因为我在代码中用到的例如Account对象中的某个字段,我拿它做计算之前,应该用select语句先将它查询出来,然后再参与计算
Q2:List has no rows for assignment to SObject
A2:没有记录返回,所以要检查一下select语句,查询应该有误
Q3:返回记录more than one row
A3:说明一个非List类型的对象实例返回了多条语句,解决办法是:要么改一下查询语句,要么将该对象实例变成List
Q4:在把web2case代码从uat本地向诺赛特环境下部署时,出现一些错误:
1、没有加metadata元文件
2、对应label和field要自主创建
ps1:带依赖关系的字段,特别是下拉框类型的,需要将依赖关系映射到下拉框中的每一个value!!!
ps2:下拉框默认值为中文:无,通过设置label:lang="en-US",即可将其改为默认值为none
Q5:Web2Case做好之后是在salesforce环境下,外部人员要访问必须要有salesforce账号
A5:需要在salesforce上面site里面进行设置,步骤如下: setup->Sites->click(你要设置的东西)->click"Publck Access Settings"->Scroll down to "Field-level Security"->click "view" next to(你想设置的对象)->edit 对象里面具体的字段,设置它们的权限:readonly or edit,图文应该更详细。




Q6:触发器入口的上下文变量要与触发器里面绑定的方法相对应,例如高亮的部分
trigger Trigger_ChannelSalesForecastDetails on Channel_Sales_Forecast_Details__c(before insert, before Update,after update) { new Triggers() .bind(Triggers.Evt.beforeInsert,new ChangeCurrencyIsoCode()) .bind(Triggers.Evt.beforeUpdate,new ChangeCurrencyIsoCode()) .bind(Triggers.Evt.afterUpdate,new GetTotalAmount()) .manage(); }
List<Channel_Sales_Forecast_Details__c> csfDatailList = (List<Channel_Sales_Forecast_Details__c>)Trigger.new; //Channel_Sales_Forecast__c channelForecast = new Channel_Sales_Forecast__c(); List<Channel_Sales_Forecast__c> channelForecast = [select Id, TotalAmount__c from channel_sales_forecast__C where id =: csfDatailList[0].Channel_Sales_Forecast__c]; List<Channel_Sales_Forecast_Details__c > lcsfd = [select CommitTotal__c,id,channel_sales_forecast__C, channel_sales_forecast__r.TotalAmount__c, isLatestVersion__c,isActive__c from Channel_Sales_Forecast_Details__c
where isLatestVersion__c = true and channel_sales_forecast__C=: channelForecast[0].Id];
针对每个销售预测首页都有对应的销售预测详情页,是一对多的关系,同时销售预测首页也有多条记录,因此在查询时,要针对具体某条销售预测订单记录,去查相应的详情页的产品记录,即:高亮处。要注意的是该触发器是在有记录被插入或更新时会被触发,因此此处的csfDatailList[0]取的便是修改的那条记录,salesforce默认批量操作,故而此处这样写
如果记录是从trigger.new里面拿到,则不需要update Channel_Sales_Forecast_Details__c对象,因为trigger.new里面拿到的就是最新更改的值!
Q8:自定义label在代码中的使用

跳转到label的value对应的链接里,链接后加上/feedbackthankyou,组合成一个完整的url
Q9:dataloader的使用,批量导出或导入字段的值
ps:导入时应注意要将对应的字段进行映射,即将salesforce平台里的字段拖拽下来与你导入的字段一一映射
Q10:EXCEL小技巧及坑
根据条件求和时,使用sumif函数,在进行批量求和时,不能直接用填充柄对其它数据进行求和,要先双击它,再进行操作
出现下面这种不管点哪个单元格,都是从A:A整列算起才是正确的,不能出现sumif(A3:A(MAX),A3,B3:B(MAX))-->这样就是没有计算A3以上的行的记录!!!

Q11:在生产环境中部署字段时,需要在对象的页面布局里将新部署的字段拖拽到布局里,并且需要给该字段设置权限(例如只读权限)

Q12:关系查询
一、标准对象:
1、child-to-parent(从子查父亲的信息,直接使用父亲对象.字段名)
SELECT Id, Name, Account.Name FROM Contact WHERE Account.Industry = 'media' //从联系人对象查询客户industry字段为‘media’的联系人id,name以及客户name
2、parent-to-child关系(一对多)
SELECT Name,
(
SELECT LastName
FROM Contacts //查询出来结果为:一个客户id对应一个list 'test0812'-->[{"lastname":"a"}]
)
FROM Account
二、自定义对象
1、child-to-parent(使用Mother_of_Child__r关系字段来关联,Mother_of_Child是在child中定义的具有主从关系的字段,主是mother)
SELECT Id, FirstName__c, Mother_of_Child__r.FirstName__c FROM Daughter__c WHERE Mother_of_Child__r.LastName__c LIKE 'C%'
2、parent-to-child关系(一对多)
SELECT LastName__c,
(
SELECT LastName__c
FROM Daughters__r
)
FROM Mother__c去
Q13:社区相关操作
社区-->ALL 社区-->构建器 update--> 主页-->所有站点
编辑时,将所需的组件从左边的搜索框里找到,并拖拽进来,搭建成想要实现的界面,要注意的是右图是Tabs下嵌套PC_CalendarMain组件和chatter下对应的组件,要先拉tab组件,再拉tab选项里相应的组件

再者就是要对新增的页面进行授权-->对社区可用,然后在对应的简档里面,将该页面加入该简档可用


给对应的简档分配受众



Q14:写测试类时出错,由于case对象里contactid字段与contact对象的id有主从关系,因此必须要有contact记录,case对象中的contactid字段才有意义,才不会报错,Account对象是一样道理,Contact中Accountid字段与Accound的id绑定,且在创建对应的对象新纪录,要对它进行插入操作!

Q15:在我点击Preview之后,跳转到videoDetail页面对添加的组件进行删除时报错,出问题的原因是进入preview界面后,aura就已经开始渲染了,这时候进行相关操作时,controller类并不能获取到相应的修改的值,因此报错,正确操作应该是直接在体验生成器编辑页面的home搜索栏里进行页面切换

Q16:部署对象时,要将对象和字段一起打包上载验证部署!!!

Q17:10-13 16:33:52
部署关掉验证规则的步骤:1、重复-->重复规则-->STRONGAccountNamematching-->禁用 2、客户-->验证规则-->Cant_Edit_When_Account_Active-->deselect启用
验证完毕后再重新打开
Q18:图中的Channel_Sales_Forecast__Share对象是销售用来记录和存储记录的 后台可以访问到 平台界面里找不到

Q19:遇到错误多多debug!!!!
Q20:当要测试满是非静态方法的类(MassEditChannelForecastController)时,需要用到PageReference类

通过PageReference类实现创建该类的实例,然后在测试类中调用被测试类的非静态方法进行测试!(原理还在摸索,后续会记录!)
PageReference类:用来在apex代码中将页面跳转到指定的位置

Q21:bug修复


问题:if语句里的判断条件不够,&&误写成了||,导致不该进入if里的赋值语句进入了。例如上面的列表sList虽然为空,但是size>0,会导致报错
如下图,userList为空但size不为0时,会进入if语句下的赋值语句,但赋值 赋的是空值,因此报错:List index out of bounds:0

Q22 异步、批量处理、定时器相关知识 : https://www.cnblogs.com/zero-zyq/p/5287343.html
Q23 bug记录:部署时,提醒‘Event Reminder before Start’进程失败,打开相关进程,会发现该进程的主要任务是给相关用户发邮件,错误的原因是:收件人不是活跃的用户,因此排查出下图中报错的类中有历史代码错误,漏掉筛选活跃用户逻辑,因此在此处做出修改即可。


Q24:在建立公式字段时,公式要通过语法检查,下图公式在加了TEXT()类型转换之后,没有再报错。
之后如果公式字段出问题,可以考虑该解决办法!

Q25:重复客户的合并
在classic界面的客户页面的bottom处有合并客户的选项卡,可以实现合并客户的功能
Q25:当代码逻辑和功能没有问题的时候,测试依然有问题,这时候就可以考虑是不是拿销售的账号进行测试,因为管理员的权限和销售的权限是不一样的
Q26:触发器的学习使用
isbefore && isupdate时,若trigger.new包括的值有所变化,不用手动添加update语句,去更新trigger.new的值,因为isbefore就是在向数据库里写值,但是其它值变化,要手动update,例如下图中cpmfList对象里的字段就不用手动update,而updateList对象里的记录则需要手动添加update语句进行更新。

isafter && isupdate时,是在修改数据库中的值,需要再次update
isbefore 和 isafter区别就是:需不需要用到已经存到数据库里的值,需要就是after,不需要就是before,例如:

此处需要用到poBefore的id,但是它是已经更新到数据库里的数据,所以需要用到after
upsert 和 insert的区别: upsert会去数据里查找数据是否存在,存在则不插入,不存在插入,相较于insert,花费的时间较长
Q27:bug修复
salesforce Uncaught TypeError: Cannot read property 'getElementsByTagName' of null
原因是找不到Id,要满足下图rendered中条件,着重块的id才有效!

Q28:对CRM/CPQ/BPM/ERP/PLM的理解,以及相关接口代码的理解(元旦!)
CRM:Customer Relationship Management
PLM:Product Lifecycle Management
Q29:ischanged函数不适用于任何新建记录,只适用于已有记录的更改

Q30:trigger.new只能拿到对应对象里的字段新修改的值,拿不到关系查询的值,例如:opportunity__r.what就拿不到
Q31:beforeDelete 里只能用 trigger.old
Q32:自定义按钮放出来不显示,可能是没有给相应简档对应的删除权限
Q33:自定义页面上面加chatter,除了代码,还要有设置:
设置1:摘要跟踪要勾上
设置2:

3:代码加上


浙公网安备 33010602011771号