Hi experts,
I have a issue on my delete plugins. I have 2 delete plugins. Both are identical.
As you can see both are identical. Both having the same pre Image with the ID, TrainingID and Cost/Hours.
Both plugins also have the same code running. Only difference is that Extra Costs will update Remaining Budget and Duration will update Remaining Days.
Here's a code snippet of Extra Costs:
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Query;
using System;
using System.Collections.Generic;
using System.Linq;
namespace TrainingBudget.Plugin
{
public class DeleteExtraCost : IPlugin
{
private static IOrganizationService _service;
private IOrganizationServiceFactory _serviceFactory;
private IPluginExecutionContext _context;
public void Execute(IServiceProvider serviceProvider)
{
_context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
if (_context.Depth > 1)
{
return;
}
if (_context.MessageName != "Delete")
{
return;
}
_serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
_service = _serviceFactory.CreateOrganizationService(_context.UserId);
UpdateBudgets();
}
private void UpdateBudgets()
{
var extraKost = EntityMapper.Map<ExtraKost>(_context.PreEntityImages.FirstOrDefault(q => q.Key == "cref8_extrakost").Value);
EntityReference extraKostERef = ((EntityReference)_context.PreEntityImages.FirstOrDefault(q => q.Key == "cref8_extrakost").Value.Attributes["cref8_extrakosttraining"]);
var training = EntityMapper.Map<Training>(_service.Retrieve("cref8_opleiding", extraKostERef.Id, new ColumnSet("cref8_jaarstartopleiding")));
var cursists = GetCursists("cref8_cursist", "cref8_extrakost_cref8_cursist", "cref8_cursistid", "cref8_extrakostid", training.Id);
foreach (var cursist in cursists)
{
var traineeBudget = GetTraineeBudget(cursist, training);
double nieuwBudget = traineeBudget.RemainingBudget + extraKost.Price;
Entity budget = new Entity("cref8_jaarlijkbudget");
budget["cref8_jaarlijkbudgetid"] = traineeBudget.Id;
budget["cref8_overigebudget"] = nieuwBudget;
_service.Update(budget);
}
}
private static List<Cursist> GetCursists(string entityName, string linkToEntityName, string linkAttributeName, string attributeName, Guid id)
{
var query = new QueryExpression()
{
EntityName = entityName,
ColumnSet = new ColumnSet("cref8_cursistid")
};
var link = query.AddLink(linkToEntityName, linkAttributeName, linkAttributeName);
link.LinkCriteria = new FilterExpression()
{
Conditions =
{
new ConditionExpression(attributeName, ConditionOperator.Equal, id)
}
};
return _service.RetrieveMultiple(query).Entities.Select(e => EntityMapper.Map<Cursist>(e)).ToList();
}
private static TraineeBudget GetTraineeBudget(Cursist cursist, Training training)
{
ConditionExpression ceYearlyBudgetFromTrainee = new ConditionExpression("cref8_cursist", ConditionOperator.Equal, cursist.Id);
ConditionExpression ceYearlyBudgetYear = new ConditionExpression("cref8_jaar", ConditionOperator.Equal, (int)training.Year);
FilterExpression filter = new FilterExpression();
filter.Conditions.Add(ceYearlyBudgetFromTrainee);
filter.Conditions.Add(ceYearlyBudgetYear);
QueryExpression qeYearlyBudget = new QueryExpression("cref8_jaarlijkbudget");
qeYearlyBudget.ColumnSet = new ColumnSet("cref8_jaarlijkbudgetid", "cref8_overigebudget");
qeYearlyBudget.Criteria.AddFilter(filter);
EntityCollection yearlyBudgetResult = _service.RetrieveMultiple(qeYearlyBudget);
return EntityMapper.Map<TraineeBudget>(yearlyBudgetResult.Entities.First());
}
}
}
Here's code snippet of Duration:
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Query;
using System;
using System.Collections.Generic;
using System.Linq;
namespace TrainingBudget.Plugin
{
public class DeleteDuration : IPlugin
{
private static IOrganizationService _service;
private IOrganizationServiceFactory _serviceFactory;
private IPluginExecutionContext _context;
public void Execute(IServiceProvider serviceProvider)
{
_context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
if (_context.Depth > 1)
{
return;
}
if (_context.MessageName != "Delete")
{
return;
}
_serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
_service = _serviceFactory.CreateOrganizationService(_context.UserId);
UpdateBudgets();
}
private void UpdateBudgets()
{
var duration = EntityMapper.Map<Duration>(_context.PreEntityImages.FirstOrDefault(q => q.Key == "cref8_duratie").Value);
EntityReference duratieERef = ((EntityReference)_context.PreEntityImages.FirstOrDefault(q => q.Key == "cref8_duratie").Value.Attributes["cref8_opleidingduratie"]);
var training = EntityMapper.Map<Training>(_service.Retrieve("cref8_opleiding", duratieERef.Id, new ColumnSet("cref8_jaarstartopleiding")));
var cursists = GetCursists("cref8_cursist", "cref8_opleiding_cref8_cursist", "cref8_cursistid", "cref8_opleidingid", training.Id);
foreach (var cursist in cursists)
{
var traineeBudget = GetTraineeBudget(cursist, training);
double nieuwAantalDagen = traineeBudget.RemainingDays + (duration.Hours / 8);
Entity budget = new Entity("cref8_jaarlijkbudget");
budget["cref8_jaarlijkbudgetid"] = traineeBudget.Id;
budget["cref8_overigedagen"] = nieuwAantalDagen;
_service.Update(budget);
}
}
private static List<Cursist> GetCursists(string entityName, string linkToEntityName, string linkAttributeName, string attributeName, Guid id)
{
var query = new QueryExpression()
{
EntityName = entityName,
ColumnSet = new ColumnSet("cref8_cursistid", "cref8_fullname")
};
var link = query.AddLink(linkToEntityName, linkAttributeName, linkAttributeName);
link.LinkCriteria = new FilterExpression()
{
Conditions =
{
new ConditionExpression(attributeName, ConditionOperator.Equal, id)
}
};
return _service.RetrieveMultiple(query).Entities.Select(e => EntityMapper.Map<Cursist>(e)).ToList();
}
private static TraineeBudget GetTraineeBudget(Cursist cursist, Training training)
{
ConditionExpression ceYearlyBudgetFromTrainee = new ConditionExpression("cref8_cursist", ConditionOperator.Equal, cursist.Id);
ConditionExpression ceYearlyBudgetYear = new ConditionExpression("cref8_jaar", ConditionOperator.Equal, (int)training.Year);
FilterExpression filter = new FilterExpression();
filter.Conditions.Add(ceYearlyBudgetFromTrainee);
filter.Conditions.Add(ceYearlyBudgetYear);
QueryExpression qeYearlyBudget = new QueryExpression("cref8_jaarlijkbudget");
qeYearlyBudget.ColumnSet = new ColumnSet("cref8_jaarlijkbudgetid", "cref8_overigedagen");
qeYearlyBudget.Criteria.AddFilter(filter);
EntityCollection yearlyBudgetResult = _service.RetrieveMultiple(qeYearlyBudget);
return EntityMapper.Map<TraineeBudget>(yearlyBudgetResult.Entities.First());
}
}
}
As you can see both Plugins do the same thing. They get the TraineeBudget of all Trainees and refund the ExtraKost or the Duration.
How can one Plugin work, and basically an identical Plugin does not work?
EDIT:
Best Regards,
Anthony
Solved! Go to Solution.
Hi @Anthony_Dob ,
Make sure you register your plugin step on Pre-validation stage instead of pre-operation.
Because primary entity record and related records will be already deleted from the system when plugin reaches pre-operation stage.
Thanks,
Bipin
Kudos and accept my solution if helpful!
Hi @Anthony_Dob ,
Make sure you register your plugin step on Pre-validation stage instead of pre-operation.
Because primary entity record and related records will be already deleted from the system when plugin reaches pre-operation stage.
Thanks,
Bipin
Kudos and accept my solution if helpful!
The first Microsoft-sponsored Power Platform Conference is coming in September. 100+ speakers, 150+ sessions, and what's new and next for Power Platform.
This training provides practical hands-on experience in creating Power Apps solutions in a full-day of instructor-led App creation workshop.
User | Count |
---|---|
15 | |
10 | |
9 | |
5 | |
4 |
User | Count |
---|---|
22 | |
16 | |
14 | |
13 | |
12 |