Thursday, 13 March 2008

Dynamics Entrepreneur Solution

Microsoft recently released a 'new' product in the Dynamics space. Dynamics Entrepreneur Solution. I say 'new' as in reality it is Dynamics NAV with a rebuilt GUI.
They have taken away all but the basics that a small business would need. Pretty much all that's left is simple G/L, Sales and Marketing, Purchasing, Inventory and Resources.
All the other functionality is still hidden away behind the scenes. The intention being that when a customer is of a sufficient size to need those extra bits 'migrating' them to a full blown NAV is just a case of modifying the forms and adding to the menus.
The new forms are very nice. They present the information is a user friendly manor and make it easy for a user to see related information. Where in NAV you would be going to menus to get at related information e.g. Cross References for a customer. as you can see in the screen shots in NAV you would open the customer and find the one you wanted. Then click the Customer Menu. Then Open the Cross References
















In Entrepreneur Solution you open the Customers screen. This gives you a list of all customers with some easy filter controls.


By clicking the blue arrow next to the customer you want you get that customers card and in the tabs at the bottom of the card you can select the cross references.



I kind of like this layout. When I was working for MBS I had a fair amount of exposure to Axapta, now Dynamics AX, and some of the screens in the new Entrepreneur Solution have a similar initial look and feel without the dozens of menus to actually make things happen. I can see some of the new screens being popular with larger NAV sites as well as the customers that Entrepreneur is aimed at.
I think it will be very interesting to see how Entrepreneur takes off in the market place.

Monday, 25 February 2008

Dynamics CRM integration to Dynamics NAV

 
One of the projects I am currently working on involves managing appointment bookings, tracking activities and making sales to a large customer base.
 
All of these things are easily achieved in any decent CRM product and being a Microsoft Gold Partner we naturally are using MS CRM. Fortunately for this project MS CRM 4.0 had just been released as we went into the development phase so we took all our CRM 3.0 knowledge and started applying it to CRM 4.0, as well as picking up on all the new cool stuff that we can now do.
 
There is also a big requirement on replacing the financial systems for this client as their current system no longer does what is needed. For us this means using Dynamics NAV 5.0 deployed at a head office level.
 
The tricky part of the solution is allowing the devolved users that will live predominately in CRM to record their information and have it feed the NAV system. To do this we needed fairly extensive integration between the two products, something that isn't available 'out of the box'. In the past we have done this sort of project and manually built the integration points, but they were fairly minor, simple things. This solution requires much more complex integration points.
After search around we settled on the Celenia Connector. The latest version of this allows us to wire together all the parts of the two systems and it lets us build configurable workflows in the connections.
 
This has allowed us to deploy portions of the financial system to users that will never actually have to access the NAV Client. As CRM is web deployable this also minimises the software footprint on individual machines, something that is desirable as all 'managed' desktops at this client are deployed via Citrix.
 
 
 

Thursday, 20 December 2007

Microsoft CRM4.0 "Titan" Released

 

REDMOND, Wash. — Dec. 17, 2007 —The new version of Microsoft Dynamics CRM, formerly code-named “Titan,” has been completed and released to manufacturing, Microsoft Corp. announced today. The new version is offered under two product names: Microsoft Dynamics CRM 4.0 for on-premise and partner-hosted deployments and Microsoft Dynamics CRM Live for Microsoft-hosted deployment. Designed with a single unified-code base for both on-premise and on-demand deployments, Microsoft Dynamics CRM enables customers to choose the right deployment model for their specific business and IT needs, with the flexibility to change deployment models over time if their needs or preferences change.

 

This is good news for me as I am leading a project that is using CRM4.0 as a major component.

 

Read the full release here.

Wednesday, 24 October 2007

NAV goes WSS3.0

 

Finally Microsoft have released an update for NAV that allows it to use WSS3.0 for Employee Portal instead of WSS2.0. This has been much requested and looked forward too, especially in our office were we are doing more and more work involving WSS3 and MOSS.

If you are a MBS partner you can download the update here https://mbs.microsoft.com/partnersource/downloads/releases/EmployeePortalNAV50.htm

Tuesday, 11 September 2007

Reporting Services, Hierarchy's and cross Browser Problems

This week I have been doing some Report development for a custom application we have been developing at work. Given everything is SQL based we opted to build the reports using Reporting Services.

On the whole the reports are pretty straight forward. However there were 2 challenges.

