Query einer Ansicht im Code ausführen

Es kommt häufig vor das eine bestimmte Aktion auf einer Menge Records einer Entität ausgeführt werden soll. Natürlich soll konfiguriert werden können welche Records das sind. Was liegt da näher als die bereits vorhandene “Advance Find” zu verwenden um diesen Filter zu definieren?Nun wollen wir dem User jedoch nicht zumuten, das Fetch XML von Hand herunterzuladen und eine Konfiguration anzupassen. Der Benutzer soll einfach eine neue Ansicht anlegen können.

In diesem Beispiel möchten wir die custom Action “XY” auf allen Accounts in einer Ansicht ausführen. Wie lässt sich das bewerkstelligen?
Es ist relativ einfach. Man muss dafür nur drei Dinge wissen:

  1. Die Ansichten werden in einer eigenen Entität “SavedQuery” gespeichert.
  2. Die “SavedQuery” Entität hat ein Field “FetchXml”
  3. Die Klasse “FetchExpression” nimmt FetchXml entgegen und leitet von der Klasse “QueryBase” ab. Somit kann eine “FetchExpression” als Query für einen “RetrieveMultipleRequest” mitegegeben werden.
const int viewToRun = 0;
var retrieveSavedQueriesRequest = new RetrieveMultipleRequest();
var savedQueriesQuery = new QueryExpression();
// Die Ansichten werden in der "SavedQuery" Entität gespeichert
savedQueriesQuery.EntityName = "savedquery";
// Nur für Accounts
savedQueriesQuery.Criteria.AddCondition("returnedtypecode", ConditionOperator.Equal, 1);
// Nur das FetchXml wird benötigt
savedQueriesQuery.ColumnSet = new ColumnSet("name", "fetchxml");
retrieveSavedQueriesRequest.Query = savedQueriesQuery;
var retrieveSavedQueriesResponse = (RetrieveMultipleResponse)OrganizationServiceContext.Execute(retrieveSavedQueriesRequest);
var fetchXml = retrieveSavedQueriesResponse.EntityCollection.Entities[viewToRun ].GetAttributeValue<string>("fetchxml")
const string actionToRun = "xy";
var retrieveRecordsRequest = new RetrieveMultipleRequest();
retrieveRecordsRequest.Query = new FetchExpression(fetchXmlToRun);
foreach (var record in ((RetrieveMultipleResponse)OrganizationServiceContext.Execute(retrieveRecordsRequest)).EntityCollection.Entities)
{
    // Action für record triggern
    var actionRequest = new OrganizationRequest(actionToRun);
    actionRequest["Target"] = record.ToEntityReference();
    OrganizationServiceContext.Execute(actionRequest);
}

Leave a Reply

Your email address will not be published. Required fields are marked *