Thursday, 8 January 2009

Another Year Over

It's been an exciting one for me.

First up Dynamics CRM4.0 was released at the start of the year. We have done a number of installation of it now and the team have done some very interesting things with it.

Next Dynamics NAV5 SP1 was released, while not a major release it did bring some interesting things. Firstly it got rid of the highly confusing SIFT tables and replaced them with views. It also brought access to the Dynamics Mobile client.

Then December brought us Dynamics NAV 2009. This is a major release and brings us lots of fun stuff. The most obvious is the new Role Tailored Client(RTC). It also gives NAV web services out of the box, something we have been after for a long time. It supports SQL2008, also released this year. We have already started working with this latest version and have a number of upgrades and new installations lined up for the first part of next year.

Closer to home the Intergen Dynamics team had some significant growth with around a dozen new team members joining over the year.
Dave Roys in Christchurch was awarded Most Valued Person by Microsoft, this is a great honour as there are only a dozen or so MVP's for NAV worldwide and Dave is the only one in Asia Pacific.
Craig Keenan was made a Subject Matter Expert for NAV.
Intergen was involved in the Dynamics NAV Partner Advisory Board and with 7 attendees out of a total of 11 coming from Intergen I think it shows how involved in the future of NAV we intend to be.

Away from the Dynamics products. Windows 2008 and SQL 2008 were both released.
Intergen has been doing huge amounts of work with MOSS as well as its more traditional custom builds. We have also been looking at all the new stuff Microsoft announced at the PDC around Cloud Services, Windows 7 etc.

2009 should be a very interesting year, between all the new things that are coming and the current global economic situation there will be many challenges ahead. More and more I think companies will be looking at ways to work smarter and reduce their overheads. Hopefully that will mean that people like me will still be in demand.

Tuesday, 2 December 2008

NAV 2009 Released

NAV 2009 has been released in the 'wave 1' counties.  This means some things that we have been waiting for a couple of years for are finally available.

There are still some gaps and the new client will take some getting used to but the addition of web-services out of the box and the new architecture is a great leap forwards.

I have posted before about web-services and since then I have been trying a few different things. In one demo from Microsoft they showed an example of them by adding a 'E#dit in Excel' button to a page that launched Excel, pushed the currently filtered data over and then allowed a user to modify it and update back into NAV.

Another interesting example has been posted by Dave 'Gaspode' Roys. In his example he is using an infopath form to get NAV data, edit it and submit it back to the system. Take a look here.

I am also trying a few things using the new client as well. Generally I 'learn' better when I have a project that needs a solution, fortunately I have a pet NAV project to play with. In our office we have a snack club that I current run, while its overkill really I keep track of it all in NAV. This gives me a chance to try to solve the minor problems that come along, and play with the new cool stuff.

This weeks project was a migration from NAV5.0 to NAV2009. As the basis of the system was fairly standard this was a straight forward exercise, adding a few new fields to tables and the doing a NAV backup and restore to a W2k8 server with SQL2k8 and NAV2009. Then I went through and rebuilt the few special bits of code that I needed.

Next up will be the addition of some RS reports and a simple app that the team can use to record what they are taking and set up their bills, a task that is currently done in a book. Once I have it figured out I'll post some examples.

Tuesday, 7 October 2008

Webservices in NAV2009

Anyone that has been reading up on NAV2009 cannot have failed to have noticed that NAV can now publish Webservices. I know clever developers have been building Webservices for NAV for a while now, but they have been building them from scratch. NAV2009 gives a simple form where you can expose a Codeunit, or a Page(the new object type used by the .NET client).
One of the examples in the Application Developers Guide publishes a Page built against the Customer Table. The example then goes on to build a simple console app that inserts, Modifies and deletes a customer record, displaying the results between each stage.
Now I know very little C# and the example has a number of bugs in it but even I have managed to get this work and add some very basic error catching in a few hours. One of the devs here told me it would have taken him somewhere between a day and 2 days top achieve the same in the past.

So the example I am talking about.
In NAV open Object Designer and run form 810
Add Page 21 and call it Customer

In Visual Studio 2008 I started a ConsoleApp Project.
I then added a reference to the WebService by Right Clicking Service References and selecting Add Service Reference. I then Clicked the Advanced Button

