Quiero devolver true o false desde la función showHideAddNewButton . Tengo un EnableRule en un botón de cinta, que llama a una regla personalizada que llama a esta función showHideAddNewButton . Al pasar true , que mostrará el botón, o false , que ocultará el botón.
Tengo que acceder a los statuscode de código de estado (motivo del estado) y statecode estado (estado) en la entidad. Creé una consulta usando Xrm.WebApi.retrieveMultipleRecords , pero no puedo hacer que devuelva una bandera. Quiero que el método retrieveMultipleRecords solo se ejecute y nunca se vuelva a llamar, pero 'devolver verdadero' a continuación se ejecuta configurando mi botón en verdadero siempre.
function showHideAddNewCsrsRecalculation(primaryControl){ var fileNumber = primaryControl.getAttribute("ssg_filenumber").getValue(); Xrm.WebApi.retrieveMultipleRecords("rrg_csrsfile", "?$select=statuscode,statecode,rr_filenumber&$filter=rr_filenumber eq '" + fileNumber + "'").then( function success(result) { for (var i = 0; i < result.entities.length; i++) { var statusCode = result.entities[i].statecode; var statusReasonCode = result.entities[i].statuscode; //if draft make button invisible if (statusReasonCode == 8676725) return false; //if submitted make button invisible if (statusReasonCode == 8676726) return false; //if inactive make button invisible if (statusCode == 1) return false; } }, function (error) { console.log(error.message); // handle error conditions } ); //if draft make button invisible //if (primaryControl.getAttribute("statuscode").getValue() == 867670025) // return false; //if submitted make button invisible //if (primaryControl.getAttribute("statuscode").getValue() == 867670026) // return false; //if inactive make button invisible //if (primaryControl.getAttribute("statecode") != 'undefined' && primaryControl.getAttribute("statecode").getValue() == 1) // return false; //other options make button visible return true; --> This keeps getting called as a result my button is always visible }La función Xrm.WebApi.retrieveMultipleRecords devuelve una promesa , no un valor booleano real. La función se ejecuta de forma asíncrona, por lo que inmediatamente después de la llamada a esta función, se ejecuta la siguiente línea y esa línea siempre devuelve true .
De hecho, no es posible hacer que una llamada asíncrona sea síncrona. En su lugar, podemos seguir otro enfoque siguiendo estos pasos:
let isRecalculationButtonVisible = false; function onLoad(context) { const formContext = context.getFormContext(); const filter = "$filter=rr_filenumber eq '" + formContext.getAttribute("ssg_filenumber").getValue() + "' and (statecode eq 1 or statuscode eq 8676725 or statuscode eq 8676726)"; Xrm.WebApi.retrieveMultipleRecords("rrg_csrsfile", "?$select=rrg_csrsfileid&$top=1&" + filter) .then(function (result) { isRecalculationButtonVisible = result.entities.length === 0; }) .catch(function (error) { console.log(error.message); }) .finally(() => { formContext.ui.refreshRibbon(false); }); } function showHideAddNewCsrsRecalculation() { return isRecalculationButtonVisible; }Como probablemente ya notó, agregué algunas mejoras.
$top=1 porque la cantidad de registros que cumplen las condiciones no es relevante aquí. Como consecuencia, la única verificación que debe realizarse es si se devuelve un registro o no.retrieveMultipleRecords devuelve una promesa. El manejo de errores recomendado para las promesas es agregar una función de catch al final de la cadena.