2012-01-08 6 views
16

yo estaba pasando por la documentación SOQL, pero no pudo encontrar consulta para obtener todos los datos de campo de una entidad dicen, cuenta, al igual quefuerza de ventas SOQL: consulta para ir a buscar todos los campos de la entidad

select * from Account [ SQL syntax ] 

¿Hay una sintaxis como la anterior en SOQL para recuperar todos los datos de la cuenta, o la única manera es enumerar todos los campos (aunque hay muchos campos para consultar)

Respuesta

16

Debe especificar los campos, si Si desea construir algo dinámico, la llamada describeSObject devuelve los metadatos sobre todos los campos de un objeto, por lo que puede generar la consulta a partir de eso.

+2

gracias por su respuesta. ¿Le importaría compartir un ejemplo para construir la consulta desde describeSObject? – Sukhhhh

24

Crear un mapa de la siguiente manera:

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

A continuación, puede iterar a través de fldObjMapValues ​​para crear una cadena de consulta 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 es correcta, no hay manera de hacerlo directamente un SELECT *. Sin embargo, esta pequeña receta de código funcionará (bueno, no la he probado, pero creo que se ve bien). Es comprensible que Force.com quiera una arquitectura de múltiples inquilinos donde los recursos solo se aprovisionen según lo que se necesite explícitamente, no fácilmente al hacer SELECCIONAR * cuando generalmente solo se necesita un subconjunto de campos.

+0

Gracias Adam. Como está de acuerdo con superfell, aceptará su respuesta :-) – Sukhhhh

+0

Por supuesto Sukhhhh :) – Adam

6

Uso el Explorador de Force.com y en el filtro de esquema puede hacer clic en la casilla junto a TableName y seleccionará todos los campos e insertará en la ventana de consulta. Utilizo esto como un atajo para escribirlo todo - solo copie y pegue desde la ventana de consulta. Espero que esto ayude.

3

En caso de que alguien estaba buscando un enfoque C#, yo era capaz de utilizar la reflexión y llegar a la siguiente:

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

Parece que funciona para los objetos que he probado (y coincide con las columnas generado por la prueba API). A partir de ahí, se trata de crear la consulta:

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

¡Buen hombre, Brad, eso funcionó! – Shazoo

1

Para mí fue la primera vez con Salesforce hoy y se me ocurrió esto en 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

Por favor, explique lo que estamos viendo, en lugar de simplemente publicar un muro de código. Gracias. – Andrew

Cuestiones relacionadas