You need to sign in to do that
Don't have an account?
Cesar Ramirez Vasquez005391619375684564
Trigger not firing before insert ?? HELP
Hi i created a trigger that checks before inserting a record of type Factura__c, if the master-relationship field exist, and if it dont the trigger create a new one with the value contained in the field Empresa_Cliente__c.
The master relationship is between Factura__c (custom object) and Account. But when i try to save a record the trigger doesnt fire and i keep receiving the salesforce validation error (Error: No matches found.) in that field. Any suggestions this is my trigger :
trigger insertAcc on Factura__c (before insert) {
System.debug(Logginglevel.ERROR , ' ::::::: Empresa Cliente :::::::::::::' + trigger.New[0].Empresa_Cliente__c) ;
List<Account> a = [select name, CodigoNAF__c from account where CodigoNAF__c = :trigger.New[0].Empresa_Cliente__c];
System.debug(Logginglevel.ERROR , ' ::::::: List :::::::::::::' + a) ;
if (a == null){
Account acc = new Account();
acc.Name = trigger.New[0].Compania__c;
acc.CodigoNAF__c = trigger.New[0].Empresa_Cliente__r.CodigoNAF__c;
insert (acc);
System.debug(Logginglevel.ERROR , ' ::::::: acc :::::::::::::' + acc) ;
}
}
Just for information CodigoNAF__c is a custom field i created within Account object.
The master relationship is between Factura__c (custom object) and Account. But when i try to save a record the trigger doesnt fire and i keep receiving the salesforce validation error (Error: No matches found.) in that field. Any suggestions this is my trigger :
trigger insertAcc on Factura__c (before insert) {
System.debug(Logginglevel.ERROR , ' ::::::: Empresa Cliente :::::::::::::' + trigger.New[0].Empresa_Cliente__c) ;
List<Account> a = [select name, CodigoNAF__c from account where CodigoNAF__c = :trigger.New[0].Empresa_Cliente__c];
System.debug(Logginglevel.ERROR , ' ::::::: List :::::::::::::' + a) ;
if (a == null){
Account acc = new Account();
acc.Name = trigger.New[0].Compania__c;
acc.CodigoNAF__c = trigger.New[0].Empresa_Cliente__r.CodigoNAF__c;
insert (acc);
System.debug(Logginglevel.ERROR , ' ::::::: acc :::::::::::::' + acc) ;
}
}
Just for information CodigoNAF__c is a custom field i created within Account object.
He intentado entender un poco lo que deseabas hacer en tu trigger. Espero que el codigo que añado te sirva de ayuda :)
Creo que es esto lo que necesitas:
As you can see there are a lot of things that I was guessing only seen your code. This trigger that I implemented is bulkified in orde to process more than one Factura at the time.
Please notice that the code is only a sample code, it is working in my org with the assumptions that I had after read your code.
I would recomend too to have a look to :
https://www.salesforce.com/us/developer/docs/apexcode/Content/apex_triggers.htm
https://www.salesforce.com/us/developer/docs/apexcode/Content/apex_qs_trigger.htm
https://developer.salesforce.com/page/Best_Practice%3A_Bulkify_Your_Code
http://www.salesforce.com/us/developer/docs/apexcode/index_Left.htm
At the moment the trigger is creating an account when there is no accounts for the corresponding CogidosNAF.
Hope it helps as template as least.
If you have further queries let me know, I'll try to help.
Hasta pronto,
Carolina.
De hecho esa es la funcionalidad que estoy tratando de buscar que si el valor digitado en EmpresaCliente__c no existe que se cree uno nuevo.
Espero tu respuesta ! Muchas Gracias !
trigger insertAcc on Factura__c (before insert) {
System.debug(Logginglevel.ERROR , ' ::::::: Empresa Cliente :::::::::::::' + trigger.New[0].Empresa_Cliente__c) ;
if(Trigger.isBefore)
{
if(Trigger.isInsert)
{
List<Account> a = [select name, CodigoNAF__c from account where CodigoNAF__c = :trigger.New[0].Empresa_Cliente__c];
System.debug(Logginglevel.ERROR , ' ::::::: List :::::::::::::' + a) ;
if (a == null){
Account acc = new Account();
acc.Name = trigger.New[0].Empresa_Cliente__c;
acc.CodigoNAF__c = trigger.New[0].Empresa_Cliente__c;
insert (acc);
System.debug(Logginglevel.ERROR , ' ::::::: acc :::::::::::::' + acc) ;
}
}
}
}
Gracias.
Varias cositas a tener en cuenta :)
- Este trigger que me pones solamente funcionaría con la factura numero 1. Si hubiese mas facturas no las procesaria.
- Si haces un insert por cada Factura procesada, rapidamente te daras contra los gobernors limits.
Solucion a esto : Bulkification. El trigger que te pase usa mapas, hace 1 consulta para todas las facturas, y 1 insert para todas las facturas: https://developer.salesforce.com/page/Best_Practice%3A_Bulkify_Your_Code
- La consulta podria devolver mas de una cuenta
- Si las cuentas son menos que las empresa cliente que pasaria
- CodigoNAF que clase de campo es? Lookup? a que?
- IMPORTANTE Empresa_Cliente_c que clase de campo es? Es un master detail a Account?
Si es un Master detail a Account, eso significa que cada vez que crees una factura este campo debe tener valor. No puedes crear nuevos registros con este campo vacio. : http://www.salesforce.com/us/developer/docs/api/Content/relationships_among_objects.htm
- Si lo que quieres es que se cree factura independientemente de que el campo se rellene o no debes usar Lookup field.
- Si Empresa_Cliente_c es un master detail a Account guardara el Id de Account aunque en SF UI muestre el nombre, luego lo que puedes hacer para recoger las cuentas es [SELECT Id ,Name , CodigoNAF__c FROM Account where Id In :empresaClientes] siendo empresaClientes una lista de Ids que provienen de los campos Empresa_cliente de cada Factura.
- <<De hecho esa es la funcionalidad que estoy tratando de buscar que si el valor digitado en EmpresaCliente__c no existe que se cree uno nuevo.>> Como sabes que el valor digitado en EmpresaCliente no existe? No existe cuando la escoges en SF UI ?
- Aparte de trigger puedes echarle un vistazillo a Workflows que quizas te sirvan: http://help.salesforce.com/apex/HTViewHelpDoc?id=creating_workflow_rules.htm
Espero que te sirva , ya me cuentas :)
Hasta pronto,
Carolina.
Acabo de ver tus preguntas,
Parece que tu caso de negocio es :
Has implementado una UI ( VF + Controllador) para Factura. Esta factura tiene una Master- Detail a Account que se llama Empresa_Cliente.
Si dicha Account que se debe de guardar en Factura ( detail of Account) con CodigoNAF_c no existe se debe de crear.
Para ello, entonces antes de insertar la Factura debes comprobar que esa cuenta no existe -- eso lo debes hacer en tu controllador, y si no existe crearla en tu controllador.
una vez alli debes creada la cuenta, te creas tu factura por codigo , como creo lo estas haciendo y luego lo mandas a base de datos.
No necesitarias un trigger a no ser que quieras validar algo.
Recuerda!
- Governor limits :https://www.salesforce.com/us/developer/docs/apexcode/Content/apex_gov_limits.htm
- Bulkifica tu codigo
Si lo que realmente quieres es que todo se haga en el trigger debes de cambiar tu campo a Lookup.
Ahora si que si creo que todo tiene mas sentido :)
Ah! Echale un vistazo a este link, es sobre patrones de codigo te puede ayudar mucho a la hora de empezar a escibir codigo :)
https://github.com/financialforcedev/fflib-apex-common
Hasta pronto,
Carolina.
Entonces mi idea era hacer un trigger que checara si el Account existe y si no que creara uno nuevo y se lo asignara a la factura para que ninguna me rebote cuando haga la sincronizacion. El valor Empresa_Cliente__c (nombre del master-relationship en el objeto Factura__c) siempre tiene un valor nunca esta vacio per este valor apunta al codigo_NAF del Account; no se si me explico asi es esta mapeado en el dataloader Empresa_Cliente__c=Empresa_Cliente__r\:Codigo_NAF__c. Este campo es un master-detail porque ocupo los roll up summaries en varios reportes :( sino ya lo hubiera cambiado a lookup.
Gracias, espero tu respuesta !1