Установка атрибута здесь:

<aura:attribute name="exportData" type="Object" />  <!-- values are setting here -->
<ui:button class="slds-button slds-button_neutral" press="{!c.downloadCsv}" label="Export CSV" />

Логика стороны Js:

downloadCsv : function(component,event,helper){
    // get the Records [contact] list from 'ListOfContact' attribute 
    var stockData = component.get("v.exportData");
    console.log('stock data@@',JSON.stringify(stockData));
    // call the helper function which "return" the CSV data as a String   
    var csv = helper.convertArrayOfObjectsToCSV(component,stockData);   
     if (csv == null){return;} 
    // ####--code for create a temp. <a> html tag [link tag] for download the CSV file--####     
     var hiddenElement = document.createElement('a');
      hiddenElement.href = 'data:text/csv;charset=utf-8,' + encodeURI(csv);
      hiddenElement.target = '_self'; // 
      hiddenElement.download = 'ExportData.csv';  // CSV file Name* you can change it.[only name not .csv] 
      document.body.appendChild(hiddenElement); // Required for FireFox browser
      hiddenElement.click(); // using click() js function to download csv file
    }

Помощник :

   convertArrayOfObjectsToCSV : function(component,objectRecords){
    // declare variables
    var csvStringResult, counter, keys, columnDivider, lineDivider;

    // check if "objectRecords" parameter is null, then return from function
    if (objectRecords == null || !objectRecords.length) {
        return null;
     }
    // store ,[comma] in columnDivider variabel for sparate CSV values and 
    // for start next line use '\n' [new line] in lineDivider varaible  
    columnDivider = ',';
    lineDivider =  '\n';
    // in the keys valirable store fields API Names as a key 
    // this labels use in CSV file header  
    keys = ['Name','PrimaryId__c','PrimaryIdType__c','RequestType__c','CreatedBy.Name','ConsolidatedStatus__c','CreatedDate','DueDate__c','GDPRRequestSubscriberStatuses__r.SecondaryIdSnapshot__c'];
    csvStringResult = '';
    csvStringResult += ['Transaction Id','Primary ID','Primary ID Type','FLAG','Submitted By','Status','Creation Date','Due Date','Secondary Id'];
    //csvStringResult += keys.join(columnDivider);
    csvStringResult += lineDivider;

    for(var i=0; i < objectRecords.length; i++){   
        counter = 0;

         for(var sTempkey in keys) {
            var skey = keys[sTempkey] ;  

          // add , [comma] after every String value,. [except first]
              if(counter > 0){ 
                  csvStringResult += columnDivider; 
               }   

           csvStringResult += '"'+ objectRecords[i][skey]+'"'; 

           counter++;

        } // inner for loop close 
         csvStringResult += lineDivider;
      }// outer main for loop close 

   // return the CSV formate String 
    return csvStringResult;        
}

Класс Apex:

 @AuraEnabled
public static List<Object> gdprCompleteRecords(){
    return [SELECT ID,(SELECT ID,SecondaryIdSnapshot__c FROM GDPRRequestSubscriberStatuses__r),Name,PrimaryId__c,PrimaryIdType__c,RequestType__c,createdBy.Name,ConsolidatedStatus__c,CreatedDate,DueDate__c FROM GDPRRequest__c];
}

Поля отношений показывают неопределенные значения:

  • createdBy.Name
  • GDPRRequestSubscriberStatuses__r.SecondaryIdSnapshot__c

Получение следующего формата json в javascript:

 [
 {
"Id": "a7U0m0000000J0UEAU",
"Name": "Request-000480",
"PrimaryId__c": "test@gmail.com",
"PrimaryIdType__c": "Email",
"RequestType__c": "SAR-TIER2",
"CreatedById": "0050m0000034uICAAY",
"ConsolidatedStatus__c": "2 New",
"CreatedDate": "2020-03-04T05:58:27.000Z",
"DueDate__c": "2020-04-03",
"GDPRRequestSubscriberStatuses__r": [
  {
    "GDPRRequest__c": "a7U0m0000000J0UEAU",
    "Id": "a7T0m000000DTnWEAW"
  },
  {
    "GDPRRequest__c": "a7U0m0000000J0UEAU",
    "Id": "a7T0m000000DTnXEAW"
  }
   ],
      "CreatedBy": {
      "Name": "Annappa PH",
      "Id": "0050m0000034uICAAY"
   }
   },
  {
"Id": "a7U0m0000000I6CEAU",
"Name": "Request-000351",
"PrimaryId__c": "test12345@gmail.com",
"PrimaryIdType__c": "Email",
"RequestType__c": "SAR-TIER2",
"CreatedById": "0050m0000034uICAAY",
"ConsolidatedStatus__c": "1 New",
"CreatedDate": "2020-02-19T04:11:18.000Z",
"DueDate__c": "2020-03-20",
"GDPRRequestSubscriberStatuses__r": [
  {
    "GDPRRequest__c": "a7U0m0000000I6CEAU",
    "Id": "a7T0m000000DT4MEAW",
    "SecondaryIdSnapshot__c": "OriginId - test12 , FacebookId - test13"
  }
],
"CreatedBy": {
  "Name": "Annappa PH",
  "Id": "0050m0000034uICAAY"
}
}

]

