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
Perspectiva Negócios DigitaisPerspectiva Negócios Digitais 

TEXT A DML EXCEPTION- NEED HELP!

Hi guys, I'm new with apex triggers, I created this trigger for an object that will only have insertions via imports .csv, and also that needs to be related to an account (field: patient_name__c), but when I'm inserting I'm having problems, I believe the trigger is wrong, can someone help me how to write correctly? 


The rule is that it should not be entered in the system when it does not find an account, that is, if it enters the "catch"(line 14), it should stop the trigger, (I tried with Exception but it continued the rest of the code instead of stopping).


My trigger:
trigger PacienteUtilizacao on Dados_Utiliza_o__c (before insert) {
    
	Account paciente;
    TUSS__c tuss;
    String restSplits;
    String firstSplit;
    String isEqual;
                                                     
    for(Dados_Utiliza_o__c utilizacao : Trigger.new)
    {
        if(utilizacao.CPF_do_Paciente__c != null && utilizacao.Nome_do_Paciente_Texto__c != null){
            try {        
                paciente = [SELECT Id, CPF__pc FROM Account WHERE CPF__pc = :utilizacao.CPF_do_Paciente__c LIMIT 1];
           	} catch (DmlException e) {
                System.debug(e.getMessage());    
            }
            
            if(paciente != null){  
                try {
                    utilizacao.Nome_do_Paciente__c = paciente.Id;
                    //se o segurado e o paciente forem o mesmo então é relacionado também
                    if (utilizacao.Nome_do_Paciente_Texto__c == utilizacao.Nome_do_Segurado_Texto__c){
                        isEqual = utilizacao.Nome_do_Paciente_Texto__c;
                        if(isEqual != null){
                            utilizacao.Nome_do_Segurado__c = paciente.Id;
                        }
                    }
                } catch (Exception e) {
                System.debug(e.getMessage());    
            }
            }
        }
        //trata o procedimento
        if(utilizacao.Procedimento_Codigo_Texto__c != null){
            try {        
                tuss = [SELECT Id,Name,Procedimento__c FROM TUSS__c WHERE Name = :utilizacao.Procedimento_Codigo_Texto__c LIMIT 1];  
            } catch (Exception e) {
                tuss = new TUSS__c();    
            }
            
            try {        
                if(utilizacao.Procedimento_Codigo_Texto__c != null){
                    tuss.Name = utilizacao.Procedimento_Codigo_Texto__c;
                    tuss.Procedimento__c = utilizacao.Descricao_Procedimento__c;
                    upsert tuss;
                    
                    utilizacao.C_digo_do_Procedimento__c = tuss.Id;
                    //preenchimento de Tipo de Procedimento
                    //consulta albulatorial
                    if(utilizacao.Procedimento_Codigo_Texto__c == '10101012' || 
                       utilizacao.Procedimento_Codigo_Texto__c == '10014' || 
                       utilizacao.Procedimento_Codigo_Texto__c == '88183038' || 
                       utilizacao.Procedimento_Codigo_Texto__c == '88199522' || 
                       utilizacao.Procedimento_Codigo_Texto__c == '88200111'){
                        utilizacao.Tipo_de_Procedimento__c = 'Consulta ambulatorial';
                    }
                    //consulta pronto socorro
                     if(utilizacao.Procedimento_Codigo_Texto__c == '10101039' || 
                       utilizacao.Procedimento_Codigo_Texto__c == '88183039' || 
                       utilizacao.Procedimento_Codigo_Texto__c == '70708143' || 
                       utilizacao.Procedimento_Codigo_Texto__c =='88199337' || 
                       utilizacao.Procedimento_Codigo_Texto__c == '10073'){
                        utilizacao.Tipo_de_Procedimento__c = 'Consulta pronto socorro';
                    }
                    //Para casos de Subtipo de Exames Simples
                    if(utilizacao.Procedimento_Codigo_Texto__c >= '40301010' && utilizacao.Procedimento_Codigo_Texto__c <= '40314235'){
                        utilizacao.Tipo_de_Procedimento__c = 'Exames simples';
                        utilizacao.Subtipo_de_Exame_Simples__c = 'Medicina laboratorial';
                    }
                    if(utilizacao.Procedimento_Codigo_Texto__c >= '40501019' && utilizacao.Procedimento_Codigo_Texto__c <= '40503259'){
                        utilizacao.Tipo_de_Procedimento__c = 'Exames simples';
                        utilizacao.Subtipo_de_Exame_Simples__c = 'Genética';
                    }
                    if(utilizacao.Procedimento_Codigo_Texto__c >= '40601102' && utilizacao.Procedimento_Codigo_Texto__c <= '40601293'){
                        utilizacao.Tipo_de_Procedimento__c = 'Exames simples';
                        utilizacao.Subtipo_de_Exame_Simples__c = 'Anatomia patológica e citopatologia';
                    }
                    if(utilizacao.Procedimento_Codigo_Texto__c >= '40701018' && utilizacao.Procedimento_Codigo_Texto__c <= '40711021'){
                        utilizacao.Tipo_de_Procedimento__c = 'Exames simples';
                        utilizacao.Subtipo_de_Exame_Simples__c = 'Medicina nuclear';
                    }
                    if(utilizacao.Procedimento_Codigo_Texto__c >= '40801128' && utilizacao.Procedimento_Codigo_Texto__c <= '40812103'){
                        utilizacao.Tipo_de_Procedimento__c = 'Exames simples';
                        utilizacao.Subtipo_de_Exame_Simples__c = 'Radiologia convencional';
                    }
                    if(utilizacao.Procedimento_Codigo_Texto__c >= '40813045' && utilizacao.Procedimento_Codigo_Texto__c <= '40814041'){
                        utilizacao.Tipo_de_Procedimento__c = 'Exames simples';
                        utilizacao.Subtipo_de_Exame_Simples__c = 'Radiologia intervencionista';
                    }
                    if(utilizacao.Procedimento_Codigo_Texto__c >= '40901181' && utilizacao.Procedimento_Codigo_Texto__c <= '40902129'){
                        utilizacao.Tipo_de_Procedimento__c = 'Exames simples';
                        utilizacao.Subtipo_de_Exame_Simples__c = 'Ultrassonografia';
                    }
                    if(utilizacao.Procedimento_Codigo_Texto__c >= '41001109' && utilizacao.Procedimento_Codigo_Texto__c <= '41002016'){
                        utilizacao.Tipo_de_Procedimento__c = 'Exames simples';
                        utilizacao.Subtipo_de_Exame_Simples__c = 'Tomografia computadorizada';
                    }
                    if(utilizacao.Procedimento_Codigo_Texto__c >= '41101170' && utilizacao.Procedimento_Codigo_Texto__c <= '41102010'){
                        utilizacao.Tipo_de_Procedimento__c = 'Exames simples';
                        utilizacao.Subtipo_de_Exame_Simples__c = 'Ressonância nuclear magnética';
                    }
                    if(utilizacao.Procedimento_Codigo_Texto__c >= '41301013' && utilizacao.Procedimento_Codigo_Texto__c <= '41501284'){
                        utilizacao.Tipo_de_Procedimento__c = 'Exames simples';
                        utilizacao.Subtipo_de_Exame_Simples__c = 'Outros';
                    }
                }
            } catch (Exception e) {
                System.debug(e.getMessage());    
            }
        }
    }
}



