Hoe maak je een tracking dimensie in D365 F&O?
Als we de InventDim-tabel onder de loep nemen, kunnen de velden worden opgesplitst in 3 groepen. Deze 3 groepen zijn al vertegenwoordigd in de bestaande veldgroepen.
Het onderzoek
Zoals je kunt zien, bevat het ook een Russisch lokalisatieveld, deze kunnen worden uitgeschakeld met de configuratiesleutel “Invent tracking dimensions – GTD, inventory profile, owner.”
Dus hoe voegen we nu nieuwe tracking dimensies toe? Er is een goede documentatie: Add new inventory dimensions through extension – Finance & Operations | Dynamics 365 | Microsoft Docs
Op het einde staat een uitleg hoe het voorgedefinieerde veld aan de product-dimensies kan worden toegevoegd.
Het is een goed artikel met ook een voorbeeldcode, maar het werkt niet als je alleen een tracking-dimensie wilt. Om die klus te klaren heb ik de tracking-dimensie Batch onderzocht. De belangrijkste truc voor jouw nieuwe tracking-dimensie is het maken van een nieuwe uitbreiding van de InventTrackingDimension Class. Onderstaande afbeelding toont de huidige extensies.
Lets do it
De volgende stap is het maken van tabel-uitbreidingen op de volgende 2 tabellen:
- InventDim
– Voeg de InventDimension1 toe aan de veldgroep Tracking Dimension.
– Maak een nieuwe relatie van de InventDimension1 naar jouw nieuwe lookup table (onder voorbeeld is de tabelnaam XXTable) - InventDimParm (Display settings)
– Voeg de InventDimension1Flag toe aan de veldgroep Tracking Dimension. - Maak en EDT-extensie voor de juiste labels op:
– InventDimension1
– InventDimension1Flag
Dus dat waren de gemakkelijke stappen. Nu beginnen we met coderen. De volgende stap is het aanmaken van een (COD)extensie op de volgende 3 tabellen:
[ExtensionOf(tableStr(InventDim))]
final class InventDimXXDim1_Extension
{
public DlvTermId parmInventFlavorId(DlvTermId _XXTable = this.getValueForDimension(classStr(XXInventTrackingDimensionDim1)))
{
if (!prmIsDefault(_XXTable))
{
this.setValueForDimension(classStr(XXInventTrackingDimensionDim1), _XXTable);
}
return _XXTable;
}
public static FieldID fieldIdFlavor()
{
return InventDim::fieldIdForDimension(classStr(XXInventTrackingDimensionDim1));
}
}
[ExtensionOf(tableStr(InventDimParm))]
final class InventDimParmXXDim1_Extension
{
public NoYes parmInventFlavorFlag(NoYes _flavorFlag = this.getValueForDimension(classStr(XXInventTrackingDimensionDim1)))
{
this.setValueForDimension(classStr(XXInventTrackingDimensionDim1), _flavorFlag);
return _flavorFlag;
}
public static FieldID fieldIdFlavor()
{
return InventDimParm::fieldIdForDimension(classStr(XXInventTrackingDimensionDim1));
}
}
[ExtensionOf(tableStr(InventDimFieldBinding))]
public final class InventDimFieldBindingXXDim1_Extension
{
protected static FieldName className2FieldName(ClassName _className)
{
var fieldName = next className2FieldName(_className);
if (_className == classStr(XXInventTrackingDimensionDim1))
{
return fieldStr(InventDim, InventDimension1);
}
return fieldName;
}
}
En tot slot, de nieuwe uitgebreide klasse van InventTrackingDimension
final class XXInventTrackingDimensionDim1 extends InventTrackingDimension
{
public IndexId indexHintForTable(TableId _tableId)
{
switch (_tableId)
{
case tableNum(InventDim):
return IndexNum(InventDim, InventDimension1Idx);
}
return 0;
}
public static XXInventTrackingDimensionDim1 getInstance()
{
return InventDimension::singletonFromInventDimFieldId(fieldNum(InventDim, InventDimension1)) as XXInventTrackingDimensionDim1;
}
public boolean isAffectingPrice()
{
return true;
}
///Override next lines incase behavior should change
public boolean checkExistsValueForItem(InventTable _inventTable, anytype _value)
public boolean isSelective()
public boolean isTransferReceiptMergeable()
public boolean isTransferTransitReceiptMergeable()
}
De hele oplossing zou er ongeveer zo uitzien:
De resultaten
En vergeet natuurlijk niet de configuratiesleutel voor InventDimension1 aan te zetten, testen zou onmogelijk zijn zonder ???? De volgende screendumps tonen de look en feel. Zoals je ook ziet, is de Owner field er nog steeds, ik denk dat MS is vergeten er een configuratiesleutel aan toe te voegen …