3

I have a custom object with a visualforce page, 2 controllers, and a custom button. The issue is if I use the "Save & New" custom button my validation for a field won't show the error on my page. However if I use the standard Save button it will. The "Save & New" WILL the exception if I don't fill out a required field.

Validation:

Rule Name No_Test_Validation
Active Checked

Error Condition Formula AND(ISPICKVAL(Result__c ,"No Test"), ISBLANK(Testing_Notes__c))

Error Message WARNING! If test result is "No Test" you need to enter Testing Notes

Visualforce Page:

<apex:page standardController="Test__c" showheader="True"><apex:pagemessages / ><apex:form >
<apex:sectionHeader title="{!$ObjectType.Test__c.label}" subtitle="{!Test__c.name}"/>
    <apex:pageBlock title="{!$ObjectType.Test__c.label} Detail" >

        <apex:pageBlockButtons >   
                    <apex:commandButton action="{!save}" value="Save"/>
                    <apex:commandButton action="{!cancel}" value="Cancel"/>   
           </apex:pageBlockButtons>

        <apex:pageBlockSection title="Edit Test Info" showHeader="true" columns="2">

                <apex:pageBlockSectionItem >
                    <apex:outputLabel value="Test Number" />
                    <apex:outputfield value="{!Test__c.Test_Number__c}" />
                </apex:pageBlockSectionItem>

                <apex:pageBlockSectionItem >
                    <apex:outputLabel value="Inspection Id" />
                    <apex:outputfield value="{!Test__c.Inspection__c}" />
                </apex:pageBlockSectionItem>

                <apex:pageBlockSectionItem >
                </apex:pageBlockSectionItem>  

                <apex:pageBlockSectionItem >
                    <apex:outputLabel value="Type of Test" />
                    <apex:inputfield value="{!Test__c.Type_of_Test__c}" />
                </apex:pageBlockSectionItem>

                <apex:pageBlockSectionItem >
                    <apex:outputLabel value="Test Value" />
                    <apex:inputField value="{!Test__c.Test_Value__c}" />
                </apex:pageBlockSectionItem>

                <apex:pageBlockSectionItem >
                </apex:pageBlockSectionItem>  

                <apex:pageBlockSectionItem >
                    <apex:outputLabel value="Result" />
                    <apex:inputField value="{!Test__c.Result__c}" />
                </apex:pageBlockSectionItem>

                <apex:pageBlockSectionItem >
                </apex:pageBlockSectionItem> 

                <apex:pageBlockSectionItem >
                    <apex:outputLabel value="Test Unit Id #" />
                    <apex:inputField value="{!Test__c.Test_Unit_ID__c}" />
                </apex:pageBlockSectionItem>  

                <apex:pageBlockSectionItem >
                    <apex:outputLabel value="Testing Notes" />
                    <apex:inputField value="{!Test__c.Testing_Notes__c}" />
                </apex:pageBlockSectionItem>



        </apex:pageBlockSection>

        <apex:pageBlockSection showHeader="false" columns="2">
            <apex:outputField value="{!Test__c.CreatedById}"/>
            <apex:outputField value="{!Test__c.LastModifiedById}"/>
        </apex:pageBlockSection>

    </apex:pageBlock> 
    </apex:form>  

Controller:

public with sharing class ButtonSaveAndNew {
    private Test__c foo;
    private ApexPages.StandardController sController;
    private String queryString;

    public ButtonSaveAndNew (ApexPages.StandardController controller) {
        sController = controller;
        foo = (Test__c)controller.getRecord();

        // Keep track of any inbound query string parameters so they can be passed along when creating a new record
        List<string> pageUrl = ApexPages.currentPage().getUrl().split('\\?');
        queryString = pageUrl[1];
    }

    public PageReference saveAndNew() {


        try {
            // Save the current sObject
            sController.save();
            // Get the Meta Data for Foo__c
            Schema.DescribeSObjectResult describeResult = sController.getRecord().getSObjectType().getDescribe();
            // Create PageReference for creating a new sObject and add any inbound query string parameters.
            PageReference pr = new PageReference('/' + describeResult.getKeyPrefix() + '/e?' + queryString);
            // Don't redirect with the viewstate of the current record.
            pr.setRedirect(true);
            return pr;
        } catch(Exception e) {
            // Don't redirect if something goes wrong. May be a validation or trigger issue on save.
            ApexPages.addMessages(e);
            return null;
        }
    }
}

Second Controller

public class getTotalTests {
    ApexPages.StandardController sController;

    public getTotalTests(ApexPages.StandardController controller) {
        sController = controller;
        system.debug('TotalTestLoad');
    }

    public Integer getTests(){
        Test__c record = (Test__c)scontroller.getRecord();
        List<Test__c> t = [SELECT Id, Inspection__c
                                  FROM Test__c 
                                  WHERE Inspection__c = :record.Inspection__c];
            Integer numb = t.size() +1;
            return numb;
    }
}
  • Does it save the value in database even there is a validation? – Ashwani Jan 26 '17 at 17:07
  • No if there is a validation error it does not save, it refreshes the page, no errors displayed, and wipes what you entered. – SkottyP Jan 26 '17 at 17:20
1

StandardController#save does not throw an exception; instead, it acts more like a DML operation with allOrNone set to false (i.e. allows partial saves). It simply returns null on a validation error. You could write your code as follows:

if(sController.save() != null) { // Saved okay
    // Get the Meta Data for Foo__c
    Schema.DescribeSObjectResult describeResult = sController.getRecord().getSObjectType().getDescribe();
    // Create PageReference for creating a new sObject and add any inbound query string parameters.
    PageReference pr = new PageReference('/' + describeResult.getKeyPrefix() + '/e?' + queryString);
    // Don't redirect with the viewstate of the current record.
    return pr.setRedirect(true);
}
return null;
  • Amazing! Thanks for taking the time to help and explain why! – SkottyP Jan 26 '17 at 19:41

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.