Apex: 用VF页面实现同时插入一个Account和多个Contact(V1.0)

Hi,陌生的朋友,欢迎来看我的笔记,如果你觉得对你有帮助,千万记得点个赞哦~ 不过其实我也只是个小白,目前在自学Java和Salesforce,所以如果你发现任何有遗漏错误的地方,欢迎交流指正!

一、需求阐述

这个Task的需求非常简单,就是要求写一个页面,在这个页面上可以新建Account和Contact,并且每个Account可以对应多个Contact。

二、逻辑梳理

简单分析之后,我们发现要实现这个功能,页面中至少要包括三个Button:Add,Delete,Save。

  • Add:用于添加多条Contact。
  • Delete:删除Contact,显示在每一条Contact之后。
  • Save:保存。

这个程序最核心的逻辑是:一个Account有多个Contact。如何实现呢?非常简单!即在做插入操作之前,把页面中所有的Contact的AccountId字段赋值为当前Account的Id。

其次是删除的逻辑:我们会通过一个内部类,实现在添加Contact的时候有一个数字与之对应。在点击删除按钮时,我们把这个数字通过传到后台,然后程序找到对应的Contact,并把它从Contact列表remove掉。

三、代码实现

1.Controller

public with sharing class addContact {

    ApexPages.StandardController sc;
    public Account acct{set; get;}
    public Integer marker = 2;
    public Integer selectedContact{set; get;}
    public List lContacts{get; set;}

    public addContact(ApexPages.StandardController controller){
        this.acct = (Account)controller.getRecord();
        sc = controller;
        lContacts = new List();
        Contact c = new Contact();
        lContacts.add(new WrapperClass(c, 1));
    }

    public PageReference addAContact(){
        Contact c = new Contact();
        lContacts.add(new WrapperClass(c, marker));
        marker = marker + 1;
        return null;
    }

    public PageReference saveAccount(){
        Database.SaveResult sr = Database.insert(acct, false);
        Id idey = sr.getId();
        List contacts = new List();
        for (WrapperClass wc : lContacts){
            Contact c = new Contact();
            c.LastName = wc.c.LastName;
            c.FirstName = wc.c.FirstName;
            c.AccountId = idey;
            contacts.add(c);
        }
        insert contacts;
        return null;
    }

    public PageReference deleteContact(){
        Integer x = -1;
        for (WrapperClass wc : lContacts){
            x++;
            if (wc.counter == selectedContact) {
                System.debug('-->selected contact:' + selectedContact + ' position:' + x);
                break;
            }
        }
        lContacts.remove(x);
        return null;
    }

    public class WrapperClass{
        public Integer counter{get; set;}
        public Contact c{get; set;}
        public WrapperClass(Contact cntc, Integer i){
            this.counter = i;
            this.c = cntc;
        }
    }
}

2.VF Page


    
        
            Account Name
        
        
            
                First Name:
                Last Name:
                Lead Source:
                
                    
                
            
        
        
        
    

3.效果

实在有点丑-_- 不过功能都实现啦~其他的之后再改进吧!

四、知识点回顾

1.PageReference

A PageReference is a reference to an instantiation of a page. Among other attributes, PageReferences consist of a URL and a set of query parameter names and values.

PageReference的作用 :

  • 查看或设置页面的参数的值
  • 导航到新的页面(很明显,在下面的代码中,PageReference的作用是导航到新的页面)

如何实例化一个页面?

  • Page.existingPageName
  • PageReference pageRef = new PageReference('partialURL');
  • PageReference pageRef = new PageReference('fullURL');
  • PageReference pageRef = ApexPages.currentPage();

下面的代码中return null表示在触发了addAContact这个方法之后,返回到当前的页面(刷新当前的页面)。

public PageReference addAContact(){
        Contact c = new Contact();
        lContacts.add(new WrapperClass(c, marker));
        marker = marker + 1;
        return null;
    }

更多用法请参考官方文档PageReference Class。

2.

Basically the apex:param tag is used to pass values from the Visualforce Page to the Apex Controller.

的作用:

  • 把参数从VF页面传到Controller

常见实例:删除记录

下列表格显示了在数据库中的潜在客户,当用户点击Delete按钮时,相应的记录就会从数据库中删除。


Apex: 用VF页面实现同时插入一个Account和多个Contact(V1.0)_第1张图片

代码实现:

public class ApexParamDemoController{
    //Property to hold the Id of the Record to be Deleted
    public Id RecordToDelete {get; set;}
    
    //Query all the Leads from the Database
    public List AllLeads{
        get{ return [SELECT Id, Name FROM Lead]; }
    }
    
    //Delete the Record from the Database
    public void deleteRecord(){
        DELETE new Lead(Id = RecordToDelete);
    }
}

  
    
      
        
        
          
            
          
        
      
    
  

同理,在本次试验中,会通过assignTo属性把该条记录的counter值传给controller中的变量selectedContact。用户在触发deleteContact后,程序会遍历contact列表中的所有记录,如果某条记录的counter和selectedContact相等,就删除这条记录并刷新页面。

 
   

public PageReference deleteContact(){
    Integer x = -1;
      for (WrapperClass wc : lContacts){
          x++;
          if (wc.counter == selectedContact) {
              System.debug('-->selected contact:' + selectedContact + ' position:' + x);
              break;
          }
      }
      lContacts.remove(x);
      return null;
}

更多用法请参考官方文档apex:param。

五、总结

懒得写了~~


参考:https://success.salesforce.com/answers?id=90630000000hfRmAAI

你可能感兴趣的:(Apex: 用VF页面实现同时插入一个Account和多个Contact(V1.0))