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
PabitraPabitra 

Quick save record in LWC

Hi,

I am creating an LWC, where I am trying to do in multiple dynamic row entering record details and doing Quick Save. In Quick save function in js file i am sending the list value to Apex class method and doing upsert there and returning inserted records list to js file again from that same method. So that I can show in the same page and do update to the same record. But I unable to return that list to js file from apex. So if I do some modification and quick save it is creating another record instad of update (as id not there ). Can anyone help me on this how can i achieve it?

Thanks in advance!!
ravi soniravi soni
hi Pabitra ,
can You show me your complete code Like Html,Js,Apex
I will try to fix your issue
Thank You
madhav sharma 1madhav sharma 1
La serie HUAWEI P40 Inicia una nueva era en la fotografía visionaria

Con el sensor CMOS más grande de Huawei hasta la fecha, la serie  ofrece en todo momento fotografía en definición superior con potentes cámaras, 5G de alto rendimiento y diseño de vanguardia
La serie HUAWEI P40 continúa el legado de excelencia en imagen de la serie. El gran sensor de 1/1.28 pulgadas cuenta con un tamaño de píxeles agrupados de 2.44 μm, lo que aumenta enormemente la entrada de luz para mejorar el rendimiento con poca iluminación, mientras que un nuevo diseño de periscopio ofrece un zoom óptico real de 10x. La serie HUAWEI P40 cuenta con la tecnología de Kirin 990 5G y es compatible con 5G de alta velocidad y Wi-Fi 6 Plus. El avanzado hardware está integrado en una carcasa atractiva y compacta que cuenta con HUAWEI Quad-Curve Overflow Display para ofrecer fluidez y capacidad de respuesta increíbles.
Diseño sin precedentes
Los modelos HUAWEI P40 Pro y HUAWEI P40 Pro+ cuentan con HUAWEI Quad-Curve Overflow Display. Inspirada en el arte del movimiento, la pantalla tiene bordes curvos en los cuatro lados, lo que crea una forma que recuerda al agua a punto de desbordarse por el borde de un vaso lleno. Los biseles superestrechos y las esquinas redondas optimizadas garantizan una sujeción ergonómica y un aspecto casi sin bordes, mientras que el lector de huellas digitales integrado en la pantalla mejorado ofrece una autenticación biométrica un 30% más rápida.
Disponibles en tres acabados de cristal brillante (blanco glaciar, azul del mar profundo y negro) y dos innovadores acabados de cristal mate refractivo (dorado rosáceo y plateado forestal), los modelos HUAWEI P40 Pro y HUAWEI P40 irradian elegancia clásica desde cualquier ángulo. El HUAWEI P40 Pro+ cuenta con un exquisito panel de nanotecnología de cerámica negra, secada y pulida para garantizar que aguante el paso del tiempo con una increíble durabilidad y un estilo atemporal. Este exclusivo diseño está disponible en dos colores icónicos: cerámica blanca y cerámica negra.