Но в листе Excel createdBy.Name & GDPRRequestSubscriberStatuses__r.SecondaryIdSnapshot__c не определено.

Проблема с именем createdby решена: но проблема с вторичным идентификатором все еще остается

Добавлен следующий код:

     for(var i=0; i < objectRecords.length; i++){   
        counter = 0;
        for(var sTempkey in keys) {
            var skey = keys[sTempkey] ;
           // alert('skey@'+skey);
           // add , [comma] after every String value,. [except first]
              if(counter > 0){ 
                  csvStringResult += columnDivider; 
               }   
            if(objectRecords[i][skey] != undefined){
                if(skey=='CreatedBy'){
                    csvStringResult += '"'+ objectRecords[i][skey].Name+'"';
                }if(skey=='GDPRRequestSubscriberStatuses__r'){
                    csvStringResult += '"'+ objectRecords[i][skey].SecondaryIdSnapshot__c+'"';
                }if(skey!='CreatedBy'&&skey!='GDPRRequestSubscriberStatuses__r')
                 csvStringResult += '"'+ objectRecords[i][skey]+'"';
              }
             else
             {
                 csvStringResult += '"'+ '' +'"';
             }
            counter++;

        } // inner for loop close 
         csvStringResult += lineDivider;
      }// outer main for loop close 

Снимок экрана: столбцы вторичных идентификаторов показаны ниже:

enter image description here

-1
SFDCLearner 5 Мар 2020 в 10:53

1 ответ

Лучший ответ

Вы не можете передать путь отношения в качестве ключа для sObject, представленного в виде словаря, что вы здесь и делаете:

       csvStringResult += '"'+ objectRecords[i][skey]+'"'; 

objectRecords[i] не содержит ключей CreatedBy.Name или GDPRRequestSubscriberStatuses__r.SecondaryIdSnapshot__c. Вложенные данные sObject работают иначе.

Вместо этого objectRecords[i] будет содержать ключ с именем CreatedBy, значение объекта которого содержит ключ Name. GDPRRequestSubscriberStatuses__r будет содержать массив объектов, каждый из которых (при наличии ненулевого количества записей) будет содержать ключ SecondaryIdSnapshot__c. Эта структура данных аналогична тому, как результаты запроса взаимосвязи представлены в Apex и в JSON, возвращаемом вызовами к конечной точке запроса Salesforce REST API.

Вам нужно будет написать логику, чтобы разложить эти строки путей отношений и просмотреть данные вложенных объектов, чтобы получить значения. Для GDPRRequestSubscriberStatuses__r вам нужно быть готовым к работе с несколькими дочерними записями, поскольку это отношение "один ко многим".

0
David Reed 5 Мар 2020 в 09:27
Да. я понял. не могли бы вы объяснить мне это: для GDPRRequestSubscriberStatuses__r вам нужно быть готовым к обработке нескольких дочерних записей, поскольку это отношение «один ко многим». это действительно полезно;
 – 
SFDCLearner
5 Мар 2020 в 09:30
О чем конкретно вы спрашиваете? Вы делаете подзапрос родитель-потомок, и у любого родителя может быть несколько дочерних записей.
 – 
David Reed
5 Мар 2020 в 09:35
Что я понял. как я могу отображать дочерние записи, связанные с родителями. в javascript.that я не понял правильно, и я запутался в логике.
 – 
SFDCLearner
5 Мар 2020 в 09:38
У меня нет возможности ответить на это. Ваши бизнес-требования должны указывать вам, какие данные отображать и как.
 – 
David Reed
5 Мар 2020 в 09:40
Предположим, что родительские записи имеют 2 дочерние записи. мы отображаем информацию об этой дочерней записи следующим образом. request1 [столбец 1], second1 (child1) (здесь новая строка) second2 (child2). [столбец 2] . Но я не понял, как это сделать.
 – 
SFDCLearner
5 Мар 2020 в 09:43