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 error message 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>
</apex:page>
<apex:pageMessages>
The above component provides the SF styling for the messages.
<apex:page controller="MyRegisterCon2" sidebar="false" docType="HTML-5.0" >
<apex:form >
<apex:pageBlock >
<apex:pageblockSection columns="1" >
<apex:pageMessages />
<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>
<apex:pageMessage>
This component is used to dispaly custom messages with severity error,warning etc. in the VF page.
<apex:page controller="MyRegisterCon2" sidebar="false" docType="HTML-5.0" >
<apex:form >
<apex:pageBlock >
<apex:pageblockSection columns="1" >
<apex:pageMessage summary="This is page message" severity="warning" strength="3" />
<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>
Hope this will be helpful to understand differrent messages in VF.
Thanks,
Naveen.