Archive for February 6, 2013

New & Changing Roles at eOne

At eOne we’re growing leaps and bounds! We’d like you to join us in welcoming Lorren Zemke, our new Director of Professional Services. Lorren will be responsible for the leadership and growth of the eOne professional services team. Lorren joins us with 20+ years of GP experience, with 16 of those years at Wennsoft. In his most recent role, he managed developers to quote, win and deliver adhoc customizations for Wennsoft customers. Lorren will lead all service billing activity including eOne training, support services and consulting services. He will have a strong focus on efficiency, utilization and growing the eOne services team.

You may be wondering “if Lorren is working with services, where did Chris Dew go?!” Never fear – Chris is still with eOne! Chris will be working with the sales team as a much needed technical resource for sales related activities and will also work on special projects through the services team, as well. He will be extremely busy (as usual)!

Please join us in welcoming Lorren to the team. Drop him a line at lorren.zemke@eonesolutions.com when you have a moment! Also, don’t forget to give a shout out to Chris Dew (chris.dew@eonesolutions.com) as he transitions to his new role at eOne, as well!

See the original post:
New & Changing Roles at eOne

February 6, 2013 · Abbey · No Comments
Tags: , , , , , ,  · Posted in: Blogs I Follow Total Views: 226

Microsoft Dynamics GP 2013 Web Client Training in Atlanta

It’s been a couple of exciting days here in Atlanta, Georgia, USA. I have attended the USWK018 Microsoft Dynamics GP 2013 Web Client for the Functional Consultant
Workshop
for partners and it’s been a blast learning more and more about the Web Client. The truth is, I cannot get enough. The more I learn about Web Client, the more I realize how much stuff there is still left to be learned. We had 12 individuals in attendance from various parts of the country,  representing over 5 partner organizations.

Partners at the Web Client Training
From left to right (front): Jason Lech (Microsoft), Lucas Miller (Microsoft), Tonya Boyce (ACE Microtech), Lynn Hedgepeth (OmniVue), Ted Mauldin (IntellPartners)
Back: Chuck Boyles (IntellPartners), Tony Fernandez (OmniVue)

This fun 2-day class provides functional consultants the opportunity to understand what
the GP Web Client is, how it functions, the necessarily security requirements
and how to properly and effectively troubleshoot GP 2013 on Web Client. If your
responsibility is to work daily on customer issues/problems, assist with changes
in business processes or to deliver technical demonstrations during the sales
cycle with new prospects, attending this course will enable you to better
troubleshoot the GP Web Client as well as, explain what the GP Web Client
can/can’t do for your customer. This class will cover some technology components. Believe it or not, there’s still plenty of technology a functional consultant must now deal with, but with the right tools and knowledge troubleshooting any Web Client issues should be a routine effort.

Not to scare you, but if you are not taking advantage of the partner training classes scheduled near you, you are missing out on a great opportunity to go it one-on-one with some of the top Microsoft Dynamics GP Escalation Engineers in the business. Partners in attendance here in Atlanta were fortunate to count with Jason Lech and Lucas Miller as instructors.

This 2-day class has come to an end, but we are immediately diving into a 3-day Technical Consultant track – USWK019 Microsoft Dynamics GP 2013 Web Client for the
Implementation Consultant Workshop –
This course will enable Implementation Consultants to understand and identify
the different Web Client deployment options for Microsoft Dynamics GP 2013, the
deployed components/services and how they function together, the installation
options, tenant services/tenant management and troubleshooting techniques. The
course will include examination of technologies such as certificates,
firewall/IP port configurations, extranet/intranet deployment scenarios and load
Balancing techniques. In summary, all the fun stuff!

Until next post!

MG.-
Mariano Gomez, MVP
IntellPartners, LLC
http://www.IntellPartners.com/

More:
Microsoft Dynamics GP 2013 Web Client Training in Atlanta

February 6, 2013 · Mariano Gomez · No Comments
Tags: , , , , , , , , ,  · Posted in: Blogs I Follow Total Views: 243

Quick Tip: Accessing Third Party Table Buffers using anonymous tables

David Meego - Click for blog homepageI have been spending a lot of time recently working on consulting engagement in Malaysia. This project involves a large amount of custom Dexterity code, some of which involves accessing tables in other third party product’s dictionaries.

In the past, I have covered Cross Dictionary Dexterity Development techniques and the usual method I recommended for accessing data from third party tables is to use the execute() function to execute code in the third party product to set key fields in a table buffer, get the table record and then return the required data. 

Below is an example of that technique to retrieve data from Fixed Assets: 

 

MBS_FA_General_Information_MSTR_ByIndex Function

function returns integer OUT_Error;
in long IN_Asset_Index;
out string OUT_Asset_ID;
out integer OUT_Asset_ID_Suffix;
out string OUT_Asset_Description;

local text code;
local string compiler_error;

