Cross Dictionary Dexterity Development
Back in 1998, when I was working with Sequel Technology (the Western Australian partner for Great Plains), we were implementing Great Plains Dynamics 4.0 for a couple of sites and were using add-on products for Service Management and Job Costing.
My business partner at the time (who did the sales) understood that Dexterity applications could be easily customised and so promised some changes to the customer. What he (and I) did not understand at the time were the limitations Dexterity has for working across dictionaries.
We did have some "with name" commands which could open forms, call procedures and run reports. We also had the execute() function which could be used to run Dexterity sanScript in the context of the 3rd party dictionary. What we did not have was cross dictionary triggers.
Based on putting a number of ideas together I came up with a method of hacking the 3rd party extracted dictionary to add global procedure containing a call with name in dictionary command. This was a redirector stub procedure to work as a trigger handler script to call back into my dictionary where the real trigger handler code was located. Then I could use execute() to register the trigger in the context of the other dictionary and use the hacked handler script to eventually call back into my code. Luckily, once cross dictionary triggers were added into Dexterity 5.10, there was no longer a need to hack a 3rd party dictionary (which is not really allowed). Thanks to Dave Gaboury and Andrew Ingalls in Fargo for working with me to create proper cross dictionary triggers.
Anyhow, I was given the opportunity to present a session on this hack method (for v4.0 and v5.0) as well as other cross dictionary techniques at the 1998 Great Plains World Wide Developer Conference in Fargo. This session was called Integrating with Third Party Dictionaries and was a hit with the development community. Later when I was with Winthrop Dexterity Consultants, I was able to present an updated version of this session using cross dictionary triggers (for v5.5 and v6.0... and later) at the Summer Tech 2000 Conference.
In 2001, I worked with Mark Rockwell from Rockton Software and created a new session called Pushing the Limits with Dexterity. In this session we discussed how to write code that was multi-dictionary friendly and showed how to create a Resource Explorer window as well as other techniques we are worked out. Sadly, I was unable to get to the Summer Tech 2001 conference and so Mark presented it by himself. An updated version was presented by both of us at the Tech 2002 conference in Fargo.
While the materials are a little bit old, the methods and concepts contained in them are still valid today and are the basis for the best practices of cross dictionary Dexterity development. These materials are available for download from both the Winthrop and Rockton websites and now also from this blog.
Note: There is a section in the "Integrating" conference materials on Modifying 3rd party forms. The method discussed is not recommended as it breaches the Dexterity License agreement (not allowed to ship a modified application dictionary) and also causes problems when applying upgrades and service packs. The later "Pushing" materials contain a Warning about modifiying 3rd party forms to explain some of the issues. For more information have a look at the following post: Can I customise a 3rd party form with Dexterity?
An archive containing the latest versions of both conference sessions is attached at the bottom of the article.
Please add your comments to say how you have used these materials.
David
02-May-2010: Cross Dictionary Triggers against the Dex.dic (dictionary 1) do work now. I am not sure what version that was changed on, but it is possible to use execute() AND triggers on the runtime engine Dexterity based components. Thanks Elmo for this info.
24-Nov-2010: Updated post to highlight that direct modification of a 3rd party form is against the Dexterity license agreement and is not recommended.
Integrating with 3rd Party Dictionaries & Pushing the Limits with Dexterity.zip
Comments
Anonymous
July 26, 2008
David, I could not help after reading your article to go back to my blog and write about my experiences around the 3 conferences you presented -- Integrating, Pushing I, and Pushing II, as they have become known. The fact remains, these techniques became the cornerstone of Dexterity programming and are now used worldwide by thousands of ISVs. You have always been someone we look up to when all options have been tried without any luck. Keep up the good work! 30' commercial: stop at my blog and read my accounts from those days... the good o' days! MG.- Mariano Gomez, MVPAnonymous
August 04, 2008
Posting from Dynamics GP Blogster http://dynamicsgpblogster.blogspot.com/2008/07/cross-dictionary-development-with.htmlAnonymous
October 22, 2008
When I started this blog, one of my goals was to help developers push the boundaries of what they believeAnonymous
November 09, 2008
Over the last few weeks I have been asked a number of times about methods of customising a 3rd partyAnonymous
January 20, 2009
One of the great things about Dexterity is that you can develop complex customisations without needingAnonymous
March 08, 2009
Recently I responded to a question on a newsgroup asking how to minimise a window from VBA (Visual BasicAnonymous
March 08, 2009
Recently I responded to a question on a newsgroup asking how to minimise a window from VBA (Visual BasicAnonymous
March 26, 2009
When working with Dexterity triggers, the hardest part of the process is working out where to place theAnonymous
March 29, 2009
In the previous part of this post we discussed the theory of the Three Trigger Technique and the detailsAnonymous
April 20, 2009
David, I need to go further with integrations. How can I open a lookup with data from another company (database), for an existing table definition? For example, I'm logged in Company 'A', but I need to open an Item lookup with items from Company 'B'Anonymous
April 20, 2009
Hi Marcos This is not quite cross dictionary, but it is something unusual. I think that you will need to use a FORM_PRE trigger on the lookup form to close the table and re-open it with the open table as command and specify the database type and pathname. You can get the pathname by reading the SY_Pathnames table for the company and series. Once you have changed the table being used the lookup should work fine.... off the other company. You will also need to check that user has access to the company using the SY_User_Company_Access_REL table. DavidAnonymous
April 21, 2009
David, thanks for your advice. As always, it was very useful. Marcos PS: How can I do to become a member of the 'Musgravion' Circle?Anonymous
April 21, 2009
Hi Marcos You are reading the blog. So you must already be a member. :-) DavidAnonymous
May 14, 2009
This particular situation has come up in a number of support incidents and I also run into this myselfAnonymous
May 17, 2009
This particular situation has come up in a number of support incidents and I also run into this myselfAnonymous
May 01, 2010
Hi, I don't agree with you on below note. (Note: Because DEX.DIC is not in the launch file, cross-dictionary triggers cannot be registered against DEX.DIC)Anonymous
May 01, 2010
Hi Elmo I have re-tested creating a cross dictionary trigger against Dex.dic on v11.0 of Dexterity and it worked. I know that this did not work when I first tried it, but it does work now. Thanks for highlighting this. I will update the post accordingly. DavidAnonymous
May 02, 2010
David, In fact I used this trigger several months back and with older version of dexterity. Was just browsing aimlessly and come to your blog, there are lot of things I am looking forward to read from here.Specifically interested in VS tools. nice work!Anonymous
April 16, 2012
Posting by Vaidy Mohan at Dynamics GP - Learn & Discuss vaidymohan.com/.../cross-dictionary-triggers-on-dex-dicAnonymous
October 25, 2012
Hi all, Is there a way I can specify a ReportID under the 'Report Destination' window .. in using VBA. Regards, Peter Muchira.Anonymous
October 30, 2012
Hi Peter I am not sure what you are trying to achieve, but you might find this post about the Report Destination windows interesting: blogs.msdn.com/.../automating-or-customizing-report-destination-window.aspx DavidAnonymous
November 20, 2015
Hi David, I am hoping you can assist me with an issue I am attempting to resolve. I was wondering what is the best way to obtain the parameter list necessary to trigger on a procedure or function from a 3rd party vendor (Binary Stream's MEM) that I can retrieve the Entity ID from any window which requires an Entity ID. For example, the Payables Transaction Entry screen, or Receivable Transaction Entry screen to name but just a few, there are many which contain this value. It would be a lot of work to go after every window in order to retrieve the Entity ID using the Helper functions provided such as the GetWindowValue. Any help would be greatly appreciated.Anonymous
December 08, 2015
Hi Curtis Running a Dexterity Script log will give you an idea of the parameter list, but will not help get the exact parameters. The only real solution is to contact the ISV (Binary Stream) and ask them to provide the parameter list for the specified procedure or function. I needed you can explain what you are trying to do so they know why you want the information. In my experience ISVs are usually very helpful as they understand that integrations to their products just helps expand their reach. Good luck David PS: The guys are Binary Stream are good people, they should have no issue helping out.Anonymous
September 26, 2016
Hi i need dictionary about field service, dynamics GP, but i don´t understand example in this programm for sinonims and word short- Anonymous
October 17, 2016
Hi XimenaYou need to create a combined dictionary of Field Service, before you can open it with Dexterity to explore the resources. Note, there is no source code in a combined dictionary.David
- Anonymous