function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
Nuno.CarvalhoNuno.Carvalho 

Appex trigger

Hello guys,
Im trying to auto-fill a field called clube, i think i´ve done the right thing , because this method worked for similar updates, i just changed the fields a wanted to compare.
The erros that gives me in debug logs is "System.QueryException: List has no rows for assignment to SObject", i know what this means i just dont know how to make this right.

Translations:
-clube (soccer club)
-jogador_representado ( represented player)
-jogadores (players)

trigger clube on Jogadores__c (before update) {
string ids;
    list <Contract> c = [Select id,Jogador_Representado__c,Clube__c from Contract];
    for(Jogadores__c i : trigger.new) {
       ids = i.id;
    }
    jogadores__c j = [Select id,name ,Clube__c From jogadores__c Where id = : ids];
    if(j.name !=null) {
         Contract con = [Select Jogador_Representado__c From Contract where id =: j.name limit 1];
               for (Contract ctt : c){
                    if(ctt.Jogador_Representado__c == con.Jogador_Representado__c ){
                    ctt.Clube__c = j.Clube__c;
               update ctt;
        }
      }
    }
}

Would aprecciate some help, thank you.
Zuinglio Lopes Ribeiro JúniorZuinglio Lopes Ribeiro Júnior
Hello Nuno,

Qual é a relação entre Contract e Jogadores__c? No contrato você possui um campo lookup ou mestre detalhe para o objeto Jogadores__c?
Which is the relationship between Contract and Jogadores__c?  Contract has a lookup/master/detail relationship with Jogadores__c? 

Your intention is to update the field Clube__c in every Contract that matches the players  being updated ? 
Você quer atualizar o campo Clube__c em todos os contratos que tem os jogadores sendo atualizado? 

Hope to have helped!

Regards.

Don't forget to mark your thread as 'SOLVED' with the answer that best helps you.
 
SalesFORCE_enFORCErSalesFORCE_enFORCEr
You can check the size of the list before executing the query.
if([Select Id from Object].size()>0){
//execute the query
}

 
Nuno.CarvalhoNuno.Carvalho
Olá Zuinglio,
Sim tenho 2 lookups, o nome do jogador e o clube mas o clube eu queria que fosse automaticamente populado, 
Eu usei o nome/id dos jogadores para comparar os objetos e inserir o clube correto.
Se quiser saber mais alguma coisa é só perguntar,
Obrigado.
Zuinglio Lopes Ribeiro JúniorZuinglio Lopes Ribeiro Júnior
Olá Nuno,

Qual é o nome do lookup do objeto Jogadores__c no objeto Contrato__c? Nesse momento do update em Jogadores__c o lookup do jogador já está preenchido no contrato certo?

 
Pavit SiddhuPavit Siddhu

hello

Is it contract or contact?
 

Nuno.CarvalhoNuno.Carvalho
Hello Pavit,
It´s contract.
Nuno.CarvalhoNuno.Carvalho
Zuinglio,
Clube__c, Jogador_Representado__c.
Eu quero que ao criar um contrato para o jogador , o field lookup Clube__C seja automaticamente preenchido.
 
Zuinglio Lopes Ribeiro JúniorZuinglio Lopes Ribeiro Júnior
Olá Nuno,

Mas então nesse caso sua trigger deveria ser no contrato, não? Se toda vez que criar um registro no objeto Contrato que tiver o campo Jogador Representado preenchido ou quando atualizar o Contrato com esse campo, você quer que o Clube__c no Contrato seja preenchido com o valor do Clube__c do jogador, correto? 

Ou o que quer é que quando atualizar o Clube__c no jogador atualize também o Clube__c em todos os contratos relacionados a este jogador? 

Acho que no caso, necessita dos dois, certo? 
Pavit SiddhuPavit Siddhu

I think where clause in Contract con = [Select Jogador_Representado__c From Contract where id =: j.name limit 1]; is not correct.

i can give u the right solution. if u tell me the relationship b/w objects

Zuinglio Lopes Ribeiro JúniorZuinglio Lopes Ribeiro Júnior
Olá Nuno,

Na trigger clube no objeto Jogadores__c toda vez que o campo Clube__c for modificado todos os contratos desse jogador também serão atualizados com o clube atual.
 
trigger clube on Jogadores__c (after update) {

	Map<Id, Id> 	jogadores 				= new Map<Id, Id>();
	List<Contract>	contratosParaAtualizar 	= List<Contract>();
	
	for (Jogadores__c jogador : Trigger.new) {
		
		Jogadores__c oldRecord = Trigger.oldMap.get(jogador.Id);
		
		if (jogador.Clube__c != oldRecord.Clube__c)
			jogadores.put(jogador.Id, jogador.Clube__c);

    }


    for (Contract con : [SELECT Clube__c, Jogador_Representado__c FROM Contract WHERE Jogador_Representado__c =: jogadores.keySet()]) {
		
		con.Clube__c 	= jogadores.get(con.Jogador_Representado__c);

		contratosParaAtualizar.add(con);
	
	}
	
	if (!contratosParaAtualizar.isEmpty())
		update contratosParaAtualizar;

}