The first is around hierarchical reporting. With in the application people can belong to different Occupational Units's(OU). One of the business rules for the reporting is 'A user can only report on their own OU and any OU that is below them.

To achieve this I ended up building a recursive function that returns a Scalar Table that works out all the OU's a specific user can see. I then use that in my where clause.

The Table Function looks like this

CREATE FUNCTION [Generate_OUTree] 
(
-- Add the parameters for the function here
@OUID [uniqueidentifier]
)
RETURNS @OUTree TABLE
(
OUID [uniqueidentifier],
ParentID [uniqueidentifier],
OUName Varchar(500),
Level Int
)
AS
begin

-- Add the SELECT statement with parameter references here
With OUTree (OUID, ParentID, OUName, Level)
As
(
-- Anchor Member defination to get top level OU
Select OUID, ParentOUID, OUName, 0 as Level
From CustomerOUView
Where OUID = @OUID
UNION ALL
--Recursive member defination to get child companies
Select CCV.OUID, CCV.ParentOUID, CCV.OUName, Level + 1
From CustomerOUView CCV
Inner Join OUTree
On CCV.ParentOUID = OUTree.OUID
)

insert into @OUTree
Select * From OUTree
RETURN

As you can see I pass in a parameter that is the ID of the users OU.






 






To actually use this to achive what I want I am calling he function like this






 







    Select *
From dbo.staffView
Where OUID IN(Select OUID From dbo.Generate_OUTree(@OUID))







This effectively returns all the rows from my view where the OUID in the view is in the list generated by my function.






 






The follow on to this was we had to build a full OU tree report. The report shows each OU under its parent and indents teh list so it is wasy to see which child OU belongs to Which parent.






 






The hard part was to be able to sort the report so that the OU structure was returned in a format that made it easy to group the OU's together.






 


CREATE PROCEDURE [Report_GenerateOUList]
-- Add the parameters for the stored procedure here
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
With OUTree (OUID, ParentID, OUName, Level, Sort)
As
(
-- Anchor Member defination to get top level OU
Select OUID, ParentOUID, OUName, 0 as Level ,Cast(OUName as Varchar(4000))
,OperatorCategoryName,MembershipCategoryName
From CustomerOUView
Where ParentOUID = '00000000-0000-0000-0000-000000000000' --top level OU has no parent


        UNION ALL
--Recursive member defination to get child OU's Select CCV.OUID, CCV.ParentOUID, CCV.OUName,
Level + 1, Cast(Sort + '|' + CCV.OUName as Varchar(4000))


        From CustomerOUView CCV
Inner Join OUTree
On CCV.ParentOUID = OUTree.OUID
)
Select * From OUTree
Order by Sort





In the database the OU ID's are all GUID's and as I wanted all OU's displayed in this report I have hard-coded for the top level OU.






Inside Reporting Services I am using the following to get indentation






=(Space(Fields!Level * 5) + Fields!OUName.Value)






This then causes 5 spaces for each level down the tree to be inserted in front of the OU's Name.






 






Once I had all this going and deployed to my Report Server everything appeared to be working fine when I viewed the reports with IE7. The only remaining thing to do was do a second check on the reports using Firefox.






Firefox and Reporting Services have a few issues. Due to he way RS renders the reports in IFRAME's Firefox causes them to get squashed up and not display correctly. After some frantic searching, Google is your friend smile_wink, and a bit of testing on a couple of report servers  found the following.






First-up Firefox only shows the top 2 to 3 cm's of your report. The rendering puts it a small IFRAME instead of expanding out down your 'page' the way IE does. This is fairly easy to resolve, thanks to Jon Galloway's blog for this answer. You need to edit the ReportingServices.css. On my machine it lives here "C:\Program Files\Microsoft SQL Server\MSSQL.3\Reporting Services\ReportManager\Styles\"






In the css file you need to add the following entry.



/* Fix report IFRAME height for Firefox */
.DocMapAndReportFrame
{
min-height: 860px;
}





 






This forces Firefox to use a taller IFRAME.






 






I also found that the width of the report was getting squashed up on my deployment server, although on my laptop's report server it wasn't happening. On investigating the two machines the only thing I could find was a difference in the build versions of the 2 SQL servers. The Deployment server is using SQL2005 SP1 while my laptop is SQL2005 SP2.






 






