D365/AX7/X++:Insert & Activate Item Price Or Cost In Costing Versions

Requirement

Insert & Activate Item Price Or Cost In Costing Versions using X++.

To know more about Costing Versions please follow below link

https://docs.microsoft.com/en-us/dynamics365/unified-operations/supply-chain/cost-management/costing-versions

Sample Code

public static void main(Args args)
{
InventItemPriceSim inventItemPriceSim;
InventDim inventDim;
PriceDiscAdmTrans priceDiscAdmTrans;
PriceDiscAdmTable PriceDiscAdmTable;
Dialog dialog;
DialogField dialogfieldItemId, dialogfieldInventSiteId, dialogActivatePrice, dialogCostingVersionId;
ItemId itemid;
NoYes activatePrice;
InventSiteId inventSiteId;
InventDim inventDimCreate;
CostingVersionId costingVersionId;
Args argsmenuItem = new Args();
;

dialog = new Dialog(‘Update Item Cost Price’);
dialogfieldItemId = dialog.addField(identifierStr(ItemId));
dialogfieldItemId.mandatory_RU(true);
dialogfieldInventSiteId = dialog.addField(identifierStr(InventSiteId));
dialogActivatePrice = dialog.addField(identifierStr(NoYes), ‘Activate Price’,’Activate Price ?’);
dialogfieldInventSiteId.mandatory_RU(true);
dialogCostingVersionId = dialog.addField(identifierStr(CostingVersionId));
dialogCostingVersionId.mandatory_RU(true);
dialog.run();
if (dialog.closedOk() == false)
{
return;
}
else
{
itemid = dialogfieldItemId.value();
inventSiteId = dialogfieldInventSiteId.value();
activatePrice = dialogActivatePrice.value();
costingVersionId = dialogCostingVersionId.value();
}
if (itemid && inventSiteId && costingVersionId)
{
try
{
ttsbegin;
while select sum(Amount), count(RecId) from priceDiscAdmTrans
join PriceDiscAdmTable
where priceDiscAdmTrans.JournalNum == PriceDiscAdmTable.JournalNum
join inventDim
group by inventDim.InventColorId, inventDim.InventSizeId, inventDim.InventStyleId, inventDim.configId, priceDiscAdmTrans.UnitId
where inventDim.inventDimId == priceDiscAdmTrans.InventDimId
&& PriceDiscAdmTable.Posted == NoYes::Yes
&& priceDiscAdmTrans.FromDate <= today()
&& priceDiscAdmTrans.ToDate >= today()
&& priceDiscAdmTrans.ItemRelation == itemid
&& priceDiscAdmTrans.relation == PriceType::PricePurch
{
inventItemPriceSim.clear();
inventItemPriceSim.initValue();
inventItemPriceSim.ItemId = itemid;
inventItemPriceSim.modifiedField(fieldNum(inventItemPriceSim, ItemId));
inventItemPriceSim.VersionId = costingVersionId;
inventItemPriceSim.modifiedField(fieldNum(inventItemPriceSim,VersionId));
inventItemPriceSim.PriceType = CostingVersionPriceType::Cost;
inventItemPriceSim.modifiedField(fieldNum(inventItemPriceSim,PriceType));
inventDimCreate.clear();
inventDimCreate.initValue();
//site wise costing so need todo use InventLocationId
inventDimCreate.InventSiteId = inventSiteId;
inventDimCreate.InventColorId = inventDim.InventColorId;
inventDimCreate.configId = inventDim.configId;
inventDimCreate.InventStyleId = inventDim.InventStyleId;
inventDimCreate.InventSizeId = inventDim.InventSizeId;
inventDimCreate = InventDim::findOrCreate(inventDimCreate);
inventItemPriceSim.InventDimId = inventDimCreate.inventDimId;
inventItemPriceSim.modifiedField(fieldNum(inventItemPriceSim, ItemId));
inventItemPriceSim.PriceUnit = 1;
inventItemPriceSim.modifiedField(fieldNum(inventItemPriceSim,FromDate));
inventItemPriceSim.UnitID = priceDiscAdmTrans.UnitId; //can be multiple unit of measure so curreny wise lines will be created //exception and assumption
inventItemPriceSim.modifiedField(fieldNum(inventItemPriceSim,UnitId));
if (priceDiscAdmTrans.RecId)//lines count
{
inventItemPriceSim.Price = priceDiscAdmTrans.Amount/priceDiscAdmTrans.RecId;//
}
inventItemPriceSim.modifiedField(fieldNum(inventItemPriceSim,Price));
inventItemPriceSim.FromDate = today();
inventItemPriceSim.modifiedField(fieldNum(inventItemPriceSim,FromDate));
inventItemPriceSim.insert();
if (activatePrice == NoYes::Yes)
{
inventItemPriceActivationJob inventItemPriceActivationJob = InventItemPriceActivationJob::construct();
inventItemPriceActivationJob.activateOneInventItemPriceSim(inventItemPriceSim);
}
}
ttscommit;
}
catch
{
ttsabort; //full rollback
throw error(‘Operation aborted.’);
}
}
}

 

 

