Loading

Tiene trabajo sin enviar pendiente. Envíe o revierta antes de llamar.

Fecha de publicación: Mar 30, 2020
Descripción

Es posible que tenga que crear un registro y luego actualizarlo con información proporcionada por un servicio web. No obstante, no puede producirse una llamada de servicio web después de una sentencia DML dentro de la misma transacción. Para realizar la acción requerida, la transacción debe separarse en dos partes de modo que la transacción DML se complete antes de que se produzca la llamada del servicio web.

Solución

Dividir la transacción en dos procesos Ajax separados

El primero inserta el registro y el segundo realiza la llamada y es capaz de actualizar el registro que acaba de insertar.

Página TestWsCallout
<apex:page controller="TestWsCallout" tabstyle="Account"> <apex:form > <apex:actionFunction action="{!InsertRecord}" name="InsertRecord_JS" Rerender="statuses" status="Status1" oncomplete="CallWebService_JS();"/> <apex:actionFunction action="{!CallWebService}" name="CallWebService_JS" status="Status2" reRender="statuses, msg"/> <apex:outputPanel id="statuses"> <apex:actionStatus id="Status1" startText="...Insertando registro en base de datos..." /> <apex:actionStatus id="Status2" startText="...Llamando al servicio web..." /> </apex:outputPanel> <apex:outputPanel id="msg"> <apex:pageMessages /> </apex:outputPanel> <div><input name="DoAction" class="btn" type="button" value="Do Action" onclick="InsertRecord_JS();return false;"/></div> </apex:form> </apex:page>

Clase TestWsCallout
public class TestWsCallout{ Account myAccount; public PageReference InsertRecord() { myAccount = new Account(name = 'Cuenta de prueba'); insert myAccount; // Llamar a un servicio web aquí lanzaría una excepción de devolución nula; } public PageReference CallWebService() { // Ejecutar una llamada a un servicio web HttpRequest req = new HttpRequest(); req.setEndpoint('http://MyWebService12345678790.com?id=' + myAccount.Id); req.setMethod('GET'); HttpResponse response = new Http().send(req); // Simular una actualización myAccount.Name = 'Cuenta de prueba 2'; update myAccount; ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.CONFIRM, 'Servicio web llamado en nueva cuenta: ' + myAccount.Name)); return null; } }
Número del artículo de conocimiento

000385374

 
Cargando
Salesforce Help | Article