Thx a lot man you helped as a lot !!! But you posted more than 47 trigger scenarios and how much Experience persons will get this type of questions in the interview as a developer ?? 2+ or what ? how much
Sir could you please explain how to implement below trigger. This was given by Tripathi sir. He said he will ask you to implement it. Please sir if possible do video on this. I tried it but didn't get desired result. There is a secondary owner look up field to user on account object every time an object is created will have to create a share record and share that particular account with the secondary owner and when accounts get updated this field is change we have to remove previously shared record which got created earlier and we have to create a new record with the updated value on it. Thank you in advance!
@@abhijit14820 try this trigger ShareAccountWithSecondaryOwner on Account (after insert, after update) { List sharesToInsert = new List(); List sharesToDelete = new List(); // Map to hold the secondary owner Id for each account Map accountIdToSecondaryOwnerId = new Map(); // Collect secondary owner Ids for newly inserted or updated accounts for (Account acc : Trigger.new) { // Check if the secondary owner lookup field has changed if (Trigger.isInsert || acc.Secondary_Owner__c != Trigger.oldMap.get(acc.Id).Secondary_Owner__c) { accountIdToSecondaryOwnerId.put(acc.Id, acc.Secondary_Owner__c); } } // Query existing account shares for accounts that are being updated List existingShares = [SELECT Id, AccountId FROM AccountShare WHERE AccountId IN :accountIdToSecondaryOwnerId.keySet()]; // Delete existing shares for updated accounts for (AccountShare share : existingShares) { sharesToDelete.add(new AccountShare(Id = share.Id)); } // Insert new shares for updated accounts for (Id accountId : accountIdToSecondaryOwnerId.keySet()) { sharesToInsert.add(new AccountShare( AccountId = accountId, UserOrGroupId = accountIdToSecondaryOwnerId.get(accountId), AccountAccessLevel = 'Read' )); } // Perform DML operations if (!sharesToDelete.isEmpty()) { delete sharesToDelete; } if (!sharesToInsert.isEmpty()) { insert sharesToInsert; } }
@@abhijit14820 try this. source: chat GPT trigger ShareAccountWithSecondaryOwner on Account (after insert, after update) { List sharesToInsert = new List(); List sharesToDelete = new List(); // Map to hold the secondary owner Id for each account Map accountIdToSecondaryOwnerId = new Map(); // Collect secondary owner Ids for newly inserted or updated accounts for (Account acc : Trigger.new) { // Check if the secondary owner lookup field has changed if (Trigger.isInsert || acc.Secondary_Owner__c != Trigger.oldMap.get(acc.Id).Secondary_Owner__c) { accountIdToSecondaryOwnerId.put(acc.Id, acc.Secondary_Owner__c); } } // Query existing account shares for accounts that are being updated List existingShares = [SELECT Id, AccountId FROM AccountShare WHERE AccountId IN :accountIdToSecondaryOwnerId.keySet()]; // Delete existing shares for updated accounts for (AccountShare share : existingShares) { sharesToDelete.add(new AccountShare(Id = share.Id)); } // Insert new shares for updated accounts for (Id accountId : accountIdToSecondaryOwnerId.keySet()) { sharesToInsert.add(new AccountShare( AccountId = accountId, UserOrGroupId = accountIdToSecondaryOwnerId.get(accountId), AccountAccessLevel = 'Read' )); } // Perform DML operations if (!sharesToDelete.isEmpty()) { delete sharesToDelete; } if (!sharesToInsert.isEmpty()) { insert sharesToInsert; } }
Hi, I have a small doubt, does your code work in the scenario where An Account has only one related opportunity and that opportunity is reparented from this Account to another account........ For the new account, your code works fine, but I have doubt whether for old account the field will be updated to empty as I think the oppMap.get(IDs).name will return System.nullpointer , attempt to de-reference a null object exception, correct me if I am wrong, and explain me the scenario please.
Maybe to avoid that null we can use oppMap.KeySet() instead of accIds, which there will be only accs with opps And also probably we will need to check on update account trigger for accs with no opps where we can just make blank the description field Also probably it will be better to check null for newOpp .AccountId before adding it to accIds set
Maybe to avoid that null we can use oppMap.KeySet() instead of accIds, which there will be only accs with opps And also probably we will need to check on update account trigger for accs with no opps where we can just make blank the description field Also probably it will be better to check null for newOpp .AccountId before adding it to accIds set
can any one say as if we are avoiding aggregate query , so can we have this query to fetch the highest amount like : list opplist = [select id , amount, accountId from amount where accountid IN:accids and order by amount desc limit 1];
Yes just add NULLS LAST in your Soql and It will work. list Opplist = [SELECT Id,Name,Amount,AccountId from Opportunity where AccountId IN :AccIds ORDER By Amount DESC NULLS LAST Limit 1];
@@Tushar.S.Kitchen You cannot use LIMIT 1 here.. if you change the accountId on an opp, your query will return opp record for a single account and the opp related to other acc will be left out.
Hi Sir I got a scenario for trigger in NTTData interview You have a Parent Object Order and its child OrderLineItems. On Order Object you have a custom field Number_of_Line_Items.When you insert a new record of the parent object, based on the value in Number_of_Line_Items field, insert that many OrderLineItems? Can you Please help me sir to solve this
When the account is updated, send an email to the account owner with the details of contact modified between the last update of account vs current update. NTT Data interview question. Pls make a solution video on this scenario, I request.🙏
whenever the contact is created if contact has any related account then if account doesn't have any related opportunity it will create new opp for that account , if account has any related opportunity then the sum of amount of opportunity stored in related account custom field - asked in interview .can you give solution
bro here is your solution, thanks for sharing a scenario: handler class: public with sharing class conAccOppController { //S:2- whenever the contact is created if contact has any related account then if account doesn't have any related opportunity it will create new opp for that account , if account has any related opportunity then the sum of amount of opportunity stored in related account custom field - asked in interview public static void afterInsert(list newCons){ set accIds=new set(); for(contact con:newCons){ if(con.AccountId!=null){ accIds.add(con.AccountId); } } //account with no opportunities: list accWithNoOppor = [select id,name from account where id in :accIds and id not in (select accountId from opportunity)]; List newOpps=new List(); for(Account acc:accWithNoOppor){ newOpps.add(new Opportunity(name='Opp created from '+acc.name+' account',accountId=acc.id,CloseDate=date.today()+10,stageName='Prospecting')); } if(newOpps.size()!=0){ insert newOpps; } aggregateResult[] agg=[select accountId,sum(amount) sumAmounts from opportunity group by accountId]; list accAmUpdate=new List(); for(aggregateResult agg2:agg){ string ids=(String) agg2.get('accountId'); decimal totalAmounts=(decimal) agg2.get('sumAmounts'); account acc=new account(id=ids,Total_Opportunity_Amount__c=totalAmounts); accAmUpdate.add(acc); } if(accAmUpdate.size()!=0){ update accAmUpdate; } } } trigger: trigger accConOpp on Contact (after insert) { conAccOppController.afterInsert(Trigger.new); }
can you please say sir will this work ?? i am not able to get the output , can anyone say where it is going wrong? set accids = new set(); for(opportunity opp:opplist) { if(oldmap== null && opp.amount!=null && opp.AccountId != null) { accids.add(opp.AccountId); } else if(oldmap!=null) { if(oldmap.get(opp.id).accountId != opp.AccountId) { accids.add(opp.accountId); accids.add(oldmap.get(opp.id).accountId); } else if(opp.Amount != oldmap.get(opp.id).amount) { accids.add(opp.AccountId); } }
} system.debug('accids' +accids);
list acclist = [select id , description from account where id in:accids]; list opplist1 = [select id ,amount, accountId from opportunity where accountID in:accids order by amount desc limit 1]; system.debug('highest opportunity' +opplist1); map stringmap= new map(); for(opportunity opp: opplist1) { stringmap.put(opp.AccountId, opp.name); } system.debug('stringmap' +stringmap);
@madhumohan2952 - the problem lies in your for loop where you are iterating the opplist1... when this for loop finishes its iteration, the map will be having the lower amount opp name set for the respective account because your key will be overriding for every for loop iteration.. you can have this inside a if-block and only populate your map when its not having the particular key as an account ID.
Trigger - Solution Approach trigger AccDes on Opportunity (after insert, after update, after delete,after undelete) { if (Trigger.isAfter && (Trigger.isInsert || Trigger.isUpdate)) { AccountOpp.handleAfterInsertUpdate(Trigger.new); } if (Trigger.isAfter && Trigger.isDelete) { AccountOpp.handleAfterDelete(Trigger.old); } if(Trigger.isAfter && Trigger.isUndelete) { AccountOpp.handleAfterUndelete(Trigger.new); } } Handler Class - public class AccountOpp { public static void handleAfterInsertUpdate(List newOpList) { Set accIds = new Set(); for (Opportunity o : newOpList) { if (o.Amount != null) { accIds.add(o.AccountId); } } if (!accIds.isEmpty()) { List accList = [SELECT Id, Name, Description, (SELECT Id, Amount, Name FROM Opportunities ORDER BY Amount DESC LIMIT 1) FROM Account WHERE Id IN :accIds]; if (!accList.isEmpty()) { for (Account a : accList) { if (!a.Opportunities.isEmpty()) { a.Description = a.Opportunities[0].Name; } else { a.Description = null; } } update accList; } } } public static void handleAfterInsertUpdate(List newOpList, List oldOpList) { handleAfterInsertUpdate(newOpList); // Reuse the same method for update }
public static void handleAfterDelete (List oplist) { handleAfterInsertUpdate(oplist); // Reuse the same method for updat
} public static void handleAfterUndelete (List oplist) { handleAfterInsertUpdate(oplist); // Reuse the same method for update } }
Thank you for another trigger scenario sir
Thanks brother
In SOQL can we use ORDER BY Amount DESC LIMIT 1.....?
Thx a lot man you helped as a lot !!!
But you posted more than 47 trigger scenarios and how much Experience persons will get this type of questions in the interview as a developer ??
2+ or what ? how much
Sir could you please explain how to implement below trigger.
This was given by Tripathi sir. He said he will ask you to implement it.
Please sir if possible do video on this. I tried it but didn't get desired result.
There is a secondary owner look up field to user on account object every time an object is created will have to create a share record and share that particular account with the secondary owner and when accounts get updated this field is change we have to remove previously shared record which got created earlier and we have to create a new record with the updated value on it.
Thank you in advance!
Sure bhai if Mohit sir said to implement it i will create a video for sure but it will take time to create a video on it
@@sfdcninjas Thank you sir! I will wait for it.
@@abhijit14820 try this
trigger ShareAccountWithSecondaryOwner on Account (after insert, after update) {
List sharesToInsert = new List();
List sharesToDelete = new List();
// Map to hold the secondary owner Id for each account
Map accountIdToSecondaryOwnerId = new Map();
// Collect secondary owner Ids for newly inserted or updated accounts
for (Account acc : Trigger.new) {
// Check if the secondary owner lookup field has changed
if (Trigger.isInsert || acc.Secondary_Owner__c != Trigger.oldMap.get(acc.Id).Secondary_Owner__c) {
accountIdToSecondaryOwnerId.put(acc.Id, acc.Secondary_Owner__c);
}
}
// Query existing account shares for accounts that are being updated
List existingShares = [SELECT Id, AccountId FROM AccountShare WHERE AccountId IN :accountIdToSecondaryOwnerId.keySet()];
// Delete existing shares for updated accounts
for (AccountShare share : existingShares) {
sharesToDelete.add(new AccountShare(Id = share.Id));
}
// Insert new shares for updated accounts
for (Id accountId : accountIdToSecondaryOwnerId.keySet()) {
sharesToInsert.add(new AccountShare(
AccountId = accountId,
UserOrGroupId = accountIdToSecondaryOwnerId.get(accountId),
AccountAccessLevel = 'Read'
));
}
// Perform DML operations
if (!sharesToDelete.isEmpty()) {
delete sharesToDelete;
}
if (!sharesToInsert.isEmpty()) {
insert sharesToInsert;
}
}
@@abhijit14820 try this. source: chat GPT
trigger ShareAccountWithSecondaryOwner on Account (after insert, after update) {
List sharesToInsert = new List();
List sharesToDelete = new List();
// Map to hold the secondary owner Id for each account
Map accountIdToSecondaryOwnerId = new Map();
// Collect secondary owner Ids for newly inserted or updated accounts
for (Account acc : Trigger.new) {
// Check if the secondary owner lookup field has changed
if (Trigger.isInsert || acc.Secondary_Owner__c != Trigger.oldMap.get(acc.Id).Secondary_Owner__c) {
accountIdToSecondaryOwnerId.put(acc.Id, acc.Secondary_Owner__c);
}
}
// Query existing account shares for accounts that are being updated
List existingShares = [SELECT Id, AccountId FROM AccountShare WHERE AccountId IN :accountIdToSecondaryOwnerId.keySet()];
// Delete existing shares for updated accounts
for (AccountShare share : existingShares) {
sharesToDelete.add(new AccountShare(Id = share.Id));
}
// Insert new shares for updated accounts
for (Id accountId : accountIdToSecondaryOwnerId.keySet()) {
sharesToInsert.add(new AccountShare(
AccountId = accountId,
UserOrGroupId = accountIdToSecondaryOwnerId.get(accountId),
AccountAccessLevel = 'Read'
));
}
// Perform DML operations
if (!sharesToDelete.isEmpty()) {
delete sharesToDelete;
}
if (!sharesToInsert.isEmpty()) {
insert sharesToInsert;
}
}
Can we use parent child query with descending amount and then using first opportunity we cane store it in map ( account id , opp[o].amount )?
Hi, I have a small doubt, does your code work in the scenario where An Account has only one related opportunity and that opportunity is reparented from this Account to another account........ For the new account, your code works fine, but I have doubt whether for old account the field will be updated to empty as I think the oppMap.get(IDs).name will return System.nullpointer , attempt to de-reference a null object exception, correct me if I am wrong, and explain me the scenario please.
Maybe to avoid that null we can use oppMap.KeySet() instead of accIds, which there will be only accs with opps
And also probably we will need to check on update account trigger for accs with no opps where we can just make blank the description field
Also probably it will be better to check null for newOpp .AccountId before adding it to accIds set
Maybe to avoid that null we can use oppMap.KeySet() instead of accIds, which there will be only accs with opps
And also probably we will need to check on update account trigger for accs with no opps where we can just make blank the description field
Also probably it will be better to check null for newOpp .AccountId before adding it to accIds set
Very well explained sir
can any one say as if we are avoiding aggregate query , so can we have this query to fetch the highest amount like : list opplist = [select id , amount, accountId from amount where accountid IN:accids and order by amount desc limit 1];
Yes just add NULLS LAST in your Soql and It will work.
list Opplist = [SELECT Id,Name,Amount,AccountId from Opportunity where AccountId IN :AccIds ORDER By Amount DESC NULLS LAST Limit 1];
@@Tushar.S.Kitchen You cannot use LIMIT 1 here.. if you change the accountId on an opp, your query will return opp record for a single account and the opp related to other acc will be left out.
Hi Sir
I got a scenario for trigger in NTTData interview
You have a Parent Object Order and its child OrderLineItems. On Order Object you have a custom field
Number_of_Line_Items.When you insert a new record of the parent object, based on the value in Number_of_Line_Items field, insert
that many OrderLineItems? Can you Please help me sir to solve this
Sure you will get a video on it this week
@@sfdcninjas Thank you sir
I am practising the scenarios and the explanation was good
keep watching and supporting bro
When the account is updated, send an email to the account owner with the details of contact modified between the last update of account vs current update.
NTT Data interview question.
Pls make a solution video on this scenario, I request.🙏
Hi vipul thanks for providing scenario i will create a video on it for sure but please wait it might take time
Ok sure. Thanks!😊
Create video on this scenario too sir
You will get it tomorrow bro
whenever the contact is created if contact has any related account then if account doesn't have any related opportunity it will create new opp for that account , if account has any related opportunity then the sum of amount of opportunity stored in related account custom field - asked in interview .can you give solution
Hi sure , in which company’s interview it was asked?
Astrait IT services
Sure i will create a video on it but you have to wait for.
is that ok with you?
@@ShwetaBanne why would an unknown company ask such a difficult trigger question ? Is it to show potential candidate down ?
bro here is your solution, thanks for sharing a scenario:
handler class:
public with sharing class conAccOppController {
//S:2- whenever the contact is created if contact has any related account then if account doesn't have any related opportunity it will create new opp for that account , if account has any related opportunity then the sum of amount of opportunity stored in related account custom field - asked in interview
public static void afterInsert(list newCons){
set accIds=new set();
for(contact con:newCons){
if(con.AccountId!=null){
accIds.add(con.AccountId);
}
}
//account with no opportunities:
list accWithNoOppor = [select id,name from account where id in :accIds and id not in (select accountId from opportunity)];
List newOpps=new List();
for(Account acc:accWithNoOppor){
newOpps.add(new Opportunity(name='Opp created from '+acc.name+' account',accountId=acc.id,CloseDate=date.today()+10,stageName='Prospecting'));
}
if(newOpps.size()!=0){
insert newOpps;
}
aggregateResult[] agg=[select accountId,sum(amount) sumAmounts from opportunity group by accountId];
list accAmUpdate=new List();
for(aggregateResult agg2:agg){
string ids=(String) agg2.get('accountId');
decimal totalAmounts=(decimal) agg2.get('sumAmounts');
account acc=new account(id=ids,Total_Opportunity_Amount__c=totalAmounts);
accAmUpdate.add(acc);
}
if(accAmUpdate.size()!=0){
update accAmUpdate;
}
}
}
trigger:
trigger accConOpp on Contact (after insert) {
conAccOppController.afterInsert(Trigger.new);
}
yOU ARE DOINGAMAZING, CAN YOU HELP I NMORE AMAZON LEVEL INTERVIEW?
This apex class code is to long
Sir, you changed the approach this is similar to trigger 16 where you used sub query any reason for that ???
Hi buddy , using subquery is not a good practice in apex
can you please say sir will this work ?? i am not able to get the output , can anyone say where it is going wrong?
set accids = new set();
for(opportunity opp:opplist)
{
if(oldmap== null && opp.amount!=null && opp.AccountId != null)
{
accids.add(opp.AccountId);
}
else if(oldmap!=null)
{
if(oldmap.get(opp.id).accountId != opp.AccountId)
{
accids.add(opp.accountId);
accids.add(oldmap.get(opp.id).accountId);
}
else if(opp.Amount != oldmap.get(opp.id).amount)
{
accids.add(opp.AccountId);
}
}
}
system.debug('accids' +accids);
list acclist = [select id , description from account where id in:accids];
list opplist1 = [select id ,amount, accountId from opportunity where accountID in:accids order by amount desc limit 1];
system.debug('highest opportunity' +opplist1);
map stringmap= new map();
for(opportunity opp: opplist1)
{
stringmap.put(opp.AccountId, opp.name);
}
system.debug('stringmap' +stringmap);
list acclist1= new list();
for(account acc: acclist)
{
if(stringmap.containskey(acc.id))
{
acc.Description = stringmap.get(acc.id);
acclist1.add(acc);
}
}
if(acclist1.size()>0)
{
update acclist1;
}
@madhumohan2952 - the problem lies in your for loop where you are iterating the opplist1... when this for loop finishes its iteration, the map will be having the lower amount opp name set for the respective account because your key will be overriding for every for loop iteration.. you can have this inside a if-block and only populate your map when its not having the particular key as an account ID.
Trigger - Solution Approach
trigger AccDes on Opportunity (after insert, after update, after delete,after undelete) {
if (Trigger.isAfter && (Trigger.isInsert || Trigger.isUpdate)) {
AccountOpp.handleAfterInsertUpdate(Trigger.new);
}
if (Trigger.isAfter && Trigger.isDelete) {
AccountOpp.handleAfterDelete(Trigger.old);
}
if(Trigger.isAfter && Trigger.isUndelete)
{
AccountOpp.handleAfterUndelete(Trigger.new);
}
}
Handler Class -
public class AccountOpp {
public static void handleAfterInsertUpdate(List newOpList) {
Set accIds = new Set();
for (Opportunity o : newOpList) {
if (o.Amount != null) {
accIds.add(o.AccountId);
}
}
if (!accIds.isEmpty()) {
List accList = [SELECT Id, Name, Description,
(SELECT Id, Amount, Name
FROM Opportunities
ORDER BY Amount DESC
LIMIT 1)
FROM Account
WHERE Id IN :accIds];
if (!accList.isEmpty()) {
for (Account a : accList) {
if (!a.Opportunities.isEmpty()) {
a.Description = a.Opportunities[0].Name;
}
else
{
a.Description = null;
}
}
update accList;
}
}
}
public static void handleAfterInsertUpdate(List newOpList, List oldOpList) {
handleAfterInsertUpdate(newOpList); // Reuse the same method for update
}
public static void handleAfterDelete (List oplist)
{
handleAfterInsertUpdate(oplist); // Reuse the same method for updat
}
public static void handleAfterUndelete (List oplist)
{
handleAfterInsertUpdate(oplist); // Reuse the same method for update
}
}