Já nessa nova trigger que precisa criar, chamada Contrato, no objeto Contract toda vez que um contrato for criado ou o campo jogador for atualizado nesse contrato, o campo Clube__c também será atualizado.
 
trigger Contrato on Contract (before insert, before update) {

	Map<Id, Id> jogadores = new Map<Id, Id>();
	
	for (Contract con : Trigger.new) {
		
		Contract oldRecord = Trigger.oldMap.get(con.Id);
		
		if ( String.isNotBlank(con.Jogador_Representado__c)  
			&&
			( oldRecord == null || con.Jogador_Representado__c != oldRecord.Jogador_Representado__c)) {
			jogadores.put(con.Jogador_Representado__c, null);
		}
	}
	
	for (Jogadores__c jogador : [SELECT Clube__c FROM Jogadores__c WHERE Id =: jogadores.keySet()]) {
		jogadores.put(jogador.Id, jogador.Clube__c);
	}
	
	for (Contract con : Trigger.new) {
		Id clubeId = jogadores.get(con.Jogador_Representado__c);
		
		if (clubeId != null)
			con.Clube__c = clubeId;
	}	
}

Talvez tenha algum erro de sintaxe já que não tenho o objeto Jogadores__c não pude testar. Mas se tiver algum problema é só avisar!

Além disso tenha em mente o conceito de Bulkify que a Salesforce recomenda como uma boa prática para Triggers
https://trailhead.salesforce.com/en/modules/apex_triggers/units/apex_triggers_bulk

E também quando tiver um tempo dá uma olhada no conceito de Framework para trabalhar com Triggers no Salesforce. Isso te ajudará a ter mais controle.
https://developer.salesforce.com/page/Trigger_Frameworks_and_Apex_Trigger_Best_Practices

Hope to have helped!

Regards.

Don't forget to mark your thread as 'SOLVED' with the answer that best helps you.
 
Zuinglio Lopes Ribeiro JúniorZuinglio Lopes Ribeiro Júnior
Na linha 4 da trigger do objeto Jogadores__c, está faltando o new, então troca por:
List<Contract>    contratosParaAtualizar = new List<Contract>();
Nuno.CarvalhoNuno.Carvalho
Ola Zuingllo,
Isto não funciona mas eu penso que sei o poquê, o lookup field Clube__c no Object Jogadores__c é os nomes das Accounts ou seja isto não está a ler o id das accounts e assim não vai buscar o nome do clube.
Eu expliquei me mal ao ínicio , peço desculpa, mas penso que este seja o problema.
Nuno.CarvalhoNuno.Carvalho
Hi Pavit Kumar,
Object Contract has 2 lookup fields between the object Jogadores__c ,
The 2 lookup fields are Clube__c and Jogadores_representados__c,
But i think i need to get the Account id because in the object jogadores__c the Clube__c field is lookup for the accounts name.
Regards,
Nuno.

Zuinglio Lopes Ribeiro JúniorZuinglio Lopes Ribeiro Júnior
Olá Nuno,

Então o Clube__c em Jogadores é um campo Texto com o nome da Conta e no Contrato é um Lookup para Conta? Há meios de fazer funcionar, mas primeiro vamos analisar o cenário.

O objeto Jogadores possui alguma ligação lookup/master/detail com a Conta? Em caso negativo, teremos que buscar pelo nome da Conta o Id da mesma para passar para o Contrato. Além disso, se esse for o caso, você precisará garantir que as contas nunca repitam o nome, uma regra de validação resolve isso. 

E caso Jogadores não tenha uma ligação direta com a Conta, se permite, posso perguntar o porque? 

Att.
Nuno.CarvalhoNuno.Carvalho
Olá,
Sim o object Jogadores tem ligação com o object Conta através de outra lookup com os nomes dos clubes , o clube neste caso faz parte das minhas contas.
A minha principal dúvida é como ir buscar o id da conta, pois eu quero comparar valores entre o object Jogadores e Contract mas no entanto o valor que preciso de passar está no object Contas. 
Nuno.CarvalhoNuno.Carvalho
Olá Zuingllo,
Disse algo que não tenha entendido?
Se o fiz peço desculpa e que me faça as questões necessárias pois precisava mesmo disto.
Pavit SiddhuPavit Siddhu

Hello, Nuno
You have clube__c field on both objects and want same value on both fields, then use process builder field on Jogadores__c .
not get till that Jogadores_representados__c lookup for which object?