D365/AX7:Exploring Extensible Data Security (XDS) With Example – Part 1

 

Basic Concepts

  1. Extensible Data Security (XDS) – It is a framework that allows developers or     system administrator to provide Data Security in D365 Finance and Operations.
  2. Policy Or Security Policy – Policy is your main technical AOT artifact or element which is used to achieve Extensible Data Security (XDS).
  3. Constrained table – Table/tables in a given security policy from which data is filtered or secured, based on the associated policy query. For example, Filtering Records in purchase order form (PurchTable) based on the primary table – VendGroup
  4. Primary table –  Primary Table is  For example, Filtering Records in purchase order form (PurchTable) based on the primary table – VendGroup.
  5. Policy queryQuery of Primary table which is used to filter records from constrained tables.

Requirement

In D365 Fins & Ops, customer has one customised table – UserSetup with fields – UserId & InventSiteId where customer is maintaining user-wise records along with Site code.

Filtering Site master (InventSiteId) lookup values on the basis of site code which is predefined in user setup of current user.

SiteLookup

Steps

  1. Create a query of usersetup table. Query
  2. Create a new security policy as per screens below:

 

 

D365/AX7: Extend Form Control OnLookup Event On Standard Form

Requirement

Extend Form Control OnLookup Event On Standard Form

Sample Code

/// <summary>
///
/// </summary>
/// <param name=”sender”></param>
/// <param name=”e”></param>
[FormControlEventHandler(formControlStr(TrvRequisitionDetails, TrvRequisitionTable_ACXSource), FormControlEventType::Lookup)]
public static void TrvRequisitionTable_ACXSource_OnLookup(FormControl sender, FormControlEventArgs e)
{
FormControlCancelableSuperEventArgs ce = e as FormControlCancelableSuperEventArgs;
SysTableLookup sysTableLookup = SysTableLookup::newParameters(tableNum(TrvDestinations), sender);
Query query = new Query();
query.addDataSource(tableNum(TrvDestinations));
sysTableLookup.addLookupfield(fieldNum(TrvDestinations,Destination ));
sysTableLookup.parmQuery(query);
sysTableLookup.performFormLookup();
ce.CancelSuperCall();
}

D365/AX7:Cancel Deliver Remainder Quantity In Sales Order Lines

Requirement

D365/AX7:Cancel Deliver Remainder Quantity In Sales Order Lines

Sample Code

[code language="csharp"]
while select forupdate salesLine
where salesLine.SalesId == 'Your Sales Id'
&& salesLine.SalesQty > 0 //only for sales Order
&& salesLine.RemainSalesPhysical != 0
{
ret = SalesUpdateRemain::updateDeliveryRemainder(salesLine, 0, 0);
if(!ret)
{
atleastOneErrorfound = true;
error(strFmt("Error In Cancellation Of Sales Line # %1: of Sales id # %2.",salesLine.LineNum, salesLine.SalesId));
}
}
[/code]

D375/AX7:Create Quality Orders Using X++

Requirement

Create Quality Orders Using X++

Sample Code

