and salesforce soql

and - Salesforce SOQL: consulta para obtener todos los campos en la entidad



salesforce select where (6)

Crea un mapa como este:

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

Luego 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 correcto, no hay manera de hacer directamente un SELECT *. Sin embargo, esta pequeña receta de código funcionará (bueno, no la he probado, pero creo que se ve bien). Comprensiblemente, Force.com desea una arquitectura de múltiples inquilinos donde los recursos solo se aprovisionen como explícitamente necesarios, no fácilmente haciendo SELECT * cuando generalmente solo se necesita un subconjunto de campos.

Estaba revisando la documentación de SOQL, pero no pude encontrar la consulta para obtener todos los datos de campo de una entidad, por ejemplo, Cuenta, como

select * from Account [ SQL syntax ]

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


Debe especificar los campos. Si desea compilar algo dinámico, la llamada describeSObject devuelve los metadatos sobre todos los campos de un objeto, para que pueda construir la consulta a partir de eso.


En caso de que alguien estuviera buscando un enfoque de C #, pude usar la reflexión y proponer lo 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 generadas por la prueba de 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; }


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



Utilizo el Explorador de Force.com y, dentro del filtro de esquema, puede hacer clic en la casilla de verificación junto a TableName y seleccionará todos los campos e insertarlos en la ventana de consulta. Utilizo esto como acceso directo para escribir todo. Solo copie y pegar desde la ventana de consulta. Espero que esto ayude.