2012-01-08 9 views
16

szedłem dokumentacji SOQL, ale nie mógł znaleźć zapytanie pobrać wszystkie dane terenowe jednostki powiedzieć, rachunek, jakSalesforce SOQL: zapytanie pobrać wszystkie pola na jednostkę

select * from Account [ SQL syntax ] 

Czy istnieje jakakolwiek składnia taka jak w SOQL, aby pobrać wszystkie dane konta, lub jedynym sposobem jest wyświetlenie wszystkich pól (chociaż jest wiele pól do zapytania)

Odpowiedz

16

Musisz określić pola, jeśli chcesz zbudować coś dynamicznego, wywołanie describeSObject zwraca metadane dotyczące wszystkich pól dla obiektu, więc możesz zbudować zapytanie z tego.

+2

dzięki za odpowiedź. Czy mógłbybyś dzielić przykład, aby zbudować zapytanie z obiektu descriptionSObject. – Sukhhhh

24

Tworzenie mapy tak:

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

Następnie można wykonać iterację fldObjMapValues ​​stworzyć ciąg kwerendy 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 jest prawidłowa, nie ma sposobu, aby bezpośrednio zrobić SELECT *. Jednak ten mały przepis na kod zadziała (cóż, nie testowałem go, ale wydaje mi się, że wygląda dobrze). Zrozumiałe, że Force.com chce architektury z wieloma dzierżawcami, w której zasoby są udostępniane tylko tak wyraźnie, jak to jest potrzebne - niełatwo, wykonując SELECT *, gdy zwykle potrzebny jest tylko podzbiór pól.

+0

Dzięki Adam. Jak zgodzisz się z superfellą, przyjmiesz odpowiedź :-) – Sukhhhh

+0

Oczywiście Sukhhhh: – Adam

6

Używam Explorera Force.com i wewnątrz filtru schematu możesz kliknąć pole wyboru obok Nazwa tabeli, aby wybrać wszystkie pola i wstawić je do okna zapytania - używam tego jako skrótu do wpisywania wszystkiego - po prostu skopiuj i wklej z okna zapytania. Mam nadzieję że to pomoże.

3

W przypadku ktoś szukał podejścia C#, mogłem użyć refleksji i pochodzą z następujących czynności:

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); 
} 

Wydaje się pracować dla obiektów, które testowałem (i pasuje do kolumn wygenerowany przez test API). Stamtąd, chodzi o tworzenie zapytania:

/* 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

Dobry człowiek, Brad, to zadziałało! – Shazoo

1

Dla mnie to był pierwszy raz z Salesforce dziś i wpadłem w 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

Wyjaśnij, na co patrzymy, a nie po prostu umieszczaj ścianę kodu. Dzięki. – Andrew

Powiązane problemy