2012-05-14 3 views
2

Я использую в своем приложении force.com Apex Classes, и многие из них имеют одинаковую структуру, я хочу, чтобы API повторно использовал его после.Создайте свой собственный API

Для exaple, эти два класса:

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

Вы хотите написать код, который работает для разных объектов, а не указывать тип объекта в коде?

Можно сделать это, объявляя свои SObject переменные с типом SObject, например, вместо

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

вы положили бы

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

и ссылающихся полей с помощью получить и поставить , например вместо

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

вы положили бы

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

Я не пробовал использовать подобный код в расширении контроллера, но в теории, так как вы можете пройти в любом стандартном контроллере вы должны быть в порядке.

Вам нужно будет подумать о том, как создать родительский объект внутри метода сохранения, потому что вам нужно будет передать тип, который вы хотите создать. Это довольно сложно, но можно взять в строке, представляющей тип объекта (например, «учетная запись») и создать новый объект этого типа:

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

получит вам новый счет. Таким образом, вы можете заменить «Учетная запись» любым типом, переданным в качестве параметра.

Для получения дополнительной информации найдите динамическую Apex, Dynamic SOQL и Dynamic DML в документации.

Предупреждение: Прохождение типов объектов и имен полей в виде строк означает, что компилятор не знает этих типов, упомянутых в коде. Поэтому, если вы попытаетесь удалить пользовательский объект или переименовать поле, salesforce не будет предупреждать вас о том, что объект или поле используется и позволит вам удалить.

Еще одно предупреждение: хотя это позволяет повторно использовать код, и это выгодно, вы можете обнаружить, что это не стоит. Я избегаю писать динамическую вершину, если я не обязан. Это намного сложнее, чем обычная вершина, и поэтому трудно отлаживать и maitain, особенно если кто-то, кроме вас, должен его поддерживать.

+0

Благодарим за помощь и разъяснения! – Netmaster

+0

У меня есть другой вопрос, как я могу автоматически вставлять значение поля основных отношений в дочерний элемент, потому что у меня есть один родитель для каждого ребенка? – Netmaster

+0

, вы можете сделать сложные вещи с помощью метода getDescribe(), чтобы узнать, какой тип объекта является родителем (не уверен, если возможно, или нет), но я думаю, что было бы проще сохранить имена типов объектов в пользовательских настройках (как строки). – naomi

Смежные вопросы