【问题标题】:Create my own API创建我自己的 API
【发布时间】:2012-05-14 10:09:21
【问题描述】:

我在我的 force.com 应用程序中使用 Apex 类,其中许多具有相同的结构,我想制作一个 API 以在之后重用它。

例如,这是两个类:

//first class

public class insererActAct{

public List<Activites_actuelles__c> accts {get; set;}

public insererActAct(ApexPages.StandardController controller){
    accts = new List<Activites_actuelles__c>();
    accts.add(new Activites_actuelles__c());
}

public void addrow(){
    accts.add(new Activites_actuelles__c());

}

public PageReference deleteRow(){
   if (accts.size()>1)
   {
      accts.remove(accts.size()-1);
   }
   return null;
}

public PageReference save()
{
    insert accts;
    Assure__c theParent = new Assure__c(id=accts[0].Activites_actuelles__c);
    PageReference acctPage = new ApexPages.StandardController(theParent).view();
    acctPage.setRedirect(true);
    return acctPage;
}
}

//second class

public class insererEnfants{

public List<Enfants__c> accts {get; set;}

public insererEnfants(ApexPages.StandardController controller){
    accts = new List<Enfants__c>();
    accts.add(new Enfants__c());
}

public void addrow(){
    accts.add(new Enfants__c());

}

public PageReference deleteRow(){
   if (accts.size()>1)
   {
      accts.remove(accts.size()-1);
   }
   return null;
}

public PageReference save()
{
    insert accts;
    Assure__c theParent = new Assure__c(id=accts[0].Parent__c);
    PageReference acctPage = new ApexPages.StandardController(theParent).view();
    acctPage.setRedirect(true);
    return acctPage;
}
}

谁能告诉我这是否可能,如果可以,请问我该怎么做?

【问题讨论】:

    标签: salesforce apex-code visualforce


    【解决方案1】:

    您的意思是要编写适用于不同类型对象的代码,而不是在代码中说明对象的类型?

    可以通过使用 sObject 类型声明 sObject 变量来做到这一点,例如,而不是

    public List<Activites_actuelles__c> accts {get; set;}
    

    你会放

    public List<sObject> sObjects{get; set;}
    

    并通过使用 get 和 put 引用字段,例如而不是

    Account theAccount = new Account();
    theAccount.name = 'Fred';
    

    你会放

    sObject theSObject = new SObject();
    theSObject.put('name', 'Fred');
    

    我没有尝试在控制器扩展中使用这样的代码,但理论上你可以传入任何标准控制器,你应该没问题。

    您需要考虑如何在 save 方法中创建父对象,因为您需要传入要创建的类型。这相当复杂,但可以接受表示对象类型的字符串(例如“帐户”)并创建该类型的新对象:

    Schema.getGlobalDescribe().get('Account').newSObject()
    

    将为您提供一个新帐户。因此,您可以将“Account”替换为作为参数传入的任何类型。

    有关更多信息,请参阅文档中的 Dynamic Apex、Dynamic SOQL 和 Dynamic DML。

    警告:将对象类型和字段名称作为字符串传递意味着编译器将不知道代码中提到了这些类型。因此,如果您尝试删除自定义对象或重命名字段,Salesforce 不会警告您该对象或字段正在使用中,而是允许您执行删除操作。

    另一个警告:虽然这允许代码重用并且这是一个好处,但您可能会发现它不值得。除非绝对必须,否则我会避免编写动态顶点。它比普通的 apex 复杂得多,因此很难调试和维护,尤其是在必须由您以外的人维护的情况下。

    【讨论】:

    • 感谢您的帮助和澄清!
    • 我还有一个问题,如何自动在孩子中插入主关系字段的值,因为我每个孩子都有一个父母?
    • 你也许可以用 getDescribe() 做复杂的事情来找出父对象是什么类型的对象(不确定是否可能),但我认为保留对象会更容易在自定义设置中键入名称(作为字符串)。
    • 感谢回复,但是我有一个VF inputField &lt;apex:inputField value="{!Enfants__c.Parent__c}"/&gt; in 女巫我每次都要插入值,但是这个值是唯一的,父名,我如何传递和插入这个值(父母姓名)自动,这是我的问题。
    猜你喜欢
    • 2012-05-29
    • 1970-01-01
    • 2013-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-30
    • 1970-01-01
    相关资源
    最近更新 更多