2012-04-02 4 views
0

Ich habe 2 benutzerdefinierte Objekte: 'Paket' und 'Bestellung'. "Bestellung" enthält das Feld "Paket" und einige andere Felder. Ich muss verschiedene Feldwerte für mehrere "Order" -Instanzen in einer Tabelle angeben. Das 'Auftrags' -Objekt wird nicht in der Datenbank gespeichert, wenn es in der Tabelle gerendert wird (ID = null), und seine Beziehung zum 'Paket' -Objekt ist schreibgeschützt. Die Frage ist, wie man alle eingegebenen Daten an richtige 'Order'-Objekte bindet.Visualforce: wie man mehrere sObjects aus der einzelnen Tabelle erstellt

Ich habe die folgende Visualforce-Quelle. Vielleicht sollte ich ein verstecktes Feld hinzufügen, um die Beziehung zwischen Bestellung und Paket anzugeben, aber ich verstehe nicht, wie man es richtig macht.

<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}"/> 

Auch Fragment meines Controllers sehen:

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

Um zu klären, ist es richtig zu sagen, eine Bestellung kann nur ein Paket haben? Zeigen Sie mehrere Bestellungen pro Seite an? –

+0

1. Ja, eine Bestellung enthält einen einzigen Pakettyp. 2. Ja, ich möchte alle Bestellungen in einer Tabelle auf einer einzigen Seite anzeigen. – Maxim

Antwort

0

ich nicht mit StandardSetController gehen würde, wenn sie mit mehr als einer Art von SObject handelt. Ich würde in Erwägung ziehen, die Apex selbst in meiner eigenen Klasse zu verwalten, die combines both.

+0

StandardSetController ist aufgrund der Paginierungsfunktion praktisch. – Maxim