I then clicked Add Web Reference

I then add the webservice and named it WebService(not very original I know)

Once I had this I could start with the C# Code. Admittedly most of this was copy -  pasted from the example. But as I said there are a few bugs that I had to resolve, plus I wanted some simple error trapping
   1: using System;








   2: using System.Collections.Generic;








   3: using System.Text;








   4:  








   5: namespace ConsoleApplication1








   6: {








   7:    // import newly generated Web service proxy








   8:    using WebService;








   9:   








  10:    class Program








  11:    {








  12:        static void Main(string[] args)








  13:        {








  14:            //create instance of service and setting credentials








  15:            Customer_Service service = new Customer_Service();








  16:            service.UseDefaultCredentials = true;








  17:  








  18:            //create instance of customer








  19:            Customer cust = new Customer();








  20:            cust.Name = "Customer Name";








  21:            //Next line will throw an error. Comment out to get successful passing








  22:            cust.Address = "12345678901234567890123456789012345678901234567890123456";








  23:            Msg("Pre Insert");








  24:            PrintCustomer(cust);








  25:           








  26:            //insert customer








  27:            //service.Insert is wrong. Correct and added a Try/Catch for errors








  28:            //service.Insert(ref cust);








  29:            try








  30:            {








  31:                service.Create(ref cust);








  32:            }








  33:            catch (Exception ex)








  34:            {








  35:                Console.WriteLine(ex.Message);








  36:            }








  37:            Msg("Post Insert");








  38:            PrintCustomer(cust);








  39:  








  40:            //create filter for searching for customers








  41:            List<Customer_Filter> filter = new List<Customer_Filter>();








  42:            Customer_Filter nameFilter = new Customer_Filter();








  43:            nameFilter.Field = Customer_Fields.Name;








  44:            nameFilter.Criteria = "C*";








  45:            filter.Add(nameFilter);








  46:  








  47:            Msg("List before modification");








  48:            PrintCustomerList(service, filter);








  49:  








  50:            cust.Name = cust.Name + "Modified";








  51:            //service.Modify is wrong. Correct and added a Try/Catch for errors








  52:            //service.Modify(ref cust);








  53:            try








  54:            {








  55:                service.Update(ref cust);








  56:            }








  57:            catch (Exception ex)








  58:            {








  59:                Console.WriteLine(ex.Message);








  60:            }








  61:  








  62:  








  63:            Msg("Post Modify");








  64:            PrintCustomer(cust);








  65:  








  66:            Msg("List after modification");








  67:            PrintCustomerList(service, filter);








  68:            try








  69:            {








  70:                service.Delete(cust.Key);








  71:            }








  72:            catch (Exception ex)








  73:            {








  74:                Console.WriteLine(ex.Message);








  75:            }








  76:  








  77:  








  78:            Msg("List after deletion");








  79:            PrintCustomerList(service, filter);








  80:  








  81:            Msg("Press [ENTER] to exit program!");








  82:            Console.ReadLine();








  83:        }








  84:  








  85:        static void PrintCustomerList(Customer_Service service, List<Customer_Filter> filter)








  86:        {








  87:            Msg("Printing Customer List");








  88:  








  89:            //conduct the actual search








  90:            //service.Find is wrong. Correct and added a Try/Catch for errors








  91:            //Customer[] list = service.Find(filter.ToArray(), null, 100);








  92:            Customer[] list = service.ReadMultiple(filter.ToArray(), null, 100);








  93:           








  94:            foreach (Customer c in list)








  95:            {








  96:                PrintCustomer(c);








  97:            }








  98:            Msg("End of List");








  99:        }








 100:  








 101:        static void PrintCustomer(Customer c)








 102:        {








 103:            Console.WriteLine("No: {0} Name: {1}", c.No, c.Name);








 104:        }








 105:  








 106:        static void Msg(string msg)








 107:        {








 108:            Console.WriteLine(msg);








 109:        }








 110:    }








 111: }








 112:  
















This is an area I think will make my life a lot easier as I get involved in integration projects fairly often. 








As I get more knowledge I'll post up more examples.

