Davide Gammone
Come creare una Mappa in Salesforce con Chiavi = Nome Campi e Valori = Risultato Query

Una Mappa è una raccolta di coppie Chiave-Valore in cui ad ogni chiave univoca si associa un singolo valore. Chiavi e valori possono essere qualsiasi tipo di dati: tipi primitivi, raccolte, oggetti sObject, tipi definiti dall'utente e tipi Apex innati.

Esempio:
questa tabella rappresenta una mappa di paesi e valute:

Country (Key) Japan France England Italy
Currency (Value) Yen Euro Pound Euro

Un record SObject ha una struttura molto simile ad una mappa per impostazione predefinita.

Account record = [SELECT Name, Phone FROM Account LIMIT 1];
system.debug(record.get('Name'));
system.debug(record.get('Phone'));

Execution Log:

USER_DEBUG [5]|DEBUG|Mario Rossi
USER_DEBUG [6]|DEBUG|null

Supporta anche put:

record.put('Phone', '0811234567');

Tuttavia, se per qualche motivo è necessario disporre di una mappa, è possibile utilizzare la serializzazione (processo intensivo per la CPU) come segue:

String stringAcc = JSON.serialize(record);
Map<String, Object> mapAcc = (Map<String, Object>)JSON.deserializeUntyped(stringAcc);
mapAcc.remove('attributes');

Codice Apex completo, per query con più record:

List<Account> record = [SELECT Name, Phone FROM Account LIMIT 2];
List<Map<String, Object>> listTotal = new List<Map<String, Object>>();
for(Account forAcc : record)
{
    system.debug(forAcc.get('Name'));
    system.debug(forAcc.get('Phone'));
    forAcc.put('Phone', '0811234567');
    String stringAcc = JSON.serialize(forAcc);
    system.debug(stringAcc);
    Map<String, Object> mapAcc = (Map<String, Object>)JSON.deserializeUntyped(stringAcc);
    mapAcc.remove('attributes');
    system.debug(mapAcc);
    listTotal.add(mapAcc);
}
system.debug(listTotal);

Execution Log:

USER_DEBUG|[5]|DEBUG|Mario Rossi
USER_DEBUG|[6]|DEBUG|null
USER_DEBUG|[9]|DEBUG|{"attributes":{"type":"Account","url":"/services/data/v45.0/sobjects/Account/0011w000004rocHAAQ"},"Name":"Mario Rossi","Id":"0011w000004rocHAAQ","RecordTypeId":"0121w0000004OmvAAE","Phone":"0811234567"}
USER_DEBUG|[12]|DEBUG|{Id=0011w000004rocHAAQ, Name=Mario Rossi, Phone=0811234567, RecordTypeId=0121w0000004OmvAAE}
USER_DEBUG|[5]|DEBUG|Luca Verdi
USER_DEBUG|[6]|DEBUG|null
USER_DEBUG|[9]|DEBUG|{"attributes":{"type":"Account","url":"/services/data/v45.0/sobjects/Account/0011w000004ronHAAQ"},"Name":"Luca Verdi","Id":"0011w000004ronHAAQ","RecordTypeId":"0121w0000004OmvAAE","Phone":"0811234567"}
USER_DEBUG|[12]|DEBUG|{Id=0011w000004ronHAAQ, Name=Luca Verdi, Phone=0811234567, RecordTypeId=0121w0000004OmvAAE}
USER_DEBUG|[15]|DEBUG|({Id=0011w000004rocHAAQ, Name=Mario Rossi, Phone=0811234567, RecordTypeId=0121w0000004OmvAAE}, {Id=0011w000004ronHAAQ, Name=Luca Verdi, Phone=0811234567, RecordTypeId=0121w0000004OmvAAE})

Di seguito, un generico codice Apex per selezionare tutti i campi di un SObject ed inserirli in una mappa:

SObjectType sobType = Account.SObjectType;
List<Map<String, Object>> listTotal = new List<Map<String, Object>>();

List<String> fields = new List<String>(sobType.getDescribe().fields.getMap().keySet());
for(SObject sob : Database.query(
       ' select ' + String.join(fields, ',')
    + ' from ' + sobType
    + ' limit 2'))
{
    Map<String,String> mapObj = new Map<String,String>();
    for (String field : fields)
    {
        Object value = sob.get(field);
        if(value != null){
            mapObj.put(field, String.valueOf(value));
        }
    }
    listTotal.add(mapObj);
}
System.debug(JSON.serialize(listTotal));

Questo sito utilizza cookie, anche di terze parti, per offrirti servizi in linea con le tue preferenze. Chiudendo questo banner, scorrendo questa pagina o cliccando qualunque suo elemento acconsenti all'uso dei cookie. Se vuoi saperne di più o negare il consenso a tutti o ad alcuni cookie, clicca qui.