自定义Salesforce Lightning App,显示“您无权访问此记录”

问题描述

名为“ Stack”的自定义闪电应用程序提供“您无权访问此记录,请联系” 尝试遵循How To Implement Full Search in Case Type using Salesforce?

中的步骤

enter image description here

这是自定义对象ERT案例类型数据的组织范围认值

enter image description here

这是stack.aspx的 Apex 代码

                public class Stack {
                      @AuraEnabled(cacheable=true)
                    public static List<LookupSearchResult> search(String searchTerm,List<String> selectedIds){
                        if(String.isBlank(searchTerm) || searchTerm.length() < 2){
                            return null;
                        }
                        String t = '%' + searchTerm + '%'; // decide how you want to search,"starts with","includes" or what
                        
                        List<ERT_Case_Type_Data__c> records = [SELECT Id,Name,Level_1__c,Level_2__c,Level_3__c
                            FROM ERT_Case_Type_Data__c
                            WHERE Level_1__c LIKE :t OR Level_2__c LIKE :t OR Level_3__c LIKE :t
                            ORDER BY Level_1__c,Level_3__c
                            LIMIT 20];
                        
                        /* You Could also experiment with SOSL?
                        records =  [FIND :('*' + searchTerm + '*') IN ALL FIELDS 
                            RETURNING Case_Type_Data__c(Id,Level_3__c)][0];
                        */
                        
                        List<LookupSearchResult> results = new List<LookupSearchResult>();
                        for(ERT_Case_Type_Data__c ctd : records){
                            results.add(new LookupSearchResult(ctd.Id,'ERT_Case_Type_Data__c','standard:case_wrap_up',ctd.Name,String.join(new List<String>{ctd.Level_1__c,ctd.Level_2__c,ctd.Level_3__c},'; ')
                            ));
                        }
                        return results;
                    } 

                }

这是 Aura组件(HTML部分)

                <aura:component implements="force:hasRecordId,force:appHostable,flexipage:availableForAllPageTypes,force:lightningquickaction" access="global" controller="Stack">
                    <aura:attribute access="global" type="List" name="selection" default="[]"/>
                    <aura:attribute access="global" type="List" name="errors" default="[]"/>

                    <lightning:card title="New Case Type">
                        
                        <lightning:recordEditForm aura:id="myForm" objectApiName="ERT_Case_Type__c" onsubmit="{!c.onSubmit}" onsuccess="{!c.onSuccess}">
                        <lightning:messages />
                        <c:Lookup selection="{!v.selection}" onSearch="{!c.lookupSearch}" onSelection="{!c.useSelected}" errors="{!v.errors}" label="Search" placeholder="Search Case Types Data"/>
                        <lightning:inputField aura:id="Level_1__c" fieldName="Level_1__c" />
                        <lightning:inputField aura:id="Level_2__c" fieldName="Level_2__c" />
                        <lightning:inputField aura:id="Level_3__c" fieldName="Level_3__c" />
                        <lightning:button class="slds-m-top_small" variant="brand" type="submit" name="save" label="Save" />
                    </lightning:recordEditForm>
                    </lightning:card>
                </aura:component>

这是 Aura组件-JS控制器部分

({
    lookupSearch : function(component,event,helper) {
    // Get the lookup component that fired the search event
    const lookupComponent = event.getSource();
    const serverSearchAction = component.get('c.search');
    lookupComponent.search(serverSearchAction);
},useSelected: function(component,helper) {
    const selection = component.get('v.selection');
    const errors = component.get('v.errors');
    
    if (selection.length) {
        if(errors.length){  // Clear errors,if any
            component.set('v.errors',[]);
        }
        let levels = selection[0].subtitle.split('; ');
        component.find('Level_1__c').set('v.value',levels[0]);
        component.find('Level_2__c').set('v.value',levels[1]);
        component.find('Level_3__c').set('v.value',levels[2]);
    }
},onSubmit: function(component,helper) {
    debugger;
    event.preventDefault();       // stop the form from submitting
    var fields = event.getParam('fields');
    fields.Case__c = component.get('v.recordId'); // link to "this" Case
    component.find('myForm').submit(fields);
},onSuccess: function(component,helper){
    var toastEvent = $A.get("e.force:showToast");
    toastEvent.setParams({
        "title": "Success!","message": "Case Type saved OK,refreshing","type": "success"
    });
    toastEvent.fire();
    $A.get('e.force:refreshView').fire(); // reload page
   }
})

请帮助我消除此访问错误

关于, 卡罗琳

解决方法

我怀疑它与共享相关(因此与组织范围的设置无关)。如果它是共享的,则只会始终返回0个结果,但不会出现大的红色错误。

如果您删除带有<c:Lookup selection="{!v.selection}" onSearch="{!c.lookupSearch}" onSelection="{!c.useSelected}" errors="{!v.errors}" label="Search" placeholder="Search Case Types Data"/>的行,错误是否消失了?如果仍然存在-自定义代码或Case_Type_Data__c周围的权限存在问题。如果消失了,那就是创建ERT_Case_Type__c

检查配置文件(或使用权限集)的权限:

  • 读取源对象(Case_Type_Data__c)和所有引用的字段(Level_1__c ...)
  • 创建目标对象(ERT_Case_Type__c)并读取/编辑所有引用的字段(Level1__c ...而且还有Case__c
  • Case对象和Case.CaseNumberCase.Subject字段上阅读
  • 执行Apex类的权限(重命名为Stack,对吗?)。也许也添加运行LookupSearchResult的权限。

我怀疑您已启用了一些关键更新(设置->关键更新或设置->发布更新),例如“根据用户个人资料限制对@AuraEnabled Apex方法的访问权限,以基于用户配置文件的方式访问用户”或“需要权限才能查看其中的记录名称”查找字段”