Fotografía de definición superior en todo momento
La serie HUAWEI P40 incorpora el avanzado sistema Ultra Vision Camera de Leica, disponible en configuraciones de tres, cuatro y cinco cámaras. El HUAWEI P40 ofrece resultados fotográficos increíbles con objetivos ultra gran angular, gran angular y teleobjetivo. EL HUAWEI P40 Pro incluye una evolución de la cámara cuádruple de Leica con una cámara cinematográfica ultra gran angular más potente y una cámara ToF, además de zoom SuperSensing de 50x. El HUAWEI P40 Pro+ permite a los consumidores disfrutar de lo inédito con SuperZoom Array, que admite zoom óptico real de 10x y zoom digital máximo de 100x.
Toda la serie HUAWEI P40 incluye HUAWEI Ultra Vision Sensor, el sensor CMOS más grande de Huawei hasta la fecha. Con 1/1.28 pulgadas en diagonal, admite agrupación de píxeles para alcanzar un tamaño de pixel de 2.44 μm y enfoque automático Octa PD de píxel completo que ofrece un enfoque de alta velocidad en cualquier momento del día. Por otro lado, HUAWEI XD Fusion Engine integra y procesa los datos de varias cámaras para generar una mejora completa de la calidad de imagen.
El HUAWEI P40 Pro acerca los sujetos lejanos con el zoom óptico de 5x, Zoom Híbrido de 10x y el zoom digital máximo de 50x. Por primera vez, la cámara con teleobjetivo óptico de 5x del HUAWEI P40 Pro incluye una matriz de filtro de color RYYB para aumentar la entrada de luz y mejorar la calidad de las fotos con zoom. El HUAWEI P40 Pro+ cuenta con SuperZoom Array de 100x, con un nuevo diseño de periscopio que refleja la luz cinco veces y amplía la ruta de la luz en un 178% para permitir un zoom óptico real de 10x. Ultra Vision Wide Camera y SuperZoom Array con estabilización óptica trabajan junto con la IA para brindar triple OIS+AIS, lo que mejora enormemente la estabilización de fotos y videos.
La textura y el color de piel se reproducen fielmente mediante un nuevo sensor de temperatura de color de espectro múltiple y el algoritmo de AWB con IA que aumenta la precisión del color 45%. Los algoritmos de aprendizaje profundo ofrecen optimizaciones de retrato en tiempo real que mejoran la iluminación y el detalle. Los modelos HUAWEI P40 Pro y HUAWEI P40 Pro+ cuentan con cámara con enfoque automático de 32 MP y cámara de profundidad por infrarrojos que permite que el enfoque automático y la reproducción del bokeh ofrezcan los mismos efectos de retrato increíbles y distintivos de los dispositivos de Huawei, además de desbloqueo facial por infrarrojos para desbloquear el dispositivo incluso cuando hay poca luz. La serie HUAWEI P40 también introduce HUAWEI Golden Snap, que incluye AI Best Moment, una nueva funcionalidad de fotografía inteligente que elige los mejores fotogramas de una foto con movimiento. AI Remove Passerby y AI Remove Reflection permiten eliminar los sujetos y reflejos no deseados del fotograma, lo que permite a los usuarios mejorar fácilmente las imágenes después de tomarlas.



 
PabitraPabitra
Hi Soni, Kindly find the code below and let me help to implement Quick save functionality for task records.
Apex class
public with sharing class BulkTaskInsertController {
    
    @AuraEnabled
    public static List<Task__c> saveAccounts(List<Task__c> taskList){
        upsert taskList;
        return taskList;
    }
}
JS file
import { LightningElement, track,api,wire } from 'lwc';
import { NavigationMixin } from 'lightning/navigation';
import { ShowToastEvent } from 'lightning/platformShowToastEvent';
import saveAccounts from '@salesforce/apex/BulkTaskInsertController.saveAccounts';
import { refreshApex } from '@salesforce/apex';


export default class DynamicRecordCreationRows extends NavigationMixin(LightningElement) {
    
    @api recordId;
    currentProj;
    startDate;
    enddDate;

    @track keyIndex = 0;
    @track error;
    @track message;
    @track taskRecList = [
        {   
            Id:null,           
            Task_Name__c: '',
            Start_Date__c: '',
            End_Date__c: '',
            Description__c:'',
            Project__c:'a005g000001JetFAAS'
        }
    ];

    addRow() {
        this.keyIndex+1;   
        this.taskRecList.push ({ 
            Id:null,           
            Task_Name__c: '',
            Start_Date__c: '',
            End_Date__c: '',
            Description__c:'',
            Project__c:'a005g000001JetFAAS'
        });
        console.log('Enter ',this.taskRecList);
        console.log('Enter ',this.taskRecList);

    }

    changeHandler(event){       
        // alert(event.target.id.split('-'));
         console.log('Access key2:'+event.target.accessKey);
         console.log('id:'+event.target.id);
         console.log('value:'+event.target.value);       
         if(event.target.name==='TaskName')
             this.taskRecList[event.target.accessKey].Task_Name__c = event.target.value;
         else if(event.target.name==='startdate'){
             this.taskRecList[event.target.accessKey].Start_Date__c = event.target.value;
         }
         else if(event.target.name==='enddate'){
             this.taskRecList[event.target.accessKey].End_Date__c = event.target.value;
         }
         else if(event.target.name==='desc'){
            this.taskRecList[event.target.accessKey].Description__c = event.target.value;
        }
     }

     removeRow(event){       
        console.log('Access key2:'+event.target.accessKey);
        console.log(event.target.id.split('-')[0]);
        if(this.taskRecList.length>=2){             
             this.taskRecList.splice(event.target.accessKey,1);
             this.keyIndex-1;
        }
    }  


