22 February, 2009

Good Reasons to Customize GP

While customization, when not properly planned and justified, can be problematic there are good reasons to customize your system to create long-term, sustainable competitive advantage and build discipline in your organization. I will follow this up with some specific examples of customizations I have built for these reasons and others.

1. Leverage your people for more value added activities. I'm not opposed to relying on people for some things but I don't see the value in having them enter and process data that the system could process unassisted. I've seen too many Controllers that function more like glorified GL Clerks. They spend more time entering and managing data than analyzing it to make decisions. Customizing your system to automate non value added tasks and deliver high quality information could enable you to convert your high paid data entry clerks back into analysts and controllers which in turn would help you identify cost saving and revenue generating opportunities.

2. Eliminate waste and redundancy to make your company scalable. Growth companies are always dealing with too few people doing too many tasks. Everyone is overworked and the pipeline of new work seems endless. As sales and production volume increase so does the demand for back office and shop floor capacity. Given the current economic climate this may not be an issue again for a while. Increasing headcount in these situations is often not at the top of management's list of solutions. Automating redundant and repeatable tasks could enable your organization to increase sales and production volume without having to add more people to manage the increased load. That's not bad for your margins.

3. Instill discipline in your organization. I was the CIO at a company with many geographically dispersed SBUs. They were all mandated to work consistently and without exception under a set of corporate business rules. In spite of that, the employees often chose not to follow those rules favoring their better judgement. In place of spending considerable time and money policing people to ensure business rules were being followed we programmed those rules into the system and took the binary decisions for which rules were defined away from the employees. This forced alignment of the operations with the corporate strategy. The people didn't like it much but the company grew by more than 50% in less than 5 years.

4. Save money AND have it your way. The GP channel is full of terrific 3rd party ISVs that seemingly have a solution for everything. Dynamics GP also comes with some terrific tools such as Modifier with VBA that you can use to tailor or customize the system according to your company's specific business needs. When making the build vs. buy decision compare the cost of having your system customized with the cost AND the compromises you might have to make with the ISV solutions available. Sometimes, you will find that you get a better, more cost effective solution by building your own solution from scratch.

5. I'm leaving this one open for comment. It would be nice to hear why some of the MVPs and others in the community would choose to customize a GP installation. I can think of a lot of reasons and find that the ease of customization is a great selling point for GP that is under valued. What do you think?

In closing, I second Mariano's warning at the end of his article. You should plan any customizations carefully and consult with experienced professionals. However, even heavily customized GP systems can be upgraded without considerable extra effort. I don't agree with those who warn against any customization in fear of upgrade complications. Most GP projects I have worked on have been heavily customized and those that have upgraded have done so without experiencing noticeable extra pain or incurring material additional costs.

21 February, 2009

How to make PO field required for specific customer


This requirement came up last week and after Mariano explained how to do it, I went ahead and did it... for fun. Sick, I know.

I posted an example of using the DUOS a couple of year ago and used that, with very few tweaks, after using Modifier to add a Check Box control to the Customer Maintenance window to store the RequiredPO flag in the DUOS (SY90000) as Mariano suggested. If you have problems converting that example to this scenario let me know and I will e-mail you the code.

After that, all you have to do is add the Sales Transaction Entry Window and the Customer ID and Customer PO Fields on that window to your Visual Basic Project. Open the VB Editor and add this code to the SalesTransactionEntry (Window) to make the Customer PO field required for selected customers:

Option Explicit
Dim Msg, Style, Title, Help, Ctxt, Response, MyString, Default
Dim ItemCollection As DUOSObjects
Dim ItemObject As DUOSObject

Private Sub CustomerID_Changed()

On Error GoTo Proc_Error:

Set ItemCollection = DUOSObjectsGet("Customer")

If CustomerID.Empty = False Then
Set ItemObject = ItemCollection(CustomerID)
If ItemObject.Properties("RequirePO") = "1" Then
CustomerPONumber.Required = True
Else
CustomerPONumber.Required = False
End If
End If

Exit Sub

Proc_Error: MsgBox Error$ & " " & Error, vbOKOnly, "CustomerID_Changed"

End Sub

19 February, 2009

Custom Business Alerts

GP does a good job of giving you the ability to create business alerts to keep you informed of events that have or may occur based on conditions in your database. Sometimes, the need to create an alert outside of the functionality in GP does, amazingly, come up. Just today a post at http://groups.google.com/group/microsoft.public.greatplains/topics and a response by Polino @ DynamicsAccounting.net drove me to create a sample business alert using only T-SQL that you could use as a starting point to developing your own.

This alert, if scheduled to run periodically, will e-mail a list of users that have been logged into GP for longer than 12.5 hours or 750 minutes. It's pretty simple!

IF EXISTS
(
select datediff(mi,logindat+logintim, getdate()) as DURATION,--convert(datetime, convert(varchar(15), GetDate(), 114), 114) - LOGINTIM as DURATION,
USERID,
CMPNYNAM,
LOGINDAT,
LOGINTIM
from DYNAMICS.dbo.ACTIVITY
where datediff(mi,logindat+logintim, getdate()) > 750
)
BEGIN

DECLARE @SQL varchar(8000)

SET @SQL = 'select datediff(mi,logindat+logintim, getdate()) as DURATION,
USERID,
CMPNYNAM,
LOGINDAT,
LOGINTIM
from DYNAMICS.dbo.ACTIVITY
where datediff(mi,logindat+logintim, getdate()) > 750'

print @SQL

EXEC master.dbo.xp_sendmail @recipients = 'youralias@yourcompany.com',
@subject = 'Users Logged in beyond limit',
@message = 'Attached is a list of users that have been logged in beyond the limit',
@query = @SQL,
@attach_results = 'TRUE',
@width = 250
END