- 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
eOne develops add-on software for Microsoft Dynamics GP and Microsoft Dynamics CRM. This blog discusses what's happening with Dynamics, Microsoft, Dynamics Resellers, eOne products and the future directions in business software.
Tuesday, December 22, 2009
The Greatest Christmas Present Ever
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.
Monday, December 14, 2009
Mouse Fix

Friday, December 11, 2009
Consultants Sell
Wednesday, December 09, 2009
Triggering Sanscript to run anywhere in Dynamics GP

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
- 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)
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;