SalesForce 查询在查询编辑器中返回结果,但从 Lightning 组件中的 APEX 代码返回 null

问题描述

我是 SalesForce 的新手,并且继承了一份不起作用的报告。请原谅任何不正确的术语,因为我正在学习这一切。报告有三个提示:状态、年份和成员。所有下拉菜单都应该填充从 APEX 类中的函数返回的数据。从选择列表填充的状态和填充有循环的年份工作正常。从 sql 查询填充的成员不返回任何内容。如果我在没有选择任何提示的情况下运行报告(应该从 sql 查询返回未过滤的结果列表),它也不会返回任何内容。当我在开发者控制台的查询编辑器中直接执行这两个 sql 查询时,它们都会返回数据,但从 APEX 函数调用时,它们什么都不返回。

这是来自 Lightning 控制器的初始化代码

doInit: function (component,event,helper) {
        var action = component.get('c.getTrcAccounts');
        action.setCallback(this,function (response) {
            var state = response.getState();
            if (state === 'SUCCESS' && component.isValid()) {
                component.set('v.trcAcclist',response.getReturnValue());
            }
            helper.getLocationState(component,event);
            helper.getYear(component,event);
        });
        $A.enqueueAction(action);
    },

以下是该代码中引用的两个辅助函数

getLocationState: function (component,event) {
        var action = component.get('c.getLocationState');
        action.setCallback(this,function (response) {
            var state = response.getState();
            if (state === 'SUCCESS') {
                component.set('v.LocationStateList',response.getReturnValue());
            }
        });
        $A.enqueueAction(action);
    },getYear: function (component,event) {
        var action = component.get('c.yearsOptions');
        action.setCallback(this,function (response) {
            var state = response.getState();
            if (state === 'SUCCESS') {
                component.set('v.LocationYearList',response.getReturnValue());
            }
        });
        $A.enqueueAction(action);
    }

这是 APEX 类中返回这三个提示数据的代码

Global class DataTableLocations {
@AuraEnabled
    Global static List<TRC_Account__c> getTrcAccounts(){
        set<string> trcAccountSet = new set<string>();
        List<TRC_Account__c> tracclist = new List<TRC_Account__c>();
        for(TRC_Account__c trcacc : [SELECT Id,Name from TRC_Account__c WHERE TRC_Member__c = True order by Name limit 50000]){
            if(!trcAccountSet.contains(trcacc.Name)){
                trcAccountSet.add(trcacc.Name);
                tracclist.add(trcacc);
            }
        }
        if(tracclist.size()>0){
            return tracclist;
        }
        else{
            return null;
        }   
    }
    @AuraEnabled
    Global static List<string> getLocationState(){
        List<string> options = new List<string>();
        //options.add(new SelectOption('SelectAll','Select All'));
        for( Schema.PicklistEntry f : Location__c.Physical_Address_State__c.getDescribe().getPicklistValues()) {
            options.add(f.getValue());
        } 
        return options;
    }
    
    @AuraEnabled
    Global static List<string> yearsOptions() {
        List<string> options = new List<string>();
        date OldDate= date.today().addYears(-18);
        integer oldyear=OldDate.year();
        for( integer i=0; i<19 ;i++) {
            options.add(string.valueOf(oldyear));
            oldyear++;
        } 
        return options;
    }
}

如果我直接在开发者控制台的查询编辑器窗口中运行 SELECT Id,Name from TRC_Account__c WHERE TRC_Member__c = True order by Name limit 50000,我会得到 7 个结果。但是,如果我在 doInit 函数中为 getTrcAccounts 输出 response.getReturnValue(),则为 null。

非常感谢任何帮助,因为我们正处于站点重新设计的时间紧缩之中。我听说这些报告在某一时刻有效,但没有人知道它们何时停止工作,我们从另一家进行原始开发的公司继承了此代码。谢谢!

更新:

如果有帮助,这是我认为在公共页面上使用的闪电应用程序中的代码

<aura:application extends="ltng:outApp" access="GLOBAL" implements="ltng:allowGuestAccess">
    <aura:dependency resource="c:SearchBinReceiptsByYear"/>
</aura:application>

解决方法

编辑