Test Class:
static testMethod void testSemContaInsereTuss()
    {   
        Integer quantidadePacientesInicial = [SELECT COUNT() FROM Account];
        System.assertEquals(quantidadePacientesInicial, 0);
        
        Integer tussAntes = [SELECT COUNT() FROM TUSS__c];
        System.assertEquals(tussAntes, 0);
        
        Integer utilizacaoAntes = [SELECT COUNT() FROM Dados_Utiliza_o__c];
        System.assertEquals(utilizacaoAntes, 0);
        
        Dados_Utiliza_o__c utilizacao = new Dados_Utiliza_o__c();      
        utilizacao.Nome_do_Segurado_Texto__c = 'Joelinton Barbosa Siqueira Gomes Freitas';
        utilizacao.Nome_do_Paciente_Texto__c = 'Joelinton Barbosa Siqueira Gomes Freitas';
        utilizacao.Sexo__c = 'Masculino';
        utilizacao.Data_de_Nascimento__c = Date.newInstance(1962, 12, 9);
        utilizacao.Procedimento_Codigo_Texto__c = '40601331';
        utilizacao.Descricao_Procedimento__c = 'Citológico anatomia patológica, qualquer material';
        utilizacao.CPF_do_Paciente__c = '615.830.252-00';
        insert utilizacao;
        
        Integer tussDepois = [SELECT COUNT() FROM TUSS__c];
        System.assertEquals(tussDepois, 0);
        
        Integer utilizacaoDepois = [SELECT COUNT() FROM Dados_Utiliza_o__c];
        System.assertEquals(utilizacaoDepois, 0);
        
        Integer quantidadePacientesPosterior = [SELECT COUNT() FROM Account];
        System.assertEquals(quantidadePacientesPosterior, 0);
    }