    saveMultipleTasks() {

        console.log("taskList"+JSON.stringify(this.taskRecList));
        saveAccounts({ taskList : this.taskRecList })
         
                //this.message = result;
                
                .then(() => {
                    this.error = undefined; 
               // this.taskRecList = [];
                console.log(result);
                    refreshApex(this.taskRecList);
                  
                  console.log(this.taskRecList);
                //this.accountRecList = [];
                if(this.message !== undefined) {
                    this.dispatchEvent(
                        new ShowToastEvent({
                            title: 'Success',
                            message: 'Accounts Created!',
                            variant: 'success',
                        }),
                    );
                }
                
                console.log(JSON.stringify(result));
                console.log("result", this.message);
            })
            .catch(error => {
                this.message = undefined;
                this.error = error;
                this.dispatchEvent(
                    new ShowToastEvent({
                        title: 'Error creating records',
                        message: error.body.message,
                        variant: 'error',
                    }),
                );
                console.log("error", JSON.stringify(this.error));
            });
    }

    connectedCallback(){
        this.currentProj=this.recordId;
        alert(this.currentProj+'');
    }

    handleProjectChange(event){
     this.currentProj= event.detail.value;
     alert(this.currentProj);
    }

    //navigate to project 
    navigateToRecordPage() {
        this[NavigationMixin.Navigate]({
            type: 'standard__recordPage',
            attributes: {
                recordId: this.recordId,
                objectApiName: 'Project__c',
                actionName: 'view'
            }
        });
    }

       

}

HTML File
<template>
    <lightning-card>
        <h3 slot="title">
            <lightning-icon icon-name="standard:task" alternative-text="Event" size="small"></lightning-icon>
            &nbsp;Create New Tasks 
        </h3>
        <template for:each={taskRecList} for:item="item" for:index="index">
            <lightning-record-edit-form key={item.id} object-api-name="Task__c">
                <lightning-messages> </lightning-messages>
                <lightning-layout multiple-rows>
                    <lightning-layout-item size="12" small-device-size="6" medium-device-size="4" large-device-size="2"
                        padding="around-small">
                        <lightning-input name="TaskName" label="Task Name"  access-key={index} id={index} type='text' onchange={changeHandler}  value={item.Task_Name__c} variant="label-stacked" required>
                        </lightning-input>
                    </lightning-layout-item>                    
                    <lightning-layout-item size="12" small-device-size="6" medium-device-size="4" large-device-size="2"
                        padding="around-small">
                        <lightning-input name="startdate" label="Start Date"  access-key={index} id={index} type='date' onchange={changeHandler}  value={item.Start_Date__c} variant="label-stacked" >
                        </lightning-input>
                    </lightning-layout-item>
                    <lightning-layout-item size="12" small-device-size="6" medium-device-size="4" large-device-size="2"
                        padding="around-small">
                        <lightning-input name="enddate" label="End Date"  access-key={index} id={index} type='date' onchange={changeHandler}  value={item.End_Date__c} variant="label-stacked" >
                        </lightning-input>
                    </lightning-layout-item>                    
                    <lightning-layout-item size="12" small-device-size="6" medium-device-size="4" large-device-size="2"
                        padding="around-small">
                        <lightning-textarea name="desc" maxlength="13000" label="Description"  access-key={index} id={index} type='text' onchange={changeHandler}  value={item.Description__c} variant="label-stacked">
                        </lightning-textarea>
                    </lightning-layout-item>
                    
                    <lightning-layout-item size="12" small-device-size="6" medium-device-size="4" large-device-size="2"
                        padding="around-small">
                        <div class="slds-p-top_medium">
                            <lightning-icon icon-name="action:new" access-key={index} id={index}
                                alternative-text="Add Row" size="small" title="Add Row" onclick={addRow}>
                            </lightning-icon>
                            <lightning-icon icon-name="action:delete" access-key={index} id={index}
                                alternative-text="Delete Row" size="small" title="Delete Row" onclick={removeRow}>
                            </lightning-icon>
                        </div>
                    </lightning-layout-item>
                </lightning-layout>

            </lightning-record-edit-form>
        </template>
        </br>
        <lightning-layout>
            <div class="slds-align_absolute-center">
                <lightning-button variant="success" onclick={navigateToRecordPage} name="Cancel" label="Cancel">
                </lightning-button>&nbsp;
                
                <lightning-button variant="success" onclick={saveMultipleTasks} name="quickSave" label="Quick Save">
                </lightning-button>&nbsp;

                <lightning-button variant="success" onclick={saveMultipleTasks} name="save" label="Save">
                </lightning-button>
                
            </div>
        </lightning-layout>
    </lightning-card>
</template>

FYI, The LWC called from a lightning component.
Thanks in Advance!!