我正在尝试构建一个可视化的Force页面,您可以在其中选择一个Opportunity,然后选择与该Opportunity关联的阶段。Opportunity保存在表记录类型中,Stage保存在表OpportunityStage中。
关系保存在哪个表中?

最佳答案

记录类型不是表,而是为特定对象定义的一组类型,因此该对象的任何记录(例如任何Opportunity)都可以具有其中一种类型。它基本上是对象上的一个超级特殊字段,用于驱动整个行为堆—您可以为每个记录类型使用不同的页面布局、不同的picklist值、可以自定义验证规则等。
stage也是salesforce配置的一个“特殊”部分,因为它们属于销售流程,我相信可用的值取决于记录类型(即它们的行为就像一个picklist)。
长话短说,您不需要担心这些字段之间的任何关系,从数据库的角度来说,它们是opportunity表上的列,从sfdc的角度来说,它们是opportunity对象上的字段。
编辑
在澄清要求后,即需要两个机会的可用阶段名称。
在没有任何描述信息的情况下,使用visualforce很容易。
确保为销售机会定义了销售流程并将其链接到适当的记录类型(听起来已经这样做了)。接下来,只需使用自定义控制器(或控制器扩展)加载所需的Opportunity—您可以通过以下页面参数指定它们,尽管这是一个人为的示例,不包括任何错误处理等(或Opportunity选择):

public with sharing class DualOpptyController
{
    public Opportunity oppty1 {get; set;}
    public Opportunity oppty2 {get; set;}

    public DualOpptyController()
    {
        oppty1 = [select Id, StageName from Opportunity where id = : ApexPages.currentPage().getParameters().get('o1')];
        oppty2 = [select Id, StageName from Opportunity where id = : ApexPages.currentPage().getParameters().get('o2')];
    }
}

然后简单地使用<apex:inputField>StageName字段放到页面上:
<apex:page controller="DualOpptyController">
    <apex:form >
        <apex:inputField value="{!oppty1.StageName}"/>
        <apex:inputField value="{!oppty2.StageName}"/>
    </apex:form>
</apex:page>

当您想搜索帐户时,只需在控制器中同时使用StageNameoppty上的oppty2字段。查询将类似于以下内容(未测试):
[Select Id, Name, (select Id, Name from Opportunities where StageName in : liStageNames) from Account]

当然,问题是它将返回所有帐户,所以我认为您最好在Opportunity上搜索StageName其中oppty1等于StageName返回相关详细信息和关联的帐户ID。然后执行第二个查询以查找oppty1等于且帐户ID位于第一个问题。您仍然可能会遇到返回太多记录的问题,因此您可能会找到改进此方法的方法,或者也可以指定其他参数(例如,Opportunity Closing This Month)。

10-07 15:24