Options with right click


Hi,

Can we display options while we right click on any resources in GP like in windows

Arun.

Storing & Displaying Images


Hi,

Can we able to save image in tables & display it in forms and reports( retrieved from table where it saved)

Arun.

A Different Splash Screen for Dynamics GP



After the feature of adding a voice message welcoming us to Dynamics GP Application, here is one more different and pretty cool thing that we can do to our Dynamics GP. We can change the default Splash screen to the one which we would always like to see.

Read this article on David’s blog: Customize the Microsoft Dynamics GP Splash Screen.

Like it is mentioned, I did try with a completely different picture by renaming it to “splash.bmp” and copy it to the GP Application Folder. Wow, that’s pretty cool to see something different and something which I like the most whenever I log on to Dynamics GP.

It will be even more interesting to see some graphical image (Animated GIFs) support, but one can always desire more and more…

Vaidy

Thanks David…



I am delighted to have your comments on my blog. When I started this blog, I had only one thought on my mind: to share whatever I have gained thru’ this 4+ years and learn much more from people who are in Dynamics GP.

Honestly, I got surprised to see your comments and once again it shows that you give attention and your valuable time to articles from people who have got less exposure to the GP world, and lend your experience and knowledge. And I cannot ask for more. 

Now it also gives me a huge responsibility to be more sensible on my articles and accurate & relevant on contents. I will do my best to share the knowledge.

I am completely delighted and I would love to see more of your valuable comments and articles on my blog.

Thank you so much.

Vaidy

Cannot access this form because the dictionary containing it is not loaded…


Well, one of the most annoying messages you could get in Dynamics GP Application.

How about seeing this message, instead of the Purchase Order Entry or Receivings Entry form, on a Monday morning, when there are piles of Receivings and POs to be entered on the System? Does not sound good, isn’t it?

Well, the only possible reason for this: This form would have been customized by some 3rd Party Application and the access would have been given to that version of the form. For instance (I always take this 3rd party product for explanations, not to offend it though), Project Accounting is the one which has customized almost all the forms in Purchasing module. There is each and every reason behind that, as the functionality and scope of Project Accounting lies very much inside Purchasing and each and every form of Purchasing module needed to be customized.

But then, the issue is, a Customer would have implemented Dynamics GP with Project Accounting (unintentionally) or a VAR without knowing the implications of PA towards the system would have installed GP with PA. This will automatically set the Security Settings for all the users to access Project Customized Purchasing forms. Now, when the Customer finally comes to know about this, and does not want Project Accounting on the environment, our VAR would have happily uninstalled the PA by “Changing the existing Instance of GP” option from Add/Remove Programs.

When the user try to open the Purchase Order Entry form, BANG, this message will pop up. And he will be out of his wits, to say the least. Calls here and there, blaming games start, situation more than panicky.

The access settings are mapped to Project Accounting based Purchasing Forms, but there is no PA dictionary at all on Client’s machine. How about it? And this is exactly what a client had faced and posted this as a query on MS Newsgroups. I was more willing to share this information to him and he was able to solve it.

The solution is simple. Open the Alternate Modified Forms/Reports, select the respective ID and change the access settings to the Microsoft Dynamics GP version of forms. That would do the trick.

And then came the input from David Musgrave. Setting access to default version for each and every form would prove more time consuming. Is there any other way to seamlessly do this? YES there is. Run the Reconcile on Security. This will remove all the stranded security access settings and change it to default settings.

Being an experienced developer in Customizations, I wanted to try this all by myself and removed some of the major Customizations from GP App. I then opened one of the affected GP Form and it threw this error. I then ran the Reconcile for Security, precisely Reconcile on “Security Assignment Alternate/Modified Operations”, those forms which are affected by the removed Customizations, were reset to Standard GP version. Wow, that’s quite nice to do this, because, we don’t have to worry about which are all the forms that are affected and need to be reset. All is done by just one click.

Now whenever someone ask this, I would say “Run Reconcile on Security”. Thanks to David for sharing this and I learned something new for me today.

Original Link of this post on MS Newsgroups: Cannot access this form because the dictionary containing it is not loaded.

Vaidy

Log on to Dynamics GP with a "Welcome Message"



Normally, while logging on to GP, we use to see the Login Screen, Company Selection Screen, then the Progress Bar showing stripes of Blues going on and on and on…

Why don’t we make it a more interesting atleast to see and hear? There is a way to do this. I was reading David’s articles, and came across this nice piece of VBA customization (original link: VBA – Welcome to Dynamics Example).

