Recently I got a requirement on Triggers.Trigger should trow an error if we try to update an Account which contains child contacts. Update should be successful if Account does not contains any child Contacts. I felt some how difficulty in writing this trigger by considering governor limits and optimizing the use of collections but I managed to write the trigger successfully.. After writing this trigger I wanted to share it with others and here is the trigger. trigger AccountsWithContacts on Account (before update) { Set<Id> accWithContacts = new Set<Id>(); for(Contact c: [Select Id,Name,AccountId from Contact Where AccountId In: Trigger.NewMap.KeySet()]) { accWithContacts.add(c.AccountId); } for(Account acc:Trigger.New) { if(accWithContacts.Contains(acc.Id)) acc.addError('could not update Account with contacts'); } }
We have different components that supports displaying messages in a visual force page like <apex:message>,<apex:messages>,<apex:pageMessage> and <apex:pageMessages>. Let us see how each component behaves. Lets take some sample code to understand each component. We have not included any message components in the VF. <apex:page controller="MyRegisterCon2" sidebar="false" docType="HTML-5.0" > <apex:form > <apex:pageBlock > <apex:pageblockSection columns="1" > <apex:inputtext value="{!FirstName}" label="First Name" /> <apex:inputtext value="{!LastName}" label="Last Name" /> <apex:input value="{!Jdate}" label="DOB" type="date" /> <apex:inputtext value="{!Phone}" label="Phone" id="phone"/> </apex:pageblockSection> <apex:pageBlockButtons > <apex:commandButton value="submit" action="{!save}" /> </apex:pageBlockButtons> </apex:pageBlock> </apex:form> </apex:page> public with sharing class MyRegisterCon2 { public Date Jdate { get; set; } public Integer Phone { get; set; } public String LastName { get; set; } public String FirstName { get; set; } public PageReference save() { return null; }
}
Though phone and DOB are not strings it is not showing any errors when you click on submit.
<apex:message>:
This component is used to display warning or errormessage for a specific component. Change visualforce to following code. <apex:page controller="MyRegisterCon2" sidebar="false" docType="HTML-5.0" > <apex:form > <apex:pageBlock > <apex:pageblockSection columns="1" > <apex:message for="phone" /> <apex:inputtext value="{!FirstName}" label="First Name" /> <apex:inputtext value="{!LastName}" label="Last Name" /> <apex:input value="{!Jdate}" label="DOB" type="date" id="dob" /> <apex:inputtext value="{!Phone}" label="Phone" id="phone" /> </apex:pageblockSection> <apex:pageBlockButtons > <apex:commandButton value="submit" action="{!save}" /> </apex:pageBlockButtons> </apex:pageBlock> </apex:form>
</apex:page>
In above code I have included <apex:message for="phone" /> . Though we have given text for DOB and Phone fields the message is shown for only specific component. i.e. Phone. <apex:messages> Include above code in VF page it will display all the messages . If we observe styling was not applied to the messages. <apex:page controller="MyRegisterCon2" sidebar="false" docType="HTML-5.0" > <apex:form > <apex:pageBlock > <apex:pageblockSection columns="1" > <apex:messages /> <apex:inputtext value="{!FirstName}" label="First Name" /> <apex:inputtext value="{!LastName}" label="Last Name" /> <apex:input value="{!Jdate}" label="DOB" type="date" id="dob" /> <apex:inputtext value="{!Phone}" label="Phone" id="phone" /> </apex:pageblockSection> <apex:pageBlockButtons > <apex:commandButton value="submit" action="{!save}" /> </apex:pageBlockButtons> </apex:pageBlock> </apex:form>