Tuesday, December 22, 2009

The Greatest Christmas Present Ever

I tried to think back to what the best present I have ever received was. I struggled to remember anything that stood out). What sprung to mind right away was the some of the worst presents ever (like the tennis ball on a string or a petrol syphon (in my first 38 yrs I have not syphoned and do not plan to anytime soon).

What we would all like to remember is being as excited about a gift as this young lady here? http://www.youtube.com/watch?v=jQiPrqjZpR4

This year I am approaching the same level of excitement as eOne has been granted a great gift. Our Mouse has been fixed. Officially. Finally. Tested. And it really works. Take a look at the solution which resides in the Knowledge Base article that was published by Microsoft today.

Just like I remembered the 'not so good' presents, there are many consultants that will remember the day that their mouse stopped working. Thanks to all those that helped bring this issue to resolution, the partners that put their weight behind the urgency, the customers that assisted with customer impact updates and for Microsoft for coming through with a resolution.

We have had some really big success stories in 2009 with partners putting together some really cool solutions. We are continually amazed at how clever our partners are and the effort that goes into providing solutions for businesses that are truly world class. I am perhaps most excited about those partners that are linking multiple eOne products together to build seamless solutions. These include:
  • SmartList Builder (distributed by Microsoft)
  • Excel Report Builder (distributed by Microsoft)
  • Navigation List Builder (distributed by Microsoft from V11)
  • Drill Down Builder (distributed by Microsoft from V11)
  • Microsoft Dynamics GP Extender (distributed by Microsoft)
  • eXtender Enterprise
  • SmartConnect
  • Flexicoder

I recently saw a partner demonstrate a solutions to a prospect that used Excel Report Builder (Qty on hand information) and SmartConnect together to create Inventory transfers within GP. They then had eXtender Enterprise logic running to fill in a few of the little functionality gaps, as well as building 5 eXtender windows and forms to match GP specifically to the business. SmartConnect kicked in off the eXtender forms to create records within CRM. They finished off with SOP, SmartList Builder and Flexicoder.

The best part of this session is none of these products were discussed individually but rather the partner simply said "this is our GP solution for your business, and you should expect this level of flexibility from any ERP you look at. " Needless to say they won the deal, as for the price, there is no ERP in the market that can complete.

Have a great Christmas break and we look forward to working with everyone again next year.

Thursday, December 17, 2009

Do your eat your own dog food?

This is a modified extract I have borrowed from another Blog (Job Adder), which borrowed from a blog by Seth Godin.


Zig Ziglar liked to say that with that one question, you could tell if someone was a successful life insurance agent. If they're not willing to buy it with their own money, how can they honestly persuade someone else to do so?

If you're in the music business but you never buy tickets or downloads, can you really empathize with the people you're selling to?

My favorite: if you work for a non-profit and you don't give money to charity, what exactly are you doing in this job? I've met some incredibly generous people in the charitable world, but I can also report that a huge number of people—even on the fundraising side—would happily cross the street and risk a beating in order to avoid giving $100 to a cause that's not their own. And the shame of it is that this inaction on their part keeps them from experiencing the very emotion that they try so hard to sell.

Money is more than a transfer of value. It's a statement of belief. An ad agency that won't buy ads, a consultant who won't buy consulting, and a waiter who doesn't tip big—it's a sign, and not a good one.

There are very few industries where this is not directly relevant. As a software and technology provider are you investing internally to ensure your business is benefiting from the right technologies? Have you upgraded to GP v10? Are you rolling out GP V11 Beta? If you hadn't received your GP license for free would you have chosen GP? What role does Sharepoint play for your organisation? When you rolled out Microsoft CRM did you hire a CRM VAR to help with design, install and build. When you are talking to a prospect can you candidly explain how your website integrates back to GP and the amazing benefits MOSS has brought to your remote consulting team.

10 or 15 years ago everyone in the GP community was excited about technology. As we as partners have matured, I wonder if we are now more excited about utilisation and AEP collection than we are technology?

I put my hand up that some changes need to be made. At eOne we do have direct online ordering, with immediate access to reg keys online for our partners (of that I have been pretty proud). We do use eXtender extensively and SmartConnect for our integrations. But, being honest here, I am off today to schedule our upgrade from GP 9 to GP11. My immediate thought was that I should see if any of my developers have some spare time for the upgrade, BUT NO, I am calling my VAR and getting an upgrade expert in to do the job leaving my team to do what they do best.

So over the holiday's, spare a thought abut what the dog is eating and also about getting our own houses in order during 2010.





Tuesday, December 15, 2009

Mouse will be back very soon.

Watch PartnerSource for a KB article containing the fix for the Visual Studio/VBA clash that stops your mouse working. By all reports the solutions and download will be posted by the end of the week.

Thanks to the guys in Microsoft who put the effort into getting this resolved. We understand it was not an easy task to resolve.

Monday, December 14, 2009

Mouse Fix

I refer to my erroneous blog post back on the 8th July - which stated the Visual Studio/VBA clash of the mouse had been resolved in SP4. It turned out I jumped the gun early and this was not addressed in that service pack.


The good news is that we have recently received an update from Microsoft on this issue, and been able to test a solution that eliminates the problem of the mouse that won't click. The solution works. We are now waiting for the final word on distribution of this solutions from Microsoft. As soon as the fix is publicly available - this blog is the first place it will be announced. Please stay tuned and watch this space.


Friday, December 11, 2009

Consultants Sell

Consultant are better at software sales than salespeople and account managers! Why do I say that?

1. Consultants know which software solves which problems.
2. Clients believe consultants.
3. Consultants appear to have no commission driven agenda.
4. Consultants truly want your clients system to run better.

Number 2 is the kicker, Clients believe consultants. A salesperson can talk about a new module all day, but unless the consultant says it is good stuff, and that he/she can deliver the solution then the whole process is a waste of time .

So Salespeople, before you start mass resignations - your role is not redundant. Someone needs to knock on the doors and close sales. Your other job is to ensure that you have a team behind you that knows the solutions deeply and are 100% confident they can deliver.

Some of you will have heard this story, but I am going to repeat it here. Consultants will not recommend a product if it means they will miss dinner with their family next week. If by suggesting a new module that they don't understand deeply and they think there may be problems or support will be tough to get - which means next week they will have to work late on site, or spend three night reading manuals - why would they make that recommendation? On the other hand if the clients needs a new SmartList or a new FRx Report then that is a job a consultant wants as they know 100% they can deliver that. Have you ever wondered why the solutions you deliver today are very similar to what you delivered 5 years ago?

The key here is 100%. As salespeople we can generally survive and hold sensible conversation at about 30% knowledge and 70% experience and bluff. For a consultant who has to make it happen there is no room for bluff and they have to be sure - 100% sure. That is 100% sure they can deliver the solution. Consultants are remarkably intelligent problem solvers and can work most things out given a little time, so I am not suggesting they need to know everything about a solution before recommending it - but they do need to know enough to be confident that they can work the rest out. I repeat, 100% confident they can deliver the solution.

So as business owners, sales teams and consultants wanting to fill utilization hoppers the key is to get your team trained. This can be through time to read manuals, online training, or classroom training ( I still believe classroom is the best learning experience).

There are some great technologies available to us as Dynamics VAR's and ISV's. This might include GP modules like Navigation Lists, Excel Report Builder, HR, Audit Trails and eXtender or stepping outside GP to SharePoint, PowerPivot, BI etc. Consultants will never move on to these solutions unless they are 100% sure that they can deliver.

So, if your consulting team is not trained then you are missing out on significant opportunity and significant services revenue. Let me give you one example of the opportunity taken by a partner in regards to SmartConnect. One VAR had their entire team take a deep training session and followed up with specific training topics for key individuals. As a result of this and high energy marketing activity they sold 74 SmartConnect's inside of 24 months. This generated an average of 7 days services with each deal. This is more than 518 days or roughly $766,000 of services revenue. Adding in the software component we are talking $1 million revenue that would not have been generated had that training session not taken place.

In summary, salespeople are important but need consultants that can deliver. Consultants can not deliver without knowing a product deeply - and that usually involves training. A VAR that does not invest in training is missing out on massive revenue opportunities.

The eOne training team is currently in Chicago and hosting jam packed training day for 13 consultants. Earlier this week we ran an online training session for 24 consultant from one single VAR. Our next deep dive training session on SmartConnect will be in New York on January 21st-22nd. Spots are already starting to fill up and if you are within easy reach of East Coast it would be great to have you along. To lock in your place at this training contact either myself or Abbey at sales@eonesolutions.net.



Wednesday, December 09, 2009

Triggering Sanscript to run anywhere in Dynamics GP

This is perhaps the best kept secret about Dynamics GP. You can use eXtender to trigger small pieces of code from anywhere you like, just like you can trigger an eXtender window to open. The hardest part of an implementation is usually the last 10% of functionality and this is made easy by eXtender Logic.

This example adds logic to an existing Great Plains form. In this scenario, we need to add logic to the Great Plains Sales Order Processing screen that checks to see if duplicate Customer PO number has already been entered for the specific customer. In this example we use the Logic Routine to create a trigger on an existing Great Plains form. In the screenshot we can see that the trigger has been placed on the Sales Order Processing – Customer PO Number – Field change event.

After the Customer PO number has been entered, the script runs which executes a query of the SOP work, open, and history tables to see if that particular Customer PO Number combination has been entered previously. If it finds it, it will open a dialog box asking if you want to “Open Inquiry, Continue, or Delete”.

If the user selects “Open Inquiry” it will open the Sop Document Inquiry window with the Invoice number that contains the duplicate PO Number. If the user clicks “Continue” it will allow the user to continue to enter the duplicate Customer PO Number. If the user hits delete, it will actually delete the current SOP document being entered.

The code window looks like this.

The actual code is posted below so you can see exactly what happens. Again I repeat that if you do not understand the code below - then don't try and write logic scipts. If this makes perfect sense then there is so much you can do within GP with eXtender logic. The best part is you can deploy this code by sending a script to be imported, and you never need to cnk up or upgrade dictionaries again for small customisations.

local string ls_po_number, ls_customer, ls_sop_number;
local integer li_sop_type;
local text lt_sql;
local long ll_sql_connection, ll_status;
ls_customer = 'Customer Number' of window SOP_Entry of form SOP_Entry;
ls_po_number = 'Customer PO Number' of window SOP_Entry of form SOP_Entry;

if empty(ls_po_number) or empty(ls_customer) then
abort script;
end if;
li_sop_type = 'SOP Type' of window SOP_Entry of form SOP_Entry;
ls_sop_number = 'SOP Number' of window SOP_Entry of form SOP_Entry;
SQL_Connect(ll_sql_connection);
lt_sql = "USE " + 'Intercompany ID' of globals;
SQL_Execute(ll_sql_connection, lt_sql);
{check if customer and po combination exists in work table}

lt_sql = "select SOPTYPE, SOPNUMBE from SOP10100 where ";
lt_sql = lt_sql + "CUSTNMBR = " + SQL_FormatStrings(ls_customer) + " and ";
lt_sql = lt_sql + "CSTPONBR = " + SQL_FormatStrings(ls_po_number) + " and ";
lt_sql = lt_sql + "not (SOPNUMBE = " + SQL_FormatStrings(ls_sop_number) + " and SOPTYPE = " + str(li_sop_type) + ")";
ll_status = SQL_Execute(ll_sql_connection, lt_sql);
if ll_status = 0 then
ll_status = SQL_FetchNext(ll_sql_connection);
if ll_status = 0 then
SQL_GetData(ll_sql_connection, 1, li_sop_type);
SQL_GetData(ll_sql_connection, 2, ls_sop_number);

case ask("A document has already been entered for this customer with this purchase order number.", "Open Inquiry", "Continue", "Delete")

in [ASKBUTTON1]

open form SOP_Document_Inquiry;
if isopen(form SOP_Document_Inquiry) then
'Sort By' of window SOP_Document_Inquiry of form SOP_Document_Inquiry = 1;
run script 'Sort By' of window SOP_Document_Inquiry of form SOP_Document_Inquiry;

'All Or Range' of window SOP_Document_Inquiry of form SOP_Document_Inquiry = 1;
run script 'All Or Range' of window SOP_Document_Inquiry of form SOP_Document_Inquiry;
'Start SOP Number' of window SOP_Document_Inquiry of form SOP_Document_Inquiry = ls_sop_number;

'End SOP Number' of window SOP_Document_Inquiry of form SOP_Document_Inquiry = ls_sop_number;
'Include GB' of window SOP_Document_Inquiry of form SOP_Document_Inquiry = 0;
run script 'Include GB' of window SOP_Document_Inquiry of form SOP_Document_Inquiry;
run script 'Redisplay Button' of window SOP_Document_Inquiry of form SOP_Document_Inquiry;
end if;

in [ASKBUTTON3]
run script delayed 'Delete Button' of window SOP_Entry of form SOP_Entry;
end case;

abort script;
end if;
end if;

{check if customer and po combination exists in history table}

lt_sql = "select SOPTYPE, SOPNUMBE from SOP30200 where ";
lt_sql = lt_sql + "CUSTNMBR = " + SQL_FormatStrings(ls_customer) + " and ";
lt_sql = lt_sql + "CSTPONBR = " + SQL_FormatStrings(ls_po_number);
ll_status = SQL_Execute(ll_sql_connection, lt_sql);
if ll_status = 0 then
ll_status = SQL_FetchNext(ll_sql_connection);
if ll_status = 0 then

SQL_GetData(ll_sql_connection, 1, li_sop_type);
SQL_GetData(ll_sql_connection, 2, ls_sop_number);
case ask("A document has already been entered for this customer with this purchase order number.", "Open Inquiry", "Continue", "Delete")

in [ASKBUTTON1]
open form SOP_Document_Inquiry;
if isopen(form SOP_Document_Inquiry) then
'Sort By' of window SOP_Document_Inquiry of form SOP_Document_Inquiry = 1;
run script 'Sort By' of window SOP_Document_Inquiry of form SOP_Document_Inquiry;
'All Or Range' of window SOP_Document_Inquiry of form SOP_Document_Inquiry = 1;
run script 'All Or Range' of window SOP_Document_Inquiry of form SOP_Document_Inquiry;
'Start SOP Number' of window SOP_Document_Inquiry of form SOP_Document_Inquiry = ls_sop_number;

'End SOP Number' of window SOP_Document_Inquiry of form SOP_Document_Inquiry = ls_sop_number;
'Include GB' of window SOP_Document_Inquiry of form SOP_Document_Inquiry = 1;
run script 'Include GB' of window SOP_Document_Inquiry of form SOP_Document_Inquiry;
run script 'Redisplay Button' of window SOP_Document_Inquiry of form SOP_Document_Inquiry;
end if;

in [ASKBUTTON3]
run script delayed 'Delete Button' of window SOP_Entry of form SOP_Entry;
end case;
abort script;
end if;
end if;
SQL_Terminate(ll_sql_connection);

Monday, December 07, 2009

Triggering SmartConnect from an eXtender Object

It is great to be able to capture custom data inside of eXtender. What is truly powerful is taking this data and pushing it through the GP business logic (eConnect) and creating new records.

This is example is going to look at Triggering a SmartConnect map from a form created in eXtender. Using the same form that was created in the previous Blog entry (Tenant Management), use a combination of eXtender and SmartConnect in order to create a new Customer in Great Plains whenever a new tenant is created in our eXtender form.

In this case, a real time datasource was created in SmartConnect using our Tenant Management form as the source.

A map was created in SmartConnect that mapped the fields from our Tenant Management form into the Customer Maintenance form. The left side of the map window shows the values from the Tenant Management form.



When the map is saved, a real time Dexterity trigger is created on our Tenant Management form. When any record in the table is updated, it will run the SmartConnect map that will create/update the customer record in Great Plains.

This shows how every GP consultant can not build screens, and create transactions without ever writing a single line of code. Now that is powerful.

Friday, December 04, 2009

Executing Sanscript from an eXtender object

This article looks at how to include sanscript code on an eXtender form from any of the following trigger points:
  • Field Entry of any field
  • Field Change of any field
  • Field Exit of any field
  • On opening the object
  • On clicking on an extra window (button)
We will specifically explore here the way to embed sanscript code into an eXtender form to open a regular GP window and pass some parameters.

In this example, a Property Management application was created using eXtender. A tenant form was created to allow tenant information to be tracked. The tenants are setup as customers in Great Plains.

An extra window was added at the bottom of the window that is labeled Rent Payment. The Rent Payment button has a few lines of sanscript code that will automatically open the Cash Receipts Entry window, and automatically populate the Customer Number with the Tenant ID. This is ideal to give the work flow process that is ideal for the customer.

The code that performs this operation is repeated here. If you are a developer you will understand this perfectly. If you do not understand what is below then you should not be writing logic code and should either contact us at eOne for consulting help or contact you local dex guru who can whip up scripts in no time.

local string ls_tenant_id;
call with name "GetString" in dictionary 3107,ls_tenant_id,"Form","PM_TENANT_CARD",CurrentID,1,"Header",0;

open form RM_Cash_Receipts;
set 'Customer Number' of window RM_Cash_Receipts of form RM_Cash_Receipts to ls_tenant_id;

run script 'Customer Number' of window RM_Cash_Receipts of form RM_Cash_Receipts;