pragma(disable warning LiteralStringUsed);
if MBS_FA_Installed() then

 Build the pass-through sanScript code.
 clear code;
 code = code + “in long IN_Asset_Index;”;
 code = code + “out string OUT_Asset_ID;”;
 code = code + “out integer OUT_Asset_ID_Suffix;”;
 code = code + “out string OUT_Asset_Description;”;
 code = code + “out integer OUT_Error;”;

 code = code + “clear table FA_General_Information_MSTR;”;
 code = code + “‘Asset Index’ of table FA_General_Information_MSTR = IN_Asset_Index;”;
 code = code + “get table FA_General_Information_MSTR by number 1;”;
 code = code + “if err() = OKAY then”;
 code = code + ”  OUT_Asset_ID = ‘Asset ID’ of table FA_General_Information_MSTR;”;
 code = code + ”  OUT_Asset_ID_Suffix = ‘Asset ID Suffix’ of table FA_General_Information_MSTR;”;
 code = code + ”  OUT_Asset_Description = ‘Asset Description’ of table FA_General_Information_MSTR;”;
 code = code + “else”;
 code = code + ”  clear OUT_Asset_ID;”;
 code = code + ”  clear OUT_Asset_ID_Suffix;”;
 code = code + ”  clear OUT_Asset_Description;”;
 code = code + “end if;”;
 code = code + “OUT_Error = err();”;

 

 Execute the code.
 if execute(MBS_FA_PROD_ID, code, compiler_error, IN_Asset_Index, OUT_Asset_ID, OUT_Asset_ID_Suffix, OUT_Asset_Description, OUT_Error) <> 0 then
  A compiler error occurred. Display the error.
  warning compiler_error;
 end if;
 
else
 clear OUT_Asset_ID;
 clear OUT_Asset_ID_Suffix;
 clear OUT_Asset_Description;
 OUT_Error = -1;
end if;
pragma(enable warning LiteralStringUsed);

 

 

The method above is great for getting a single record (1 to 1 relationship), but how can you move through a range of records in a third party table (1 to many relationship)?

Here are some methods I have used previously for handling moving through a range of records:

  1. Using similar code to the example above, you can pass in the parameters to set the range and the previous values for the key fields (blank will get first). Then issue a get next table command and return the key fields and any other additional data needed. If the EOF (End of File) is reached then clear the table buffer so that the returned parameters are blank. This code can be called once to get the first record and then from inside a while loop to get the next record. Each time we are passing back the parameters for the range and the previous records key fields.  This method is good for reading values, but not so useful if you need to manipulate/save data or access every field in the table.
     
  2. Create a global procedure in your dictionary which has the parameters for the fields you need from the third party table. Then use an execute() function to create the range on the third party table, get the first record and then loop through the table using a while loop with a get next table statement. Inside the while loop use a call with name in dictionary command to call back to your dictionary. This code will then loop through the table and call back into your code for each record.
     
  3. Not Recommended: Before we had the execute() command, you could create a duplicate table definition in my dictionary which could access the physical table at the database level. This technique has issues if the original table structure gets changed. It does not work for temporary tables and will bypass Dexterity table triggers (if any) on the original table.

 

So, now I want to introduce a new method that I worked out that allows full access to the third party table almost as though it was actually a table in your dictionary. The concept is execute() some code in the third party dictionary to pass back the table buffer you want as an anonymous table. It requires a procedure in your code which can be called from the execute() statement (similar to method 2 above).

  

Execute Code Example

local integer l_key;

local text code;
local string compiler_error;

l_key = 1;

pragma(disable warning LiteralStringUsed);

if MBS_FA_Installed() then
 Build the pass-through sanScript code.
 clear code;
 code = code + “in integer IN_Key;”;
 code = code + “local anonymous table Master_Table;”;
 code = code + “open table Master_Table with name technicalname(table FA_General_Information_MSTR);”;

 code = code + “call with name ” + QUOTE + technicalname(script MBS_FA_General_Information_MSTR_Callback) + QUOTE+ ” in dictionary ” + str(Runtime_GetCurrentProductID())
      + “, table Master_Table, IN_Key; “;

 Execute the code.
 if execute(MBS_FA_PROD_ID, code, compiler_error, l_key) <> 0 then
  A compiler error occurred. Display the error.
  warning compiler_error;
 end if;
end if;

pragma(enable warning LiteralStringUsed);

 

 

MBS_FA_General_Information_MSTR_Callback Procedure

inout anonymous table FA_General_Information_MSTR;
in integer IN_Key;

get first table FA_General_Information_MSTR by number IN_Key;

warning column(“‘Asset ID'”) of table FA_General_Information_MSTR;

 

 

Once you have the anonymous table in your code you can perform any action you like on the table. The only exception is that you should use the column() function to refer to the columns or fields. If you require other parameters to be passed, you can add them to your callback procedure and then pass them via the execute() statement, such as the IN_Key parameter in the example above.

In our project we used a cross dictionary trigger on a Fixed Assets procedure to capture one table buffer that was passed as a parameter. We then used a variation of the above technique to pass the captured table buffer as an anonymous table parameter through to the execute() statement, which in turn passed it back to our callback procedure as a second anonymous table parameter along with the additional table buffer from the execute() statement itself.

I hope you find this technique useful.  

David

Taken from:
Quick Tip: Accessing Third Party Table Buffers using anonymous tables

February 6, 2013 · David Musgrave · No Comments
Tags: , , , , , , , , , ,  · Posted in: Blogs I Follow Total Views: 244