This not only enables a Welcome Message, but also opens up a lot of customization scope while logging on to Dynamics GP. We can certainly playaround to do more such interesting things, that spice up Dynamics GP.

For those, who had already gone thru’ the article, hope you guys have already gone miles with this customization example.

Vaidy

Test Company Message while logging on to Dynamics GP



I had wondered for quite sometime, on seeing a message that says “This company is set up for testing. Please do not use this company for Live data processing.” (or something like that, not the exact message is provided here).

The reason for this message getting popped up: While creating the test company, the company name is entered with a “” (remove the double quotes) appended to the live company. For instance, if my Live Company is something like “Vaidy Inc.” then the test company which is created by moving the live data would be “Vaidy Inc. “””.

GP automatically recognizes this tag “” and considers this as a Test Company and pops this message whenever you log on to this company.

Quite interesting, isn’t it?

Vaidy

Menus for Visual Studio Tools – Dyanmics GP



“The wait is over”. That’s the caption given by David on his blog, to signal the arrival of an Add-On which allows all VSTools Forms to be added to Standard GP Menus. Please check the below link:

Menus for VSTools Dynamics GP

It is available on PartnerSource and CustomerSource for download. It is official now. So all the developers can enjoy this feature, as most of the developers would have suffered for not being able to add their forms to GP Menus, which would have been a annoying disadvantage.

Let’s start rocking with this nice add-on.

Vaidy

Cross Dictionary Customization – EXAMPLE


Objective: This post is intended to show a very simple but practical example of 3rd Party Dictionary Customization. The target product is Field Service Contract Administration.

Field Service Product Details:

1. Product Name: FieldService
2. Product ID: 949

Sample Customization Description: I am going to retrieve the Contract Header information, when an existing Contract is entered. I am using SanScript runtime code executions and Dex object Triggers.

Procedure: STARTUP
{
Procedure: Startup
Series: System (Not mandatory to select System)
Summary: This script registers all dex object triggers required for this customization product.
}

local integer l_nResult;

l_nResult = Trigger_RegisterFocusByName
(
949, {Product ID}
“‘Contract Number’ of window SVC_Contract_Maintenance of form SVC_Contract_Maintenance”, {Object on which the trigger is registered}
TRIGGER_FOCUS_CHANGE, {execute this trigger on the CHANGE event of the object}
TRIGGER_AFTER_ORIGINAL, {execute this trigger after the original CHANGE event script is processed}
script FS_Get_Contract_Hdr_Info
);

if l_nResult <> SY_NOERR then
warning “Error registering the trigger: FS_Get_Contract_Hdr_Info. ” +
“Object: ‘Contract Number’ of window SVC_Contract_Maintenance of form SVC_Contract_Maintenance, ” +
“Event: CHANGE, ” +
“Scope: AFTER_ORIGINAL.”;
end if;

Procedure: FS_Get_Contract_Hdr_Info
{
Procedure: FS_Get_Contract_Hdr_Info
Series: Sales (Not mandatory to select Sales)
Summary: This script retrieves the contract header information on Contract Entry/Update form once an existing Contract is entered.
If the Contract is new, then it is not touched.
}

{Local Variables Declaration}
local integer l_nResult;
local string l_sCompileMsg, l_sContractNo, l_sCustomerID, l_sAddressID, l_sContractType, l_sCurrencyID;
local integer l_nContractLength, l_nContractPeriod;
local datetime l_dtStartDate;
local text l_sCode;

{Construct the SanScript code to execute it inside Field Service and retrive the Contract values}
l_sCode = “”;
l_sCode = l_sCode + “out string O_sContractNo;”;
l_sCode = l_sCode + “out string O_sCustomerID;”;
l_sCode = l_sCode + “out string O_sAddressID;”;
l_sCode = l_sCode + “out string O_sContractType;”;
l_sCode = l_sCode + “out string O_sCurrencyID;”;
l_sCode = l_sCode + “out integer O_nContLength;”;
l_sCode = l_sCode + “out integer O_nContPeriod;”;
l_sCode = l_sCode + “out datetime O_dtStartDate;”;
l_sCode = l_sCode + “if ‘Customer Number’ of window SVC_Contract_Maintenance of form SVC_Maintenance <> “” then”;
l_sCode = l_sCode + ” O_sContractNo = ‘Contract Number’ of window SVC_Contract_Maintenance of form SVC_Contract_Maintenance;”;
l_sCode = l_sCode + ” O_sCustomerID = ‘Customer Number’ of window SVC_Contract_Maintenance of form SVC_Contract_Maintenance;”;

