Hola, hice una función que detecta si agregué o eliminé una nueva fila en mi subcuadrícula y ejecuté algunos coce de acuerdo con eso
Normalmente funciona bien en un registro principal existente a menos que cree un nuevo registro principal, presiono guardar, luego agrego una fila en mi subcuadrícula y mi función se ejecuta dos veces por alguna razón
¿Alguien sabe por qué mi código se ejecuta dos veces solo cuando creo un nuevo registro principal, la función está en onLoad incluso?
Tomé el código principal de aquí: (la función dosomething se dispara dos veces)
function onLoad() { var funtionName = "onLoad"; try { setTimeout(function () { if (Xrm.Page != null && Xrm.Page != undefined && Xrm.Page.getControl("contact_subgrid") != null && Xrm.Page.getControl("contact_subgrid") != undefined) { _rowCount = Xrm.Page.getControl("subgrid").getGrid().getTotalRecordCount(); Xrm.Page.getControl("subgrid").addOnLoad(onGridLoad); } }, 5000); } catch (e) { Xrm.Utility.alertDialog(functionName + "Error: " + (e.message || e.description)); } } function onGridLoad() { var functionName = " onGridLoad "; var currentRowCount = null; try { setTimeout(function () { if (Xrm.Page != null && Xrm.Page != undefined && Xrm.Page.getControl("contact_subgrid") != null && Xrm.Page.getControl("contact_subgrid") != undefined) { currentRowCount = Xrm.Page.getControl("subgrid").getGrid().getTotalRecordCount(); if (currentRowCount > _rowCount) { dosomething(); _rowCount = currentRowCount; } else if (currentRowCount < _rowCount) { dosomethingelse(); _rowCount = currentRowCount; } } }, 2000); } catch (e) { Xrm.Utility.alertDialog(functionName + "Error: " + (e.message || e.description)); } }Su código usa el objeto Xrm.Page , que está obsoleto en Dynamics 365 CE Online/Dataverse. Debe usar la nueva API; consulte Referencia de la API del cliente - MS Docs .
Su función se llama dos veces, porque el sistema llama dos veces a la función onLoad : primero cuando el formulario se abre en el modo "Crear", segundo cuando se guardan los datos en el formulario. Una vez que se han guardado los datos, la página del formulario no se vuelve a cargar, pero, sin embargo, se vuelve a llamar a la función onLoad del formulario. Esto hace que su secuencia de comandos adjunte un segundo controlador onLoad.
Prueba este código. Se basa en la API de script moderna. Asegúrese de que su formulario pase el contexto del formulario a la función onLoad :
function onLoad(c) { const formContext = c.getFormContext(); const subGrid = formContext.getControl("subgrid"); const contactSubGrid = formContext.getControl("contact_subgrid"); if (subGrid === null || contactSubGrid === null) return; try { setTimeout(() => { let rowCount = subGrid.getGrid().getTotalRecordCount(); subGrid.addOnLoad(controlContext => { setTimeout(() => { let currentRowCount = subGrid.getGrid().getTotalRecordCount(); try { if (currentRowCount > rowCount) { // do something } else if (currentRowCount < rowCount) { // do something else } rowCount = currentRowCount; } catch (e) { Xrm.Navigation.openErrorDialog({ message: e.message, errorCode: e.errorCode }); } }, 2000); }); }, 5000); } catch (e) { Xrm.Navigation.openErrorDialog({ message: e.message, errorCode: e.errorCode }); } }