2017-09-20 14 views
0

Visualforce 페이지에서 계정 개체의 관련 목록에서 기회 레코드를 동적으로 저장하려고합니다. 대상 :Visualforce 페이지에서 부모 개체의 관련 목록에서 자식 개체 레코드를 저장하는 방법

  • 페이지 블록 테이블을 사용한 VF 페이지를 만들었습니다.
  • 그리고 행 추가를 클릭하면 테이블에 새 행이 만들어 지지만 기회를 저장할 때 AccountName 필드가 테이블 (관련 목록)에 공백으로 표시되고 해당 기회 레코드가 특정 계정에 저장되지 않습니다.

내가 시스템 디버그를했을 때 계정 및 opplist가 saveopp()에 아무것도 표시하지 않기 때문에 실제 문제가 발생하지 않습니다. 나는 Accountid가 기회의 조회 필드로 가지 않을 것이라고 생각한다.

사람들이 나를 도와 주면 정말 고마워. 문제. 당신의 친절한 도움 :) 주셔서 감사합니다

**VF Page:-** 
<apex:page standardController="Account" extensions="taskDemo"> 
<apex:form > 
<apex:pageBlock title="" id="pb1" > 
<apex:pageBlockSection title="Assign" columns="2"> 
<apex:inputField value="{!Account.Name}"/> 
<apex:inputField value="{!Account.AccountNumber}"/> 
<apex:inputField value="{!Account.Phone}"/> 
<apex:inputField value="{!Account.Website}"/> 
<apex:commandButton value="updateRecord" action="{!save}"/> 
</apex:pageBlockSection> 
<apex:pageBlockTable value="{!oppList}" var="op"> 
     <apex:column headerValue="OpportunityName"> 
     <apex:inputField value="{!op.Name}"> 
     </apex:inputField> 
     </apex:column> 
     <apex:column headerValue="AccountName"> 
     <apex:inputField value="{!op.Account.Name}"></apex:inputField> 
     </apex:column> 
     <apex:column headerValue="Amount"> 
     <apex:inputField value="{!op.Amount}"> 
     </apex:inputField> 
     </apex:column> 
     <apex:column headerValue="StageName"> 
     <apex:inputField value="{!op.StageName}"> 
     </apex:inputField> 
     </apex:column> 
    </apex:pageBlockTable> 
<apex:commandButton value="saveopp" action="{!saveopp}"/> 
<apex:commandButton value="AddRow" action="{!addRow}" rerender="pb1"/> 
</apex:pageBlock> 
</apex:form> 
</apex:page> 

**Controller:-** 
public class taskDemo { 
public ApexPages.StandardController controller; 
public List<Opportunity> oppList{get; set;} 
public Account a{get; set;} 
public String accId{get;set;} 

public taskDemo(ApexPages.StandardController controller) { 
    a = new Account(); 
    accId = controller.getId(); 
    System.debug('accid is::'+accId); 
    oppList = [Select id,Name,Account.Name,Amount,StageName,CloseDate from 
       Opportunity where AccountId =: accId]; 
} 

public void addRow(){ 
    oppList.add(new Opportunity()); 
    Opportunity ts=new Opportunity(); 
    ts.AccountId = accId; 
    System.debug('addrow::'+ ts.AccountId); 
} 
public PageReference saveopp(){ 
    if(a.Name != null){ 
     insert a; 
     system.debug('a record is='+a); 
     List<Opportunity> con = new List<Opportunity>(); 

     for(Opportunity os : oppList) 
     { 
      os.AccountId = accId; 
      con.add(os); 
      system.debug('os record is='+os); 
     } 
     if(con != null){ 
      upsert oppList; 
      system.debug('opp record is='+oppList); 
     } 
    } 
    return null;   

}} 

답변

0

내가 코드에 필요한 문제와 변화의 몇 가지 지적하고 싶습니다

  1. 계정에 대한 저장 방법의 기본은 표준로 리디렉션됩니다 페이지. 필요한 경우 다시 visualforce 페이지로 리디렉션해야합니다.

  2. 계정 ID가없는 경우 모든 기회를 쿼리하므로 생성자가 잘 정의되지 않았습니다.

  3. addRow()에서 기회 레코드에 먼저 레코드를 추가 한 다음 올바르지 않은 새 기회 레코드를 초기화하려고합니다. 또한 레코드를 삽입하기 전에 계정 이름을 표시 할 수 없습니다. 가장 이상적인 솔루션은 기회 정보 목록에 계정 이름을 다시 표시하는 것이 아니라 페이지 상단에 정보가 있기 때문입니다. 우리는 기회를 구할 때 기회를 연결할 수 있습니다.

  4. saveopp()에서 계정을 upsert해야합니다.

  5. 마감 날짜는 기회를 저장하기위한 필수 필드입니다. 따라서 UI에서 정보를 가져와야합니다.