l_sCode = l_sCode + ” O_sAddressID = ‘Address Code’ of window SVC_Contract_Maintenance of form SVC_Contract_Maintenance;”;

l_sCode = l_sCode + ” O_sContractType = ‘Contract Type’ of window SVC_Contract_Maintenance of form SVC_Contract_Maintenance;”;

l_sCode = l_sCode + ” O_sCurrencyID = ‘Currency ID’ of window SVC_Contract_Maintenance of form SVC_Contract_Maintenance;”;

l_sCode = l_sCode + ” O_nContLength = ‘Contract Length’ of window SVC_Contract_Maintenance of form SVC_Contract_Maintenance;”;

l_sCode = l_sCode + ” O_sContPeriod = ‘Contract Period’ of window SVC_Contract_Maintenance of form SVC_Contract_Maintenance;”;

l_sCode = l_sCode + ” O_dtStartDate = ‘Start Date’ of window SVC_Contract_Maintenance of form SVC_Contract_Maintenance;”;

l_sCode = l_sCode + “end if;”;
{Execute the Code segment inside Field Service}
l_nResult = execute
(
949, {Product ID}
l_sCode, {Constructed Code Segment}
l_sCompileMsg, {Store the Runtime Compilation errors, if any found}
{Parameters}
l_sContractNo,
l_sCustomerID,
l_sAddressID,
l_sContractType,
l_sCurrencyID,
l_nContractLength,
l_nContractPeriod,
l_dtStartDate
);


{If any runtime compilation errors occurred, throw the corresponding error message}
if l_nResult <> 0 then
warning “Error executing the constructed code. Error Message: ” + l_sCompileMsg;
abort script;
end if;

{Do some Planned Process}
———

Vaidy

Cross Dictionary Customizations – Contd…



The second point in the list (Cross Dictionary Customizations – An Insight) is Writing 3rd Party Triggers. Triggers are classified as 3rd Party triggers, if we use the keyword “ByName”. I hope all of us know what exactly is a trigger and how it is written, when we read this post.

The following are the Triggers available for writing triggers on 3rd Pary products:
1. Trigger_RegisterFormByName
2. Trigger_RegisterFocusByName
3. Trigger_RegisterProcedureByName
4. Trigger_RegisterFunctionByName
5. Trigger_RegisterDatabaseByName

Syntaxes and explanations are best provided in Dex Manual, which can be referred. But let me tell you some of the complications involved in this.

First and foremost: 3rd Party triggers are comparitively less reliable. Maintaining our code with respect to each and every version release of the Parent 3rd Party product is mandatory. This can be experienced best by writing Procedure Triggers. For some reason, if the procedure is either amended with Parameters or worst case its been scrapped, our life will become miserable. That’s the sole reason, always, the dependency towards a 3rd Party product should be minimal.

We won’t be having any kind of release notes for the resources that are being either amended or removed or added. It is our QA’s responsibility to test our customization against each version release of the parent 3rd party and fix our customization, if needed.

Using #1 and #2 (SanScript Code & 3rd Party Triggers), we can achieve almost all kinds of requirements from the customers.

Customizing a UI resource (Form, Report, etc) will be the worst way of customizing. At any cost, we should try avoid doing such customizations, as this would cost us too much at the time of maintenance. I had faced this in one of my projects. I had to customize a 3rd party product’s screen to some extent and after all efforts put in and maintained it for number of version releases, one fine day, that screen was scrapped from the parent product itself, leaving me to grudge in frustration. I cannot keep this form, as the core dependency of that particular form is no more available in the parent product. I cannot scrap this functionality from my customization as it is somewhat critical to the client. The only way out for me then, was to redesign that form in my customization and establish all the missing dependencies. By then, we had skipped several deadlines.

One more thing, which is interesting as well as challenging, is the access of Table Buffers of the Parent Product from our customizations. You may want to access the Table Buffers for various reasons, such as Creating Records from your product, Retrieving records which may form a basis for your product, Populating records in a lookup designed by you specifically for your requirements, etc.

Among all these reasons, the most tricky scope of accessing buffers is, any Process-Oriented access. For instance, if a Sales Invoice is posted from the Parent Product and a subsequent GL Journal is created from that product, and if your customization require this new piece of information, then you will have to be very very careful in placing your code so that you get the correct table buffer values. Most of the Cross Dictionary customizations face issues on accessing the table buffers and almost always when they try to access in between a critical process.

More to come…

Vaidy