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
AmberTaylorAmberTaylor 

Issue with Controller (DML inside constructor)

Hi there, 

I have an issue : 
I had a DML statement inside my constructor and my code worked just fine when trying to test cases by myself. But when i tried to login as another user i discovered my huge mistake, and tried to correct it. Unfortunately, I'm not successful. So that's why i need help to figure out the best way to achieve this : 

Here is MyVFP :
<apex:page controller="OC_CreationDeclarationEquipements"  sidebar="false" tabStyle="OC_FormulaireDeclaEquip__c">
    <style type="text/css">
        .noEquip {
          text-align: center;
          font-weight: bold;
          font-size: 20px;
        }
        
        .MyBtn{
            text-decoration:none;
            padding:4px;
        }
        
        .customPopup {
            background-color: white;
            border-style: solid;
            border-width: 2px;
            left: 20%;
            padding: 10px;
            position: absolute;
            z-index: 9999;
            width: 500px;
            top: 20%;
        }
        
        .popupBackground{
            background-color:black;
            opacity: 0.20;
            filter: alpha(opacity = 20);
            position: absolute;
            width: 100%;
            height: 100%;
            top: 0;
            left: 0;
            z-index: 9998;
        }
        
        .imgclass:hover{   
            background-image: url(/img/help/helpOrbs.gif);   
            background-repeat: no-repeat;   
            width: 16px;   
            height: 15px;      
            background-position: right;   
          
        }  
        
        .imgclass{   
            background-image: url(/img/help/helpOrbs.gif);   
            background-repeat: no-repeat;   
            width: 16px;   
            height: 15px;   
        }  
        
        .closeButton {
            float: right;
        }
        
        h1 {
          font-size: 24px;
          text-shadow: -1px -1px #eee, 1px 1px #888, -3px 0 4px #000;
          color:black;
          padding:16px;
          font-weight:lighter;
          text-align:center;
          display:inline;
          line-height:92px;
        }
        
        .innerText {
            font-size: 18px;
            padding:16px;
            margin-right:16px;
        }
    </style>  
        
         

        <apex:pageMessages id="msg"></apex:pageMessages>
        <apex:pageBlock id="newDeclaration" title="Création d'une déclaration d'équipement"  rendered="{!declarationMere.TECH_IsSubmitted__c == false}">
            
                <apex:pageBlockButtons >
                    <apex:form >
                        <apex:commandButton action="{!validate}" value="Valider ma déclaration" rendered="{!haveEquip}" style="padding:6px;"/>
                    </apex:form>
                </apex:pageBlockButtons>
                            
            <!-- Current User Infos 1rst Co-->
            <apex:pageBlockSection collapsible="false" columns="2" rendered="{!haveDeclaration ==false}">
                <apex:outputText value="{!nouvelleDeclaration.Nom__c}" label="Nom Complet"/>
                <apex:outputText value=" {!nouvelleDeclaration.DateDeclaration__c}" label="Date de la déclaration"></apex:outputText>
                <apex:outputText value=" {!nouvelleDeclaration.Matricule__c}" label="Matricule"></apex:outputText>
                <apex:outputText value=" {!nouvelleDeclaration.CodeUnite__c}" label="Code unité"></apex:outputText>
                <apex:outputText value=" {!nouvelleDeclaration.NomManager__c}" label="Responsable"></apex:outputText>
                <apex:outputText value=" {!nouvelleDeclaration.LibelleUnite__c}" label="Libellé unité"></apex:outputText>
                <apex:outputText value=" {!nouvelleDeclaration.MatriculeManager__c}" rendered="true"></apex:outputText>
                <apex:outputText value=" {!nouvelleDeclaration.Responsable__c}" rendered="false" ></apex:outputText>
            </apex:pageBlockSection>
            
            <!-- Current User Infos - Existing declaration -->
            <apex:pageBlockSection collapsible="false" columns="2" rendered="{!haveDeclaration==true}">
                <apex:outputText value="{!declarationMere.Nom__c}" label="Nom Complet"/>
                <apex:outputText value=" {!declarationMere.DateDeclaration__c}" label="Date de la déclaration"></apex:outputText>
                <apex:outputText value=" {!declarationMere.Matricule__c}" label="Matricule"></apex:outputText>
                <apex:outputText value=" {!declarationMere.CodeUnite__c}" label="Code unité"></apex:outputText>
                <apex:outputText value=" {!declarationMere.NomManager__c}" label="Responsable"></apex:outputText>
                <apex:outputText value=" {!declarationMere.LibelleUnite__c}" label="Libellé unité"></apex:outputText>
                <apex:outputText value=" {!declarationMere.MatriculeManager__c}" rendered="false"></apex:outputText>
                <apex:outputText value=" {!declarationMere.Responsable__c}" rendered="false" ></apex:outputText>
            </apex:pageBlockSection>
            
            <!-- Equipements Ajout -->
            <apex:form >
               
            
            <apex:pageBlockSection id="newEquip" title="Ajout d'un équipement" columns="1" >                
                <apex:pageBlockSection >
                    <apex:pageblockSectionItem >
                    <apex:outputLabel value="Type d'équipement" for="equipType"></apex:outputLabel>
                    <apex:actionRegion >
                        <apex:inputField value="{!newEquipement.TypeEquipement__c}" label="Type d'équipement" required="{!requiredType}" id="equipType" >
                            <apex:actionSupport event="onchange" action="{!onChangeValue}" rerender="op1, msg"/> 
                        </apex:inputField>
                    </apex:actionRegion>
                    </apex:pageblockSectionItem>
                </apex:pageBlockSection>

                <apex:pageBlockSection id="op1">
                        <apex:pageBlockSectionItem rendered="{!renderOP2}">
                            <apex:outputPanel >
                                <apex:outputLabel value="{!$ObjectType.OC_Equipement__c.fields.NumeroSerie__c.label}" />
                                <apex:commandButton id="showSerialNumber" image="/img/func_icons/util/help16.png" style="width:5%;padding:0; border:0px;" rerender="popUpSerialNumber" action="{!showPopup}" immediate="true"/>
                            </apex:outputPanel>
                            <apex:inputField id="serialNumber" label="Numéro de série" value="{!newEquipement.NumeroSerie__c}"  required="{!requiredOP2}"></apex:inputField>
                        </apex:pageBlockSectionItem>
                    
                        <apex:inputField id="phoneNumber" label="Numéro de téléphone" value="{!newEquipement.NumeroTelephone__c}" rendered="{!renderOP3}" required="{!requiredOP3}"></apex:inputField>   
                    
                        <apex:pageBlockSectionItem rendered="{!renderOP3}">
                            <apex:outputPanel >
                                <apex:outputLabel value="{!$ObjectType.OC_Equipement__c.fields.NumeroIMEIiPhone__c.label}" />
                                <apex:commandButton id="showImei" image="/img/func_icons/util/help16.png" style="width:5%;padding:0; border:0px;" rerender="popUpIMEI" action="{!showPopup}" immediate="true"/>
                            </apex:outputPanel>
                            <apex:inputField id="imeiNumber" label="Numéro IMEI" value="{!newEquipement.NumeroIMEIiPhone__c}" required="{!requiredOP3}"></apex:inputField>
                        </apex:pageBlockSectionItem>
                        
                        <apex:pageBlockSectionItem rendered="{!renderOP4}">
                            <apex:outputPanel >
                                <apex:outputLabel value="{!$ObjectType.OC_Equipement__c.fields.NumeroSIL__c.label}" />
                                <apex:commandButton id="showSIL" image="/img/func_icons/util/help16.png" style="width:5%;padding:0; border:0px;" rerender="popUpNoSIL" action="{!showPopup}" immediate="true"/>
                            </apex:outputPanel>
                            <apex:inputField id="SILNumber" label="Numéro SIL" value="{!newEquipement.NumeroSIL__c}" required="{!requiredOP4}"></apex:inputField>
                        </apex:pageBlockSectionItem>
                        
                </apex:pageBlockSection>  
                <apex:outputText value="{!newEquipement.DateCreation__c}" rendered="false"></apex:outputText>       
            </apex:pageBlockSection>
             
                
            <!-- POPUP D'AIDE pour le NO SIL-->
            <apex:outputPanel id="popUpNoSIL" title="Où trouver le Numéro SIL ?">
                <apex:outputPanel styleClass="popupBackground" layout="block" rendered="{!displayPopUp}"/>
                    <apex:outputPanel styleClass="customPopup" layout="block" rendered="{!displayPopUp}">
                        <apex:commandButton value="X" title="Fermer la fenêtre" action="{!closePopup}" styleClass="closeButton" rerender="popUpNoSIL" immediate="true"> </apex:commandButton><br/>
                        <h1>
                            Où trouver le numéro SIL ?
                        </h1>
                        <apex:outputPanel styleClass="innerText" layout="block">Merci d'indiquer le numéro sur 7 chiffres mentionné après les caractères SIL sur l’autocollant, comme sur la photo suivante :</apex:outputPanel>
                        <br/>
                        <apex:image id="imageSIL" value="{!$Resource.OC_HelpSIL}" style="width:100%;" />
                        <br/><br/><br/>
                        <apex:commandButton value="Compris !" action="{!closePopup}" rerender="popUpNoSIL" immediate="true" style="margin-left: 45%; padding:6px;"/>
                    </apex:outputPanel>
            </apex:outputPanel>
            
            <!-- POPUP D'AIDE pour le NO de série  -->
            <apex:outputPanel id="popUpSerialNumber">
                <apex:outputPanel styleClass="popupBackground" layout="block" rendered="{!displayPopUp}"/>
                    <apex:outputPanel styleClass="customPopup" layout="block" rendered="{!displayPopUp}">
                        <apex:commandButton value="X" title="Fermer la fenêtre" action="{!closePopup}" styleClass="closeButton" rerender="popUpSerialNumber" immediate="true"> </apex:commandButton><br/>
                        <h1>
                            Où trouver le numéro de série ?
                        </h1><br/>
                        <apex:outputPanel styleClass="innerText" layout="block"> Merci d'indiquer le numéro de série figurant sur l’autocollant, comme sur la photo suivante : </apex:outputPanel>  <br/><br/>
                        <apex:image id="imageSerialNumber" value="{!$Resource.OC_HelpSerialNumber}" style="width:100%;" />
                        <br/><br/><br/>
                        <apex:commandLink styleClass="btn" value="Compris !" action="{!closePopup}" rerender="popUpSerialNumber" immediate="true" style="margin-left: 45%; padding:6px; text-decoration: none;background-color:lightblue;"/>
                    </apex:outputPanel>
            </apex:outputPanel>
            
            <!-- POPUP D'AIDE pour le NO IMEI -->
            <apex:outputPanel id="popUpIMEI" >
                <apex:outputPanel styleClass="popupBackground" layout="block" rendered="{!displayPopUp}"/>
                    <apex:outputPanel styleClass="customPopup" layout="block" rendered="{!displayPopUp}">
                        <apex:commandButton value="X" title="Fermer la fenêtre" action="{!closePopup}" styleClass="closeButton" rerender="popUpIMEI" immediate="true"> </apex:commandButton><br/>
                        <h1 >
                            Où trouver le numéro IMEI ?
                        </h1><br/>
                        <apex:outputPanel styleClass="innerText" layout="block"> Afin de trouver le numéro IMEI de votre appareil, rendez-vous dans : <br/> Réglages > Général > Informations <br/> Descendez un peu plus pas sur la page et saississez le numéro IMEI comme sur la photo ci-après : </apex:outputPanel>  <br/><br/>
                        <apex:image id="imageIMEI" value="{!$Resource.OC_HelpIMEI}" style="width:100%;" />
                        <br/><br/><br/>
                        <apex:commandButton value="Compris !" action="{!closePopup}" rerender="popUpIMEI" immediate="true" style="margin-left: 45%; padding:6px;"/>
                    </apex:outputPanel>
            </apex:outputPanel>
                
                <div style="align:center;"> 
                    <apex:commandButton id="BtnAddEquip" value="Ajouter l'équipement" action="{!save}" status="AddEquip" style="padding:6px;"/>
                </div>
            </apex:form>
            
            <!-- Equipements Consultation -->
            <apex:form >
            <apex:pageBlockSection title="Équipements détenus" collapsible="false" columns="1">
                 <apex:pageblockTable value="{!listEquipementsEnft}" var="equipements" rendered="{!haveEquip == true}">              
                        <apex:column value="{!equipements.TypeEquipement__c}" headerValue="Type d'équipement"></apex:column>        
                        <apex:column value="{!equipements.NumeroSIL__c}" headerValue="Numéro SIL"></apex:column>
                        <apex:column value="{!equipements.NumeroSerie__c}" headerValue="Numéro de série"></apex:column> 
                        <apex:column value="{!equipements.NumeroIMEIiPhone__c}" headerValue="Numéro IMEI"/>  
                        <apex:column value="{!equipements.NumeroTelephone__c}" headerValue="Numéro de téléphone" />  
                        <apex:column value="{!equipements.DateCreation__c}" headerValue="Date de création"></apex:column> 
                        <apex:column headerValue="Actions" >
                            <apex:commandLink styleClass="btn MyBtn" value=" Modifier" onclick="return openPopup('/apex/OC_EditEquipement?id={!equipements.id}');" /> 
                            <apex:commandLink styleClass="btn MyBtn"  value=" Supprimer" action="{!deleteRecord}" onclick="if(!confirm('Êtes-vous sûr(e) de  vouloir supprimer cet équipement ?')) return false;">
                                <apex:param name="equipmentId" value="{!equipements.id}" assignTo="{!selectedEquipement}"/>
                            </apex:commandLink>
                        </apex:column>          
                 </apex:pageblockTable>
                
                <apex:pageBlockSectionItem rendered="{!haveEquip == false}">
                    <div class="noEquip">Vous n'avez pas encore ajouté d'équipement
                    </div>
                </apex:pageBlockSectionItem>
             </apex:pageBlockSection> 
            </apex:form>
      </apex:pageBlock>
    
      <apex:pageBlock id="consultDeclaration" title="Consultation de votre déclaration d'équipement" rendered="{!declarationMere.TECH_IsSubmitted__c == true}">
          
            <!-- Current User Infos - Existing declaration -->
            <apex:pageBlockSection collapsible="false" columns="2" rendered="{!haveDeclaration}">
                <apex:outputText value="{!declarationMere.Nom__c}" label="Nom Complet"/>
                <apex:outputText value=" {!declarationMere.DateDeclaration__c}" label="Date de la déclaration"></apex:outputText>
                <apex:outputText value=" {!declarationMere.Matricule__c}" label="Matricule"></apex:outputText>
                <apex:outputText value=" {!declarationMere.CodeUnite__c}" label="Code unité"></apex:outputText>
                <apex:outputText value=" {!declarationMere.NomManager__c}" label="Responsable"></apex:outputText>
                <apex:outputText value=" {!declarationMere.LibelleUnite__c}" label="Libellé unité"></apex:outputText>
                <apex:outputText value=" {!declarationMere.MatriculeManager__c}" rendered="false"></apex:outputText>
                <apex:outputText value=" {!declarationMere.Responsable__c}" rendered="false" ></apex:outputText>
            </apex:pageBlockSection>

            <!-- Equipements Consultation -->
                <apex:pageBlockSection title="Équipements détenus" collapsible="false" columns="1">
                     <apex:pageblockTable value="{!listEquipementsEnft}" var="equipements" rendered="{!haveEquip == true}">              
                            <apex:column value="{!equipements.TypeEquipement__c}" headerValue="Type d'équipement"></apex:column>        
                            <apex:column value="{!equipements.NumeroSIL__c}" headerValue="Numéro SIL"></apex:column>
                            <apex:column value="{!equipements.NumeroSerie__c}" headerValue="Numéro de série"></apex:column> 
                            <apex:column value="{!equipements.NumeroIMEIiPhone__c}" headerValue="Numéro IMEI"/>  
                            <apex:column value="{!equipements.NumeroTelephone__c}" headerValue="Numéro de téléphone" />  
                            <apex:column value="{!equipements.DateCreation__c}" headerValue="Date de création"></apex:column>       
                     </apex:pageblockTable>
                </apex:pageBlockSection> 
      </apex:pageBlock>
