среда, 30 апреля 2008 г.

Write InfoLog to database

There are several batch tasks running on the schedule in our company. They send many messages to InfoLog. Usually I am interesting messages of some type. It is not convenient scroll all messages in SysInfologBrowser form in search of required. I decided to implement the method for writing InfoLog to the database. After investigation of the Info class I wrote code listed below.

protected Log logTxt()

{

#resAppl

#Define.UserTab('\t')

Integer fromIdx = transLogPoint + 1;

Integer toIdx = infoLog.num();

SysInfoLogEnumerator enum = SysInfologEnumerator::newData(infoLog.copy(fromIdx, toIdx));

Log logTxt;

DictEnum dictEnum = new DictEnum(enumNum(Exception));
;
while (enum.moveNext())
{

logTxt += strFmt("%1 \t %2\r\n",

dictEnum.index2Name(enum.currentException()),
strRem(enum.currentMessage(), #UserTab));
}

transLogPoint = toIdx;

return logTxt;

}

Variable transLogPoint keep the value of the last message index before start batch task.

Why debit and credit turnovers different in Ledger and Inventory modules?

I want to share my thoughts about inventory closing functionality. I had made this research since time I took part in Axapta implementation projects. For all customers our developer team extended functionality of the inventory turnover report. After report modification users could receive detailed financial data in the inventory module. But there is one small issue. Financial managers and accountants asked me why turnovers were different in Ledger and Inventory modules. After investigation I found the cause of problem. There is no field Correct in InventTrans table like in LedgerTrans. That is why transactions are different for credit note in Ledger and Inventory modules. And inventory closing doesn’t create ledger transactions with Correct sign. We suggested correcting turnovers in Ledger module after inventory closing by manually creating additional correctional transactions. What do you think about it?

вторник, 29 апреля 2008 г.

Null value for ADO command parameter

Now I whith my colleagues work on integration Axapta with the other business application named M&F (Management and Finance). Our company uses M&F for more than eight years and now it is time for new ERP system. This application has 2-tier architecture, and its business logic is on the server side. We use stored procedure API for document exchange from Axapta to M&F. Some days ago I tried to call stored procedure on MS SQL Server from X++. For several parameters it was necessary to set null value. At first I instantiated COMVariant like this:

COM parameter = new COM("ADODB.Parameter");

COMVariant nullParam = new COMVarian(ComVariantInOut::In, ComVariantType::VT_NULL);

;

parameter.name("@paramName");

parameter.type(#adInteger);

parameter.value(nullParam); // This method throw exception!

After several hours research I found decision of this problem:

COM parameter = new COM("ADODB.Parameter");

nullParam = new COMVariant();

;

parameter.name("@paramName");

parameter.type(#adInteger);

nullParam.variantType(ComVariantType::VT_NULL);

parameter.value(nullParam); // This method doesn`t throw exception now!

I think problem is in constructor of the COMVariant class. What is your opinion?