1

We have a unique field on an object, populated by workflow (datestamp + userId), which prevents a user from submitting two records on the same day. I'd like to display an error message on the visualforce input page, but the normal error message approaches don't seem to be working. Is there some special way I need to display this error? Here is my controller:

    public class NewDailyForecast {

        public Daily_Forecast__c fc {get;set;}
        public String userId {get;set;}
        public Date todayDate {get;set;}
        public String dailyType {get;set;}
        public String weeklyType {get;set;}
        public String fName {get;set;}
        public double fAmount {get;set;}
        public String recType {get;set;}
        public List<Daily_Forecast__c> thisWeekDaily {get;set;}
        public List<Daily_Forecast__c> thisWeekWeekly {get;set;}
        public List<Daily_Forecast__c> checkUnique {get;set;}

        //set up controller & extension for vf page
        ApexPages.StandardSetController setCon;

        public NewDailyForecast(ApexPages.StandardSetController controller) {
            setCon = controller;
        }

        public void getValues(){
            //get logged in user
            userId = UserInfo.getUserId();
            system.debug('userId '+userId);

            //get today's date
            todayDate = system.today();
            system.debug('todayDate '+todayDate);

            //get record type
            dailyType = [SELECT Id FROM RecordType WHERE Name = 'Daily Forecast'].Id;
            weeklyType = [SELECT Id FROM RecordType WHERE Name = 'Weekly Forecast'].Id;
            system.debug('dailyType '+dailyType);
            system.debug('weeklyType '+weeklyType);

            fName = userId + todayDate;

            fAmount=0;

            //new forecast record on page
            fc = new Daily_Forecast__c (RecordTypeId = dailyType, Date__c = todayDate, Forecast_Amount__c = fAmount, User__c = userId);
            system.debug('fc '+fc);

            //list of related forecast records
            thisWeekDaily = new List<Daily_Forecast__c>([SELECT Id, Date__c, User__c, User__r.UserRole.Name, User__r.Territory__c, Forecast_Amount__c, RecordTypeId, RecordType.Name 
                    FROM Daily_Forecast__c WHERE User__c = :userId AND Date__c = THIS_WEEK AND RecordTypeId = :dailyType ORDER BY Date__c ASC]);
            system.debug('thisWeekDaily '+thisWeekDaily);
            thisWeekWeekly = new List<Daily_Forecast__c>([SELECT Id, Date__c, User__c, User__r.UserRole.Name, User__r.Territory__c, Forecast_Amount__c, RecordTypeId, RecordType.Name 
                    FROM Daily_Forecast__c WHERE User__c = :userId AND Date__c = THIS_WEEK AND RecordTypeId = :weeklyType ORDER BY Date__c ASC]);        
            system.debug('thisWeekWeekly '+thisWeekWeekly);        
        }

        public PageReference saveRecord(){
        //error catching method 1: build list to match existing and throw error if list>0
        //this doesn't work
            checkUnique = new List<Daily_Forecast__c>([SELECT Id, Date__c, User__c FROM Daily_Forecast__c WHERE Date__c = :fc.Date__c AND User__c = :fc.User__c]);
    /*        if(checkUnique.size()>0){
                system.debug('checkUnique '+checkUnique);
                ApexPages.Message myFatalMsg = new ApexPages.Message(ApexPages.Severity.FATAL,'Duplicate record created. Please try again');
                ApexPages.addMessage(myFatalMsg);
                system.debug('fatal error '+myFatalMsg);
                ApexPages.Message myErrorMsg = new ApexPages.Message(ApexPages.Severity.ERROR,'Error Message');
                ApexPages.addMessage(myErrorMsg);
                system.debug('error '+myErrorMsg);
            }
            insert fc;
    */
            //error catching method 2: try insert and catch exception
            //This doesn't work either
            try {
                insert fc;
            }
            catch(DMLException e)
            {
                for(Daily_Forecast__c df :thisWeekDaily){
                    df.addError('Duplicate entry not allowed');
                }
                system.debug(e);
                ApexPages.addMessages(e);
                ApexPages.Message myFatalMsg = new ApexPages.Message(ApexPages.Severity.FATAL,'Duplicate record created. Please try again');
                ApexPages.addMessage(myFatalMsg);
                return null;
            }
            return new pageReference( '/' + fc.id );
        }
    }