是的,它是一个公共页面,称为“Salesforce 站点”。它无需登录即可向全世界公开。这些具有特殊的安全性,因为大多数时候您不想这样公开数据。充其量你会显示联系我们的表格,也许是一些要下载的文件,产品目录......这一切都非常锁定,默认是禁止一切,然后管理员决定允许什么。有一个 Visualforce 页面 + Aura 组件有点不寻常,但好吧,它发生了。

如果您从 Salesforce 内部访问此页面,您(和任何其他内部用户)都可以看到结果。类似 https://mydomain.my.salesforce.com/apex/SearchBinReceiptsByYear 之类的东西,对您来说,该页面可以正常工作,“只是”不在 salesforce 之外。

当在网络上这样公开时 - 没有登录用户。有特殊的“[站点名称] 来宾用户”,如果您在设置中搜索“站点”,就可以看到它们。它有一个特殊的配置文件,其中还包含 [站点名称]。令人讨厌的是 - 它没有显示在用户或个人资料列表中。

您的代码在 Salesforce(自动)激活关键更新时损坏。可能是这个:https://releasenotes.docs.salesforce.com/en-us/spring20/release-notes/rn_networks_secure_perms_guests.htm 如果您在 Google 上搜索“访客用户的安全对象权限”,网上有一些不错的资源,例如 https://katiekodes.com/salesforce-spring-20-guest-user/

询问您的系统管理员同事或阅读有关 sharing rules 的一些信息。

您必须转到设置 -> 共享规则。有一个复选框会导致您的东西损坏,您无法取消选中它。

enter image description here

向下滚动到您的 TRC 帐户对象并点击“新建”。您需要创建类似这样的内容,但要符合您的条件(TRC 成员等于 true)

enter image description here

保存,稍等片刻(重新计算共享可能需要一段时间,您会收到一封电子邮件)并尝试该页面。

如果它仍然不起作用,您必须检查访客用户的个人资料,它可能需要读取 TRC 帐户及其名称字段的权限。

如果是 Salesforce 站点 - 试试这个来找到它:https://help.salesforce.com/articleView?id=000334554&type=1&mode=1

如果是客户门户、社区、数字体验(他们多次重命名产品)- 尝试使用 https://help.salesforce.com/articleView?id=sf.rss_config_guest_user_profile.htm&type=5


原答案

看起来它运行正常,因为首先获取帐户(成员?),并且在该获取的回调(当数据从服务器返回时要做什么)中,您有 helper.getLocationStatehelper.getYear。你写道,这些填充OK。这不是最好的性能代码,但它应该可以完成工作。

没有特定的顺序...

对于系统管理员来说,整个过程是否正常?还是每个人都坏了?如果它适用于系统管理员,它可能与共享有关,您的系统管理员应该知道(设置 - > 共享设置是您控制谁可以看到什么的地方。也许“凡人”不允许看到任何数据?通常系统管理员会绕过它。作为一个快速而肮脏的测试,您可以将类定义修改为 global without sharing class DataTableLocations,但这是一个非常丑陋的黑客。

如果您在运行此组件时打开 DeveloperConsole(右上角)会发生什么,您是否在日志中看到任何错误?如果在控制台中你去 Debug -> Open ExecuteAnonymous 并运行这段代码会发生什么:

System.debug(DataTableLocations.getTrcAccounts());

enter image description here

它会返回一些东西吗?抛出错误?

您可以进入设置 -> 调试模式,勾选用户旁边的复选框并保存。这会稍微减慢系统速度,但可以让您更好地调试 javascript。然后,您可以在源代码中添加一些 debugger;console.log 语句并查看浏览器控制台中发生的情况(Chrome 中为 Ctrl+Shift+J,firefox 中为 Ctrl+Shift+I)。例如

action.setCallback(this,function (response) {
    var state = response.getState();
    debugger;
    console.log(state);
    console.log(component.isValid());
    console.table(response.getReturnValue());
    if (state === 'SUCCESS' && component.isValid()) {
        component.set('v.trcAccList',response.getReturnValue());
    }
    console.log(component.get('v.trcAccList'));
    debugger;
    helper.getLocationState(component,event);
    helper.getYear(component,event);
});

在类似 HTML 的文件中,“cmp”文件中实际使用的 trcAccList 变量如何?可能设置没问题,包含7条记录,但显示不正确?