Tag Archives: Architecture Assessment

Implementing a new Microsoft Dynamics solution doesn’t merely introduce a new piece of software into your environment. Yes, the software is an important part, you need to deploy it successfully, configure it as necessary, probably even customize it and change the business logic under the hood.

One component, however, is easily overlooked, and you wouldn’t believe how often it’s not addressed until late. Or too late. It’s the infrastructure.

Infrastructure is tough. It’s not just servers and desktops with some wires, switches and access points in between. Its a lot more. What kind of hardware do you need for your servers or desktops? What kind of performance do you really need? What kind of network layout is optimal for your transaction volume? Should you run the client on desktop machines, or would a remote desktop access be a preferred method? Do you virtualize your servers? What kind of failover capacities do you need? Can you retain any of your old hardware? How many users will use the system? Tomorrow? In five years? What about interfaces and integration to other systems or applications?

When I moved this blog to its new domain NavigateIntoSuccess.com I gave you a commitment I intend to observe: there will be a new post here every Monday and every Thursday. Today is Thursday, so let’s rock’n’roll.

When comparing .NET variables, including Enums, you cannot use C/AL comparison operators. To compare .NET variables, you must use the Equals method (of the System.Object type) that all .NET types implement or inherit. So, instead of IF var1 = var2, or IF var1 = var1.EnumValue (in case of an Enum), just write IF var1.Equals(var2), or IF var1.Equals(var1.EnumValue).

I see this mistake often being made or attempted by developers, even though it has been documented inside .NET Interoperability documentation since it was introduced with 2009 R2.

Make sure that you don’t access the Microsoft.Dynamics.NAV JavaScript object before the document ready event fires. If you do so, you might experience problems on Chrome when the user refreshes the browser (F5). It appears that on refresh Chrome loads (and runs) scripts in different order, and depending on how complex scripts included in your project are, your code might get executed before Microsoft’s script is loaded, and it will cause nasty script errors. This occurs only on Chrome on PC.

When you have to format C/AL variables (numbers, dates/times, booleans) for exchange with other apps, call FORMAT(variable,0,9) instead of simply FORMAT(variable). The format 9 formats the variable according to XML standards, and this value can then be interpreted correctly on any system with any regional settings. This is useful also when passing string-formatted values from C/AL to C# or JavaScript.

To check if a BLOB field has a value, you call its HASVALUE function. For example: IF Item.Picture.HASVALUE THEN;

In older versions, earlier than NAV 2009, you had to call CALCFIELDS before you could check HASVALUE, which – if you think of it, did not make much sense. This was changed in NAV 2009, so ever since that version you can check HASVALUE before you decide to call CALCFIELDS first. It makes all the sense – you don’t need to pull up to 2GB of data over just to see if anything is inside.

If you are an old-school guy (or just old, as me), and you CALCFIELDS first, HASVALUE next, maybe it’s time for you to reconsider it.

Rembember – the pattern is: IF Field.HASVALUE THEN Rec.CALCFIELDS(Field);