function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
Swetha A 5Swetha A 5 

Unable to fetch data in Dynamic lightning data tables in real time

We have a functionality called "Ownership Mass transfer tool" which is used to transfer all the records of all the Standard and custom objects from one user to another user.
We are using Dynamic lightning data tables to fetch the records in real time based on the user input to show them on the page. But for some reason we are not able to get the data in the back end which is showing NULL. Here is the code snippet. We would like your advice in knowing the root cause of the issue:
({
    /*commenting as we are using custom messages handler as thei component will also be used in clasic. 
     * commeshowToast : function(component, event, helper,title,message) {
        var toastEvent = $A.get("e.force:showToast");
        var mode = "dismissible ";
        if(title == "error"){
            mode = "pester";
        }
        toastEvent.setParams({
            "title": title,
            "type":title,
            "message": message,
            "mode": mode
        });
        toastEvent.fire();
    },*/
    clearMessages : function(component, event, helper){
        var messageEvent = $A.get("e.c:CustomMessageEvent");
        messageEvent.setParams({"toClear" :true}); //to clear any error messsages
        messageEvent.fire();
    },
    //fires display message event 
    displayMessage : function(component, event, helper, message, type, mode, duration){
        var messageEvent = $A.get("e.c:CustomMessageEvent");
        console.log(message);
        messageEvent.setParams({
            "message" : message,
            "mode" : mode,
            "type" : type,
            "duration" : duration
        });
        messageEvent.fire();
    },
    // handle non success response
    handleNSR : function(component, event, helper, response){ 
        var state = response.getState();
        if (state === "INCOMPLETE") {
            helper.displayMessage(component, event, helper,"Incomplete updated."+response.getReturnValue(), "error", "", 5000);
            //helper.showToast(component, event, helper,"error","Action incomplete"); 
        }
        else if (state === "ERROR") {
            var errors = response.getError();
            if (errors) {
                var erMessage = '';
                for(var i = 0; i<errors.length; i++){
                    if (errors[0] && errors[0].message) {
                        erMessage = erMessage+ errors[i].message
                    }
                }
                helper.displayMessage(component, event, helper,"Error message: "+erMessage, "error", "", 5000);
                //helper.showToast(component, event, helper,"error","Error message: " +erMessage); 
            } else {
                console.log("Unknown error");
                //helper.showToast(component, event, helper,"error","Unknown error");
                helper.displayMessage(component, event, helper,"Unknown error ", "error", "", 5000);
            }
        }
    },
    // get the sobjects configured in Datatable settings of lightning component type OwnershipTransfer
    getSobjList : function(component, event, helper) {
        var action = component.get("c.getSobjOptions");
        action.setParams({});
        action.setCallback(this, function(response) {
            var state = response.getState();
            if (state === "SUCCESS" && response.getReturnValue()!= '') {
                var opts= JSON.parse(response.getReturnValue());
                component.set('v.sObjList',opts);
            }else{
                helper.handleNSR(component, event, helper, response);
            }
        })
        $A.enqueueAction(action);
    },
    // sets the coloumn attribute for select sobject, if more than 1 sobject is selected 
    // coloumns are generelised into 2 coloumns as name of selected object and number of records to transfer
    getColumns : function(component, event, helper){
        var selectedOBJ = component.get("v.sObjs");
        component.set("v.extendedColumns", []);
        /* if(selectedOBJ.length > 1){
            var col = [
                { label: 'Object Name', fieldName: 'objName', type: 'text'},
                { label: 'Number of Records', fieldName: 'recCount', type: 'number'}
            ];
            component.set("v.columns",col);*/
        var action = component.get("c.getColumns_Sobjs");
        action.setParams({'objs' : selectedOBJ});
        action.setCallback(this, function(response) {
            var state = response.getState();
            if (state === "SUCCESS" && response.getReturnValue()!= '') {
                var res = response.getReturnValue();
                component.set("v.extendedColumns",res);
                var curUser = component.get("v.currentOwner");
                if(!$A.util.isEmpty(curUser)){
                    helper.getRecords(component, event, helper);
                }
            }else{
                helper.handleNSR(component, event, helper, response);
            }
        })
        $A.enqueueAction(action);
        //helper.getRecords(component, event, helper);
        /*}else if(selectedOBJ.length == 1){
            var action = component.get("c.getColumns_Sobj");
            action.setParams({'obj' : selectedOBJ[0]});
            action.setCallback(this, function(response) {
                var state = response.getState();
                if (state === "SUCCESS" && response.getReturnValue()!= '') {
                    var res = [];
                    res = JSON.parse(response.getReturnValue());
                    component.set("v.columns",res);
                    var curUser = component.get("v.currentOwner");
                    if(!$A.util.isEmpty(curUser)){
                        helper.getRecords(component, event, helper);
                    }
                }else{
                    helper.handleNSR(component, event, helper, response);
                }
            })
            $A.enqueueAction(action);
        }else{
            component.set("v.columns",[]);
        }*/
    },
    //returns the records for selected objects.
    // if more than one object is elected, only the number of records will be returened
    getRecords : function(component, event, helper){
        //var error = false;
        var selectedOBJ = component.get("v.sObjs");
        var curUser = component.get("v.currentOwner");
        var accId = component.get("v.accId");
        var target = event.getSource();
        var fromButton = target.get("v.label");
        if(fromButton == "Get Records" ){
            var error = helper.validateInputs(component, event, helper, false);
        }
        if(error){
            return;
        }
        component.set("v.isWaiting",true);
        component.set("v.statusMessage","Please wait... While we load the data...");
        var action = component.get("c.getRecords_Sobj");
        action.setParams({'objs' : selectedOBJ,
                          'co' : curUser,
                          'accId' : accId
                         });
        action.setCallback(this, function(response) {
            var state = response.getState();
            var res = response.getReturnValue();
            component.set("v.source", res);
            if (state === "SUCCESS" && res != '') {
                /*if(len != 1){
                    for(x in res){
                        var tempObj = {};
                        tempObj.Id = x;
                        tempObj.objName = x;
                        tempObj.recCount = res[x].length;
                        data.push(tempObj);
                    }*/
                //Expanded Results extendedResultList
                var extendedData = {};
                
                for(var x in res){
                    extendedData[x] = [];
                    var tempData2 = [];
                    tempData2 = res[x];
                    for(var i=0;i<tempData2.length;i++){
                        tempData2[i]["obj"] = x;
                        tempData2[i] = helper.lenior(component, event, helper,tempData2[i],'',[]);
                        extendedData[x].push(tempData2[i]);
                    }
                }
                component.set("v.extendedResultList", extendedData);
                helper.createMultipleDatatables(component, event, helper);
                /*}else{
                    for(x in res){
                        var tempData2 = [];
                        tempData2 = res[x];
                        for(var i=0;i<tempData2.length;i++){
                            tempData2[i] = helper.lenior(component, event, helper,tempData2[i],'',[]);
                            data.push(tempData2[i]);
                        }
                    }
                }*/
                /*component.set("v.resultList", data);*/
            }else{
                helper.handleNSR(component, event, helper, response);
            }
        });
        $A.enqueueAction(action);
    },
    //As soql queries are allowed to get information from parent objects, 
    //We are leaniorising the data into a single layor objects.
    lenior : function(component, event, helper,tempData, oldKey, globalData){
        if(typeof(tempData) === 'object'){
            var key;
            for(key in tempData){
                var newKey = oldKey+key;
                var newVal = tempData[key];
                //console.log(newVal);
                if(typeof(newVal) === 'object'){
                    helper.lenior(component, event, helper, newVal, newKey, globalData);
                }else{
                    var idvar = newKey.endsWith('Id');
                    if(idvar === true){
                        newVal = "/"+newVal;
                    }
                    globalData[newKey] = newVal;
                }
            }            
            return globalData;
        }else{
            return ;
        }
    },
    //Validate the options selected by the user
    validateInputs : function(component, event, helper, tr){
        var error = false;
        var selectedOBJ = component.get("v.sObjs");
        var len = selectedOBJ.length;
        var curUser = component.get("v.currentOwner");
        if(len == 0){
            error = true;
            helper.displayMessage(component, event, helper,$A.get("$Label.c.object_required"), "error", "", 5000);
            //helper.showToast(component, event, helper,"error","Please select a value for object.");
        }
        
        if(!curUser){
            error = true;
            helper.displayMessage(component, event, helper,$A.get("$Label.c.currentUser_required"), "error", "", 5000);
            //helper.showToast(component, event, helper,"error","Please select a User"); 
        }
        if(tr){
            var newOwner = component.get("v.newOwner");
            if(!newOwner){
                error = true;
                helper.displayMessage(component, event, helper,$A.get("$Label.c.newOwner_Required"), "error", "", 5000);
            }
            var selectedRows = 0;
            var selectedOBJs = component.get("v.sObjs");
            for(var x =0; x<selectedOBJs.length;x++){
                var idValue = "dataTable"+selectedOBJs[x];
                console.log("**validation method: "+idValue);
                var table = component.find(idValue);
                var selectedRow = [];
                if(!$A.util.isEmpty(table[0]))
                    selectedRow = table[0].getSelectedRows();
                else
                    selectedRow = table.getSelectedRows();
                selectedRows = selectedRows+selectedRow.length;
            }
            if(selectedRows == 0){
                error = true;
                helper.displayMessage(component, event, helper,$A.get("$Label.c.Select_Rec"), "error", "", 5000);
            }
            
        }
        return error;
    },
    //perform the periodic updates (batches menction on the datatable settings) on the selected records.
    updateSelected : function(component, event, helper){
        var error = helper.validateInputs(component, event, helper, true);
        if(error){
            //component.set("c.statusMessage","Refreshing Records...");
            component.set("v.isWaiting",false);
            return;
        }
        //var selectedRow = component.find("dataTable").getSelectedRows();
        var selectedOBJs = component.get("v.sObjs");
        for(var x =0; x<selectedOBJs.length;x++){
            var idValue = "dataTable"+selectedOBJs[x];
            console.log("**validation method: "+idValue);
            var table = component.find(idValue);
            var selectedRow = [];
            if(!$A.util.isEmpty(table[0]))
                selectedRow = table[0].getSelectedRows();
            else
                selectedRow = table.getSelectedRows();
            var selIds = [];
            for(var i =0;i<selectedRow.length; i++){
                var idvar = selectedRow[i].Id.replace('/','');
                selIds.push(idvar);
            }
            if(selIds.length > 0)
            	helper.splitRec(component, event, helper, selIds, selectedOBJs[x]);
        }
    },
    splitRec : function(component, event, helper, totalIds, obj){
        var objList = component.get("v.trnfObjs");
        objList.push(obj);
        component.set("v.trnfObjs",objList);
        var splitIds = [];
        var split = 100;
        var sObjList = component.get("v.sObjList");
        for(var i =0; i<sObjList.length; i++){
            if(sObjList[i].value === obj){
                split = sObjList[i].splitVal;
                break;
            }
        }
        for(var i =0;i<totalIds.length;i++){
            if(i==split)
                break;
            splitIds.push(totalIds[i]);
        }
        helper.updateSplit(component, event, helper,splitIds, totalIds, obj);
    },
    updateSplit : function(component, event, helper,splitIds, totalIds, obj){
        var action = component.get("c.updateSObj_Selected");
        action.setParams({'sIDs' : splitIds,
                          'obj' : obj,
                          'newUser' : component.get("v.newOwner"),
                          'curUser' : component.get("v.currentOwner"),
                         });
        action.setCallback(this, function(response) {
            var state = response.getState();
            if (state === "SUCCESS" && response.getReturnValue()!= '') {
                //helper.displayMessage(component, event, helper,$A.get("$Label.c.Records_transfered_success"), "success", "dismissible", 300);
            }else{
                helper.handleNSR(component, event, helper, response);
                component.set("v.hasUpdateErrors", true);
            }
            //removing the first "x" ids from total ids as they have been processed.
            var newTIDS = totalIds.slice(splitIds.length);
            if(newTIDS.length > 0){
                //calling the split with new totak ids to get new "x ids"
                helper.splitRec(component, event, helper, newTIDS, obj);
            }else{
                if(component.get("v.hasUpdateErrors") == false){
                    var trnfObjs = component.get("v.trnfObjs");
                    var newtrnfObjs = [];
                    for(var to=0; to<=trnfObjs.length;to++){
                        if(obj != trnfObjs[to] && !$A.util.isEmpty(trnfObjs[to]))
                            newtrnfObjs.push(trnfObjs[to]);
                    }
                    component.set("v.trnfObjs",newtrnfObjs);
                    helper.displayMessage(component, event, helper,"All selected "+obj+$A.get("$Label.c.updated_successfully"),$A.get("$Label.c.Success"), $A.get("$Label.c.Dismissible"), 5000);
                    component.set("v.statusMessage","Refreshing Records...");
                    //helper.getRecords(component, event, helper);
                    component.set("v.isWaiting",false);
                }
            }
            var trnfObjs = component.get("v.trnfObjs");
            if($A.util.isEmpty(trnfObjs))
                helper.getRecords(component, event, helper);
        });
        $A.enqueueAction(action);
    },
    createMultipleDatatables: function(component, event, helper){
        var sObjList = component.get("v.sObjList");
        var sObjMap = {};
        for(var i =0; i<sObjList.length; i++){
            sObjMap[sObjList[i].value] = sObjList[i];
        }
        var extendedColumns = component.get("v.extendedColumns");
        var extendedResultList = component.get("v.extendedResultList");
        var selectedOBJ = component.get("v.sObjs");
        var temp = [];
        if(selectedOBJ.length>0){
            for(var x=0;x<selectedOBJ.length;x++){
                var table = [];
                table.push("lightning:datatable");
                var tableAtt = {};
                var sleRec = [];
                console.log("**Creation method: "+"dataTable"+selectedOBJ[x]);
                tableAtt["aura:id"]="dataTable"+selectedOBJ[x];
                tableAtt["keyField"]="Id";
                tableAtt["data"]=extendedResultList[0][selectedOBJ[x]];
                tableAtt["columns"]=JSON.parse(extendedColumns[0][selectedOBJ[x]]);
                tableAtt["resizeColumnDisabled"]="true";
                var auto = component.get("v.autoSelectRows");
                if(auto == true){
                    var data = extendedResultList[0][selectedOBJ[x]];
                    for(var y=0;y<data.length;y++){
                        sleRec.push(data[y].Id);
                    }
                    tableAtt["selectedRows"]=sleRec;
                }
                table.push(tableAtt);
                
                var card = [];
                card.push("lightning:card");
                var cardAtt = {};
                cardAtt["title"] = sObjMap[selectedOBJ[x]].label+" ("+tableAtt["data"].length+")";
                cardAtt["variant"] = "base";
                cardAtt["class"] = "cardborder";
                card.push(cardAtt);
                temp.push(card);
                temp.push(table);
            }
            $A.createComponents(temp, function(components, status, errorMessage){
                if (status === "SUCCESS") {
                    var body = [];
                    for(var i =0; i<components.length; i++){
                        if(i%2==0){
                            body.push(components[i]);
                        }else{
                            var cardBody = components[i-1].get("v.body");
                            cardBody.push(components[i]);
                            $A.util.addClass(cardBody, 'slds-card__body_inner');
                            components[i-1].set("v.body",cardBody);
                        }
                    }
                    /*components.forEach(function(item){
                        body.push(item);
                    });*/
                    component.set("v.extendedTables", body);
                }else if (status === "INCOMPLETE") {
                    console.log("No response from server or client is offline.")
                }else if (status === "ERROR") {
                    console.log("Error: " + errorMessage);
                }
            }
                               );
        }else{
            var body = [];
            component.set("v.extendedTables", body);
        }
        component.set("v.isWaiting",false);
    },
})