【发布时间】:2020-09-14 00:55:47
【问题描述】:
我正在编写一个可调用方法批处理顶点类,以将“订单包”对象上的多个货币字段汇总到其“订单位置”的父对象。我以为我已经正确添加了所有内容,但它似乎正在将“Package_Monthly_Recurring_Fees__c”和“Package_One_Time_Fees__c”从 Package_Monthly_Recurring_Fees__c 字段更新为相同的价格。有人可以帮我确定为什么两个字段使用相同的价格吗?非常感谢任何帮助!
global class OrderLocationRollupSummary implements Database.Batchable<sObject>, Schedulable {
//Invocable Method
@InvocableMethod(label='Rollup All Order Packages to Locations')
global static void rollupAllorderpackages(List<Order_Location_Package__c> orderpackages) {
rollupOrderPackages(orderpackages);
}
//Batchable Methods
global Database.QueryLocator start(Database.BatchableContext bc) {
return Database.getQueryLocator([SELECT Id FROM Order_New_Location__c]);
}
global void execute(Database.BatchableContext context, List<sObject> batch){
Set<Id> OrderLocationIds = new Set<Id>();
for (sObject ordloc : batch) {
OrderLocationIds.add(ordloc.Id);
}
summarizeOrderPackages(OrderLocationIds);
}
global void finish(Database.BatchableContext context) {}
//Schedulable Methods
global void execute(SchedulableContext context){
OrderLocationRollupSummary batchJob = new OrderLocationRollupSummary();
Database.executeBatch(batchJob);
}
//Static Methods
public static void rollupOrderPackages(List<Order_Location_Package__c> orderpackages) {
Set<Id> OrderLocationIds = new Set<Id>();
//Get Order Location Ids from specified orderpackages
for (Order_Location_Package__c ordpckg : orderpackages) {
OrderLocationIds.add(ordpckg.New_Location_Name__c);
}
if (OrderLocationIds.isEmpty() == false) {
/*Execute as a future call so that the user doesn't have to wait around for
the rollup to finish. Unless, already in a future or batch call state then
just perform the rollup.*/
if (System.isFuture() == false && System.isBatch() == false) {
summarizeOrderPackagesAsync(OrderLocationIds);
}
else {
new OrderLocationRollupSummary().summarizeOrderPackages(OrderLocationIds);
}
}
}
@future
public static void summarizeOrderPackagesAsync(Set<Id> OrderLocationIds) {
new OrderLocationRollupSummary().summarizeOrderPackages(OrderLocationIds);
}
//Public Methods
public void summarizeOrderPackages(Set<Id> OrderLocationIds) {
//Get Order Locations to Update
List<Order_New_Location__c> orderlocations = queryOrderLocationsById(OrderLocationIds);
Map<Id, double> results = getOrderPackagesAmountsByLocationId(OrderLocationIds);
//Loop Order Locations and set Amounts
List<Order_New_Location__c> orderlocationsToUpdate = new List<Order_New_Location__c>();
for (Order_New_Location__c ordloc : orderlocations) {
double mrf = 0;
double otf = 0;
if (results.containsKey(ordloc.Id)) {
mrf = results.get(ordloc.Id);
otf = results.get(ordloc.Id);
}
//Determine if Amounts have Changed
if (ordloc.Package_Monthly_Recurring_Fees__c != mrf ||
ordloc.Package_One_Time_Fees__c != otf) {
ordloc.Package_Monthly_Recurring_Fees__c = mrf;
ordloc.Package_One_Time_Fees__c = otf;
orderlocationsToUpdate.add(ordloc); //Add location to collection to be updated
}
}
if(orderlocationsToUpdate.isEmpty() == false) {
Database.SaveResult[] saveResults = Database.update(orderlocationsToUpdate, false);
System.debug(saveResults);
}
}
//Private Methods
public Map<Id, double> getOrderPackagesAmountsByLocationId(Set<Id> OrderLocationIds) {
Map<Id, double> resultsByOrderLocationId = new Map<Id, double>();
//Summarize Order Package Amounts by Order Location Id
AggregateResult[] results = aggregateOrderPackageAmounts(OrderLocationIds);
for (AggregateResult result : results) {
Id orderlocationId = (Id) result.get('OrderLocation');
double mrf = (double) result.get('MRFees');
double otf = (double) result.get('OTFees');
resultsByOrderLocationId.put(orderlocationId, mrf);
resultsByOrderLocationId.put(orderlocationId, otf);
}
return resultsByOrderLocationId;
}
//Query Methods
private List<Order_New_Location__c> queryOrderLocationsById(Set<Id> OrderLocationIds) {
return [SELECT
Id
,Package_Monthly_Recurring_Fees__c
,Package_One_Time_Fees__c
FROM
Order_New_Location__c
WHERE
Id IN :OrderLocationIds];
}
private AggregateResult[] aggregateOrderPackageAmounts(Set<Id> OrderLocationIds) {
return [SELECT
New_Location_Name__c OrderLocation
,SUM(Monthly_Recurring_Fees__c) MRFees
,SUM(One_Time_Fees__c) OTFees
FROM
Order_Location_Package__c
WHERE
New_Location_Name__c IN :OrderLocationIds
GROUP BY
New_Location_Name__c];
}
}
【问题讨论】:
-
我对 Apex 有点陌生,因此我们将不胜感激。如果有更好的方法来写这个,我也会很感兴趣。我的主要目标是需要将多个货币字段汇总到父记录,但我需要尽可能接近实时地进行此操作,并且有时会更新 200 多个父记录(订单位置)。再次感谢您的指导!
标签: salesforce apex salesforce-development salesforce-developer