Hi,
I am running AX2012 CU7 and running some migration trials. I am looking at migrating through the RouteOperations entity.
The entity populates the target field RouteOpr(RouteOpr).PropertyId for the respective route line.
I also need to populate (WrkCtrActivityRequirementSet).PropertyId. These two fields drive a modification we have implemented.
As you do, having never touched X++ before I set about modifying the dixf class. How hard can it be? It's not a straight map, but there are other fields in the WrkCtrActivityRequirementSet table that populate, so I just copy that.
I modified the class as below, copying the wrkCtrActivityRequirementSet.LoadPercent field syntax.
I compiled and ran an incremental CIL for good measure. Unfortunately my migration entity behaved no differently on the second pass. No problems, no errors, it just didn't populate as I had hoped.
I appreciate this isn't an x++ tutorial forum but I would appreciate someone looking over my code below to see if they can point me in the direction of what I did wrong.
public container GenerateRouteRequirement(boolean _stagingToTarget = true)
{
WrkCtrActivity wrkCtrActivity;
WrkCtrRouteOprActivity wrkCtrRouteOprActivity;
WrkCtrActivityRequirementSet wrkCtrActivityRequirementSet;
WrkCtrActivityRequirement wrkCtrActivityRequirement;
WrkCtrActivityCapabilityRequirement capabilityRequirement;
HcmRatingLevel hcmRatingLevel;
container res;
WrkCtrId wrkCtrId;
if (_stagingToTarget)
{
if ( target.RecId)
{
if(entity.UsedForOperationScheduling || entity.UsedForJobScheduling ||
entity.RelationshipType || entity.RatingLevelId || entity.Quantity || entity.MinimumLevelNeeded ||
entity.LoadPercent || entity.PropertyId || entity.Factor || entity.EntityType || entity.Description || entity.WrkCtrId)
{
wrkCtrActivity.EntityType = WrkCtrActivityType::RouteOpr;
wrkCtrActivity.write();
select forUpdate firstOnly wrkCtrRouteOprActivity
where wrkCtrRouteOprActivity.RouteOpr == target.RecId
&& wrkCtrRouteOprActivity.RouteOprDataAreaId == target.dataAreaId;
wrkCtrRouteOprActivity.Activity = wrkCtrActivity.RecId;
wrkCtrRouteOprActivity.RouteOpr = target.RecId;
wrkCtrRouteOprActivity.RouteOprDataAreaId = target.dataAreaId;
wrkCtrRouteOprActivity.write();
wrkCtrActivityRequirementSet = wrkCtrActivityRequirementSet::findActivity(wrkCtrActivity.RecId,true);
wrkCtrActivityRequirementSet.initValue();
wrkCtrActivityRequirementSet.Activity = wrkCtrActivity.RecId;
wrkCtrActivityRequirementSet.Description = entity.Description;
wrkCtrActivityRequirementSet.LoadPercent = entity.LoadPercent;
wrkCtrActivityRequirementSet.PropertyId = entity.PropertyId;
wrkCtrActivityRequirementSet.Quantity = entity.Quantity;
wrkCtrActivityRequirementSet.write();
select forUpdate firstOnly wrkCtrActivityRequirement
where wrkCtrActivityRequirement.ActivityRequirementSet == wrkCtrActivityRequirementSet.RecId;
wrkCtrActivityRequirement.initValue();
wrkCtrActivityRequirement.ActivityRequirementSet = wrkCtrActivityRequirementSet.RecId;
wrkCtrActivityRequirement.RelationshipType = DMFEntityBase::string2Enum(entity.RelationshipType, enumNum(WrkCtrActivityRequirementType));
wrkCtrActivityRequirement.UsedForOperationScheduling = DMFEntityBase::string2Enum(entity.UsedForOperationScheduling, enumNum(NoYes));
wrkCtrActivityRequirement.UsedForJobScheduling = DMFEntityBase::string2Enum(entity.UsedForJobScheduling, enumNum(NoYes));
wrkCtrActivityRequirement.write();
select forUpdate firstOnly capabilityRequirement
where capabilityRequirement.ActivityRequirement == wrkCtrActivityRequirement.RecId;
capabilityRequirement.initValue();
capabilityRequirement.MinimumLevelNeeded = entity.MinimumLevelNeeded;
capabilityRequirement.ActivityRequirement = wrkCtrActivityRequirement.RecId;
capabilityRequirement.write();
if(entity.WrkCtrId)
{
this.createSubTypeRequirement(wrkCtrActivityRequirement, entity.WrkCtrId);
}
}
}
}
else
{
select firstOnly wrkCtrRouteOprActivity
where wrkCtrRouteOprActivity.RouteOpr == target.RecId
&& wrkCtrRouteOprActivity.RouteOprDataAreaId == target.dataAreaId;
wrkCtrActivity = WrkCtrActivity::find(wrkCtrRouteOprActivity.Activity);
wrkCtrActivityRequirementSet = wrkCtrActivityRequirementSet::findActivity(wrkCtrActivity.RecId);
select firstOnly wrkCtrActivityRequirement
where wrkCtrActivityRequirement.ActivityRequirementSet == wrkCtrActivityRequirementSet.RecId;
select firstOnly MinimumLevelNeeded from capabilityRequirement
where capabilityRequirement.ActivityRequirement == wrkCtrActivityRequirement.RecId;
select firstOnly1 RatingLevelId from hcmRatingLevel where hcmRatingLevel.RatingLevelId == entity.RatingLevelId;
wrkCtrId = this.getSubTypeRequirement(wrkCtrActivityRequirement);
res = [
wrkCtrActivityRequirement.UsedForOperationScheduling,
wrkCtrActivityRequirement.UsedForJobScheduling,
enum2str(wrkCtrActivityRequirement.RelationshipType),
hcmRatingLevel.RatingLevelId,
wrkCtrActivityRequirementSet.Quantity,
capabilityRequirement.MinimumLevelNeeded,
wrkCtrActivityRequirementSet.LoadPercent,
wrkCtrActivityRequirementSet.PropertyId,
hcmRatingLevel.Factor,
wrkCtrActivity.EntityType,
wrkCtrActivityRequirementSet.Description,
wrkCtrId];
}
return res;
}
I really want to get my teeth into X++ but it turns out AX implementations are pretty time consuming. Any assistance would be gratefully accepted (including any overview of what this is doing (res, container, piping || entity. , etc).
Cheers