You need to sign in to do that
Don't have an account?

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 :
Here is my controller :
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
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