</apex:page>

Here is my controller : 
public class OC_CreationDeclarationEquipements {
    //INFOS USER & Equipement
    public User declarant {get; set;}
    Public Boolean haveDeclaration {get; set;}
    Public Boolean haveEquip {get; set;}
    public OC_FormulaireDeclaEquip__c nouvelleDeclaration {get;set;}
    public OC_Equipement__c newEquipement {get;set;}
    public list<OC_Equipement__c> listEquipementsEnft{get;set;}
    public User manager {get; set;}
    public string selectedEquipement { get; set; }
    public OC_FormulaireDeclaEquip__c declarationMere{get;set;}
    public String selectedRT{get;set;} // selected value of type picklist
    public boolean renderOP2 {get; set;}// true -> show op2
    public boolean renderOP3 {get; set;}// true -> show op3
    public boolean renderOP4 {get; set;}// true -> show op4
    public boolean requiredOP2{get;set;} // true -> field in op2 is required
    public boolean requiredOP3{get;set;}// true -> fields in op3 are required
    public boolean requiredOP4{get;set;}// true -> field in op4 is required
    public boolean requiredType {get; set;}
    public boolean displayPopup{get; set;} // true => Shop popup
    public boolean exectuteDML {get; set;}
    
    
    //Constructeur
    Public OC_CreationDeclarationEquipements() {
        //Set EquipementType field to mandatory
        requiredType = true;
        
        //Search for current user Informations
        declarant = [Select ID, Name, EmployeeNumber, Email, Matricule_responsable__c,Matricule__c,Entit_niveau_304045__c, Libel_Entit_304045__c from USER where id=:UserInfo.getUserId()];
        System.debug('<====== declarant value = '+ declarant +'=======>');
        
        //search his manager        
        manager = [Select Id, Name, Matricule__c from User where Matricule__c = :declarant.Matricule_responsable__c];
        System.debug('<====== manager value = '+manager+'=======>');
        
        //this list is null
        List<OC_FormulaireDeclaEquip__c > lst = [SELECT Id, CreatedById,User__c
                                                 FROM OC_FormulaireDeclaEquip__c 
                                                 WHERE User__c = :Userinfo.getUserId() ];
        System.debug('<====== lst value = '+lst+'=======>');
        
        If (lst.size()>0){
         	haveDeclaration = true;
            // Query objet parent
            nouvelleDeclaration = new OC_FormulaireDeclaEquip__c();
            nouvelleDeclaration = [SELECT  Id,
                                       Name,
                                       Nom__c,
                                       Email__c,
                                       Matricule__c,
                                       MatriculeManager__c,
                                       Commentaire__c,
                                       Responsable__c,
                                       DateDeclaration__c,
                                       NomManager__c,
                               		   CodeUnite__c,
                                	   LibelleUnite__c,
                               		   User__c,
                               		   TECH_IsSubmitted__c
                   FROM OC_FormulaireDeclaEquip__c
                   WHERE User__c =:Userinfo.getUserId() OR Matricule__c =:declarant.Matricule__c limit 1];           
        } else {
            haveDeclaration = false;
            //instanciation de la déclaration si l'utilisateur courant n'a pas encore créé la sienne (toute première ouverture de l'objet)
        	nouvelleDeclaration = new OC_FormulaireDeclaEquip__c (Responsable__c = manager.Id,NomManager__c = manager.Name,CodeUnite__c = declarant.Entit_niveau_304045__c,LibelleUnite__c = declarant.Libel_Entit_304045__c,DateDeclaration__c = System.Now(), Nom__c = declarant.Name, Email__c = declarant.Email, MatriculeManager__c = declarant.Matricule_responsable__c, Matricule__c = declarant.Matricule__c);
       		System.debug('<====== haveDeclaration value = '+haveDeclaration+'=======>');
        }
      	
		//Instanciation équipement        
        newEquipement = new OC_Equipement__c(DateCreation__c = System.Now());

        // Query objet enfant
        listEquipementsEnft = new list<OC_Equipement__c> ();
        listEquipementsEnft = [SELECT ID,
                                      Name,
                                      NumeroTelephone__c,
                               		  NumeroSIL__c,
                                      TypeEquipement__c,
                                      NumeroSerie__c,
                                      NumeroIMEIiPhone__c,
                                      DateCreation__c
                               FROM OC_Equipement__c
                               WHERE DeclarationEquipement__r.User__c =:UserInfo.getUserId()];
        
        if(listEquipementsEnft.size()>0) {
            haveEquip = true;
        } else {
            haveEquip = false;
        }
    }
    
    
    
