2

テキスト フィールドを持つ VF ページ フォームがあります。このテキスト フィールドの値は、既存の商談カスタム フィールドと比較されます。このテキスト フィールドの値が商談に存在する場合は、先に進んで新しいレコードを作成します。

Apex テストクラスを作成する場合を除いて、すべてうまくいきます。

商談を作成し、カスタム フィールドの値をハード コードする必要があります。残念ながら、このフィールドは書き込み可能ではありません。

以前にこの問題に遭遇した人はいますか?

これは私が得ているエラーです: Error: Compile Error: Field is not writeable: Opportunity.Deal_Registration_ID__c at line 9 column 103

以下は私のApexクラスです。

私のテストクラスは一番下にあります。

どんな助けでも大歓迎です。

乾杯!ロンメル

public with sharing class VaultVF {

public Vault__c vault {get; set;}
public List<String> errorMsgs {get; set;}
public String saveResult {get; set;}
public String dealReg {get; set;}
public String oppId {get; set;}
public String email {get; set;}
public Boolean scenario1{get; set;}
public Boolean scenario2{get; set;}
public Boolean scenario3{get; set;}

// Generates country dropdown from country settings 

public List<SelectOption> getCountriesSelectList() {
    List<SelectOption> options = new List<SelectOption>();
    options.add(new SelectOption('', '-- Select One --'));        

    // Find all the countries in the custom setting 

    Map<String, Country__c> countries = Country__c.getAll();

    // Sort them by name 

    List<String> countryNames = new List<String>();
    countryNames.addAll(countries.keySet());
    countryNames.sort();

    // Create the Select Options. 

    for (String countryName : countryNames) {
        Country__c country = countries.get(countryName);
        options.add(new SelectOption(country.Two_Letter_Code__c, country.Name));
    }
    return options;
}

//Constructor, set defaults
public VaultVF(ApexPages.StandardController controller) {

    vault = (vault__c)controller.getRecord();

    //Populate list of random characters for CAPTCHA verification
    characters = new List<String>{'a','b','c','d','e','f','g','h',
        'i','j','k','m','n','p','q','r','s','t','u','v','w',
        'x','y','z','1','2','3','4','5','6','7','8','9'
    };

    errorMsgs = new List<String>();

}

//Determine if page has error so errors message can be displayed
public boolean getHasErrors(){
    if(ApexPages.hasMessages() == true){
        if(errorMsgs == null){
            errorMsgs = new List<String>();             
        }

        //Loop through errors and add to a list
        for(ApexPages.Message m : ApexPages.getMessages()){
            if(m.getSummary().startsWith('Uh oh.')){
                errorMsgs.add(String.valueOf(m.getSummary()));
            }
        }
    }
    return ApexPages.hasMessages();     
}

public void save(){
    errorMsgs = new List<String>();

    //Make sure captcha was correct
    if(validateCAPTCHA() == false){
        errorMsgs.add('Verification code was incorrect.');
        captchaInput = '';
    }

    //Make sure the Scenario is selected        
    if(scenario1 == true){
        vault.Scenario__c = 'BIG-IP as a Firewall';
    }else if(scenario2 == true){
        vault.Scenario__c = 'BIG-IP providing firewall service in conjunction with other vendors';
    }else if(scenario3 == true){
        vault.Scenario__c = 'BIG-IP front ending Firewalls';
        if(vault.Load_Balancer_is_a_Firewall__c == null){
           errorMsgs.add('Please specify if the load balancer is a firewall.');
        }
        if(vault.Providing_DDos_Connection__c == null){
           errorMsgs.add('Please specify if this is providing DDos connection level protection for firewalls or both.');
        }
        if(vault.Providing_DDos_protection_except_ASM__c == null){
           errorMsgs.add('Please specify if we are providing DDos protection (except ASM).');
        }
        if(vault.No_Traffic_Traverse__c == null){
           errorMsgs.add('Please specify if there is Traffic that does not traverse the Firewalls.');
        }
        if(vault.Firewall_Vendor_Name__c == null){
           errorMsgs.add('Please specify a Firewall Vendor.');
        }
    } else {
        errorMsgs.add('Please select one of three Scenarios that is similar to your setup');
    }     

    //-----Need to make sure deal registration number on opportuntiy is valid.-----

    //Set some sort of is valid deal reg flag to false. We will assume the deal reg Id entered is invalid until we determine it is valid
    vault.isValidDealReg__c = false;

    //Query Account Id, and Deal_Registration_Id__c from the opportunity object where the deal registration Id equals the value entered in the form
    List<Opportunity> opps = [select Id, Deal_Registration_ID__c from Opportunity where Deal_Registration_ID__c = :vault.Deal_Registration__c];

    //check to see if  registration id on the opp match the entered value    
    if(opps.size() > 0 && opps[0].Deal_Registration_ID__c == vault.Deal_Registration__c){

    //If they do match set the valid deal reg Id flat to true
        vault.isValidDealReg__c = true;
        vault.Related_Opp__c = opps[0].Id;

    //If they don't match then query all contacts on the account related to the opportunity
    }

    //If is valid deal reg flag is false add a message to the errorMSgs list indicated the entered
    //deal registration is not valid with details on who they should contact
    if(errorMsgs.size()>0){
        //stop here
    } else if(vault.isValidDealReg__c == false){
        errorMsgs.add('Deal Registration # was incorrect. Please contact your representative.');
    } else {
        try{
            vault.Status__c = 'Application Received';
            insert vault;
            saveResult = 'success';

        }catch(exception e){
            ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.FATAL, 'Uh oh. Something didn\'t work quite right. Please contact partners@f5.com for assistance. \n\n' + e.getMessage()));                
            saveResult = 'fail';
        }
    }

}