Monday, 6 October 2008

Intergen is the MS NZ Partner of the Year 2008

Year year Microsoft partners get various awards. Most of these are based on submissions. Partners enter into the various categories and are the submissions are then judged by Microsoft.

Partner of the Year is different. Microsoft employees look at the partners and selects those that they feel are suitable. These are then judged.

For Intergen this is a huge honour and, coupled with being announced as a member of the Presidents Club, firmly establishes us as the leading Microsoft Partner in NZ.

To see all the categories and winners for this years Microsoft awards take a look at the MS Site here.

Vista Gadgets

I have been using Vista for almost a year now and one of the things I like in it is the Sidebar. When I was on XP I used desktop gadgets from a third party so when I finally got Vista I did some digging around its sidebar. While there are a number of cool gadgets two of the most useful I have found are the App Launcher and the Magic Folder.
App Launcher allows a user to set up shortcut's to what ever they like and they can be grouped into folders. While a number of standard windows folders can be accessed, for example My Computer, one of the things that is missing is links to the user folders such as Documents by default. 


















The other gadget I have found really useful is the Magic Folder. I often save all sorts of things to my desktop over the course of a day. Magic Folder allows me to drag and drop them onto the folder which then files them away based on the file extension. So any pictures are moved the the My Pictures folder, pdf's move to a folder inside My Documents, etc. You can specify your own file extensions and you can move to anywhere on your system.
If you find you regularly have masses of files on your desktop and you can store them loosely by file extension it is well worth looking into.

Dynamics NAV MVP

I am pleased to say that the newest MVP for Dynamics NAV is Dave Roys.

Why am I so pleased that Dave has been recognised? well for the past four and a half years I have been working along side him. Dave is based out of Intergen's Christchurch office. Prioir to his move to New Zealand he had been working for a UK partner while I was with, at that time, Navision UK Ltd, and he was a student on one or two of the courses I ran back then. So in a ,very small, way I help contribute to his passion for NAV, well I hope anyway lol.

If you haven't already read his blog I advise you to do so.

Wednesday, 17 September 2008

RPO Released

What is the RPO?

The RPO (Runtime Page Optimizer) speeds up ASP.NET and SharePoint websites. Its simple. We automated 8 of the guidelines set out in Yahoo's "Best practices for speeding up your site" and checked these with the creators of YSlow to make sure the RPO gives you the fastest website ever. Try the RPO now from www.getrpo.com.

Technical background

The RPO (Runtime Page Optimizer) is a software component for IIS 6/7 web servers  that speeds up ASP.NET and SharePoint websites significantly.  The component works at runtime - with no development changes, no extra hardware and performs these optimizations:

  • Combination. Combines JS files, CSS files reducing HTTP requests. It can optionally  combine JPEGs and GIFs into CSS sprites to reduce the number of images.  This significantly decreases the roundtrips between browser and server reducing page load time
  • Compression. Minifies and gzip compresses resources, decreasing page load times and data traffic
  • Caching. Increases speed through caching - automatically setting far future expires on the browser, caching optimized resources on the server, with full control over when both caches are refreshed
  • Browser aware. Works with all versions of IE, FF, Opera, Chrome and Safari - optimizations are automatically turned on/off to meet the browser's capability
  • Framework support. Supports ASP.NET 2.0+, AJAX, SharePoint 2007, DotNetNuke, EPiServer
  • Fast set up. No extra hardware required,  no CDN maintenance, no browser software, zero impact installation - component is a single DLL installed on a web server
  • You decide how fast your pages load. Out-of-the-box the RPO will speed up websites at level-4 optimization. For even greater speed, you can use the RPO to sprite images and combine all JavaScripts into one, you'll just need to ensure your images are correctly scaled and your JavaScripts behave well when combined. This level of optimization usually takes a "milestone" to complete, the RPO reduces the developer  effort to hours and keeps your images and scripts in their original maintainable format

Do you need it?

Speed is everything. Unless you've implemented best practices, the website that seems fast on your local machine is often slooooooow when people use it from around the country or internationally. Users hate slooooooow webpages. Asking your customers to wait is like asking them to leave. Try the RPO now from www.getrpo.com.