thank you for the attention!
Andrew GAndrew G
Greetings.

If we think about "What is a DML Exception?", we realise that the exception occurs when we do an insert, update, merge, delete or restore.  In this case, your code does a query which does not execute any DML operation.  Whilst zero records can be passed back, and that is a type of error, it doesn't quite match a DML exception.
An alternate option is create a custom exception class and throw that exception directly, not via a try...catch....
Example
trigger PacienteUtilizacao on Dados_Utiliza_o__c (before insert) {

    public class MyException extends Exception {}

    Account paciente;
    TUSS__c tuss;
    String restSplits;
    String firstSplit;
    String isEqual;
                                                      
    for(Dados_Utiliza_o__c utilizacao : Trigger.new)
    {
        if(utilizacao.CPF_do_Paciente__c != null && utilizacao.Nome_do_Paciente_Texto__c != null){
		Trigger.new[0].addError(new MyException('Data incomplete on record');
	} else {
 	//other processing
   }

Note the declaration of MyException class.
And that I test using an IF statement and Throw the custom exception at that time, and then put the SELECT query in the ELSE branch.

Note, there is a bulkification error in your code - you have a SELECT statement in your FOR loop.  This will cause a "too many SOQL" error if you are doing bulk uploads.  If you require access to the accounts related to the record, then do a query for all accounts by a broader criteria and pass to a Map, and then do a map.get(key) .

Example
trigger PacienteUtilizacao on Dados_Utiliza_o__c (before insert) {

    public class MyException extends Exception {}

    Account paciente;
    TUSS__c tuss;
    String restSplits;
    String firstSplit;
    String isEqual;

	list<String> listCPFPacientId = new list<String>();
    for(Dados_Utiliza_o__c utilizacao : Trigger.new){
            listCPFPacientId.add(utilizacao.CPF_do_Paciente__c);
	}

	map<Id,Account> mapAccounts = new Map<Id,Account>();
	for( Account account : [SELECT Id, CPF__pc FROM Account WHERE CPF__pc IN :listCPFPacientId ]) {
            mapAccounts.put(account.id,account);
        }	

                                                      
    for(Dados_Utiliza_o__c utilizacao : Trigger.new)
    {
        if(utilizacao.CPF_do_Paciente__c != null && utilizacao.Nome_do_Paciente_Texto__c != null){
		Trigger.new[0].addError(new MyException('Data incomplete on record');
	} else {
  		paciente = mapAccounts.get(utilizacao.CPF_do_Paciente__c);

 	//other processing
   }
}
note, both code samples are not compiled, so no guarantees on syntax, but they should point you in the right direction.


HTH

Andrew