2

force.comアプリケーションのApexクラスで使用していますが、それらの多くは同じ構造を持っているので、後で再利用するためのAPIを作成したいと思います。

たとえば、これらは2つのクラスです。

//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;
}
}

誰かがそれが可能かどうかを教えてもらえますか?はいの場合、どうすればこれを行うことができますか?

4

1 に答える 1

4

コード内のオブジェクトの種類を示すのではなく、さまざまな種類のオブジェクトに対して機能するコードを記述したいということですか?

これを行うには、たとえば、代わりに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()

新しいアカウントを取得します。したがって、「アカウント」をパラメータとして渡された任意のタイプに置き換えることができます。

詳細については、ドキュメントでDynamic Apex、Dynamic SOQL、およびDynamicDMLを参照してください。

警告の言葉:オブジェクトタイプとフィールド名を文字列として渡すことは、コンパイラがそれらのタイプがコードで言及されていることを認識しないことを意味します。したがって、カスタムオブジェクトを削除しようとしたり、フィールドの名前を変更したりしても、salesforceはオブジェクトまたはフィールドが使用中であることを警告せず、削除を許可します。

警告の別の言葉:これはコードの再利用を可能にし、それは利点ですが、それは価値がないことに気付くかもしれません。どうしても必要な場合を除いて、動的な頂点を書くことは避けます。通常の頂点よりもはるかに複雑であるため、特に自分以外の誰かがそれを維持する必要がある場合は、デバッグと維持が困難です。

于 2012-05-14T13:12:12.447 に答える