bnb
bnb

Reputation: 111

JavaScript triggered twice in Form Onchage

I use Javascript to trigger a Flow when I want to change the state. Everything worked fine but the JavaScript function triggered two times when I change the state my record.

i think the Problem is something with the save. enter image description here enter image description here enter image description here enter image description here

storno=function (executionContext)
{
	var functionName = "storno";
	var formContext = executionContext.getFormContext();
	if(formContext.getAttribute("statecode").getValue() == 3)
	{ 
		//try{
			var data= {"id": ""};
			data.id = formContext.data.entity.getId();
			var requestUrl = "https://prod-78.westeurope.logic.azure.com:443/workflows/6bff2c7051424e00b8519160db83c1bf/triggers/manual/paths/invoke?api-version=2016-06-01&sp=%2Ftriggers%2Fmanual%2Frun&sv=1.0&sig=sfSBGx1gP3WzU1x7XMY64WVFc_RJ6EBMadIBnNudKR4";
			var req = new XMLHttpRequest();
			req.open("POST",requestUrl,true);
			req.setRequestHeader("Accept","application/json");
			req.setRequestHeader("Content-Type","application/json; charset=utf-8");
			req.setRequestHeader("OData-MaxVersion","4.0");
			req.setRequestHeader("OData-Version","4.0");
			req.onreadystatechange = function(){
				if(this.readyState == 4 || this.readyState == 2){
					req.onreadystatechange = null;
				
					if (this.status == 200 || this.status == 204 || this.status == 202){
						formContext.data.refresh(true);
		       Xrm.Utility.openEntityForm(formContext.data.entity.getEntityName(),formContext.getAttribute("description").getValue());
						
					}
					//else{
					//	var error = JSON.parse(this.response).error;
					//}
				}
			};
			req.send(JSON.stringify(data));	
		//}
		//catch(ex){
		//Obj_RunFlow.throwError(functionName,ex.massage);
		//}
	}
		
};

Upvotes: 0

Views: 1858

Answers (2)

Antonio González
Antonio González

Reputation: 61

Have you resolved this issue? I was experiencing the same problem where an OnChange event function was being triggered twice, I did manage to resolve it so hopefully this helps

I noticed this happens only right after the record gets created, and the reloads in UPDATE type.

Seems like the problem happens because the onChange event handlers are not being cleared properly (maybe product defect) hence added twice and triggered twice.

I have been able to avoid this by adding a function that adds the OnChange function at the Form OnLoad, this allows you to handle when you want to attach the function to the OnChange event. Something similar to this:

FNS = {
OnLoadMain: function (executionContext) {
    try {
        
        FNS.OnChangeEvents(executionContext);
    }
    catch (ex) {
        var alertStrings = {
            text: "Function : OnLoadMain" + ex.message.toString()
        };
        Xrm.Navigation.openAlertDialog(alertStrings);
    }
},
OnChangeEvents: function (executionContext) {
    try {
        var formContext = executionContext.getFormContext();
        if (formContext.ui.getFormType() !== 1) {
        
            formContext.getAttribute("statuscode").addOnChange(function (executionContext) { //Status on change only upon update to prevent event from being added twice (product bug)

                //do you stuff here
            });
        }

    } catch (ex) {
        var alertStrings = {
            text: "Function : OnChangeEvent" + ex.message.toString()
        };
        Xrm.Navigation.openAlertDialog(alertStrings);
    }
},
}

The only thing left is to place the event handler under the Form

enter image description here

Upvotes: 2

AnkUser
AnkUser

Reputation: 5531

can I add my 2 cent.

Why are you firing your flow via Javascript and now via CDS connector.

If you fire your flow with Javascript, it will trigger only when user interaction with button happens. Your flow will not trigger if Record (status) is changed by some background logic or some other plugin.

To make your flow run on Status change under all circumstances let it be via user interaction of background logic,

I would prefer running your flow via CDS connector and that too when Record is updated and filter out your field to be only Status.

In this way your flow will get triggered automatically only when Status field is changed.

Upvotes: 0

Related Questions