пятница, 10 июня 2011 г.
AIF exception message
вторник, 13 мая 2008 г.
Be careful whith Collections and Maps in Axapta
List list = new List(Types::String);
ListIterator iterator;
;
list.addEnd("a");
list.addEnd("b");
list.addEnd("c");
list.addEnd("d");
iterator = new ListIterator(list);
while (iterator.more())
{
if (iterator.value() == "b")
list.addEnd("e");
iterator.next();
}
info(list.toString());
There is instance of List class retaining arbitrary string values. ListIterator class is instantiated for traversing through elements in the list. What will happen when we try to add a new element in the list inside iteration block? New element will be added to collection! In Java for iterators implemented other behavior. If an iterator is obtained, modifying the underlying collection will throw a ConcurrentModificationException. Pay attantion to this difference.
четверг, 8 мая 2008 г.
Warehouse attributes
The interesting solution was implemented on current project. One from our customer requirements is more deeply analysis of goods flows for effective management. There are many criterions for review and one of them is the warehouse properties. It can be region where warehouse is situated or belonging warehouse to company attribute, for instance. Inventory dimensions technology is powerful facility in Axapta. And our developer team took these ideas as basis. For all attributes was created tables as they are created for all inventory dimensions. And fields referenced to corresponding tables, was added to InventLocation as inventory dimensions fields in InventDim. Then functionality of grouping and rendering different views for warehouse attributes was extended in OnHand form. Users can quickly get used to warehouse attributes as to inventory dimensions. This solution is sutable for OLAP analysis as well.
понедельник, 5 мая 2008 г.
Inventory closing make corrections for transactions in closed periods
It was on previous project where I first took part as a manager. The project was completed successfully, but some questions have no answers till now. One of them is why inventory closing functionality makes corrections for transactions in closed periods. It is huge headache for all users. Fortunately it happens rarely, that is why solution of this issue was suspended. When I visited masterclass at December 2007 arranged by Microsoft in
среда, 30 апреля 2008 г.
Write InfoLog to database
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())
{
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?