And vf page:

<apex:page standardController="Daily_Forecast__c" extensions="NewDailyForecast" recordSetVar="forecasts" tabStyle="Daily_Forecast__c" sidebar="false" action="{!getValues}">
        <apex:form >
        <apex:pageblock >
          <apex:messages />

        </apex:pageblock>        
        <apex:pageBlock title="Create New Forecast" mode="edit">
                <apex:pageBlockButtons >
                    <apex:commandButton value="Save" action="{!saveRecord}" rerender="error"/>
                    <apex:commandButton value="Cancel" action="{!cancel}"/>
                </apex:pageBlockButtons>
            <apex:pageBlockSection >
                <apex:inputField label="Forecast Type" value="{!fc.RecordTypeId}" id="recType" />
                <apex:inputField label="Amount" value="{!fc.Forecast_Amount__c}" id="fAmount" />
                <apex:inputField label="User Name" value="{!fc.User__c}" id="fUser" />
                <apex:inputField label="Date" value="{!fc.Date__c}" id="fDate" />
            </apex:pageBlockSection>
        </apex:pageBlock>
        <apex:pageBlock title="This Week's Forecast">
            <apex:pageBlockSection >
                <apex:pageBlockTable id="thisWeek" value="{!thisWeekDaily}" var="d" >
                    <apex:column headerValue="Day"><apex:outputText value="{0, date, EEEE}">
                            <apex:param value="{!d.Date__c}" /> 
                        </apex:outputText></apex:column>
                    <apex:column headerValue="Forecast Amount"><apex:outputField value="{!d.Forecast_Amount__c}"/></apex:column>
                    <apex:column headerValue="Type"><apex:outputField value="{!d.RecordType.Name}" /></apex:column>
                </apex:pageBlockTable>
                <apex:pageBlockTable id="thisWeekWeekly" value="{!thisWeekWeekly}" var="w" >
                    <apex:column headerValue="Day"><apex:outputText value="{0, date, EEEE}">
                            <apex:param value="{!w.Date__c}" /> 
                        </apex:outputText></apex:column>
                    <apex:column headerValue="Forecast Amount"><apex:outputField value="{!w.Forecast_Amount__c}"/></apex:column>
                    <apex:column headerValue="Type"><apex:outputField value="{!w.RecordType.Name}" /></apex:column>
                </apex:pageBlockTable>            
            </apex:pageBlockSection>
        </apex:pageBlock>
        </apex:form>
    </apex:page>

What is the correct way to catch and display the unique/duplicate error message on the vf page? Without any error handling i get the expected INSERT FAILED error screen, which is not user-friendly. With the exception catching above, no message shows at all. How can I program the exception handling to display a user-friendly error message? Thanks in advance.

3

The <apex:commandButton> that calls your save method, where you trap exceptions and present them as page messages, has a rerender attribute pointed at an id that doesn't exist ("error"). This will rerender nothing, so your page doesn't react to the addition of error messages.

If you ensure that your <apex:pageMessages /> element is within a rerendered entity, or simply remove the rerender and return null from your save method, you should see messages appear.

Adding error messages using addMessage() and rendering them with an <apex:pageMessages /> component is a good, standard approach that's very user-friendly.

  • I've got another problem now - how do I update the save method if the user changes the User__c field on the page via lookup? The controller is trying to save with the logged in user even if the name is changed on the page. – Jean Grey Mar 22 '18 at 16:00
  • @JeanGrey, please post a new question if you have a separate issue so others can also weigh in (and consider accepting answers that solve your questions, you have several that are open). – David Reed Mar 22 '18 at 16:06

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.