[code language = “cpp”]
public static void CreateQualityOrder(InventRefId _refId, ItemId _componentId, ItemName _componentName, InventTestGroupId _inventTestGroupId,AcxQualityTestType _qualityTestType, Description _location = ”)
{
InventQualityOrderTable inventQualityOrderTable;
InventQualityOrderLine inventQualityOrderLine;
InventDim inventDim;
InventTestGroup inventTestGroup;
InventTestGroupMember inventTestGroupMember;
InventSiteGateEntry_IN inventSiteGateEntry_IN;
AcxCMRNDetails acxCMRNDetails;
AcxCMRNLineDetails acxCMRNLineDetails;
AcxCMRNHeader acxCMRNHeader;
;

inventQualityOrderTable.InventRefId= _refId;
inventQualityOrderTable.AcxIsCMRN = NoYes::Yes;
inventQualityOrderTable.AcxComponentId = acxCMRNDetails.ComponentID;
inventQualityOrderTable.AcxLocation = _location;
inventQualityOrderTable.AcxQualityTestType = _qualityTestType;
inventQualityOrderTable.AcceptableQualityLevel = inventTestGroup.AcceptableQualityLevel;
inventQualityOrderTable.ItemSamplingId = inventTestGroup.ItemSamplingId;
inventQualityOrderTable.OrderStatus = InventTestOrderStatus::Open;
inventQualityOrderTable.ReferenceType = InventTestReferenceType::Production;
inventQualityOrderTable.QualityOrderId = NumberSeq::newGetNum(InventParameters::numRefQualityOrderId()).num();
inventQualityOrderTable.ItemId= _componentId;
inventDim.InventSiteId = InventLocation::find(inventSiteGateEntry_IN.InventLocationId).InventSiteId;
inventDim.InventLocationId = inventSiteGateEntry_IN.InventLocationId;//’11’;
inventDim = InventDim::findOrCreate(inventDim);
inventQualityOrderTable.InventDimId = inventDim.inventDimId;
inventQualityOrderTable.ItemName = _componentName;
inventQualityOrderTable.TestGroupId= _inventTestGroupId;
inventQualityOrderTable.Qty=1.00;
inventQualityOrderTable.BlockingQty = 1.00;
inventQualityOrderTable.doinsert();
while select inventTestGroupMember
where inventTestGroupMember.TestGroupId == inventTestGroup.TestGroupId
{
inventQualityOrderLine.clear();
inventQualityOrderLine.initFromQualityOrderTable(inventQualityOrderTable);
inventQualityOrderLine.AcceptableQualityLevel = inventTestGroup.AcceptableQualityLevel;
inventQualityOrderLine.ActionOnFailure = inventTestGroupMember.ActionOnFailure;
inventQualityOrderLine.CertificateOfAnalysisReport = inventTestGroupMember.CertificateOfAnalysis;
inventQualityOrderLine.LowerLimit = inventTestGroupMember.LowerLimit;
inventQualityOrderLine.LowerTolerance = inventTestGroupMember.LowerTolerance;
inventQualityOrderLine.IncludeResults = NoYes::Yes;
inventQualityOrderLine.StandardValue = inventTestGroupMember.StandardValue;
inventQualityOrderLine.TestId = inventTestGroupMember.TestId;
inventQualityOrderLine.TestInstrumentId = inventTestGroupMember.TestInstrumentId;
inventQualityOrderLine.TestSequence = inventTestGroupMember.TestSequence;
inventQualityOrderLine.TestUnitId = inventTestGroupMember.TestUnitId;
inventQualityOrderLine.UpperLimit = inventTestGroupMember.UpperLimit;
inventQualityOrderLine.UpperTolerance = inventTestGroupMember.UpperTolerance;
inventQualityOrderLine.insert();
info(strFmt(‘Quality Order %1 is generated.’,inventQualityOrderLine.QualityOrderId));
}
}
[/code]

 

D365/AX7:Customization Analysis Report (CAR)

The CAR Customization Analysis Report is a Microsoft Excel report.This report contains details of your customizations & artifacts, extension models, best practices issues, errors & warnings.


[code language = “cpp”]
****** Run the below command in cmd ******
xppbp.exe -metadata=<local packages folder> -all -model=<ModelName> -xmlLog=C:\BPCheckLogcd.xml -module=<PackageName> -car=<reportlocation>
For example
xppbp.exe -metadata=C:\Packages -all -model=”MyAppSuiteCustomizations” -xmlLog=C:\temp\BPCheckLogcd.xml -module=”ApplicationSuite” -car=c:\temp\CAReport.xlsx

********The xppbp.exe tool is located in c:\packages\bin or I:\AosService\PackagesLocalDirectory\bin ********

[/code]

UntitledFor more detail, please refer below link

https://docs.microsoft.com/en-us/dynamics365/unified-operations/dev-itpro/dev-tools/customization-analysis-report

 

D365/AX7 :Vendor & Customer-wise Auto Or Manual Settlement (X++)

Requirement

In standard D365 Finance & Operation, you can manually select the transactions to settle, or Microsoft Dynamics AX/D365 FO can select the transactions automatically by using the automatic settlement functionality. You can enable this feature by selecting the Automatic settlement check box in the Accounts receivable Or Accounts payable parameters form.But the customer/Client wants the same functionality of automatic settlement vendor-wise & customer-wise.

Sample Code 

1 enum field is provided in customer and vendor master. Values of enum is Manual Settlement (1) & Automatic Settlement (2).

[code language = “cpp”]
[ExtensionOf(classStr(OffsetVoucher))]
final class ACPLOffsetVoucher_Extension
protected boolean skipMarkTransaction(CustVendTrans _custVendTransCredit, CustVendTrans _custVendTransDebit, boolean _areBillingClassificationsEnabled, boolean _isRestricted)
{
boolean ret = next skipMarkTransaction(_custVendTransCredit, _custVendTransDebit, _areBillingClassificationsEnabled, _isRestricted);
if (_custVendTransCredit.tableId == tableNum(VendTrans))
{
if (VendTable::find(_custVendTransCredit.AccountNum).AcxSettlement == AcxSettlement::Manual)
{
ret = true;
}
}
else if (_custVendTransCredit.TableId == tableNum(CustTrans))
{
if (CustTable::find(_custVendTransCredit.AccountNum).AcxSettlement == AcxSettlement::Manual)
{
ret = true;
}
}

return ret;
}
}
[/code]