Ich habe ein Plugin auf Update
(pre-op) von InvoiceDetail
, in denen ich die zugehörige Invoice
abrufen, um einige weitere Informationen von ihm zu erhalten (dh: das Steuerprofil, das ausgewählt wurde auf Rechnungsebene) in CRM 2016.Retrieve ein Update in Plugin
Hier ist, wie ich es tun:
//xrmObjects is an object containing all useful objects in plugins/workflow...
var invoice = RetrieveEntity(xrmObjects.Service, xrmObjects.TracingService, image["invoiceid"] as EntityReference, new ColumnSet("invoiceid", "pricelevelid", "customerid", "opportunityid", "xtc_tax_definition"));
Diese spezifische Codezeile oben löst eine andere Update
auf InvoiceDetail
Er Re die oben beschriebene Methode aufgerufen:
public static Entity RetrieveEntity(IOrganizationService service, ITracingService tracingService, EntityReference target, ColumnSet columnSet)
{
Entity entity = new Entity();
try
{
entity = CrmServiceExtensions.ExecuteWithRetry<RetrieveResponse>(service, new RetrieveRequest
{
Target = target,
ColumnSet = columnSet
}).Entity;
}
catch (Exception ex)
{
tracingService.Trace($"Error retrieving {target.LogicalName}: {ex.Message}");
throw;
}
return entity;
}
Hier ExecuteWithRetry
:
public static T ExecuteWithRetry<T>(IOrganizationService service, OrganizationRequest request)
where T : OrganizationResponse
{
T response = null;
int i = 0;
// Maximum of five iterations.
while (i < 5)
{
try
{
response = (T)service.Execute(request);
// If the Execute does not throw an Exception, break the loop
break;
}
catch (System.Web.Services.Protocols.SoapException e)
{
// Retry if the SoapException is a "Generic SQL Error",
// otherwise rethrow the SoapException.
// "Generic SQL Error" might indicate a deadlock.
if (e.Detail.InnerText.ToLower().Contains("generic sql error"))
{
++i;
// Wait (sleep thread) for i * 1000 milliseconds.
// So, first iteration waits 1 second,
// while fifth iteration will wait 5 seconds.
System.Threading.Thread.Sleep(i * 1000);
}
else throw;
}
}
if (i >= 5)
{
throw new Exception("ExecuteWithRetry: too many retries");
}
return response;
}
Ich habe bestätigt, dass nichts flippige geschieht, wird die Update-Meldung auf InvoiceDetail ausgelöst wieder an der Linie response = (T)service.Execute(request);
ich auch versucht, mit früh gebundenen und einen Kontext, um die Rechnung, aber die LoadProperty
Methoden, die die Rechnung lädt die gleiche Sache ....
using (XrmServiceContext ctx = new XrmServiceContext(xrmObjects.Service))
{
Xrm.InvoiceDetail image = xrmObjects.PluginContext.PreEntityImages["invoicedetail"].ToEntity<Xrm.InvoiceDetail>();
try
{
ctx.LoadProperty(image, "invoice_details");
}
catch (Exception ex)
{
throw new InvalidPluginExecutionException($"Error retrieving invoice details' invoice: {ex.Message}");
}
}
Ich kann nichts in meiner Schrittkonfiguration sehen, die das tun würde. Irgendwelche Ideen?
Ich nehme an, Sie haben das Offensichtliche getan und überprüft, dass es keine Plugins in der Rechnung 'Retrieve' Nachricht gibt? – jasonscript
@jasonscript In der Tat, ich habe keine Workflow/Plugins für diese Nachricht und diese Entität (eigentlich keine für Rechnung) konfiguriert –
So führt eine Abfrage gegen die Rechnung, während der Aktualisierung einer Rechnung Detail einen anderen Invoice Detail Plugin Update-Trigger zu auftreten? – Daryl