    public Pagereference save() {
        
        List<OC_Equipement__c> insertEquip = new List<OC_Equipement__c>();  
        System.debug('<====== haveDeclaration value = '+haveDeclaration+'=======>');
        if(haveDeclaration == false) {
            System.debug('<====== nouvelleDeclaration value = '+nouvelleDeclaration+'=======>');
            insert nouvelleDeclaration;
        }
        
            //Création des enregistrements d'équipements rattachés à la déclaration + redirection vers page de réca
            newEquipement.DeclarationEquipement__c = nouvelleDeclaration.ID;
        	System.debug('<====== insertedDeclaration id value = '+nouvelleDeclaration+'=======>');
        	System.debug('<====== newEquip value filled with parentId = '+newEquipement.DeclarationEquipement__c+'=======>');
        	
            insert newEquipement;
        	System.debug('<====== newEquipement inserted value = '+newEquipement+'=======>');
            PageReference pr = new PageReference('/apex/OC_CreationDeclarationEquipements');
        	pr.setRedirect(true);
            return pr;
    }
    
    public Pagereference validate() {
            //Mise à jour de la déclaration afin qu'elle ne soit plus modifiable en cochant le champ TECH_IsSubmitted__c 
            nouvelleDeclaration.TECH_IsSubmitted__c = true;
        	System.debug('<====== declarationMere value = '+declarationMere+'=======>');
        	System.debug('<====== nouvelleDeclaration value = '+nouvelleDeclaration+'=======>');
            update nouvelleDeclaration;
            PageReference pr = new PageReference('/apex/OC_CreationDeclarationEquipements');
        	pr.setRedirect(true);
            return pr;
    }
    
