如何从 visualforce 页面上父对象的相关列表中保存子对象记录
how can I save child object record from related list of parent object on visualforce page
我想从 visualforce 页面上的相关客户对象列表中动态保存商机记录。为此:
- 我创建了一个 VF 页面,并在其中使用了页面块 table。
- 当我单击添加行时,会在 table 上创建一个新行,但是当我保存商机时,AccountName 字段在 table(相关列表)上显示为空白,并且该商机记录不会'保存在特定的帐户中。
我没有遇到实际问题,因为当我进行系统调试时,Account 和 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;
}}
我想指出您的代码中需要的几个问题和更改:
您帐户的默认保存方法是重定向到标准页面。如果需要,我们需要再次重定向到 visualforce 页面。
构造函数定义不明确,因为如果帐户 ID 不存在,它会查询所有机会。
在 addRow() 中,您先向机会列表添加一条记录,然后再初始化一条新的机会记录,这是不正确的。此外,我们无法在插入记录之前显示帐户名称。理想的解决方案是不要在机会列表中再次显示客户名称,因为我们在页面顶部有信息。我们可以link在保存机会的时候把机会记入账户。
在saveopp()中,你必须upsert account。
此外,结束日期是保存商机的必填字段。因此我们需要从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;
}
}
}
我想从 visualforce 页面上的相关客户对象列表中动态保存商机记录。为此:
- 我创建了一个 VF 页面,并在其中使用了页面块 table。
- 当我单击添加行时,会在 table 上创建一个新行,但是当我保存商机时,AccountName 字段在 table(相关列表)上显示为空白,并且该商机记录不会'保存在特定的帐户中。
我没有遇到实际问题,因为当我进行系统调试时,Account 和 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;
}}
我想指出您的代码中需要的几个问题和更改:
您帐户的默认保存方法是重定向到标准页面。如果需要,我们需要再次重定向到 visualforce 页面。
构造函数定义不明确,因为如果帐户 ID 不存在,它会查询所有机会。
在 addRow() 中,您先向机会列表添加一条记录,然后再初始化一条新的机会记录,这是不正确的。此外,我们无法在插入记录之前显示帐户名称。理想的解决方案是不要在机会列表中再次显示客户名称,因为我们在页面顶部有信息。我们可以link在保存机会的时候把机会记入账户。
在saveopp()中,你必须upsert account。
此外,结束日期是保存商机的必填字段。因此我们需要从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;
}
}
}