2012-04-02 24 views
0

私は2つのカスタムオブジェクトを持っています: 'Package'と 'Order'。 'Order'には 'Package'フィールドとその他のフィールドが含まれます。 1つのテーブルで複数の「Order」インスタンスに異なるフィールド値を指定する必要があります。 'Order'オブジェクトは、テーブル(ID = null)にレンダリングされたときにデータベースに格納されず、 'Package'オブジェクトとの関係は読み取り専用です。問題は、入力されたすべてのデータを適切な「Order」オブジェクトにバインドする方法です。Visualforce:単一テーブルから複数のsObjectを作成する方法

私は以下の視覚力源を持っています。 OrderとPaticular Packageの関係を指定するために隠しフィールドを追加する必要があるかもしれませんが、私はそれを正しく行う方法を理解していません。 SObjectの複数のタイプを扱うとき、私はStandardSetControllerに行かないだろう

public class OrdersController { 

public String X12NC { get; set; } 

public String productType { get; set; } 

public List<max__Order__c> orders = new List<max__Order__c>();  

public Set<max__Order__c> ordered{ get; set; } 

public Integer orderedNumber { get { return ordered.size(); } } 

public OrdersController() { 
    System.debug(Logginglevel.INFO, 'Start constructor'); 
    this.X12NC = ApexPages.currentPage().getParameters().get('x12nc'); 
    this.productType = ApexPages.currentPage().getParameters().get('productType'); 
    this.ordered = new Set<max__Order__c>(); 
    System.debug(Logginglevel.INFO, 'productType = ' + this.productType); 
    System.debug(Logginglevel.INFO, 'x12nc = ' + this.X12NC); 
}  

public ApexPages.StandardSetController conn { 
    get {    
     if (conn == null) { 
      System.debug(Logginglevel.INFO, 'Creating new connection!'); 
      String pType = this.productType == null ? '%': '%' + this.productType + '%'; 
      String x12nc = this.x12nc == null ? '%': '%' + this.x12nc + '%'; 

      System.debug(Logginglevel.INFO, 'pType = ' + pType); 
      System.debug(Logginglevel.INFO, 'x12nc = ' + x12nc); 
      conn = new ApexPages.StandardSetController(Database.getQueryLocator([ 
       select name, max__X12NC__c, max__Product_Description__c, max__Expected__c, max__Stock__c, max__Product_Status__c, max__Max_Qty__c from max__Package__c 
       where max__X12NC__c like :x12nc  
       and name like :pType     
       limit 2000 
      ])); 
      conn.setPageSize(20);     
     } 
     return conn; 
    } 

    set; 
} 

// Initialize setCon and return a list of records 
public List<max__Order__c> getProducts() { 
    System.debug(Logginglevel.INFO, 'getProducts() call'); 
    orders.clear(); 
    for (max__Package__c pckg: (List<max__Package__c>) conn.getRecords()) { 
     max__Order__c order = new max__Order__c(max__Package__r = pckg); 
     orders.add(order); 
    } 

    return orders; 
} 

public PageReference search() { 
    System.debug(Logginglevel.INFO, 'Call search method!'); 
    this.ordered.clear(); 
    this.conn = null; 
    return null; 
} 

public PageReference makeOrder() { 
    System.debug(Logginglevel.INFO, 'Make order'); 
    for (max__Order__c order: orders) { 
     System.debug(Logginglevel.INFO, 'Inspecting order = ' + order); 
     if (order.amount__c != null && order.amount__c > 0) { 
      System.debug(Logginglevel.INFO, 'Add ' + order + ' to shopping cart'); 
      System.debug(Logginglevel.INFO, 'Order package = ' + order.package__c); 
      ordered.add(order); 
     } 
    } 

    System.debug('The number of objects added in shopping cart: ' + ordered.size()); 
    return null; 
} 
+0

明確にするために、1つの注文で1つのパッケージしか持てないと言うのは正しいですか? 1ページに複数の注文を表示していますか? –

+0

1.はい、1つの注文には1種類のパッケージが含まれています。 2.はい、すべての注文を1つのページに1つのテーブルで表示したいと思います。 – Maxim

答えて

0

<apex:pageBlockTable value="{!products}" var="product"> 
      <apex:column headerValue="Product Type"> 
       <apex:outputLink value="/{!product.Package__r.ID}">{!product.Package__r.name}</apex:outputLink> 
      </apex:column> 
      <apex:column value="{!product.package__r.X12NC__c}"/> 
      <apex:column value="{!product.package__r.Product_Description__c}"/> 
      <apex:column value="{!product.package__r.Stock__c}"/> 
      <apex:column value="{!product.package__r.Expected__c}"/> 
      <apex:column value="{!product.package__r.Product_Status__c}"/>     
      <apex:column value="{!product.package__r.Max_Qty__c}"/>     
      <apex:column headerValue="Quantity">      
       <apex:inputField value="{!product.amount__c}"/> 
      </apex:column> 
     </apex:pageBlockTable> 
     <apex:commandButton value="Make order" action="{!makeOrder}"/> 

また、私のコントローラのフラグメントを参照してください。私は自分のクラスでApexを自分自身で管理することを検討したいと思いますcombines both

+0

StandardSetControllerは、改ページ機能のために便利です。 – Maxim

関連する問題