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

SalesForce查询在查询编辑器中返回结果,但在Lightning组件中从APEX代码返回null,salesforce,apex,salesforce-lightning,soql,Salesforce,Apex,Salesforce Lightning,Soql,我是SalesForce的新手,继承了一份不起作用的报告。请原谅任何不正确的术语,因为我正在学习所有这些。报告有三个提示:国家、年份和成员。所有下拉列表都应该填充APEX类中函数返回的数据。状态(从选择列表填充)和年份(使用循环填充)都可以正常工作。从SQL查询填充的成员不返回任何内容。如果我在没有选择任何提示的情况下运行报告(这将返回SQL查询结果的未筛选列表),它也不会返回任何结果。当我在开发人员控制台的查询编辑器中直接执行这两个SQL查询时,它们都返回数据,但当从APEX函数调用时,它们什

我是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;
    }
}
全局类DataTableLocations{
@可听的
全局静态列表GettrAccounts(){
set trcAccountSet=新集合();
List traccList=新列表();
对于(TRC\U Account\uuuu c trcacc:[从TRC\U Account\uuuuu c中选择Id、名称,其中TRC\U Member\uuuuuu c=按名称的真实订单限制50000]){
如果(!trcAccountSet.contains(trcacc.Name)){
trcAccountSet.add(trcacc.Name);
traccList.add(trcacc);
}
}
如果(traccList.size()>0){
返回traccList;
}
否则{
返回null;
}   
}
@可听的
全局静态列表getLocationState(){
列表选项=新列表();
//添加(新的SelectOption('SelectAll','SelectAll'));
对于(Schema.PicklistEntry f:Location\u c.Physical\u Address\u State\u c.getdescription().getPicklistValues()){
options.add(f.getValue());
} 
返回选项;
}
@可听的
全局静态列表年份选项(){
列表选项=新列表();
date OldDate=date.today().addYears(-18);
整数oldyear=OldDate.year();
对于(整数i=0;i编辑

是的,这是一个公共页面,叫做“Salesforce站点”。它不需要登录就可以向全世界公开。这些都有特殊的安全措施,因为大多数时候你都不想公开这样的数据。最多你会显示“联系我们”表单,可能是一些要下载的文档,产品目录……都非常锁定,默认是禁止所有内容,然后管理员决定允许什么。这是有一个Visualforce页面+光环组件有点不寻常,但好吧,它发生了

如果您从salesforce内部访问此页面,您(以及任何其他内部用户)都可以看到结果。对于您来说,该页面将很好地工作,“只是”不在salesforce外部

当在网络上这样暴露时-没有登录用户。有一个特殊的“[Site Name]Guest user”,如果你在设置中搜索“Sites”,你可以看到他们。它有一个特殊的配置文件,里面也有[Site Name]。令人讨厌的是-它没有显示在用户或配置文件列表上

当Salesforce(auto)激活关键更新时,您的代码中断。可能是这样的:例如,如果您在Google上搜索“Guest用户的安全对象权限”,网络上会有一些不错的资源

询问您的系统管理员同事或阅读一些关于

你必须进入设置->共享规则。有一个复选框导致你的东西坏了,你不能解开它

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

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

如果仍然不起作用,您必须检查来宾用户的配置文件,它可能需要读取TRC帐户及其名称字段的权限

如果是Salesforce网站,请尝试以下方法查找:

如果是客户门户、社区、数字体验(他们对产品进行了多次重命名)-请尝试


原始答案

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

没有具体的顺序

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

如果在运行此组件时打开DeveloperConsole(右上角),您在日志中是否看到任何错误?如果在控制台中转到Debug->openexecuteanonymous并运行以下代码,会发生什么情况:

System.debug(DataTableLocations.getTrcAccounts());

它会返回什么吗?抛出错误

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

action.setCallback(此函数,响应){
var state=response.getState();
调试器;
console.log(状态);
console.log(组件
System.debug(DataTableLocations.getTrcAccounts());