Microsoft Dynamics Ax developer's blog

Wednesday, April 25, 2007

AxPath integration with browser email etc

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:

  • download the latest beta of Tabax
  • Install Tabax and Plugin SDL
  • download and install AxPath plugin. Run register.bat

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:

  • 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?

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:

  • 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:

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.

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:

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.

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...

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:

  • 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:

#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...

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:

  • 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

  • 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



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


download



changes:


  • Autohide option at about tab - sidax will autocollapse when you move mouse out of it's window (thank to Blokva from AxForum)

  • Images in the main menu - different menues