With great help of AndyD, Tabax now have an integration with browser and other tools. For example you can send a link to the specific purchase order via outlook, and when the link will be clicked, user will see purchase order you linked to.
You can also link to the specific parts of code. For example here tabax checks your access to development environment when you are navigating AOT link.
How to make it work:
Microsoft Dynamics Ax developer's blog
Wednesday, April 25, 2007
Monday, April 23, 2007
SYS_ExpressionQueryBuilder
SYS_ExpressionQueryBuilder is an ExpressionBuilder for queries. Read more @ axaptapedia
InventTrans inventTrans;
QueryRun qr = SYS_ExpressionQueryBuilder::construct()
.dataSource(tableNum(InventTrans))
.count(fieldNum(InventTrans, RecID))
.groupBy(fieldNum(InventTrans, ItemID))
.between(fieldNum(InventTrans, DatePhysical), 01012006, 31122006)
.matches(fieldNum(InventTrans, Qty), '<0')
.exists(tableNum(InventDim))
.link(fieldNum(InventTrans, InventDimID),
fieldNum(InventDim, InventDimID))
.matches(fieldNum(InventDim, InventLocationID), condition)
.run();
;
while(qr.next())
{
inventTrans = qr.get(tableNum(InventTrans));
info(strFmt('%1: %2', inventTrans.ItemId, InventTrans.RecId));
}
Tuesday, April 03, 2007
Infolog stack trace
This extension allows to see stacktrace of infolog items and navigate through call stack. read more @axaptapedia
Monday, March 26, 2007
Tabax 0.3 beta 3
Starting a beta stage of the new Tabax version (download)
What's new since 0.2.x:
What's new since 0.2.x:
- Works with Ax 4 (icons are in tabax.ax4 they should be copied to "C:\Program Files\Microsoft Dynamics AX\40\Client\Share\Include\tabax")
- User interface can be localized (it is translated already to Russian and Spanish (the last by Manel Querol (Mkz) from http://www.TrucosAx.com))
- windows management (enable "fit maчimized" in setup and your window maximization will be emulated with fitting)
- tab width setup (maximal width, minial width and "Tabs have same size")
- Plugin SDK (it's only first small step)
- Ivan Kashperuk added the "Open table field" functionality to the "Edit current field" button
- Autosize: tabax don't let to change it's size
Friday, March 09, 2007
Tabax 0.2.15 -- fit mazimized windows
homepage
download (30K)
There are two changes:
1. "Fit maximized windows" setting added -- thanks AdnyD
2. Bug in table browser removed -- thanks Ivan Kashperuk
One of tabax users asked for the "Fit maximized windows feature". In you enable it tabax will fit window to the client area of Ax main window when detect maximization of some inner window.
I think, everybody do not like the following Ax behaviour: when you maximize window (for example code editor) and then open child window, the first winow change it's size. The new Tabax feature prevents it behaviour - it just normalize all maximized windows and fit them to the maximal size they can get without some parts being hidden. So when new window is displayed, prevoius window do not change it's size.
What do you think about this feature?
download (30K)
There are two changes:
1. "Fit maximized windows" setting added -- thanks AdnyD
2. Bug in table browser removed -- thanks Ivan Kashperuk
One of tabax users asked for the "Fit maximized windows feature". In you enable it tabax will fit window to the client area of Ax main window when detect maximization of some inner window.
I think, everybody do not like the following Ax behaviour: when you maximize window (for example code editor) and then open child window, the first winow change it's size. The new Tabax feature prevents it behaviour - it just normalize all maximized windows and fit them to the maximal size they can get without some parts being hidden. So when new window is displayed, prevoius window do not change it's size.
What do you think about this feature?
Tuesday, February 20, 2007
Podcasts

I am now in pause between the two jobs. So almost every day I am walking through the nearby forest park with my child. She is sleeping and I have about three hours to do something interesting or useful. Snowflakes falling down do not allow me to read on paper or my pocket pc, but I can listen podcasts or webcasts.
The additional reason to do such things is to learn spoken english. For example when MS contacted me via phone on the SQL injection hole i've found (BTW i have tried to reproduce it on Ax4 and it is still here) I was not able to understand almost anything from what they have spoken.
So I need to train...
The first candidate to listen is the list of webcasts on channel 9 tagged with "Dynamics" because it is an interesting topic to me.
It is very useful, but have some disadwantages:
- the files are very big - I need soundtrack only
- my mp3 player can not play wmv smoothly (and it plays them only after renaming them to .wma) - I am forced to use a Pocket PC
- I feel, I can get a slight Danish accent (it is nice, but I think not when mixed with Russian ;) )
So I am switched to other podcast named .NET rocks - an internet radio about Microsort .NET and related technologies. It is interesting for me, sounds quite professional and, I think, made with a clean American English.
Can you recommend me interesing podcasts in English?
Do you know something for extracting soundtrack from a wmv file?
PS. The latest ".NET rocks" show is with a Steve McConnell, the author of the "Code complete" book, recomended recently by MFP

Saturday, February 17, 2007
Sidax 0.4 b 2
See page at axaptapedia for details. It is strongly recommended to upgrade beta0 to beta 1 or beta 2.
Tuesday, February 06, 2007
Python
Every programmer, ecpecialy one, which deals with some ugly language like X++ or BAAN 4GL should know some scripting language. Its a kind of practical and easy tool which allows you to write small programs quickly, in cost of performance.
My favorite is Python. It is nice, mature enough and widely supported (even my Pocket PC has an interpretter).
For example one task which I did with python a couple days ago is a preparation of data of the legacy system to load in Dynamics Ax. The source file consists of text lines, where data fields are separated with the piplene character ('|'). Some of data fields values contain pipeline character too. The first field of the line identifies type of the data (invenotory group or inventory item). The file was encoded using DOS (cp866) encoding. So there was 3 actions po perform:
It was done by the following scipts:
1. Splitting files by data type and converting from DOS to Windows
2. Checking for correctnes:
As you can see it is readable and easy.
If you get interested, look at the following links:
My favorite is Python. It is nice, mature enough and widely supported (even my Pocket PC has an interpretter).
For example one task which I did with python a couple days ago is a preparation of data of the legacy system to load in Dynamics Ax. The source file consists of text lines, where data fields are separated with the piplene character ('|'). Some of data fields values contain pipeline character too. The first field of the line identifies type of the data (invenotory group or inventory item). The file was encoded using DOS (cp866) encoding. So there was 3 actions po perform:
- recode data to Windows encoding (cp1251)
- separate item data from inventory group data
- check for lines which pipeline in data
It was done by the following scipts:
1. Splitting files by data type and converting from DOS to Windows
src=open('input.txt', 'r')
dst = {'asl': open('inventory.txt', 'w'), 'ctl': open('group.txt', 'w')}
lineNo = 1
for line in src:
type = line.split('|')[0]
if type in dst:
try:
dst[type].write(line.decode('cp866').encode('cp1251'))
except:
print line
print lineNo
lineNo += 1
2. Checking for correctnes:
import sys
lineCount = 8
fileName = sys.argv[1] if len(sys.argv)>1 else 'inventory.txt'
for lineNo, line in enumerate(open(fileName, 'r')):
if line.count('|')!=lineCount:
print lineNo
print line.decode('cp1251').encode('cp866')
As you can see it is readable and easy.
If you get interested, look at the following links:
- python.org -- python homepage
- dive into python -- python tutorial
- IronPython -- python for .NET (by MS employee)
Thursday, February 01, 2007
Tabax 0.2.14: View query of the active datasource
A new version of tabax:
download (27K)
Now you can view the source of the query in the active datasource by simply holding Ctrl+Shift while pressing the 'Table browser' button (code by Ivan Kashperuk).
Also you can list all datasources on the active form and then browse the data by holding Shift while pressing the 'Table browser' button.
download (27K)
Now you can view the source of the query in the active datasource by simply holding Ctrl+Shift while pressing the 'Table browser' button (code by Ivan Kashperuk).
Also you can list all datasources on the active form and then browse the data by holding Shift while pressing the 'Table browser' button.
Friday, January 26, 2007
Dynamic analog of abstract macro
Palle Algemark have published an article witch solution of the same task which have been solved by abstract macro in my latest post. He uses table map and reflection code to achieve flexibility.
It is good, especially when you have ready to use map for all concrete tables. It is more difficult to create such map id you haven't.
For example you can not just declare fact, that you have same name for a field in each table; uou should: either repeatedly add declaration of all field mappings, or generate it by reflection code, or generate it in xpo.
The following dynamic code uses only list of tables and the fact, that ItemID has the same name:
It is good, especially when you have ready to use map for all concrete tables. It is more difficult to create such map id you haven't.
For example you can not just declare fact, that you have same name for a field in each table; uou should: either repeatedly add declaration of all field mappings, or generate it by reflection code, or generate it in xpo.
The following dynamic code uses only list of tables and the fact, that ItemID has the same name:
static void Test_DictTab(Args _args)
{
container tables = [
tableNum(InventTable),
tableNum(InventJournalTable),
tableNum(InventJournalTrans)
];
int i;
void processTable(TableID _tableID)
{
SysDictTable table = SysDictTable::newTableId(_tableID);
Common record = table.makeRecord();
FieldID itemField = table.fieldName2Id(fieldStr(InventTable, ItemID));
;
while select count(recID) from record
where record.(itemField) == '001'
{
info(strFmt("%1 = %2", table.label(), record.RecId));
}
}
;
for(i=1; i<=conLen(tables); i++)
processTable(conPeek(tables, i));
}
Thursday, January 25, 2007
Abstract macro
Recently published article about trick, whch I have often used in BAAN and sometimes in Dynamics Ax programming.
read the article at Axaptapedia
Two days ago I have added a new inventory dimension and was impressed how many work can be eliminated using this trick...
But don't overuse macros in can lead to less readability of your code.
One time I have used macros to build something like internal DSL to describe mapping of Ax tables to interface tables on SQL server and now one my ex-collegue claim it is unreadable.
read the article at Axaptapedia
Two days ago I have added a new inventory dimension and was impressed how many work can be eliminated using this trick...
But don't overuse macros in can lead to less readability of your code.
One time I have used macros to build something like internal DSL to describe mapping of Ax tables to interface tables on SQL server and now one my ex-collegue claim it is unreadable.
Tuesday, January 16, 2007
Tabax 0.2.13

what's new
Summary: open application object for the currently selected item in AOT, some managebility and extensibility.
download
Monday, January 15, 2007
WordSL - Microsoft Word as a visual XSLT editor
Just uploaded a varsion of the WordSL - tool which lets generate Word 2003 xml files via XSLT - you don't even need to have a word on a server to provide a file generation.
details...
details...
Thursday, January 04, 2007
customization: do it smarter
If you haven't watched the video Dynamics AX 4.0 - Smart customizations - watch it! (especally if you are novice Dynamics Ax developer).
I can just add few thoughts:
First of all - this sceencast recommends to subclass existing class, but i thing there asre some cases when it is better to tweak existing class. The most often case - when existing class has bad structure (for example LedgerJournalCheckPost in 3.0 - i don't know about 4.0 so much). If you have one large method which does all you can not just overide it to add some functionality - you often have to copy all it's body to the child and tweak it. I you do so you will have more problems when upgrading to the next version: you have not only to upgrade method of existing parent, but to modify all copied parts of the child and there is no obvious clues to find what parts to modify.
Second, what can be done to make upgrades less painful:
I can just add few thoughts:
First of all - this sceencast recommends to subclass existing class, but i thing there asre some cases when it is better to tweak existing class. The most often case - when existing class has bad structure (for example LedgerJournalCheckPost in 3.0 - i don't know about 4.0 so much). If you have one large method which does all you can not just overide it to add some functionality - you often have to copy all it's body to the child and tweak it. I you do so you will have more problems when upgrading to the next version: you have not only to upgrade method of existing parent, but to modify all copied parts of the child and there is no obvious clues to find what parts to modify.
Second, what can be done to make upgrades less painful:
- Interfaces - there havte to be more documented interfaces - so Ax devs will know what they can change and what cannot to make Ax backward compatible.
- Unit tests as part of Ax package - all unit tests developed by Ax team have to be shipped with Ax to enable partner or customer developers ensure they haven't breaked anything
- Events - SAP R/3, as i know, have concept of events - you have not to modify existing code to be informed about some thing ocuured in system - you just subscribe, say, to journal posting and can make extra transaction if you want. So your customisation code isn't mixed with the existing code.
- Better code structure - i think there is no excure for very big methods for example. Better code structure can be easy reused by customer programmers and can be seft documented and testable.
Monday, December 04, 2006
Go component
Just uploaded a new extension go component - this is like "go" tab from Sidax but standalone and integrated with editor via script.

I am using autohotkey macros to setup hotkeys for various actions and define Ctrl+Enter to go to selected component in the editor:
So you can, for example, edit the class declaration, click on the class name of the class the current class entends and press Ctrl+Enter - you see the parent of the currently editing class.
I am using autohotkey macros to setup hotkeys for various actions and define Ctrl+Enter to go to selected component in the editor:
#IfWinActive, ahk_class AxaptaClientClassName
~^Enter::
SendInput,{APPSKEY}sg
Exit
So you can, for example, edit the class declaration, click on the class name of the class the current class entends and press Ctrl+Enter - you see the parent of the currently editing class.
Monday, November 27, 2006
Tabax 0.2.11
The main new feature is the new button "Edit current field". Open, say, ledger accounts form from main menu, select "Tax group" field and click this button.
You will see AOT for StringEdit:Tax_TaxGroup.
I think this button fill be helpful for developers and consultants to explore axapta functionality.
more...
You will see AOT for StringEdit:Tax_TaxGroup.
I think this button fill be helpful for developers and consultants to explore axapta functionality.
more...
Wednesday, November 22, 2006
Bunch of Tabax extensions
There are some Tabax extensions occured last week.
- AxCreateNewProject from Ivan Kashperuk to create an empty project with two clicks
- Toggle SQL trace for switch SQL trace On/Off instantly with tabax toolbar button (it can be used an example of reflecting state of something via button image )
- Just a button to run the find dialog for AOT node quickly
Sunday, November 19, 2006
AxPath is coming: Sidax 0.4 beta 0 + Tabax 0.2.10
download tabax | download sidax
There is the first AxPath implementation. AxPath let you store a link for some record in database or an AOT item in the form of URI and then send it to a collegue or open it. So, for example you can copy link to the some purchase order, send it to colleague and it will be opened by colleague (so purchase orders form is opened and positioned at specific order).
Now Tabax, and Sidax support this technique. I am planning integration of AxPath scheme in the system letting AxPath links to be embedded in the webpages, mails, etc.
so, in Sidax:
in Tabax:
I am going to implement "favorits" in the sidax based on AxPath
There is the first AxPath implementation. AxPath let you store a link for some record in database or an AOT item in the form of URI and then send it to a collegue or open it. So, for example you can copy link to the some purchase order, send it to colleague and it will be opened by colleague (so purchase orders form is opened and positioned at specific order).
Now Tabax, and Sidax support this technique. I am planning integration of AxPath scheme in the system letting AxPath links to be embedded in the webpages, mails, etc.
so, in Sidax:
- you can copy AxPath of the menu item in main menu with right click
- you can navigate AxPath via "go component"
in Tabax:
- AxPath:
- when pressing the "Copy" button it copies axpath of the current record to the clipboard
- when pressing the «Ctrl+Shift+Copy» it copies AOT items, currently selected
- if you insert axpath to the input box it navigates the path given
- when pressing the "Copy" button it copies axpath of the current record to the clipboard
- now tabs are switched correctly under AX3KR3
- X++ calculator in the input box:
- enter ?<X++ expression> and press Enter to evaluate an expression
- enter ?<X++ statement> and press Enter to run a statement
- enter ?<X++ expression> and press Enter to evaluate an expression
I am going to implement "favorits" in the sidax based on AxPath
Wednesday, November 15, 2006
aggreg8.net - trying to aggregate all Dynamics Ax development blogs
Microsoft launched the new site for IT pros - aggreg8. I have'nt realized what it is exactly, but created the workgroup for Dynamics Ax and aggreated some development blogs there: view online
Monday, November 13, 2006
Sidax 0.3.7b14
Subscribe to:
Posts (Atom)