You need to sign in to do that
Don't have an account?
I have a requirement. where I need to be able to pass the name of a batch apex class . I am passing class name as a string. The function will call Database.ExecuteBatch using the string as the name of the class.
But i unable to pass the string as a class name in Db.executebatch();
public class DynamicBatchClass {
public string selectedclass{get;set;}
public string classname{get;set;}
public string inputquery{get;set;}
public DynamicBatchClass(){
}
public list<selectoption> getclassnameslist ()
{
map<string,sobject> instanceMap=new map<string,sobject>();
list<selectoption> options=new list<selectoption>();
system.debug('---->>>>-');
list<ApexClass> ClassNames=new list<ApexClass>();
options.add(new selectoption('--None--','--None--'));
ClassNames=[select Id,name,body from ApexClass];
for(ApexClass ac:ClassNames)
{
if(ac.body.contains('batch')){
system.debug('-----'+ac.name);
options.add(new selectoption(ac.Id,ac.name));
instanceMap.put(ac.name, ac);
system.debug('--instanceMap--'+instanceMap);
}
}
return options;
}
public void run(){
system.debug('--selectedclasses--'+selectedclass);
system.debug('--query-->'+inputquery);
ApexClass newAp = [select id, name from apexclass where id=:selectedclass];
string s = newap.Name;
Database.executeBatch(new s() ,50);
}
}
Any one help me to pass the classname
VF :- <apex:page controller="DynamicBatchClass" showHeader="false" standardStylesheets="false" sidebar="false" docType="html-5.0" applyBodyTag="False" applyHtmlTag="False">
<html xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" lang="en" >
<apex:stylesheet value="{!URLFOR($Resource.SLDS24, 'assets/styles/salesforce-lightning-design-system-vf.min.css')}" />
<apex:form>
<div class="slds" role="banner">
<div class="slds-grid">
<div class="slds-form-element">
<label class="slds-form-element__label" for="text-input-01">Input Label</label>
<div class="slds-form-element__control">
<input type="text" id="text-input-01" class="slds-input" placeholder="Placeholder Text" />
</div>
</div>
<div class="slds-text-heading--large">Select Batch Class</div>
<apex:selectList value="{!selectedclasses}" multiselect="false" size="1" label="Select Batch Class">
<apex:selectOptions value="{!classnameslist}"></apex:selectOptions>
</apex:selectList>
</div>
</div>
<apex:pageblock >
<apex:pageBlockSection >
<apex:inputTextArea label="Query"></apex:inputTextArea>
</apex:pageBlockSection>
</apex:pageblock>
</apex:form>
</html>
</apex:page>
public class DynamicBatchClass {
public string selectedclass{get;set;}
public string classname{get;set;}
public string inputquery{get;set;}
public DynamicBatchClass(){
}
public list<selectoption> getclassnameslist ()
{
map<string,sobject> instanceMap=new map<string,sobject>();
list<selectoption> options=new list<selectoption>();
system.debug('---->>>>-');
list<ApexClass> ClassNames=new list<ApexClass>();
options.add(new selectoption('--None--','--None--'));
ClassNames=[select Id,name,body from ApexClass];
for(ApexClass ac:ClassNames)
{
if(ac.body.contains('batch')){
system.debug('-----'+ac.name);
options.add(new selectoption(ac.Id,ac.name));
instanceMap.put(ac.name, ac);
system.debug('--instanceMap--'+instanceMap);
}
}
return options;
}
public void run(){
system.debug('--selectedclasses--'+selectedclass);
system.debug('--query-->'+inputquery);
ApexClass newAp = [select id, name from apexclass where id=:selectedclass];
string s = newap.Name;
Database.executeBatch(new s() ,50);
}
}
Any one help me to pass the classname
VF :- <apex:page controller="DynamicBatchClass" showHeader="false" standardStylesheets="false" sidebar="false" docType="html-5.0" applyBodyTag="False" applyHtmlTag="False">
<html xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" lang="en" >
<apex:stylesheet value="{!URLFOR($Resource.SLDS24, 'assets/styles/salesforce-lightning-design-system-vf.min.css')}" />
<apex:form>
<div class="slds" role="banner">
<div class="slds-grid">
<div class="slds-form-element">
<label class="slds-form-element__label" for="text-input-01">Input Label</label>
<div class="slds-form-element__control">
<input type="text" id="text-input-01" class="slds-input" placeholder="Placeholder Text" />
</div>
</div>
<div class="slds-text-heading--large">Select Batch Class</div>
<apex:selectList value="{!selectedclasses}" multiselect="false" size="1" label="Select Batch Class">
<apex:selectOptions value="{!classnameslist}"></apex:selectOptions>
</apex:selectList>
</div>
</div>
<apex:pageblock >
<apex:pageBlockSection >
<apex:inputTextArea label="Query"></apex:inputTextArea>
</apex:pageBlockSection>
</apex:pageblock>
</apex:form>
</html>
</apex:page>
Check out the Type Class and its forName and newInstance methods: https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_methods_system_type.htm
I hope this helps!
Database.Batchable<sobject> instance = (Database.Batchable<sobject>)classType.newInstance();
Database.executeBatch((Database.Batchable<sObject>)instance, 100);