코드를 업데이트했습니다. 문의 사항이 있으시면 알려주십시오.

VF 페이지 :

<apex:page standardController="Account" extensions="taskDemo"> 
     <apex:form > 
     <apex:pageMessages /> 
     <apex:pageBlock title="" id="pb1" > 
     <apex:pageBlockSection title="Assign" columns="2"> 
      <apex:inputField value="{!Account.Name}"/> 
      <apex:inputField value="{!Account.AccountNumber}"/> 
      <apex:inputField value="{!Account.Phone}"/> 
      <apex:inputField value="{!Account.Website}"/> 
      <apex:commandButton value="updateRecord" action="{!upsertAccount}"/> 
     </apex:pageBlockSection> 
     <apex:pageBlockTable value="{!oppList}" var="op"> 
      <apex:column headerValue="OpportunityName"> 
      <apex:inputField value="{!op.Name}"> 
      </apex:inputField> 
      </apex:column> 
      <!--<apex:column headerValue="AccountName"> 
      <apex:inputField value="{!op.Account.Name}"></apex:inputField> 
      </apex:column>--> 
      <apex:column headerValue="Close date"> 
       <apex:inputField value="{!op.CloseDate}"/> 
      </apex:column> 
      <apex:column headerValue="Amount"> 
      <apex:inputField value="{!op.Amount}"> 
      </apex:inputField> 
      </apex:column> 
      <apex:column headerValue="StageName"> 
      <apex:inputField value="{!op.StageName}"> 
      </apex:inputField> 
      </apex:column> 
     </apex:pageBlockTable> 
     <apex:commandButton value="saveopp" action="{!saveopp}"/> 
     <apex:commandButton value="AddRow" action="{!addRow}" rerender="pb1"/> 
     </apex:pageBlock> 
     </apex:form> 
    </apex:page> 

에이펙스 확장 :

public class taskDemo { 
    public ApexPages.StandardController controller; 
    public List<Opportunity> oppList{get; set;} 
    public Account account{get; set;} 
    public String accId{get;set;} 

    public taskDemo(ApexPages.StandardController controller) { 
     try{ 
      account = new Account(); 
      account = (Account)controller.getRecord(); 
      if(account.Id != null){ 
       oppList = [Select id,Name,Account.Name,Amount,StageName,CloseDate from 
         Opportunity where AccountId =: account.Id]; 
       system.debug('Opportunities '+ oppList.size());  
      } 
      else{ 
       oppList = new List<Opportunity>(); 
      }  
     } 
     catch(Exception e){ 
      ApexPages.addMessage(new ApexPages.message(ApexPages.Severity.ERROR,e.getMessage())); 
     } 

    } 

    public void addRow(){ 
     oppList.add(new Opportunity()); 
    } 

    public pageReference upsertAccount(){ 
     Pagereference pg = Page.taskDemoPage;//please update taskDemoPage with the name of your vf page. 
     if(account.Name != null){ 
      upsert account; 
      pg.getParameters().put('Id',account.Id); 
      pg.setRedirect(true); 
     } 
     else{ 
      pg = null; 
     } 
     return pg; 
    } 

    public PageReference saveopp(){ 
     try{ 
      pageReference pg = Page.taskDemoPage;//please update taskDemoPage with the name of your vf page. 
      if(account.Name != null){ 
       upsert account; 
       pg.getParameters().put('Id',account.Id); 
       List<Opportunity> con = new List<Opportunity>(); 

       for(Opportunity os : oppList) 
       { 
        os.AccountId = account.Id; 
        con.add(os); 
        system.debug('os record is='+os); 
       } 
       if(con != null){ 
        upsert oppList; 
        system.debug('opp record is='+oppList); 
       } 
      } 
      pg.setRedirect(true); 
      return pg;    
     } 
     catch(Exception e){ 
      ApexPages.addMessage(new ApexPages.message(ApexPages.Severity.ERROR,e.getMessage())); 
      return null; 
     } 
    } 
} 
+0

는 @Shyam 나이 르 이제 코드가 난 정말 당신이 want..but 설명 할 수있는 fine..like 노력하고, 정말 고마워요 나 u hv 만든 변경 사항 ..? – Swarnika

+0

고마워요 @Pang 당신이 뭔가 편집했습니다. 설명해 주시겠습니까? – Swarnika

+0

안녕하세요 @ 스와 니카, 내가 변경 한 내용이 아래에 있습니다. –