how can i achieve this through apex When Account is marked as Inactive (Custom Checkbox) then mark all related contacts as inactive.Can anyone please tell me the sourcecode with vf page not through process builder or any workflows please help me.
You can achieve this by formula field as well. Create a custom formula field on contact with return type as checkbox & refer Account's inactive checkbox.
Still if you need code, here it is Access this page with this URL:
Thankyou so much for your valuable response,it's working fine but the account's checkbox is not getting check however the contact's inactive checkbox is getting checked..Can you tell me why this is happening?
and can you please tell me how can i do this through trigger.I will mark your answer as the best answer because it helped me alot but i just want to do this through trigger as noone is going to mark inactive through vf pafe.Also when i am marking the inactive checkbox as unchecked then the contact is not getting updated..Please help..
Below is Account trigger & helper class. You might need to write trigger on contact to ensure when new contact is being created for inactive accounts, that contact is also updated as inactive contact. This is just a raw implementation. You can consider using Trigger framework as well. Hope this helps. Handle rest of the scenarios in same way.
Trigger:
trigger UpdateContactInActiveFlag on Account (before update) {
Map<Id,Boolean> accIDToActiveFlagMap= new Map<Id,Boolean>(); for(Account acc :trigger.new){
Can I also get all the account @karan ? so that I can select the account and make it inactive from the checkbox on record & it should get updated.Can I do this?
Yes, you can use recordSetVar on <apex:page> to use standard set controller,display all accounts with this checkbox in a pageblocktable & then run same logic to update Accounts & contacts.
This will help. https://developer.salesforce.com/forums/?id=906F0000000BX9mIAG
But how to relate the inactive checkbox beside every record?Actually I am new to this apex I don't know much infact you can say 2% out of 10%.If you can help that would be great,I know it seems like i am getting greedy but it's ok if you don't have enough time to make this up.. Thanks.
Also can you please tell me from where I can practice scenarios as I can see you have depth knowledge on apex.I too want to become good developer.Please help.
That is alright. Good to see people's inclination towards learning Salesforce. Start with trailhead. It is one stop shop for everything you need to know about salesforce. Go through all developer trails.
https://trailhead.salesforce.com/
Some other links to get started with Apex programming. https://resources.docs.salesforce.com/sfdc/pdf/salesforce_apex_language_reference.pdf https://www.tutorialspoint.com/apex/ http://www.sfdc99.com/apex-academy/
I did manage to work something out quickly. This serves the purpose. You can beautify it based on your requirement. It will atleast give you an idea on how to start working.
private Account acc; public AccountInactiveController(ApexPages.StandardController controller) {
acc = (Account)controller.getRecord();
}
// ApexPages.StandardSetController must be instantiated // for standard list controllers public ApexPages.StandardSetController setAccount { get { if(setAccount == null) { setAccount = new ApexPages.StandardSetController(Database.getQueryLocator( [SELECT Name,Id,Active__c FROM Account])); } return setAccount ; } set; } // Initialize setCon and return a list of records public List<Account> getAccounts() {
return setAccount.getRecords(); }
public pageReference save(){
Map<Id,Boolean> oldAccIdToActiveFlagMap = new Map<Id,Boolean>(); Map<Id,Boolean> accIdToActiveFlagMap = new Map<Id,Boolean>(); List<Account> accListToUpdate = new List<Account>();
for(Account acc : [Select id,Active__c from Account where ID IN :setAccount.getRecords()]){
But I am geting the following error when i run this class i.e Error: AccountInactiveController Compile Error: Variable does not exist: AccountTriggerHelper at line 52 column 5..
public class AccountInactiveController {
private Account acc;
public AccountInactiveController(ApexPages.StandardController controller) {
acc = (Account)controller.getRecord();
}
public pageReference save(){
system.debug('*acc**'+acc.InActive__c);
if(acc.InActive__c){
update acc ;
inActiateContacts(acc);
}
return new pagereference('/'+acc.Id);
}
private void inActiateContacts(Account acc){
List<Contact> contactList = new List<Contact>();
for(Contact conObj: [Select id,InActive__c from contact where AccountId =:acc.Id ]){
conObj.InActive__c = true;
contactList.add(conObj);
}
if(!contactList.isEmpty()){
update contactList;
}
}
}
All Answers
You can achieve this by formula field as well. Create a custom formula field on contact with return type as checkbox & refer Account's inactive checkbox.
Still if you need code, here it is
Access this page with this URL:
https://<serverUrl>.visual.force.com/apex/<page name>?id=<Account Id>
VF page:
<apex:page standardController="Account" extensions="AccountInactiveController" >
<apex:form >
<apex:pageBlock >
<apex:pageBlockSection >
<apex:inputField value="{!account.InActive__c}"/>
</apex:pageBlockSection>
<apex:commandButton value="save" action="{!save}"/>
</apex:pageBlock>
</apex:form>
</apex:page>
controller:
public class AccountInactiveController {
private Account acc;
public AccountInactiveController(ApexPages.StandardController controller) {
acc = (Account)controller.getRecord();
}
public pageReference save(){
system.debug('*acc**'+acc.InActive__c);
if(acc.InActive__c)
inActiateContacts(acc);
return new pagereference('/'+acc.Id);
}
private void inActiateContacts(Account acc){
List<Contact> contactList = new List<Contact>();
for(Contact conObj: [Select id,InActive__c from contact where AccountId =:acc.Id ]){
conObj.InActive__c = true;
contactList.add(conObj);
}
if(!contactList.isEmpty()){
update contactList;
}
}
}
Hi Prema,
Please mark correct answer if this helps.
Regards,
Karan
Thankyou so much for your valuable response,it's working fine but the account's checkbox is not getting check however the contact's inactive checkbox is getting checked..Can you tell me why this is happening?
Thanks & Regards,
Prema
public class AccountInactiveController {
private Account acc;
public AccountInactiveController(ApexPages.StandardController controller) {
acc = (Account)controller.getRecord();
}
public pageReference save(){
system.debug('*acc**'+acc.InActive__c);
if(acc.InActive__c){
update acc ;
inActiateContacts(acc);
}
return new pagereference('/'+acc.Id);
}
private void inActiateContacts(Account acc){
List<Contact> contactList = new List<Contact>();
for(Contact conObj: [Select id,InActive__c from contact where AccountId =:acc.Id ]){
conObj.InActive__c = true;
contactList.add(conObj);
}
if(!contactList.isEmpty()){
update contactList;
}
}
}
Below is Account trigger & helper class. You might need to write trigger on contact to ensure when new contact is being created for inactive accounts, that contact is also updated as inactive contact. This is just a raw implementation. You can consider using Trigger framework as well.
Hope this helps. Handle rest of the scenarios in same way.
Trigger:
trigger UpdateContactInActiveFlag on Account (before update) {
Map<Id,Boolean> accIDToActiveFlagMap= new Map<Id,Boolean>();
for(Account acc :trigger.new){
if(trigger.oldMap.get(acc.Id).Active__c != acc.InActive__c ){
accIDToActiveFlagMap.put(acc.id,acc.Active__c );
}
}
system.debug('**accIDToActiveFlagMap****'+accIDToActiveFlagMap);
AccountTriggerHelper.UpdateActiveFlagOnContacts(accIDToActiveFlagMap);
}
Apex class:
public with sharing class AccountTriggerHelper {
public static void UpdateActiveFlagOnContacts(Map<Id,Boolean> accIdToFlagMap){
List<Contact> listOfContactsToUpdate = new List<Contact>();
try{
List<Contact> contactsToUpdate = [Select id,InActive__c,AccountId from Contact where AccountId IN :accIdToFlagMap.keySet()];
if(contactsToUpdate != null && contactsToUpdate.size()>0 ){
for(Contact conObj : contactsToUpdate ){
conObj.InActive__c = accIdToFlagMap.get(conObj.AccountId);
}
}
update contactsToUpdate ;
}catch(Exception excp){
system.debug('Exception occured while updating active flag on Account'+excp.getMessage()+excp.getStackTraceString());
}
}
}
Yes, you can use recordSetVar on <apex:page> to use standard set controller,display all accounts with this checkbox in a pageblocktable & then run same logic to update Accounts & contacts.
This will help.
https://developer.salesforce.com/forums/?id=906F0000000BX9mIAG
Thanks.
Start with trailhead. It is one stop shop for everything you need to know about salesforce. Go through all developer trails.
https://trailhead.salesforce.com/
Some other links to get started with Apex programming.
https://resources.docs.salesforce.com/sfdc/pdf/salesforce_apex_language_reference.pdf
https://www.tutorialspoint.com/apex/
http://www.sfdc99.com/apex-academy/
In the meantime, I will work on the code.
.
I did manage to work something out quickly. This serves the purpose. You can beautify it based on your requirement. It will atleast give you an idea on how to start working.
VF page:
<apex:page standardController="Account" extensions="AccountInactiveController" >
<apex:form >
<apex:pageBlock >
<apex:pageBlockSection columns="1">
<apex:pageBlockTable value="{!accounts}" var="accRecord">
<apex:column headerValue="Account Name" value="{!accRecord.Name}"/>
<apex:column headerValue="Active">
<apex:inputField value="{!accRecord.Active__c}"/>
</apex:column>
</apex:pageBlockTable>
</apex:pageBlockSection>
<apex:commandButton value="save" action="{!save}"/>
</apex:pageBlock>
</apex:form>
</apex:page>
Controller:
public class AccountInactiveController {
private Account acc;
public AccountInactiveController(ApexPages.StandardController controller) {
acc = (Account)controller.getRecord();
}
// ApexPages.StandardSetController must be instantiated
// for standard list controllers
public ApexPages.StandardSetController setAccount {
get {
if(setAccount == null) {
setAccount = new ApexPages.StandardSetController(Database.getQueryLocator(
[SELECT Name,Id,Active__c FROM Account]));
}
return setAccount ;
}
set;
}
// Initialize setCon and return a list of records
public List<Account> getAccounts() {
return setAccount.getRecords();
}
public pageReference save(){
Map<Id,Boolean> oldAccIdToActiveFlagMap = new Map<Id,Boolean>();
Map<Id,Boolean> accIdToActiveFlagMap = new Map<Id,Boolean>();
List<Account> accListToUpdate = new List<Account>();
for(Account acc : [Select id,Active__c from Account where ID IN :setAccount.getRecords()]){
oldAccIdToActiveFlagMap .put(acc.Id,acc.Active__c );
}
for(Account acc : (List<Account>)setAccount.getRecords()){
if(oldAccIdToActiveFlagMap .containsKey(acc.id)){
if(oldAccIdToActiveFlagMap.get(acc.id) != acc.Active__c){
accIdToActiveFlagMap.put(acc.Id,acc.Active__c);
accListToUpdate.add(acc);
}
}
}
update accListToUpdate;
AccountTriggerHelper.UpdateActiveFlagOnContacts(accIdToActiveFlagMap);
return null;
}
}
Apex class:
public with sharing class AccountTriggerHelper {
public static void UpdateActiveFlagOnContacts(Map<Id,Boolean> accIdToFlagMap){
List<Contact> listOfContactsToUpdate = new List<Contact>();
try{
List<Contact> contactsToUpdate = [Select id,InActive__c,AccountId from Contact where AccountId IN :accIdToFlagMap.keySet()];
if(contactsToUpdate != null && contactsToUpdate.size()>0 ){
for(Contact conObj : contactsToUpdate ){
conObj.InActive__c = accIdToFlagMap.get(conObj.AccountId);
}
}
update contactsToUpdate ;
}catch(Exception excp){
system.debug('Exception occured while updating active flag on Account'+excp.getMessage()+excp.getStackTraceString());
}
}
}