web-dev-qa-db-fra.com

salesforce SOQL: requête pour récupérer tous les champs de l'entité

Je parcourais la documentation SOQL, mais je n'ai pas trouvé de requête pour extraire toutes les données de champ d'une entité, par exemple, Compte, comme 

select * from Account [ SQL syntax ]

Existe-t-il une syntaxe similaire à celle décrite ci-dessus dans SOQL pour extraire toutes les données du compte, ou le seul moyen consiste à répertorier tous les champs (bien qu'il y ait beaucoup de champs à interroger) 

16
Sukhhhh

Vous devez spécifier les champs. Si vous souhaitez créer quelque chose de dynamique, l'appel describeSObject renvoie les métadonnées relatives à tous les champs d'un objet. Vous pouvez ainsi créer la requête à partir de cela.

18
superfell

Créez une carte comme ceci:

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

Ensuite, vous pouvez parcourir fldObjMapValues ​​pour créer une chaîne de requête 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);

le superfell est correct, il n'y a aucun moyen de faire directement un SELECT *. Cependant, cette petite recette de code fonctionnera (bon, je ne l’ai pas testée mais je pense que ça a l'air correct). Naturellement, Force.com souhaite une architecture multi-locataire dans laquelle les ressources ne sont provisionnées que pour les besoins explicites - pas facilement en effectuant une SÉLECTION *, alors que seul un sous-ensemble de champs est réellement nécessaire.

24
Adam

J'utilise Force.com Explorer et, dans le filtre de schéma, vous pouvez cocher la case en regard du Nom de la table pour sélectionner tous les champs et les insérer dans votre fenêtre de requête. J'utilise ce raccourci pour taper le texte - il suffit de copier et coller depuis la fenêtre de requête. J'espère que cela t'aides.

6
Renee Pennington

Si quelqu'un cherchait une approche C #, j'ai pu utiliser la réflexion et proposer les éléments suivants:

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

Il semble fonctionner pour les objets que j'ai testés (et correspond aux colonnes générées par le test de l'API). A partir de là, il s'agit de créer la requête:

/* 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;
}
3
Brad Christie

Pour moi, c’était la première fois que je travaillais avec Salesforce aujourd’hui et j’en ai parlé avec 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;
}
1
Koen De Jaeger

J'ai utilisé ce qui suit pour obtenir des dossiers complets-

query_all("Select Id, Name From User_Profile__c")

Pour obtenir des champs d'enregistrement complets, nous devons mentionner ces champs comme mentionné ici - https://developer.salesforce.com/docs/atlas.en-us.soql_sosl.meta/soql_sosl/sforce_api_calls_soql_select .htm

L'espoir vous aidera !!!

0
S.Yadav