     public PageReference deleteRecord() {
        selectedEquipement = ApexPages.CurrentPage().getParameters().get('equipmentId');
        System.debug('<====== selectedEquipement value = '+selectedEquipement+'=======>');
        OC_Equipement__c deleteRcd = [SELECT Id from OC_Equipement__c where Id = :selectedEquipement limit 1 ];
        System.debug('<====== deleteRcd = ' + deleteRcd + '=======>');

            try{
                delete deleteRcd;
            }
            catch(DmlException ex){
                ApexPages.addMessages(ex);
            }
        
               
        PageReference pr = new PageReference('/apex/OC_CreationDeclarationEquipements');
        pr.setRedirect(true);
        return pr;
    }
    
    //Check value selected on field type equipment to render spécific fields
    public void onChangeValue(){
        selectedRT = newEquipement.TypeEquipement__c;
        
        switch on selectedRT {
   			when '' { 
                renderOP2 = false;
                requiredOP2=false;
                
                renderOP3 = false;
                requiredOP3 = false;
                
                renderOP4 = false;
                requiredOP4 =false;
   			}
   			when 'iPhone', 'iPad' {
       			renderOP2 = false;
                requiredOP2=false;
                
                renderOP3 = true;
                requiredOP3=true;
                
                renderOP4 = false;
                requiredOP4=false;
   			}
            when 'Copieur Multifonctions','Imprimante' { 
                renderOP2 = true;
                requiredOP2 = true;
                
                renderOP3 = false;
                requiredOP3 = false;
                
                renderOP4 = false;
                requiredOP4 = false;
   			}
   			when else {
       			renderOP2 = false;
                requiredOP2 = false;
                
                renderOP3 = false;
                requiredOP3 = false;
                
                renderOP4 = true;
                requiredOP4 = true;
   			}
		}
    }
    
    //Custom PopUp for Help Texts
    public void closePopup() {        
        displayPopup = false;    
    }   
    
    public void showPopup() {        
        displayPopup = true;    
    }
}

What I want to do here is : 

When an user first click on the object Tab, a declaration is inserted (Only one declaration by user is allowed). => right now my issue is there.

Ty in advance for your help 
Amber