2012-01-08 32 views
16

Tôi đã đi qua các tài liệu SOQL, nhưng không thể tìm thấy truy vấn để lấy tất cả các dữ liệu hiện trường của một thực thể nói, tài khoản, nhưSalesforce SOQL: truy vấn để lấy tất cả các trường trên thực thể

select * from Account [ SQL syntax ] 

Có một cú pháp như trên trong SOQL để lấy tất cả dữ liệu của tài khoản, hoặc cách duy nhất là liệt kê tất cả các trường (mặc dù có nhiều trường được truy vấn)

Trả lời

16

Bạn phải chỉ định các trường, nếu bạn muốn xây dựng một cái gì đó năng động, cuộc gọi describeSObject trả về siêu dữ liệu về tất cả các trường cho một đối tượng, vì vậy bạn có thể xây dựng truy vấn từ đó.

+2

nhờ trả lời của bạn. Bạn có muốn chia sẻ một ví dụ hay không, để xây dựng truy vấn từ describeSObject. – Sukhhhh

24

Tạo một bản đồ như thế này:

Map<String, Schema.SObjectField> fldObjMap = schema.SObjectType.Account.fields.getMap(); 
List<Schema.SObjectField> fldObjMapValues = fldObjMap.values(); 

Sau đó, bạn có thể lặp qua fldObjMapValues ​​để tạo ra một chuỗi truy vấn SOQL:

String theQuery = 'SELECT '; 
for(Schema.SObjectField s : fldObjMapValues) 
{ 
    String theLabel = s.getDescribe().getLabel(); // Perhaps store this in another map 
    String theName = s.getDescribe().getName(); 
    String theType = s.getDescribe().getType(); // Perhaps store this in another map 

    // Continue building your dynamic query string 
    theQuery += theName + ','; 
} 

// Trim last comma 
theQuery = theQuery.subString(0, theQuery.length() - 1); 

// Finalize query string 
theQuery += ' FROM Account WHERE ... AND ... LIMIT ...'; 

// Make your dynamic call 
Account[] accounts = Database.query(theQuery); 

superfell là đúng, không có cách nào để trực tiếp làm một SELECT *. Tuy nhiên, công thức mã nhỏ này sẽ làm việc (tốt, tôi đã không thử nghiệm nó nhưng tôi nghĩ rằng nó sẽ ok). Có thể hiểu Force.com muốn một kiến ​​trúc nhiều người thuê nhà, nơi tài nguyên chỉ được cung cấp một cách rõ ràng cần thiết - không dễ dàng bằng cách thực hiện SELECT * khi thường chỉ có một nhóm nhỏ các trường thực sự cần thiết.

+0

Cảm ơn Adam. Khi bạn đồng ý với superfell, sẽ chấp nhận câu trả lời của mình :-) – Sukhhhh

+0

Tất nhiên Sukhhhh :) – Adam

6

Tôi sử dụng trình khám phá Force.com và trong bộ lọc lược đồ, bạn có thể nhấp vào hộp kiểm bên cạnh TableName và nó sẽ chọn tất cả các trường và chèn vào cửa sổ truy vấn của bạn - Tôi sử dụng điều này làm lối tắt để nhập tất cả - chỉ cần sao chép và dán từ cửa sổ truy vấn. Hi vọng điêu nay co ich.

3

Trong trường hợp bất cứ ai đang tìm kiếm một cách tiếp cận C#, tôi đã có thể sử dụng phản ánh và đưa ra như sau:

public IEnumerable<String> GetColumnsFor<T>() 
{ 
    return typeof(T).GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance) 
     .Where(x => !Attribute.IsDefined(x, typeof(System.Xml.Serialization.XmlIgnoreAttribute))) // Exclude the ignored properties 
     .Where(x => x.DeclaringType != typeof(sObject)) // & Exclude inherited sObject propert(y/ies) 
     .Where(x => x.PropertyType.Namespace != typeof(Account).Namespace) // & Exclude properties storing references to other objects 
     .Select(x => x.Name); 
} 

Nó xuất hiện để làm việc cho các đối tượng tôi đã thử nghiệm (và phù hợp với cột được tạo bởi kiểm tra API). Từ đó, nó là về việc tạo truy vấn:

/* assume: this.server = new sForceService(); */ 

public IEnumerable<T> QueryAll<T>(params String[] columns) 
    where T : sObject 
{ 
    String soql = String.Format("SELECT {0} FROM {1}", 
     String.Join(", ", GetColumnsFor<T>()), 
     typeof(T).Name 
    ); 
    this.service.QueryOptionsValue = new QueryOptions 
    { 
     batchsize = 250, 
     batchSizeSpecified = true 
    }; 
    ICollection<T> results = new HashSet<T>(); 
    try 
    { 
     Boolean done = false; 
     QueryResult queryResult = this.service.queryAll(soql); 
     while (!finished) 
     { 
      sObject[] records = queryResult.records; 
      foreach (sObject record in records) 
      { 
       T entity = entity as T; 
       if (entity != null) 
       { 
        results.Add(entity); 
       } 
      } 
      done &= queryResult.done; 
      if (!done) 
      { 
       queryResult = this.service.queryMode(queryResult.queryLocator); 
      } 
     } 
    } 
    catch (Exception ex) 
    { 
     throw; // your exception handling 
    } 
    return results; 
} 
+0

Người đàn ông tốt Brad, đã làm việc! – Shazoo

1

Đối với tôi đây là lần đầu tiên với Salesforce hôm nay và tôi đến với điều này trong Java:

/** 
* @param o any class that extends {@link SObject}, f.ex. Opportunity.class 
* @return a list of all the objects of this type 
*/ 
@SuppressWarnings("unchecked") 
public <O extends SObject> List<O> getAll(Class<O> o) throws Exception { 
    // get the objectName; for example "Opportunity" 
    String objectName= o.getSimpleName(); 

    // this will give us all the possible fields of this type of object 
    DescribeSObjectResult describeSObject = connection.describeSObject(objectName); 

    // making the query 
    String query = "SELECT "; 
    for (Field field : describeSObject.getFields()) { // add all the fields in the SELECT 
     query += field.getName() + ','; 
    } 
    // trim last comma 
    query = query.substring(0, query.length() - 1); 

    query += " FROM " + objectName; 

    SObject[] records = connection.query(query).getRecords(); 

    List<O> result = new ArrayList<O>(); 
    for (SObject record : records) { 
     result.add((O) record); 
    } 
    return result; 
} 
+3

Vui lòng giải thích những gì chúng tôi đang xem, thay vì chỉ đăng một bức tường mã. Cảm ơn. – Andrew

Các vấn đề liên quan