As a work around I found that by putting an empty text box in the header of my reports that was the full width of the report Firefox no longer squashes up the report. While ideally I will update the server with the latest SP for SQL this is acting as a work around for the time being.






 






Tuesday, 4 September 2007

Dynamics Book

Maybe I have been a bit slow. Or maybe I just wasn't paying attention to the right things but I just found a useful site that is being put together by the Dynamics community. So far the vast majority of the work appears to have been done by David Singleton, one of the MVP's for Dynamics NAV.

It's called the Dynamics Book and its a wiki for all the Dynamics Products. Understandably at this stage the majority of the information is around Dynamics NAV but hopefully with the wider community getting in on the act that will grow and it will become a good source for all Dynamics products.

This in conjunction with the forums, MiBuSo and Dynamics User  that many Dynamics Users and Consultants regularly contribute too are an invaluable resource for anyone working in this space, be you an end user, new consultant or developer, or experienced consultant or developer. There's always a new trick to learn. Check them out.

I'll be adding permanent links to my tool box for all of them.

Saturday, 28 July 2007

Document Approval in Employee Portal

In NAV 5.0 there is now standard document approval functionality.

While it is fairly basic in some respects, it is more than adequate for a smallish company to handle purchase and sales approvals.

A request I had with one of my clients was for the document approvers to check and approve the documents on a website as these approvers would have very little reason to access NAV for any other reason.

I opted to deploy the approvals via SharePoint using Employee Portal.

 

Initially I figured this would be fairly straight forward. All I needed to do was set up a couple of web parts in NAV that displayed the Document approvals data, pre filter it so that only approvals for the user that had logged in would be displayed. Provide a link that would display the associated Purchase document. I'd need an option box adding that allowed the user to select Approve, Reject or Delegate.

All pretty simple stuff really. So off I went, I added the Option field to a table, set up a list web part for the Document Approvals, I also set up a Card part for this table, the logic being I'd display a list of all approvals with minimal information and then the user would access the card part to get more information and to select the approve, reject, delegate options. In the card part I added a save button. 

Now came the tricky bit. I needed to update NAV when the user made a selection.

In standard NAV there the only tables that can be updated by Employee Portal are the ones related to the demo web parts, i.e. Customers, Sales Headers and Lines, BOMs and Items. If you want to get anything else back in you have to go and make changes to at least one codeunit. Depending on what you are trying to do you need to work on codeunit's 6822 through 6827. For what I wanted to achieve I had to add extra functions to 6824 - Modify Head Data mgt.

What I had to do was add a new function that deciphered the incoming XML, extract the fields I was interested in and then execute the standard Approve, Reject, Delegate Functions.

This took a while because I used a principle I had used many times before when building new code. That is I build it up in small steps checking I am getting the result I want at each step. With the Employee Portal bits what I failed to realise was that I had to initialise a whole heap of variables that get passed out of the code I was working on so that the webpart updates after my code executes. As I hadn't added this code I kept getting error after error in the portal site. Given that every time you make a change you have to stop and start the NAS so that it gets the new code and you can't access the standard Debugger to see where it is failing this became a fairly long process of insert an error command in the code. Restart the NAS, reload the approval document, save it and see what happened, i.e. did I hit my deliberate error before hitting the piece of code that was failing. Once I found the point where I had the line of code that was giving a problem it was straight forward to resolve, finding that line took me about 4 hours.

Once I understood where in my 'normal' style of development I had gone wrong it took me another couple of hours to get the functions I wanted to work. I did run into 2 other problems with it all.

The first was that when i update the record that the Portal has gotten I am getting a 'Another user has modified this record since it was retrieved from the database' error. I can almost live with that, I am going to attempt to set it up so that the portal resets and doesn't attempt to display the updated record anyway.

The second proved a lot more problematic. After getting the web base approvals set for one company I am in the position where I need to roll it out over several companies for the same client. What I don't want to do is have multiple NAS's running as the client is going to be creating new companies and removing old ones from time to time, so I want to run the Approval functionality cross multi companies. after much thought we decided to make a new approval table that is updated when approvals are created and modified, This table also captures the company name of the NAV company that the approval was raised in. We then use this to drive the Approval Portal.

This gave us a lot of headaches as when something is approved in the Portal it needs to update the correct company in NAV, but some clever coding has gotten round this. There is a fair amount of other multi company functionality required by this customer so I'll do a separate post about some of those challenges once I have them figured out.