Dynamics AX Blog - Page 13
AX 2012: How to change the value of a default dimension of a recordThe following job will give you an example, of how to change the value of a dimension within the default dimensions of a record (the example-job changes the value of the dimension costcenter of a customer). In this way and manner individual dimension values can be removed also.
static void changeDimensionValue(Args _args)
{
DimensionAttributeValueSetStorage dimensionAttributeValueSetStorage;
DimensionAttribute dimensionAttribute;
CustTable custTable = CustTable::find("US-014");
DimensionValue oldDimensionValue;
DimensionValue newDimensionValue = "011";
DimensionDefault newDimensionDefault;
#define.dimensionName("CostCenter")
DimensionValue getDimensonValue(DimensionDefault _dimensionDefault)
{
DefaultDimensionView defaultDimensionView;
select firstonly DisplayValue
from defaultDimensionView
where defaultDimensionView.Name == #dimensionName
&& defaultDimensionView.DefaultDimension == _dimensionDefault;
return defaultDimensionView.DisplayValue;
}
// Get current value
oldDimensionValue = getDimensonValue(custTable.DefaultDimension);
// Build DimensionAttributeValueSetStorage
dimensionAttributeValueSetStorage = DimensionAttributeValueSetStorage::find(custTable.DefaultDimension);
// Remove old dimension value
dimensionAttribute = DimensionAttribute::findByName(#dimensionName);
dimensionAttributeValueSetStorage.removeDimensionAttributeValue(
DimensionAttributeValue::findByDimensionAttributeAndValue(dimensionAttribute, oldDimensionValue).RecId);
// Set new dimension value
if(newDimensionValue != "")
{
dimensionAttribute = DimensionAttribute::findByName(#dimensionName);
dimensionAttributeValueSetStorage.addItem(
DimensionAttributeValue::findByDimensionAttributeAndValue(dimensionAttribute, newDimensionValue));
}
newDimensionDefault = dimensionAttributeValueSetStorage.save();
ttsbegin;
custTable.selectForUpdate(true);
custTable.DefaultDimension = newDimensionDefault;
custTable.update();
ttscommit;
}
Screenshot before job Screenshot after job |
Create a picking list line for a production orderThe following job creates a picking list line for a production order.
static void createProdJournalBOM(Args _args)
{
AxProdJournalBOM axProdJournalBOM;
InventDim inventDim;
axProdJournalBOM = AxProdJournalBOM::construct();
axProdJournalBOM.validateInput(true);
axProdJournalBOM.continueOnError(true);
axProdJournalBOM.parmProdId("P000194");
axProdJournalBOM.parmJournalId("00950");
axProdJournalBOM.parmItemId("M0014");
axProdJournalBOM.parmBOMConsump(30);
axProdJournalBOM.prodJournalBOM().initFromInventTable(InventTable::find(axProdJournalBOM.parmItemId()));
// Lagerungsdimensionen (optional)
inventDim = axProdJournalBOM.prodJournalBOM().inventDim();
inventDim.InventSizeId = "1000";
inventDim = InventDim::findOrCreate(inventDim);
axProdJournalBOM.parmInventDimId(inventDim.InventDimId);
axProdJournalBOM.save();
} |
Find number sequence code based on Exteneded data typeI recently had a problem with a number sequence in a form. But i didn't know the name of the number sequence, so i was not able to look for it in the number sequence code form.
info(strFmt("%1", NumberSequenceTable::find(
NumberSeqReference::findReference(
extendedTypeNum(PurchReqId)).NumberSequenceId).NumberSequence)); |
Reserve/Unreserve a sales order lineThe are a lot of examples about how to reserve a sales order line. But i did not find an example, where the result of the reservation has been tested. So i had to write some code for my own. I am checking the reserved value before executing my code, and afterwards. If the reserved quantity is still the same, my job seems to have failed.
static void reserveSalesLine(Args _args)
{
InventTransIdSumSingleStatus inventTransIdSumSingleStatus;
SalesLine salesLine;
InventMovement inventMovement;
InventDim inventDim;
InventDimParm inventDimParmCriteria;
InventQtyReservPhysical oldReservedQty;
InventQtyReservPhysical newReservedQty;
InventUpd_Reservation inventUpd_Reservation;
InventQty reserveQty;
// Inline method to get current reserved quantity for specific inventDim
InventQtyReservPhysical getReservedQty()
{
inventDimParmCriteria.initFromInventDim(inventDim);
inventTransIdSumSingleStatus = InventTransIdSumSingleStatus::newTransOriginIdStatus(InventTransOriginSalesLine::findInventTransOriginId(salesLine.DataAreaId, salesLine.InventTransId),
StatusReceipt::None,
StatusIssue::ReservPhysical);
inventTransIdSumSingleStatus.parmInventDimCriteria(inventDim);
inventTransIdSumSingleStatus.parmInventDimParmCriteria(inventDimParmCriteria);
return inventTransIdSumSingleStatus.reservPhysical();
}
// Sales order line
salesLine = SalesLine::findInventTransId('012431');
inventMovement = InventTrans::findTransId(salesLine.InventTransId).inventMovement(true);
// Build inventDim-Record, where the quantity should be reserved
inventDim.clear();
inventDim.InventSiteId = "1";
inventDim.InventLocationId = "12";
inventDim.wmsLocationId = "12";
inventDim = InventDim::findOrCreate(inventDim);
// Get current physical reserved Quantity
oldReservedQty = getReservedQty();
// Set quanity which should be reserved (negative values to reserve, postive value to unreserve)
reserveQty = -2;
inventUpd_Reservation = InventUpd_Reservation::newInventDim(inventMovement,
inventDim,
reserveQty,
true);
inventUpd_Reservation.updateNow();
// Get new reserved quantity
newReservedQty = getReservedQty();
// Compare old and new reserved quantity to identify if reservation failed
if(oldReservedQty == newReservedQty)
{
error("Reservation failed.");
}
} |
Check/Post a picking list journal for a production orderBelow is a sample of X++ code which can be used to check or post a picking list journal for a production order. Changing the value of the Enum JournalCheckPostType controls if the journal is checked or checked and posted.
static void checkPostProdJournalTablePickingList(Args _args)
{
JournalCheckPost journalCheckPost;
ProdJournalTable prodJournalTable = ProdJournalTable::find("00943", true);
// Check/Post journal
journalCheckPost = ProdJournalCheckPostBOM::newJournalCheckPost(false,
true,
JournalCheckPostType::Check,
prodJournalTable.TableId,
prodJournalTable.JournalId);
journalCheckPost.run();
} |
Check/Post a route card journal for a production orderBelow is a sample of X++ code which can be used to check or post a route card journal for a production order. Changing the value of the Enum JournalCheckPostType controls if the journal is checked or checked and posted.
static void checkPostProdJournalTableRoute(Args _args)
{
JournalCheckPost journalCheckPost;
ProdJournalTable prodJournalTable = ProdJournalTable::find("00943", true);
// Check/Post journal
journalCheckPost = ProdJournalCheckPostRoute::newJournalCheckPost(false,
true,
JournalCheckPostType::Check,
prodJournalTable.TableId,
prodJournalTable.JournalId);
journalCheckPost.run();
} |
|
|
|
|
|
|


The following code opens form VendTable in grid and modifies the query of the form. In the example three specific vendors should be shown.
{
Args args;
FormRun fr;
QueryBuildDataSource qbds;
FormDataSource fds;
QueryBuildRange qbr;
args = new Args(formStr(VendTable));
args.caller(null);
args.menuItemType(MenuItemType::Display);
args.menuItemName(menuitemDisplayStr(VendTable));
args.formViewOption(FormViewOption::Grid);
fr = classfactory.formRunClass(args);
fr.init();
fds = fr.dataSource();
qbds = fds.queryBuildDataSource();
qbds.addRange(fieldNum(VendTable, RecId)).value(queryValue(22565421239));
qbds.addRange(fieldNum(VendTable, RecId)).value(queryValue(22565421240));
qbds.addRange(fieldNum(VendTable, RecId)).value(queryValue(22565421714));
fr.run();
fr.detach();
}
The form opened by above job may look similar to the following screenshot: