Friday, January 27, 2012

Delete transactions in Dynamics AX 2012

We're in the process of implementing AX 2012 and we needed to flush out all the transactions from a company. There's a nifty class in AX that's called SysDatabaseTransDelete that does exactly what we need. It loops through the tables in the AOT and, depending on their TableGroup property, will flush out the data.

After cleaning the transactions we needed to delete a few vendors. However we kept getting an error about AOS validation failing. After investigating, we figured out that transactions in VendInvoiceInfoTable still existed... This table is flagged with a new TableGroup value which is TransactionHeader!

In fact, two new TableGroup types have been added in AX2012: TransactionHeader and TransactionLine. We'll need to modify the method SysDatabaseTransDelete.handleTable to support these 2 new cases :


void handleTable(SysDictTable sysDictTable)
{
TableGroup tableGroup;

if (tableSet.in(sysDictTable.id()))
return;
tableSet.add(sysDictTable.id());

if (sysDictTable && !sysDictTable.isTmp() && !sysDictTable.isMap())
{
tableGroup = sysDictTable.tableGroup();

// Handle company specific tables to be deleted
if (sysDictTable.dataPrCompany())
{
switch(tableGroup)
{
case TableGroup::Transaction:
case TableGroup::WorksheetHeader:
case TableGroup::WorksheetLine:
//FIX - Support new AX2012 transaction table types
case TableGroup::TransactionHeader:
case TableGroup::TransactionLine:
this.handleTransTable(sysDictTable);
break;
default:
this.handleNonTransTable(sysDictTable);
break;
}
}
else
{
// Handle global tables to be deleted
switch(tableGroup)
{
case TableGroup::Transaction:
case TableGroup::WorksheetHeader:
case TableGroup::WorksheetLine:
//FIX - Support new AX2012 transaction table types
case TableGroup::TransactionHeader:
case TableGroup::TransactionLine:
this.handleGlobalTransTable(sysDictTable);
break;
default:
break;
}
}
}
}