//------------------------Code for CAPTCHA verification----------------------------
public String captchaInput {get; set;}
List<String> characters;
String char1; 
String char3; 
String char5;

//This methods simply returns a random number between 0 and the size of the character list
public Integer randomNumber(){
    Integer random = Math.Round(Math.Random() * characters.Size());
    if(random == characters.size()){
        random--;
    }
    return random;
}

/*Here we have 6 get methods that return 6 random characters to the page.
For chars 1,3, and 5 (the black characters) we are saving the the values so 
that we can compare them with the user's input */
public String getChar1(){
    char1 = characters[randomNumber()];
    return char1;
}
public String getChar2(){
    return characters[randomNumber()];
}
public String getChar3(){
    char3 = characters[randomNumber()];
    return char3;
}
public String getChar4(){
    return characters[randomNumber()];
}
public String getChar5(){
    char5 = characters[randomNumber()];
    return char5;
}
public String getChar6(){
    return characters[randomNumber()];
}

public String correctAnswer(){
    return char1 + char3 + char5;   
}

public Boolean validateCAPTCHA(){
    if(captchaInput.length() == 3 && captchaInput.subString(0,1) == char1 && captchaInput.subString(1,2) == char3 && captchaInput.subString(2,3) == char5){
        return true;
    }else{
        return false;
    }
}

}

以下はテストクラスです

@isTest
public class VaultVFTEST {

/*This tests the VaultVF class on the Vault__c object*/

static testMethod void VaultVFTEST() {

    //Create opp, hardcode the Deal_Registration_Id__c field with 'x111111111' and insert opp
    Opportunity opp = new Opportunity(Name='test opp', StageName='stage', Deal_Registration_Id__c='x111111111', Probability = 95, CloseDate=system.today());
    insert opp;

    //Create and insert Vault record
    Vault__c vault = new Vault__c(
        Deal_Registration__c = 'x111111111',
        Scenario__c = 'BIG-IP front ending Firewalls',
        isValidDealReg__c = true,
        Status__c = 'Application Received',
        Load_Balancer_is_a_Firewall__c = 'Yes',
        Providing_DDos_Connection__c = 'Firewalls',
        Providing_DDos_protection_except_ASM__c = 'Yes',
        No_Traffic_Traverse__c = 'Yes',
        Firewall_Vendor_Name__c = 'Firewall Vendor Company',
        First_Name__c = 'Test First Name',
        Last_Name__c = 'Test Last Name',
        Company_Name__c = 'Test Company Name',
        Phone__c = '(206) 946-3126',
        Email__c = 'test@email.com',
        Country__c = 'United States',
        Additional_Info__c = 'Test Additional Info',
        Related_Opp__c = opp.Id
    );

    //Now insert the vault record to invoke the VaultVF class
    Test.startTest();
    insert vault;
    Test.stopTest();

    //Assertion Testing - Check to make sure the Deal_Registration__c value
    //matches the Deal_Registration_Id__c value of the related opportunity
    for(Vault__c v : [select Id, Deal_Registration__c from Vault__c where Deal_Registration__c IN :vault]){
        system.assertEquals(v.Deal_Registration__c, opp.Deal_Registration_Id__c);
    }
}
}
4

1 に答える 1

1

フィールドのOpportunity.Deal_Registration_ID__c種類は?数式項目または自動付番の場合、Apex から書き込み可能ではありません。

一般的に、このようなシナリオでは、商談を (このフィールドを設定せずに) 挿入し、挿入が成功した後にデータベースから読み戻す必要があります。自動番号の場合 - 魔法が自然に発生します (ただし、ある種のライセンス番号を連続して偽造するのが最善のアイデアだとは言いません ;))、数式フィールドの場合 - すべてを設定したことを確認してください挿入前の計算で使用されるフィールド。

したがって、次のようなものがうまくいくはずです:

Opportunity opp = new Opportunity(Name='test opp', StageName='stage', Probability = 95, CloseDate=system.today());
insert opp;
opp = [SELECT Id, Name, Deal_Registration_ID__c FROM Opportunity WHERE Id = :opp.Id];

// Optionally - make sure value was set
System.assertNotEquals(null, opp.Deal_Registration_ID__c);
System.assert(opp.Deal_Registration_ID__c.length() > 0); // if it's a String

Vault__c vault = new Vault__c(
    Deal_Registration__c = opp.Deal_Registration_ID__c ,
    Scenario__c = 'BIG-IP front ending Firewalls',
    isValidDealReg__c = true,
    Status__c = 'Application Received',
    Load_Balancer_is_a_Firewall__c = 'Yes',
    Providing_DDos_Connection__c = 'Firewalls',
    Providing_DDos_protection_except_ASM__c = 'Yes',
    No_Traffic_Traverse__c = 'Yes',
    Firewall_Vendor_Name__c = 'Firewall Vendor Company',
    First_Name__c = 'Test First Name',
    Last_Name__c = 'Test Last Name',
    Company_Name__c = 'Test Company Name',
    Phone__c = '(206) 946-3126',
    Email__c = 'test@email.com',
    Country__c = 'United States',
    Additional_Info__c = 'Test Additional Info',
    Related_Opp__c = opp.Id
);
于 2013-01-08T06:45:15.543 に答える