tag:blogger.com,1999:blog-145488612024-03-12T18:24:03.935-05:00MBS GuruReviewing, exploring, and customizing Microsoft Dynamics GP... among other thingsmbsguruhttp://www.blogger.com/profile/13675896847183138852noreply@blogger.comBlogger102125tag:blogger.com,1999:blog-14548861.post-7728170293250791442013-10-23T17:05:00.002-05:002013-10-23T17:05:16.802-05:00Connecting to a Microsoft CRM 2013 Internet Facing Deployment with C#Integrating and retrieving data from a Microsoft CRM 2013 instance is a common request, and I have found myself working on a number of these solutions lately. I encountered a recent example where a client was using an Internet Facing Deployment of CRM 2013.<br />
<br />
In this case, I needed to connect to the Microsoft CRM 2013 server to retrieve data to be integrated into Dynamics GP.<br />
<br />
Here is a quick sample of code you may use to connect to an internet facing deployment of Microsoft CRM 2013 using claims based authentication.<br />
<br />
<br />
<!-- code formatted by http://manoli.net/csharpformat/ -->
<br />
<div class="csharpcode">
<pre class="alt"><span class="rem">// Get the endpoint of the CRM organization service.</span></pre>
<pre>Uri organizationServiceUri = <span class="kwrd">new</span> Uri(<span class="str">@"CrmOrganizationServiceEndpointUri"</span>); <span class="rem">// In production code, abstract this to configuration.</span></pre>
<pre class="alt"> </pre>
<pre><span class="rem">// Get the service configuration.</span></pre>
<pre class="alt">IServiceConfiguration<IOrganizationService> serviceConfiguration = ServiceConfigurationFactory.CreateConfiguration<IOrganizationService>(organizationServiceUri);</pre>
<pre> </pre>
<pre class="alt"><span class="rem">// Set up the credentials.</span></pre>
<pre>ClientCredentials clientCredentials = <span class="kwrd">new</span> ClientCredentials();</pre>
<pre class="alt">clientCredentials.UserName.UserName = <span class="str">"CrmUserName"</span>; <span class="rem">// In production code, abstract this to configuration.</span></pre>
<pre>clientCredentials.UserName.Password = <span class="str">"CrmPassword"</span>; <span class="rem">// In production code, abstract this to configuration.</span></pre>
<pre class="alt"> </pre>
<pre><span class="kwrd">using</span> (OrganizationServiceProxy organizationServiceProxy = <span class="kwrd">new</span> OrganizationServiceProxy(serviceConfiguration, clientCredentials))</pre>
<pre class="alt">{</pre>
<pre> <span class="rem">// Perform business logic here.</span></pre>
<pre class="alt">}</pre>
</div>
<style>
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: Consolas, "Courier New", Courier, Monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #a31515; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style><div class="blogger-post-footer">http://mbsguru.blogspot.com/atom.xml</div>Bryan Princehttp://www.blogger.com/profile/01546244332553420397noreply@blogger.com0tag:blogger.com,1999:blog-14548861.post-59783038414273899552013-09-03T12:16:00.000-05:002013-09-10T13:06:31.769-05:00Executing SQL Queries via SharePoint Web Services<h2>
Can you really execute native SQL Queries from SharePoint Web Services?</h2>
Microsoft SharePoint is great for building enterprise
systems tying together various data sources.
If the information you are looking for is in a SharePoint List or
Document Library, it is straightforward to call the built-in Web Services to
query or manipulate that data. Through
custom Web Parts, you can run server-side code and easily retrieve data that lives
outside SharePoint.<br />
<div>
<br />
<div class="MsoNormal">
<o:p></o:p></div>
<div class="MsoNormal">
But what if you don’t have the access to run Server-Side
code? How can you get to the data that
lives in SQL Server from your client-side web application? You can’t call external XML web services
because of the Same Origin Policy Restrictions.
True, you can work around this if you have access to a JSONP web
service, and some browsers and servers are starting to support CORS to allow
limited cross-site access. But if you
don’t have access to the server, can’t control the browser environment and no
JSONP web services are available, you aren't out of luck. I'll show you how to get SharePoint to
execute the SQL Queries on your behalf and return the results to your web
browser. With a few tweaks, this same
technique can also be used to access arbitrary XML Web Services. In a later article, I'll expand this example to do just that.<o:p></o:p></div>
<h2>
A Word of Warning:</h2>
<div class="MsoNormal">
<o:p></o:p></div>
<div class="MsoNormal">
There is a downside to this approach. Since you will be using the SharePoint Server
as a proxy, the SQL logs will show the connection coming from the SharePoint
Server. Also, you must either pass in a
username/password with the web service call or use a guest SQL account. You will have to consider the security impact
of either approach carefully.<o:p></o:p></div>
<h2>
How does it work?</h2>
<div class="MsoNormal">
<o:p></o:p></div>
<div class="MsoNormal">
You will be using the WebPartPages.GetDataFromDataSourceControl
method. This method is intended to be used by
SharePoint Designer to render data during page design and is very sparsely
documented. According to MSDN, it takes
two string parameters: dscXml and contextUrl.
That is the extent of the MSDN documentation.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
In order to make it easier to work with, I created a helper function
called SqlQuery that accepts a Server name, Database name, User name,
password, Sql Query and a callback function.
Pass in the proper parameters and your callback will be executed with
the results. You can paste the source
code below into the HTML source of a Content Editor Web Part on a page on your
SharePoint Server to test. Note, I am using JQuery to simplify the AJAX calls and form interaction.<o:p></o:p></div>
<h2>
Source Code:</h2>
<div class="MsoNormal">
<o:p></o:p></div>
<pre style="background: white;"><span style="font-family: Consolas;"> <span style="font-size: xx-small;"> </span></span><span style="font-family: Consolas; font-size: 13px;"> </span><span style="color: blue; font-size: 13px;"><</span><span style="color: maroon; font-size: 13px;">script</span><span style="font-family: Consolas; font-size: 13px;"> </span><span style="color: red; font-size: 13px;">src</span><span style="color: blue; font-size: 13px;">=</span><span style="color: blue; font-size: 13px;">"http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.10.2.min.js"</span><span style="font-family: Consolas; font-size: 13px;"> </span><span style="color: red; font-size: 13px;">type</span><span style="color: blue; font-size: 13px;">=</span><span style="color: blue; font-size: 13px;">"text/javascript"</span><span style="color: blue; font-size: 13px;">></</span><span style="color: maroon; font-size: 13px;">script</span><span style="color: blue; font-size: 13px;">></span></pre>
<pre style="background-color: white; background-position: initial initial; background-repeat: initial initial; font-family: Consolas; font-size: 13px;"> <span style="color: blue;"><</span><span style="color: maroon;">script</span> <span style="color: red;">type</span><span style="color: blue;">=</span><span style="color: blue;">"text/javascript"</span><span style="color: blue;">></span>
$(document).ready(<span style="color: blue;">function</span> () {</pre>
<pre style="background-color: white; font-size: 13px;"><pre><span style="font-family: Consolas;"> </span><span style="color: darkgreen;"><span style="font-family: Courier New, Courier, monospace;">//SqlQuery function - proxies a SQL Server call through sharepoint web services and executes your callback with the results.</span></span></pre>
<span style="font-family: Consolas;"> </span><span style="color: blue; font-family: Consolas;">function</span><span style="font-family: Consolas;"> SqlQuery(server, database, user, password, query, callback) {
</span><span style="color: blue; font-family: Consolas;">var</span><span style="font-family: Consolas;"> soapMessage = [</span><span style="color: maroon; font-family: Consolas;">"<?xml version='1.0' encoding='utf-8'?>"</span><span style="font-family: Consolas;">];
soapMessage.push(</span><span style="color: maroon; font-family: Consolas;">"<soap:Envelope xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'>"</span><span style="font-family: Consolas;">);
soapMessage.push(</span><span style="color: maroon; font-family: Consolas;">" <soap:Body>"</span><span style="font-family: Consolas;">);
soapMessage.push(</span><span style="color: maroon; font-family: Consolas;">" <GetDataFromDataSourceControl xmlns='http://microsoft.com/sharepoint/webpartpages'>"</span><span style="font-family: Consolas;">);
soapMessage.push(</span><span style="color: maroon; font-family: Consolas;">" <dscXml>&lt;asp:SqlDataSource runat=&quot;server&quot; __designer:commandsync=&quot;true&quot; ProviderName=&quot;System.Data.SqlClient&quot; ConnectionString=&quot;"</span><span style="font-family: Consolas;">);
soapMessage.push(</span><span style="color: maroon; font-family: Consolas;">"Data Source="</span><span style="font-family: Consolas;"> + server + </span><span style="color: maroon; font-family: Consolas;">";User ID="</span><span style="font-family: Consolas;"> + user + </span><span style="color: maroon; font-family: Consolas;">";Password="</span><span style="font-family: Consolas;"> + password + </span><span style="color: maroon; font-family: Consolas;">";Initial Catalog="</span><span style="font-family: Consolas;"> + database + </span><span style="color: maroon; font-family: Consolas;">";&quot; "</span><span style="font-family: Consolas;">);
soapMessage.push(</span><span style="color: maroon; font-family: Consolas;">" SelectCommand=&quot;"</span><span style="font-family: Consolas;"> + query + </span><span style="color: maroon; font-family: Consolas;">" &quot;/&gt;</dscXml>"</span><span style="font-family: Consolas;">);
soapMessage.push(</span><span style="color: maroon; font-family: Consolas;">" <contextUrl></contextUrl>"</span><span style="font-family: Consolas;">);
soapMessage.push(</span><span style="color: maroon; font-family: Consolas;">" </GetDataFromDataSourceControl>"</span><span style="font-family: Consolas;">);
soapMessage.push(</span><span style="color: maroon; font-family: Consolas;">" </soap:Body>"</span><span style="font-family: Consolas;">);
soapMessage.push(</span><span style="color: maroon; font-family: Consolas;">"</soap:Envelope>"</span><span style="font-family: Consolas;">);
</span><span style="color: blue; font-family: Consolas;">var</span><span style="font-family: Consolas;"> message = soapMessage.join(</span><span style="color: maroon; font-family: Consolas;">""</span><span style="font-family: Consolas;">);
</span><span style="color: blue; font-family: Consolas;">var</span><span style="font-family: Consolas;"> thisSite = window.location.href.split(window.location.pathname).shift();
$.ajax({
url: thisSite + </span><span style="color: maroon; font-family: Consolas;">"/_vti_bin/webpartpages.asmx"</span><span style="font-family: Consolas;">,
beforeSend: </span><span style="color: blue; font-family: Consolas;">function</span><span style="font-family: Consolas;"> (xhr) { xhr.setRequestHeader(</span><span style="color: maroon; font-family: Consolas;">"SOAPAction"</span><span style="font-family: Consolas;">, </span><span style="color: maroon; font-family: Consolas;">"http://microsoft.com/sharepoint/webpartpages/GetDataFromDataSourceControl"</span><span style="font-family: Consolas;">); },
type: </span><span style="color: maroon; font-family: Consolas;">"POST"</span><span style="font-family: Consolas;">,
dataType: </span><span style="color: maroon; font-family: Consolas;">"xml"</span><span style="font-family: Consolas;">,
contentType: </span><span style="color: maroon; font-family: Consolas;">"text/xml; charset=\"utf-8\""</span><span style="font-family: Consolas;">,
data: message,
complete: </span><span style="color: blue; font-family: Consolas;">function</span><span style="font-family: Consolas;"> (xData, status) {
</span><span style="color: blue; font-family: Consolas;">if</span><span style="font-family: Consolas;"> (status == </span><span style="color: maroon; font-family: Consolas;">"success"</span><span style="font-family: Consolas;">) {
</span><span style="color: blue; font-family: Consolas;">var</span><span style="font-family: Consolas;"> rows = $($.parseXML($(xData.responseXML).find(</span><span style="color: maroon; font-family: Consolas;">"GetDataFromDataSourceControlResult"</span><span style="font-family: Consolas;">).prop(</span><span style="color: maroon; font-family: Consolas;">"text"</span><span style="font-family: Consolas;">))).find(</span><span style="color: maroon; font-family: Consolas;">"Row"</span><span style="font-family: Consolas;">);
callback(rows, status);
} </span><span style="color: blue; font-family: Consolas;">else</span><span style="font-family: Consolas;"> {
callback(xData, status);
}
}
});
};
</span><pre><span style="font-family: Consolas;"> </span><span style="color: darkgreen;"><span style="font-family: Courier New, Courier, monospace;">//Set up some variables to interact with the form.</span></span><span style="font-family: Consolas;"></span><span style="font-family: Consolas;"></span></pre>
<span style="font-family: Consolas;"> </span><span style="color: blue; font-family: Consolas;">var</span><span style="font-family: Consolas;"> executeButton = $(</span><span style="color: maroon; font-family: Consolas;">"#executeQuery"</span><span style="font-family: Consolas;">), serverInput = $(</span><span style="color: maroon; font-family: Consolas;">"#server"</span><span style="font-family: Consolas;">), databaseInput = $(</span><span style="color: maroon; font-family: Consolas;">"#database"</span><span style="font-family: Consolas;">), userNameInput = $(</span><span style="color: maroon; font-family: Consolas;">"#userName"</span><span style="font-family: Consolas;">), passwordInput = $(</span><span style="color: maroon; font-family: Consolas;">"#password"</span><span style="font-family: Consolas;">), queryInput = $(</span><span style="color: maroon; font-family: Consolas;">"#query"</span><span style="font-family: Consolas;">);
</span><pre><span style="font-family: Consolas;">
</span></pre>
<pre><span style="font-family: Consolas;"> </span><span style="color: darkgreen;"><span style="font-family: Courier New, Courier, monospace;">//When the user clicks the button, execute the query, parse and display the results.</span></span><span style="font-family: Consolas;"></span><span style="font-family: Consolas;"></span></pre>
<span style="font-family: Consolas;"> executeButton.click(</span><span style="color: blue; font-family: Consolas;">function</span><span style="font-family: Consolas;"> () {
window.status = </span><span style="color: maroon; font-family: Consolas;">"calling SQL Query"</span><span style="font-family: Consolas;">;</span></pre>
<pre style="background-color: white; font-size: 13px;"><pre><span style="font-family: Consolas;"> SqlQuery(serverInput.val(), databaseInput.val(), userNameInput.val(), passwordInput.val(), queryInput.val(), </span><span style="color: blue; font-family: Consolas;">function</span><span style="font-family: Consolas;"> (rows, status) {</span></pre>
<span style="font-family: Consolas;"> window.status = status;
</span><span style="color: blue; font-family: Consolas;">if</span><span style="font-family: Consolas;"> (status == </span><span style="color: maroon; font-family: Consolas;">"success"</span><span style="font-family: Consolas;">) {
</span><span style="color: blue; font-family: Consolas;">var</span><span style="font-family: Consolas;"> output = [</span><span style="color: maroon; font-family: Consolas;">"<ol>"</span><span style="font-family: Consolas;">];</span></pre>
<pre style="background-color: white; font-size: 13px;"><pre><span style="font-family: Consolas;"> </span><span style="color: darkgreen;"><span style="font-family: Courier New, Courier, monospace;">//rows is now a jquery object with the response from the sql query</span></span></pre>
<span style="font-family: Consolas;"> rows.each(</span><span style="color: blue; font-family: Consolas;">function</span><span style="font-family: Consolas;"> (i, element) {
</span><span style="color: blue; font-family: Consolas;">var</span><span style="font-family: Consolas;"> row = [];
</span><span style="color: blue; font-family: Consolas;">for</span><span style="font-family: Consolas;"> (</span><span style="color: blue; font-family: Consolas;">var</span><span style="font-family: Consolas;"> j = 0; j < element.attributes.length; j++) {
</span><span style="color: blue; font-family: Consolas;">var</span><span style="font-family: Consolas;"> attribute = element.attributes[j];
row.push(</span><span style="color: maroon; font-family: Consolas;">"'"</span><span style="font-family: Consolas;"> + attribute.nodeName + </span><span style="color: maroon; font-family: Consolas;">"'='"</span><span style="font-family: Consolas;"> + attribute.value + </span><span style="color: maroon; font-family: Consolas;">"'"</span><span style="font-family: Consolas;">);
}
output.push(</span><span style="color: maroon; font-family: Consolas;">"<li>"</span><span style="font-family: Consolas;"> + row.join() + </span><span style="color: maroon; font-family: Consolas;">"</li>"</span><span style="font-family: Consolas;">);
});
$(</span><span style="color: maroon; font-family: Consolas;">"#output"</span><span style="font-family: Consolas;">).html(output.join(</span><span style="color: maroon; font-family: Consolas;">""</span><span style="font-family: Consolas;">) + </span><span style="color: maroon; font-family: Consolas;">"</ol>"</span><span style="font-family: Consolas;">);
} </span><span style="color: blue; font-family: Consolas;">else</span><span style="font-family: Consolas;"> {
$(</span><span style="color: maroon; font-family: Consolas;">"#output"</span><span style="font-family: Consolas;">).html($(rows.responseXML).text());
}
});
});
});
</span><span style="color: blue; font-family: Consolas;"></</span><span style="color: maroon; font-family: Consolas;">script</span><span style="color: blue; font-family: Consolas;">></span></pre>
<pre style="background-color: white; font-size: 13px;"><pre><span style="color: darkgreen; font-family: Courier New, Courier, monospace;"><!-- And the form to let the user interact with the SqlQuery function. --></span><span style="font-family: Consolas;"></span></pre>
<span style="font-family: Consolas;"></span><span style="font-family: Consolas;">
</span><span style="color: blue; font-family: Consolas;"><</span><span style="color: maroon; font-family: Consolas;">h1</span><span style="color: blue; font-family: Consolas;">></span><span style="font-family: Consolas;">
SQL Query Demo</span><span style="color: blue; font-family: Consolas;"></</span><span style="color: maroon; font-family: Consolas;">h1</span><span style="color: blue; font-family: Consolas;">></span><span style="font-family: Consolas;">
</span><span style="color: blue; font-family: Consolas;"><</span><span style="color: maroon; font-family: Consolas;">label</span><span style="font-family: Consolas;"> </span><span style="color: red; font-family: Consolas;">for</span><span style="color: blue; font-family: Consolas;">=</span><span style="color: blue; font-family: Consolas;">'userName'</span><span style="color: blue; font-family: Consolas;">></span><span style="font-family: Consolas;">
User Name:</span><span style="color: blue; font-family: Consolas;"></</span><span style="color: maroon; font-family: Consolas;">label</span><span style="color: blue; font-family: Consolas;">></span><span style="font-family: Consolas;">
</span><span style="color: blue; font-family: Consolas;"><</span><span style="color: maroon; font-family: Consolas;">input</span><span style="font-family: Consolas;"> </span><span style="color: red; font-family: Consolas;">type</span><span style="color: blue; font-family: Consolas;">=</span><span style="color: blue; font-family: Consolas;">'text'</span><span style="font-family: Consolas;"> </span><span style="color: red; font-family: Consolas;">id</span><span style="color: blue; font-family: Consolas;">=</span><span style="color: blue; font-family: Consolas;">'userName'</span><span style="font-family: Consolas;"> </span><span style="color: red; font-family: Consolas;">value</span><span style="color: blue; font-family: Consolas;">=</span><span style="color: blue; font-family: Consolas;">'SQLUser'</span><span style="font-family: Consolas;"> </span><span style="color: blue; font-family: Consolas;">/></span><span style="font-family: Consolas;">
</span><span style="color: blue; font-family: Consolas;"><</span><span style="color: maroon; font-family: Consolas;">label</span><span style="font-family: Consolas;"> </span><span style="color: red; font-family: Consolas;">for</span><span style="color: blue; font-family: Consolas;">=</span><span style="color: blue; font-family: Consolas;">'password'</span><span style="color: blue; font-family: Consolas;">></span><span style="font-family: Consolas;">
Password:</span><span style="color: blue; font-family: Consolas;"></</span><span style="color: maroon; font-family: Consolas;">label</span><span style="color: blue; font-family: Consolas;">></span><span style="font-family: Consolas;">
</span><span style="color: blue; font-family: Consolas;"><</span><span style="color: maroon; font-family: Consolas;">input</span><span style="font-family: Consolas;"> </span><span style="color: red; font-family: Consolas;">type</span><span style="color: blue; font-family: Consolas;">=</span><span style="color: blue; font-family: Consolas;">'password'</span><span style="font-family: Consolas;"> </span><span style="color: red; font-family: Consolas;">id</span><span style="color: blue; font-family: Consolas;">=</span><span style="color: blue; font-family: Consolas;">'password'</span><span style="font-family: Consolas;"> </span><span style="color: red; font-family: Consolas;">value</span><span style="color: blue; font-family: Consolas;">=</span><span style="color: blue; font-family: Consolas;">'********'</span><span style="font-family: Consolas;"> </span><span style="color: blue; font-family: Consolas;">/></span><span style="font-family: Consolas;">
</span><span style="color: blue; font-family: Consolas;"><</span><span style="color: maroon; font-family: Consolas;">label</span><span style="font-family: Consolas;"> </span><span style="color: red; font-family: Consolas;">for</span><span style="color: blue; font-family: Consolas;">=</span><span style="color: blue; font-family: Consolas;">'server'</span><span style="color: blue; font-family: Consolas;">></span><span style="font-family: Consolas;">
Server:</span><span style="color: blue; font-family: Consolas;"></</span><span style="color: maroon; font-family: Consolas;">label</span><span style="color: blue; font-family: Consolas;">></span><span style="font-family: Consolas;">
</span><span style="color: blue; font-family: Consolas;"><</span><span style="color: maroon; font-family: Consolas;">input</span><span style="font-family: Consolas;"> </span><span style="color: red; font-family: Consolas;">type</span><span style="color: blue; font-family: Consolas;">=</span><span style="color: blue; font-family: Consolas;">'text'</span><span style="font-family: Consolas;"> </span><span style="color: red; font-family: Consolas;">id</span><span style="color: blue; font-family: Consolas;">=</span><span style="color: blue; font-family: Consolas;">'server'</span><span style="font-family: Consolas;"> </span><span style="color: red; font-family: Consolas;">value</span><span style="color: blue; font-family: Consolas;">=</span><span style="color: blue; font-family: Consolas;">'SERVERNAME'</span><span style="font-family: Consolas;"> </span><span style="color: blue; font-family: Consolas;">/></span><span style="font-family: Consolas;">
</span><span style="color: blue; font-family: Consolas;"><</span><span style="color: maroon; font-family: Consolas;">label</span><span style="font-family: Consolas;"> </span><span style="color: red; font-family: Consolas;">for</span><span style="color: blue; font-family: Consolas;">=</span><span style="color: blue; font-family: Consolas;">'database'</span><span style="color: blue; font-family: Consolas;">></span><span style="font-family: Consolas;">
Database:</span><span style="color: blue; font-family: Consolas;"></</span><span style="color: maroon; font-family: Consolas;">label</span><span style="color: blue; font-family: Consolas;">></span><span style="font-family: Consolas;">
</span><span style="color: blue; font-family: Consolas;"><</span><span style="color: maroon; font-family: Consolas;">input</span><span style="font-family: Consolas;"> </span><span style="color: red; font-family: Consolas;">type</span><span style="color: blue; font-family: Consolas;">=</span><span style="color: blue; font-family: Consolas;">'text'</span><span style="font-family: Consolas;"> </span><span style="color: red; font-family: Consolas;">id</span><span style="color: blue; font-family: Consolas;">=</span><span style="color: blue; font-family: Consolas;">'database'</span><span style="font-family: Consolas;"> </span><span style="color: red; font-family: Consolas;">value</span><span style="color: blue; font-family: Consolas;">=</span><span style="color: blue; font-family: Consolas;">'Food'</span><span style="font-family: Consolas;"> </span><span style="color: blue; font-family: Consolas;">/></span><span style="font-family: Consolas;">
</span><span style="color: blue; font-family: Consolas;"><</span><span style="color: maroon; font-family: Consolas;">label</span><span style="font-family: Consolas;"> </span><span style="color: red; font-family: Consolas;">for</span><span style="color: blue; font-family: Consolas;">=</span><span style="color: blue; font-family: Consolas;">'query'</span><span style="color: blue; font-family: Consolas;">></span><span style="font-family: Consolas;">
Query:</span><span style="color: blue; font-family: Consolas;"></</span><span style="color: maroon; font-family: Consolas;">label</span><span style="color: blue; font-family: Consolas;">></span><span style="font-family: Consolas;">
</span><span style="color: blue; font-family: Consolas;"><</span><span style="color: maroon; font-family: Consolas;">textarea</span><span style="font-family: Consolas;"> </span><span style="color: red; font-family: Consolas;">id</span><span style="color: blue; font-family: Consolas;">=</span><span style="color: blue; font-family: Consolas;">'query'</span><span style="font-family: Consolas;"> </span><span style="color: red; font-family: Consolas;">rows</span><span style="color: blue; font-family: Consolas;">=</span><span style="color: blue; font-family: Consolas;">'5'</span><span style="font-family: Consolas;"> </span><span style="color: red; font-family: Consolas;">cols</span><span style="color: blue; font-family: Consolas;">=</span><span style="color: blue; font-family: Consolas;">'80'</span><span style="color: blue; font-family: Consolas;">></span><span style="font-family: Consolas;">SELECT TOP 10 [NDB_No] ,[Seq] ,[Amount] ,[Msre_Desc] ,[Gm_Wgt] FROM [Food].[dbo].[WEIGHT]</span><span style="color: blue; font-family: Consolas;"></</span><span style="color: maroon; font-family: Consolas;">textarea</span><span style="color: blue; font-family: Consolas;">></span><span style="font-family: Consolas;">
</span><span style="color: blue; font-family: Consolas;"><</span><span style="color: maroon; font-family: Consolas;">input</span><span style="font-family: Consolas;"> </span><span style="color: red; font-family: Consolas;">type</span><span style="color: blue; font-family: Consolas;">=</span><span style="color: blue; font-family: Consolas;">'button'</span><span style="font-family: Consolas;"> </span><span style="color: red; font-family: Consolas;">id</span><span style="color: blue; font-family: Consolas;">=</span><span style="color: blue; font-family: Consolas;">'executeQuery'</span><span style="font-family: Consolas;"> </span><span style="color: red; font-family: Consolas;">value</span><span style="color: blue; font-family: Consolas;">=</span><span style="color: blue; font-family: Consolas;">'Execute Query'</span><span style="font-family: Consolas;"> </span><span style="color: blue; font-family: Consolas;">/></span><span style="font-family: Consolas;">
</span><span style="color: blue; font-family: Consolas;"><</span><span style="color: maroon; font-family: Consolas;">h1</span><span style="color: blue; font-family: Consolas;">></span><span style="font-family: Consolas;">
Output</span><span style="color: blue; font-family: Consolas;"></</span><span style="color: maroon; font-family: Consolas;">h1</span><span style="color: blue; font-family: Consolas;">></span><span style="font-family: Consolas;">
</span><span style="color: blue; font-family: Consolas;"><</span><span style="color: maroon; font-family: Consolas;">div</span><span style="font-family: Consolas;"> </span><span style="color: red; font-family: Consolas;">id</span><span style="color: blue; font-family: Consolas;">=</span><span style="color: blue; font-family: Consolas;">'output'</span><span style="color: blue; font-family: Consolas;">></span><span style="font-family: Consolas;">
</span><span style="color: blue; font-family: Consolas;"></</span><span style="color: maroon; font-family: Consolas;">div</span><span style="color: blue; font-family: Consolas;">></span></pre>
<div class="MsoNormal">
<br /></div>
<h2>
Example:</h2>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYjIoFTCSvHzliT4MpiE3apC0Kvg-H7OUcB3YJSVzw5rqwMY0q58z5bcNSvO8B4imGL06PvVx98HD4XTrrksZhjKtk64y8NJd6E-i1sDNjExB1sEynaByQfbtBhPKc0HWTmdQ_kA/s1600/sqlquery.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYjIoFTCSvHzliT4MpiE3apC0Kvg-H7OUcB3YJSVzw5rqwMY0q58z5bcNSvO8B4imGL06PvVx98HD4XTrrksZhjKtk64y8NJd6E-i1sDNjExB1sEynaByQfbtBhPKc0HWTmdQ_kA/s1600/sqlquery.png" /></a></div>
<div>
<br /></div>
<div class="MsoNormal">
<o:p></o:p></div>
<br />
<div class="MsoNormal">
<!--[if gte vml 1]><v:shapetype
id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t"
path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f">
<v:stroke joinstyle="miter"/>
<v:formulas>
<v:f eqn="if lineDrawn pixelLineWidth 0"/>
<v:f eqn="sum @0 1 0"/>
<v:f eqn="sum 0 0 @1"/>
<v:f eqn="prod @2 1 2"/>
<v:f eqn="prod @3 21600 pixelWidth"/>
<v:f eqn="prod @3 21600 pixelHeight"/>
<v:f eqn="sum @0 0 1"/>
<v:f eqn="prod @6 1 2"/>
<v:f eqn="prod @7 21600 pixelWidth"/>
<v:f eqn="sum @8 21600 0"/>
<v:f eqn="prod @7 21600 pixelHeight"/>
<v:f eqn="sum @10 21600 0"/>
</v:formulas>
<v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/>
<o:lock v:ext="edit" aspectratio="t"/>
</v:shapetype><v:shape id="Picture_x0020_1" o:spid="_x0000_i1025" type="#_x0000_t75"
style='width:468pt;height:293.25pt;visibility:visible;mso-wrap-style:square'>
<v:imagedata src="file:///C:\Users\lrussell\AppData\Local\Temp\1\msohtmlclip1\01\clip_image001.png"
o:title=""/>
</v:shape><![endif]--><!--[if !vml]--><!--[endif]--><o:p></o:p></div>
</div>
<div class="blogger-post-footer">http://mbsguru.blogspot.com/atom.xml</div>Lance Russellhttp://www.blogger.com/profile/11780142384048582104noreply@blogger.com0tag:blogger.com,1999:blog-14548861.post-36252051576355105092013-03-17T09:29:00.000-05:002013-03-17T09:29:51.379-05:00Will Your Existing GP Customizations Work in GP 2013?With the recent release of Microsoft Dynamics GP 2013 comes
an exciting new feature: the Web Client. We've all longed for the Web Client,
dreaming of a day when we could access our system from any web browser without
being tied to our desktops and office networks, and now it’s finally here!
Before we all begin to jump for joy, there is one thing to realize before making
the switch to GP 2013—some of the customizations that you've made over the
years to your existing Dynamics GP installation may not be fully compatible in
the new Web Client.<br />
<br />
Before going further, let’s take a look at the different
ways that GP can be customized, which of those ways will present an issue
moving over to the new GP 2013 Web Client, and the next steps to make the
transition.
<br />
<br />
<h3>
4 Types of Dynamics GP Customizations</h3>
There are four ways that Dynamics GP software can be
modified or customized:<br />
<ol>
<li><b>Modifier - </b>Allows
changes to be made to the user interface (UI). Examples include adding new
fields, moving fields around, and changing field labels, etc. Customizations made to GP using Modifier will
be compatible with both the GP 2013 desktop version as well as the Web Client.</li>
<li><b>Dexterity -</b>This is the programming language in which Dynamics GP is written
and customizations to the code level require a Dexterity developer. Example of
changes to Dexterity code include things like adding new business logic or
capturing business domain specific data through alternate forms or window
modifications. The possibilities are endless. Customizations made to GP using Dexterity
will be compatible with both the GP 2013 desktop version as well as the Web
Client.</li>
<li><b>VBA - </b>Is most often used to add additional functionality to fields
such as disabling a field or automatically populate fields from a database,
etc. Although customizations made to GP using VBA will be compatible with the
desktop version of GP 2013, at this time <b>they
are not compatible with the GP 2013 Web Client</b>.</li>
<li><b>VST - </b>Allows the same type of changes that would be made with
Dexterity but with the .NET programming language. Although customizations made
to GP using VST will be compatible with the desktop version of GP 2013, at this
time <b>they are not compatible with the GP
2013 Web Client</b> without additional modifications.</li>
</ol>
<br />
<br />
<table border="1" cellpadding="0" cellspacing="0" style="border-collapse: collapse; border: none; mso-border-alt: solid #8DB3E2 .5pt; mso-border-insideh-themecolor: text2; mso-border-insideh-themetint: 102; mso-border-insideh: .5pt solid #8DB3E2; mso-border-insidev-themecolor: text2; mso-border-insidev-themetint: 102; mso-border-insidev: .5pt solid #8DB3E2; mso-border-themecolor: text2; mso-border-themetint: 102; mso-padding-alt: 0in 5.4pt 0in 5.4pt; mso-yfti-tbllook: 1184;">
<tbody>
<tr>
<td style="background: #8DB3E2; border: solid #8DB3E2 1.0pt; mso-background-themecolor: text2; mso-background-themetint: 102; mso-border-alt: solid #8DB3E2 .5pt; mso-border-themecolor: text2; mso-border-themecolor: text2; mso-border-themetint: 102; mso-border-themetint: 102; padding: 0in 5.4pt 0in 5.4pt; width: 119.7pt;" valign="top" width="160"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<b><span style="color: white; mso-themecolor: background1;">Type of Customization<o:p></o:p></span></b></div>
</td>
<td style="background: #8DB3E2; border-left: none; border: solid #8DB3E2 1.0pt; mso-background-themecolor: text2; mso-background-themetint: 102; mso-border-alt: solid #8DB3E2 .5pt; mso-border-left-alt: solid #8DB3E2 .5pt; mso-border-left-themecolor: text2; mso-border-left-themetint: 102; mso-border-themecolor: text2; mso-border-themecolor: text2; mso-border-themetint: 102; mso-border-themetint: 102; padding: 0in 5.4pt 0in 5.4pt; width: 119.7pt;" valign="top" width="160"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<b><span style="color: white; mso-themecolor: background1;">Compatible with GP 2013 Desktop Version <o:p></o:p></span></b></div>
</td>
<td style="background: #8DB3E2; border-left: none; border: solid #8DB3E2 1.0pt; mso-background-themecolor: text2; mso-background-themetint: 102; mso-border-alt: solid #8DB3E2 .5pt; mso-border-left-alt: solid #8DB3E2 .5pt; mso-border-left-themecolor: text2; mso-border-left-themetint: 102; mso-border-themecolor: text2; mso-border-themecolor: text2; mso-border-themetint: 102; mso-border-themetint: 102; padding: 0in 5.4pt 0in 5.4pt; width: 119.7pt;" valign="top" width="160"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<b><span style="color: white; mso-themecolor: background1;">Compatible with <o:p></o:p></span></b></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<b><span style="color: white; mso-themecolor: background1;">GP 2013 Web Client <o:p></o:p></span></b></div>
</td>
<td style="background: #8DB3E2; border-left: none; border: solid #8DB3E2 1.0pt; mso-background-themecolor: text2; mso-background-themetint: 102; mso-border-alt: solid #8DB3E2 .5pt; mso-border-left-alt: solid #8DB3E2 .5pt; mso-border-left-themecolor: text2; mso-border-left-themetint: 102; mso-border-themecolor: text2; mso-border-themecolor: text2; mso-border-themetint: 102; mso-border-themetint: 102; padding: 0in 5.4pt 0in 5.4pt; width: 119.7pt;" valign="top" width="160"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
<b><span style="color: white; mso-themecolor: background1;">How to tell if you have this customization<o:p></o:p></span></b></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid #8DB3E2 1.0pt; mso-border-alt: solid #8DB3E2 .5pt; mso-border-themecolor: text2; mso-border-themecolor: text2; mso-border-themetint: 102; mso-border-themetint: 102; mso-border-top-alt: solid #8DB3E2 .5pt; mso-border-top-themecolor: text2; mso-border-top-themetint: 102; padding: 0in 5.4pt 0in 5.4pt; width: 119.7pt;" valign="top" width="160"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
Modifier<o:p></o:p></div>
</td>
<td style="border-bottom: solid #8DB3E2 1.0pt; border-left: none; border-right: solid #8DB3E2 1.0pt; border-top: none; mso-border-alt: solid #8DB3E2 .5pt; mso-border-bottom-themecolor: text2; mso-border-bottom-themetint: 102; mso-border-left-alt: solid #8DB3E2 .5pt; mso-border-left-themecolor: text2; mso-border-left-themetint: 102; mso-border-right-themecolor: text2; mso-border-right-themetint: 102; mso-border-themecolor: text2; mso-border-themetint: 102; mso-border-top-alt: solid #8DB3E2 .5pt; mso-border-top-themecolor: text2; mso-border-top-themetint: 102; padding: 0in 5.4pt 0in 5.4pt; width: 119.7pt;" valign="top" width="160"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
Yes<o:p></o:p></div>
</td>
<td style="border-bottom: solid #8DB3E2 1.0pt; border-left: none; border-right: solid #8DB3E2 1.0pt; border-top: none; mso-border-alt: solid #8DB3E2 .5pt; mso-border-bottom-themecolor: text2; mso-border-bottom-themetint: 102; mso-border-left-alt: solid #8DB3E2 .5pt; mso-border-left-themecolor: text2; mso-border-left-themetint: 102; mso-border-right-themecolor: text2; mso-border-right-themetint: 102; mso-border-themecolor: text2; mso-border-themetint: 102; mso-border-top-alt: solid #8DB3E2 .5pt; mso-border-top-themecolor: text2; mso-border-top-themetint: 102; padding: 0in 5.4pt 0in 5.4pt; width: 119.7pt;" valign="top" width="160"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
Yes<o:p></o:p></div>
</td>
<td style="border-bottom: solid #8DB3E2 1.0pt; border-left: none; border-right: solid #8DB3E2 1.0pt; border-top: none; mso-border-alt: solid #8DB3E2 .5pt; mso-border-bottom-themecolor: text2; mso-border-bottom-themetint: 102; mso-border-left-alt: solid #8DB3E2 .5pt; mso-border-left-themecolor: text2; mso-border-left-themetint: 102; mso-border-right-themecolor: text2; mso-border-right-themetint: 102; mso-border-themecolor: text2; mso-border-themetint: 102; mso-border-top-alt: solid #8DB3E2 .5pt; mso-border-top-themecolor: text2; mso-border-top-themetint: 102; padding: 0in 5.4pt 0in 5.4pt; width: 119.7pt;" valign="top" width="160"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
The page title of the window will have a dot in front of it<o:p></o:p></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid #8DB3E2 1.0pt; mso-border-alt: solid #8DB3E2 .5pt; mso-border-themecolor: text2; mso-border-themecolor: text2; mso-border-themetint: 102; mso-border-themetint: 102; mso-border-top-alt: solid #8DB3E2 .5pt; mso-border-top-themecolor: text2; mso-border-top-themetint: 102; padding: 0in 5.4pt 0in 5.4pt; width: 119.7pt;" valign="top" width="160"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
Dexterity<o:p></o:p></div>
</td>
<td style="border-bottom: solid #8DB3E2 1.0pt; border-left: none; border-right: solid #8DB3E2 1.0pt; border-top: none; mso-border-alt: solid #8DB3E2 .5pt; mso-border-bottom-themecolor: text2; mso-border-bottom-themetint: 102; mso-border-left-alt: solid #8DB3E2 .5pt; mso-border-left-themecolor: text2; mso-border-left-themetint: 102; mso-border-right-themecolor: text2; mso-border-right-themetint: 102; mso-border-themecolor: text2; mso-border-themetint: 102; mso-border-top-alt: solid #8DB3E2 .5pt; mso-border-top-themecolor: text2; mso-border-top-themetint: 102; padding: 0in 5.4pt 0in 5.4pt; width: 119.7pt;" valign="top" width="160"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
Yes<o:p></o:p></div>
</td>
<td style="border-bottom: solid #8DB3E2 1.0pt; border-left: none; border-right: solid #8DB3E2 1.0pt; border-top: none; mso-border-alt: solid #8DB3E2 .5pt; mso-border-bottom-themecolor: text2; mso-border-bottom-themetint: 102; mso-border-left-alt: solid #8DB3E2 .5pt; mso-border-left-themecolor: text2; mso-border-left-themetint: 102; mso-border-right-themecolor: text2; mso-border-right-themetint: 102; mso-border-themecolor: text2; mso-border-themetint: 102; mso-border-top-alt: solid #8DB3E2 .5pt; mso-border-top-themecolor: text2; mso-border-top-themetint: 102; padding: 0in 5.4pt 0in 5.4pt; width: 119.7pt;" valign="top" width="160"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
Yes<o:p></o:p></div>
</td>
<td style="border-bottom: solid #8DB3E2 1.0pt; border-left: none; border-right: solid #8DB3E2 1.0pt; border-top: none; mso-border-alt: solid #8DB3E2 .5pt; mso-border-bottom-themecolor: text2; mso-border-bottom-themetint: 102; mso-border-left-alt: solid #8DB3E2 .5pt; mso-border-left-themecolor: text2; mso-border-left-themetint: 102; mso-border-right-themecolor: text2; mso-border-right-themetint: 102; mso-border-themecolor: text2; mso-border-themetint: 102; mso-border-top-alt: solid #8DB3E2 .5pt; mso-border-top-themecolor: text2; mso-border-top-themetint: 102; padding: 0in 5.4pt 0in 5.4pt; width: 119.7pt;" valign="top" width="160"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
The dexterity modification will be listed in the Dynamics.set file: C:\Program
Files\Microsoft Dynamics\GP (or the application directory where you installed
GP)<o:p></o:p></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid #8DB3E2 1.0pt; mso-border-alt: solid #8DB3E2 .5pt; mso-border-themecolor: text2; mso-border-themecolor: text2; mso-border-themetint: 102; mso-border-themetint: 102; mso-border-top-alt: solid #8DB3E2 .5pt; mso-border-top-themecolor: text2; mso-border-top-themetint: 102; padding: 0in 5.4pt 0in 5.4pt; width: 119.7pt;" valign="top" width="160"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
VBA<o:p></o:p></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
(Visual Basic for Applications)<o:p></o:p></div>
</td>
<td style="border-bottom: solid #8DB3E2 1.0pt; border-left: none; border-right: solid #8DB3E2 1.0pt; border-top: none; mso-border-alt: solid #8DB3E2 .5pt; mso-border-bottom-themecolor: text2; mso-border-bottom-themetint: 102; mso-border-left-alt: solid #8DB3E2 .5pt; mso-border-left-themecolor: text2; mso-border-left-themetint: 102; mso-border-right-themecolor: text2; mso-border-right-themetint: 102; mso-border-themecolor: text2; mso-border-themetint: 102; mso-border-top-alt: solid #8DB3E2 .5pt; mso-border-top-themecolor: text2; mso-border-top-themetint: 102; padding: 0in 5.4pt 0in 5.4pt; width: 119.7pt;" valign="top" width="160"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
Yes<o:p></o:p></div>
</td>
<td style="border-bottom: solid #8DB3E2 1.0pt; border-left: none; border-right: solid #8DB3E2 1.0pt; border-top: none; mso-border-alt: solid #8DB3E2 .5pt; mso-border-bottom-themecolor: text2; mso-border-bottom-themetint: 102; mso-border-left-alt: solid #8DB3E2 .5pt; mso-border-left-themecolor: text2; mso-border-left-themetint: 102; mso-border-right-themecolor: text2; mso-border-right-themetint: 102; mso-border-themecolor: text2; mso-border-themetint: 102; mso-border-top-alt: solid #8DB3E2 .5pt; mso-border-top-themecolor: text2; mso-border-top-themetint: 102; padding: 0in 5.4pt 0in 5.4pt; width: 119.7pt;" valign="top" width="160"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
No<o:p></o:p></div>
</td>
<td style="border-bottom: solid #8DB3E2 1.0pt; border-left: none; border-right: solid #8DB3E2 1.0pt; border-top: none; mso-border-alt: solid #8DB3E2 .5pt; mso-border-bottom-themecolor: text2; mso-border-bottom-themetint: 102; mso-border-left-alt: solid #8DB3E2 .5pt; mso-border-left-themecolor: text2; mso-border-left-themetint: 102; mso-border-right-themecolor: text2; mso-border-right-themetint: 102; mso-border-themecolor: text2; mso-border-themetint: 102; mso-border-top-alt: solid #8DB3E2 .5pt; mso-border-top-themecolor: text2; mso-border-top-themetint: 102; padding: 0in 5.4pt 0in 5.4pt; width: 119.7pt;" valign="top" width="160"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
The page title of the window will have a dot at the end of it<o:p></o:p></div>
</td>
</tr>
<tr>
<td style="border-top: none; border: solid #8DB3E2 1.0pt; mso-border-alt: solid #8DB3E2 .5pt; mso-border-themecolor: text2; mso-border-themecolor: text2; mso-border-themetint: 102; mso-border-themetint: 102; mso-border-top-alt: solid #8DB3E2 .5pt; mso-border-top-themecolor: text2; mso-border-top-themetint: 102; padding: 0in 5.4pt 0in 5.4pt; width: 119.7pt;" valign="top" width="160"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
VST<o:p></o:p></div>
<div class="MsoNormal" style="margin-bottom: 0.0001pt;">
(Visual Studios Tools)<o:p></o:p></div>
</td>
<td style="border-bottom: solid #8DB3E2 1.0pt; border-left: none; border-right: solid #8DB3E2 1.0pt; border-top: none; mso-border-alt: solid #8DB3E2 .5pt; mso-border-bottom-themecolor: text2; mso-border-bottom-themetint: 102; mso-border-left-alt: solid #8DB3E2 .5pt; mso-border-left-themecolor: text2; mso-border-left-themetint: 102; mso-border-right-themecolor: text2; mso-border-right-themetint: 102; mso-border-themecolor: text2; mso-border-themetint: 102; mso-border-top-alt: solid #8DB3E2 .5pt; mso-border-top-themecolor: text2; mso-border-top-themetint: 102; padding: 0in 5.4pt 0in 5.4pt; width: 119.7pt;" valign="top" width="160"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
Yes<o:p></o:p></div>
</td>
<td style="border-bottom: solid #8DB3E2 1.0pt; border-left: none; border-right: solid #8DB3E2 1.0pt; border-top: none; mso-border-alt: solid #8DB3E2 .5pt; mso-border-bottom-themecolor: text2; mso-border-bottom-themetint: 102; mso-border-left-alt: solid #8DB3E2 .5pt; mso-border-left-themecolor: text2; mso-border-left-themetint: 102; mso-border-right-themecolor: text2; mso-border-right-themetint: 102; mso-border-themecolor: text2; mso-border-themetint: 102; mso-border-top-alt: solid #8DB3E2 .5pt; mso-border-top-themecolor: text2; mso-border-top-themetint: 102; padding: 0in 5.4pt 0in 5.4pt; width: 119.7pt;" valign="top" width="160"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
No<o:p></o:p></div>
</td>
<td style="border-bottom: solid #8DB3E2 1.0pt; border-left: none; border-right: solid #8DB3E2 1.0pt; border-top: none; mso-border-alt: solid #8DB3E2 .5pt; mso-border-bottom-themecolor: text2; mso-border-bottom-themetint: 102; mso-border-left-alt: solid #8DB3E2 .5pt; mso-border-left-themecolor: text2; mso-border-left-themetint: 102; mso-border-right-themecolor: text2; mso-border-right-themetint: 102; mso-border-themecolor: text2; mso-border-themetint: 102; mso-border-top-alt: solid #8DB3E2 .5pt; mso-border-top-themecolor: text2; mso-border-top-themetint: 102; padding: 0in 5.4pt 0in 5.4pt; width: 119.7pt;" valign="top" width="160"><div class="MsoNormal" style="margin-bottom: 0.0001pt;">
All customizations are stored in the AddIn subfolder of the Microsoft
Dynamics\GP folder.<o:p></o:p></div>
</td>
</tr>
</tbody></table>
<br />
<br />
<br />
<h3>
How to Tell What Kind of Customizations You Have</h3>
There are a few simple ways to tell what type of
customizations you have in Dynamics GP.
<br />
<br />
1.
<b>Modifier -</b> The Customization Maintenance window will list modified forms, modified
reports, and custom VBA code and references that are active on the workstation.
<br />
Tools -> Customize -> Customization Maintenance<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgf6rl4FJ9YyeUANUOHGOm5Qxj6UidE_G9Nyg3XOBqVj2dhnhzV_rxvgL84OPE4wrDs6G-UiDt9nkaT8HiITO46A427zPV9lP2wKeop8c5OcULE3GpodARbaq3Cc5MjBlZXlqXXBQ/s1600/image001.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgf6rl4FJ9YyeUANUOHGOm5Qxj6UidE_G9Nyg3XOBqVj2dhnhzV_rxvgL84OPE4wrDs6G-UiDt9nkaT8HiITO46A427zPV9lP2wKeop8c5OcULE3GpodARbaq3Cc5MjBlZXlqXXBQ/s1600/image001.png" /></a></div>
<br />
If you have made customizations to GP using Modifier, there will be a dot in front of the window’s page title.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBGo-iAXOukNX08l3hITkq2vY3nIKlkiQbBKaLNWYioBpiVgIRu2PdZR14TA1YNQKwL9y2GkMpJ1VWfEWqe8BXeVsJpnQiDVYYp3TICIy0Eldvks1boYsBQrLL-vQjgymxAzUllw/s1600/image002.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="77" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBGo-iAXOukNX08l3hITkq2vY3nIKlkiQbBKaLNWYioBpiVgIRu2PdZR14TA1YNQKwL9y2GkMpJ1VWfEWqe8BXeVsJpnQiDVYYp3TICIy0Eldvks1boYsBQrLL-vQjgymxAzUllw/s320/image002.jpg" width="320" /></a></div>
<br />
<br />
<br />
<br />
2.
<b>Dexterity -</b> The Customization Status window will list Dexterity customizations, as well as
the Dynamics GP modules and Dexterity-based ISV solutions that are installed
and active. <br />
Tools -> Customize -> Customization Status<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjueDL_Yp2gP-lylMo64vHJvIN0j8nb945blBwQtMRNfqq1ZtzQI-h7Qvn7ORjPUv5PMMoDtEJf7ZNTLqGXhcCq-mP2NEzGop5zqy3OvfdeyzpBpKDyXYDlBq7vmq90Bf7sdEMFQA/s1600/image003.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjueDL_Yp2gP-lylMo64vHJvIN0j8nb945blBwQtMRNfqq1ZtzQI-h7Qvn7ORjPUv5PMMoDtEJf7ZNTLqGXhcCq-mP2NEzGop5zqy3OvfdeyzpBpKDyXYDlBq7vmq90Bf7sdEMFQA/s1600/image003.jpg" /></a></div>
<br />
<br />
3.
<b>VBA - </b>The
Customization Maintenance window will list modified forms, modified reports,
and custom VBA code and references that are active on the workstation. <br />
Tools -> Customize -> Customization Maintenance<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgf6rl4FJ9YyeUANUOHGOm5Qxj6UidE_G9Nyg3XOBqVj2dhnhzV_rxvgL84OPE4wrDs6G-UiDt9nkaT8HiITO46A427zPV9lP2wKeop8c5OcULE3GpodARbaq3Cc5MjBlZXlqXXBQ/s1600/image001.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgf6rl4FJ9YyeUANUOHGOm5Qxj6UidE_G9Nyg3XOBqVj2dhnhzV_rxvgL84OPE4wrDs6G-UiDt9nkaT8HiITO46A427zPV9lP2wKeop8c5OcULE3GpodARbaq3Cc5MjBlZXlqXXBQ/s1600/image001.png" /></a></div>
If you have made customizations to GP using VBA, there will be a dot at the end of the window’s page title.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2KFNE20MDf-mEk9H5JL1eF1426jerLal7QrQN_YiyddLhF7Yyw0w1vmrI7UQ8G-_cMMI4nqGGW9FvbTpwzsb870oSvoayzDU83UHL5ukCzBPt3UUV32PPGkb_6iOwCCFQipgUSA/s1600/ContractMaintenanceLines2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="77" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2KFNE20MDf-mEk9H5JL1eF1426jerLal7QrQN_YiyddLhF7Yyw0w1vmrI7UQ8G-_cMMI4nqGGW9FvbTpwzsb870oSvoayzDU83UHL5ukCzBPt3UUV32PPGkb_6iOwCCFQipgUSA/s320/ContractMaintenanceLines2.jpg" width="320" /></a></div>
<br />
<br />
4.
<b>VST - </b>All customizations made to GP using VST are stored in a folder
called AddIns. If you have VST customizations, you
will find them inside this folder located AddIn
subfolder of the Dynamics GP client installation. This is typically
C:\Program Files (x86)\Microsoft
Dynamics\GP\AddIns.<br />
<br />
<h3>
Next Steps</h3>
<div>
<br /></div>
If GP customizations exist that may not be compatible with
the new GP 2013 Web Client here are a few suggestions to preserve your
customization’s functionality.<br />
<br />
<h4>
Business Process Analysis<br /><i style="font-weight: normal;">Is
this functionality still needed? Can it be improved?</i></h4>
<div>
<i style="font-weight: normal;"><br /></i></div>
Determine if the customization is still
needed. New releases are packed with new functionality and the task that the
old customization helped accomplish may now be handled out-of-the-box in the
new version. Or, your business may have
changed and it is simply not needed any longer! A business process analysis
against the new version will help identify which customizations are no longer
needed. After reviewing the new release’s capabilities, you may find that there
are many other new features offered that you hadn’t even thought of before.
<br />
<br />
It’s like trading in your old 1994
Honda Accord for the 2013 model—you were excited about the built in navigation
system (no more Garmin attached to your windshield) and heated seats but you
had no idea that it had blind spot detectors and could park itself! So when
you’re ready to make the switch, make a point to learn about all the new
features of the software, not just the ones you already know about and you may
be pleasantly surprised. Sometimes you don’t know what you don’t know!<br />
<br />
<h4>
Spend Time on Design</h4>
If a customization is going to be re-implemented
it makes sense to spend a little extra time on the design of the customization.
Ask yourself if there are any features that have been lacking that need to be
added or can the functionality be changed to make it more user friendly. By
making sure you have got the most value out of your customization it will pay off
in the long run when you don’t have to continuously make changes to it again
and again in the future.<br />
<br />
<h4>
Use Case Documentation</h4>
As with all customizations, it is a
best practice to document, document, and document. Before sitting down with a
developer take screen shots of the areas you want to change and document the
business process flow. This will provide clear communication between you and
your developer and help to ensure there aren’t any discrepancies between what
you are trying to achieve and what the system ends up doing. It’s great to keep
them on record as well!<br />
<br />
<h4>
Hire a Professional Dexterity Developer</h4>
Now that you are ready to move
forward with your customizations into GP 2013’s Web Client, you’ll need to hire
a Dexterity developer. Dexterity developers aren’t as easy to come by as other
programming languages, but the good news is that if you've found one, they
probably know their stuff (this isn't something your neighbor’s nephew in high
school can do for you on the weekends). It’s a sophisticated programming language that takes years of experience to learn.<br />
<br />
After having completed all of the
leg work; conducting your business process analysis and providing your
developer with use case documentation, the dexterity changes should be a
breeze!
<br />
<br />
Here are a few things to look for
in a Dexterity developer:
<br />
·
Is the programmer certified in Dexterity or
Microsoft Dynamics GP?<br />
·
How many or how long has the programmer been
working with Dexterity?<br />
·
Will the programmer provide documentation of
their changes?<br />
·
Will the programmer, or company they work for be
able to support you in the years to come?<br />
<br />
<h2>
</h2>
<div class="blogger-post-footer">http://mbsguru.blogspot.com/atom.xml</div>Bryan Princehttp://www.blogger.com/profile/01546244332553420397noreply@blogger.com4tag:blogger.com,1999:blog-14548861.post-21954649535397522342012-11-02T21:21:00.000-05:002012-11-03T21:00:11.421-05:00CSS Consolidator jiu-jitsu<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js" type="text/javascript"></script>
<script src="http://lexrc.com/scripts/cleanCSS.js" type="text/javascript"></script>
<br />
<h2>
CSS Consolidator
</h2>
Sometimes you inherit a huge pile of CSS and want to make a few changes. Sometimes there are huge groups of duplicated rules. Sometimes, you just want to see everywhere Comic Sans is used in your stylesheets. (Hopefully, nowhere.)
<br />
<br />
Paste in your Source CSS below and click Consolidate CSS. Rules and selectors will be consolidated in the next textbox. All processing is done client-side in JavaScript.<br />
<br />
Below that, you will see a breakdown of your styles, arranged by Selector, Attribute and Values.<br />
<br />
Why did I do this? Why not?<br />
<h3>
Source CSS (No @media tags please)</h3>
<textarea cols="80" id="cssSource" rows="5"></textarea>
<br />
<input id="cssClean" type="button" value="Consolidate CSS" />
<br />
<br />
<h3>
Consolidated CSS</h3>
<br />
<textarea cols="80" id="cssOutput" rows="20"></textarea>
<br />
<table>
<thead>
<tr><th style="border: 1px solid black;">Selectors
</th>
<th style="border: 1px solid black;">Attributes
</th>
<th style="border: 1px solid black;">Values
</th>
</tr>
</thead>
<tbody>
<tr>
<td style="border: 1px solid black; vertical-align: text-top;"><div id="selectors">
</div>
</td>
<td style="border: 1px solid black; vertical-align: text-top;"><div id="attributes">
</div>
</td>
<td style="border: 1px solid black; vertical-align: text-top;"><div id="values">
</div>
</td>
</tr>
</tbody>
</table>
<div class="blogger-post-footer">http://mbsguru.blogspot.com/atom.xml</div>Lance Russellhttp://www.blogger.com/profile/11780142384048582104noreply@blogger.com0tag:blogger.com,1999:blog-14548861.post-21592736740368223672012-11-02T21:08:00.000-05:002012-11-05T12:16:55.646-06:00Capturing (and using) raw SOAP messages in WCFWCF is great for building web services. It's also great for interacting with existing web services. Visual Studio makes it so easy . . . add a service reference, point to the WSDL of the service and just like that, you have a set of classes to handle the service and data contracts.<br />
<br />
Unfortunately, sometimes web services don't live up to their contracts. Recently, I was interacting with a web service and found that sometimes the response would be null. I fired up Fiddler and looked at the SOAP messages. Sure enough, an error had occurred on the remote server and the response, while valid XML, looked nothing like the promised Data Contract. It did however provide a useful description of the error.<br />
<br />
There was no SOAP fault . . . no exception thrown (unless I tried to use the null response without checking), just a null response object by the time WCF handed it to me.<br />
<br />
I searched the web and found several suggestions. <br />
<br />
<ul>
<li>Use Fiddler . . . tried that but it doesn't help when you are trying to get your service into production.</li>
<li>Build a SOAP Extension . . . that's great if you are building a legacy asp.net XML Web Service and just want to log or tweak the messages. I'm doing WCF and needed to make the messages available to my service in real time.</li>
<li>Edit the Visual Studio Generated classes to wrap the response in XML and deserialize it yourself . . . that might work but you throw away so much niceness that's built for you already.</li>
</ul>
<div>
I ended up building a custom Endpoint behavior and applying it to the generated SOAP Client object.
</div>
<div>
<br /></div>
<div>
First, you need a class to hold the raw Request and Response:
</div>
<div>
<pre style="background-color: #eeeeee; background-position: initial initial; background-repeat: initial initial; border: 1px solid black; font-family: Consolas, Courier, monospace; font-size: 13px;"> <span style="color: blue;">public</span> <span style="color: blue;">class</span> <span style="color: #2b91af;">InspectedSOAPMessages</span>
{
<span style="color: blue;">public</span> <span style="color: blue;">string</span> Request { <span style="color: blue;">get</span>; <span style="color: blue;">set</span>; }
<span style="color: blue;">public</span> <span style="color: blue;">string</span> Response { <span style="color: blue;">get</span>; <span style="color: blue;">set</span>; }
}
</pre>
</div>
<div>
<br /></div>
<div>
Create an instance of the class and pass it into the new Endpoint Behavior:
</div>
<div>
<br /></div>
<div>
<pre style="background-color: #eeeeee; background-position: initial initial; background-repeat: initial initial; border: 1px solid black; font-family: Consolas, Courier, monospace; font-size: 13px;"> <span style="color: #2b91af;">InspectedSOAPMessages</span> soapMessages = <span style="color: blue;">new</span> <span style="color: #2b91af;">InspectedSOAPMessages</span>();
batchClient.Endpoint.Behaviors.Add(<span style="color: blue;">new</span> <span style="color: #2b91af;">CapturingEndpointBehavior</span><span style="font-family: Consolas, Courier, monospace;">(soapMessages));</span>
BatchService.<span style="color: #2b91af;">batchResponseType</span> response = batchClient.BatchOperation(batchRequest);
batchClient.Close();
<span style="font-family: Consolas;"></span><span style="color: green;"> //response will be null if the contract was violated . . . </span>
<span style="color: blue;">if</span> (response == <span style="color: blue;">null</span>)
{
results.Message = soapMessages.Response; } else { <span style="color: green;">//process normal response</span>
</pre>
<br />
Now, all we need is the set of classes to handle the Endpoint Behavior:<br />
<br />
<pre style="background-color: #eeeeee; background-position: initial initial; background-repeat: initial initial; border: 1px solid black; font-family: Consolas, Courier, monospace; font-size: 13px;"> <span style="color: blue;">using</span> System.ServiceModel;
<span style="color: blue;">using</span> System.ServiceModel.Channels;
<span style="color: blue;">using</span> System.ServiceModel.Description;
<span style="color: blue;">using</span> System.ServiceModel.Dispatcher;
<span style="color: blue;">namespace</span> MBSGuru
{
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"><summary></span>
<span style="color: grey;">///</span><span style="color: green;"> Allows capturing of raw SOAP Messages</span>
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"></summary></span>
<span style="color: blue;">public</span> <span style="color: blue;">class</span> <span style="color: #2b91af;">CapturingEndpointBehavior</span> : <span style="color: #2b91af;">IEndpointBehavior</span>
{
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"><summary></span>
<span style="color: grey;">///</span><span style="color: green;"> Holds the messages</span>
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"></summary></span>
<span style="color: blue;">public</span> <span style="color: #2b91af;">InspectedSOAPMessages</span> SoapMessages { <span style="color: blue;">get</span>; <span style="color: blue;">set</span>; }
<span style="color: blue;">public</span> CapturingEndpointBehavior(<span style="color: #2b91af;">InspectedSOAPMessages</span> soapMessages)
{
<span style="color: blue;">this</span>.SoapMessages = soapMessages;
}
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"><summary></span>
<span style="color: grey;">///</span><span style="color: green;"> Required by IEndpointBehavior</span>
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"></summary></span>
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"><param name=</span><span style="color: grey;">"endpoint"</span><span style="color: grey;">></param></span>
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"><param name=</span><span style="color: grey;">"bindingParameters"</span><span style="color: grey;">></param></span>
<span style="color: blue;">public</span> <span style="color: blue;">void</span> AddBindingParameters(<span style="color: #2b91af;">ServiceEndpoint</span> endpoint, <span style="color: #2b91af;">BindingParameterCollection</span> bindingParameters) { <span style="color: blue;">return</span>; }
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"><summary></span>
<span style="color: grey;">///</span><span style="color: green;"> Required by IEndpointBehavior</span>
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"></summary></span>
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"><param name=</span><span style="color: grey;">"endpoint"</span><span style="color: grey;">></param></span>
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"><param name=</span><span style="color: grey;">"clientRuntime"</span><span style="color: grey;">></param></span>
<span style="color: blue;">public</span> <span style="color: blue;">void</span> ApplyClientBehavior(<span style="color: #2b91af;">ServiceEndpoint</span> endpoint, <span style="color: #2b91af;">ClientRuntime</span> clientRuntime)
{
clientRuntime.MessageInspectors.Add(<span style="color: blue;">new</span> <span style="color: #2b91af;">CapturingMessageInspector</span>(<span style="color: blue;">this</span>.SoapMessages));
}
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"><summary></span>
<span style="color: grey;">///</span><span style="color: green;"> Required by IEndpointBehavior</span>
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"></summary></span>
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"><param name=</span><span style="color: grey;">"endpoint"</span><span style="color: grey;">></param></span>
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"><param name=</span><span style="color: grey;">"endpointDispatcher"</span><span style="color: grey;">></param></span>
<span style="color: blue;">public</span> <span style="color: blue;">void</span> ApplyDispatchBehavior(<span style="color: #2b91af;">ServiceEndpoint</span> endpoint, <span style="color: #2b91af;">EndpointDispatcher</span> endpointDispatcher) { <span style="color: blue;">return</span>; }
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"><summary></span>
<span style="color: grey;">///</span><span style="color: green;"> Required by IEndpointBehavior</span>
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"></summary></span>
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"><param name=</span><span style="color: grey;">"endpoint"</span><span style="color: grey;">></param></span>
<span style="color: blue;">public</span> <span style="color: blue;">void</span> Validate(<span style="color: #2b91af;">ServiceEndpoint</span> endpoint) { <span style="color: blue;">return</span>; }
}
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"><summary></span>
<span style="color: grey;">///</span><span style="color: green;"> Actual inspector that captures the messages</span>
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"></summary></span>
<span style="color: blue;">public</span> <span style="color: blue;">class</span> <span style="color: #2b91af;">CapturingMessageInspector</span> : <span style="color: #2b91af;">IClientMessageInspector</span>
{
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"><summary></span>
<span style="color: grey;">///</span><span style="color: green;"> Holds the messages</span>
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"></summary></span>
<span style="color: blue;">public</span> <span style="color: #2b91af;">InspectedSOAPMessages</span> SoapMessages { <span style="color: blue;">get</span>; <span style="color: blue;">set</span>; }
<span style="color: blue;">public</span> CapturingMessageInspector(<span style="color: #2b91af;">InspectedSOAPMessages</span> soapMessages)
{
<span style="color: blue;">this</span>.SoapMessages = soapMessages;
}
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"><summary></span>
<span style="color: grey;">///</span><span style="color: green;"> Called after the web service call completes. Allows capturing of raw response.</span>
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"></summary></span>
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"><param name=</span><span style="color: grey;">"reply"</span><span style="color: grey;">></param></span>
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"><param name=</span><span style="color: grey;">"correlationState"</span><span style="color: grey;">></param></span>
<span style="color: blue;">public</span> <span style="color: blue;">void</span> AfterReceiveReply(<span style="color: blue;">ref</span> System.ServiceModel.Channels.<span style="color: #2b91af;">Message</span> reply, <span style="color: blue;">object</span> correlationState)
{
<span style="color: blue;">this</span>.SoapMessages.Response = reply.ToString();
}
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"><summary></span>
<span style="color: grey;">///</span><span style="color: green;"> Called before the web service is invoked. Allows capturing of raw request.</span>
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"></summary></span>
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"><param name=</span><span style="color: grey;">"request"</span><span style="color: grey;">></param></span>
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"><param name=</span><span style="color: grey;">"channel"</span><span style="color: grey;">></param></span>
<span style="color: grey;">///</span><span style="color: green;"> </span><span style="color: grey;"><returns></returns></span>
<span style="color: blue;">public</span> <span style="color: blue;">object</span> BeforeSendRequest(<span style="color: blue;">ref</span> System.ServiceModel.Channels.<span style="color: #2b91af;">Message</span> request, <span style="color: #2b91af;">IClientChannel</span> channel)
{
<span style="color: blue;">this</span>.SoapMessages.Request = request.ToString();
<span style="color: blue;">return</span> <span style="color: blue;">null</span>;
}
}
}
</pre>
<br />
And just like that, you have a copy of the request and response. How you handle the violation of the contract is up to you. At least now you can report something more informative than "Error Occurred"
</div>
<div class="blogger-post-footer">http://mbsguru.blogspot.com/atom.xml</div>Lance Russellhttp://www.blogger.com/profile/11780142384048582104noreply@blogger.com0tag:blogger.com,1999:blog-14548861.post-17180856095282905762012-10-10T11:25:00.001-05:002012-10-10T11:25:06.009-05:00Create a Customer in Dynamics GP 2010 using eConnectA few days ago I created a simple example to <a href="http://mbsguru.blogspot.com/2012/10/create-vendor-with-econnect-using-in.html" target="_blank">create a vendor in Dynamics GP</a> using eConnect. I received a few requests to show a sample integration to create new customers. Creating new customers in Dynamics GP via eConnect is a common request and usually proceeds the creation of other receivables documents.<br />
<br />
The sample below creates a new customer using the eConnect .NET assembly and in-memory serialization.<br />
<br />
To run the following code on your machine:<br />
<ol>
<li>Install the latest version of the eConnect 11 SDK.</li>
<li>Create a new Console Application in Microsoft Visual Studio.</li>
</ol>
<div>
Add references to these dynamic link libraries which are located by default in C:\Program Files (x86)\Microsoft Dynamics\eConnect 11.0\API\. (Ignore the x86 if you are using a 32-bit system.)</div>
<div>
<ol>
<li>Microsoft.Dynamics.GP.eConnect.dll</li>
<li>Microsoft.Dynamics.GP.eConnect.Serialization.dll</li>
</ol>
<div>
Replace the Program.cs class in the project for the new class below.<br />
<br /></div>
</div>
<!-- code formatted by http://manoli.net/csharpformat/ -->
<style type="text/css">
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: Consolas, "Courier New", Courier, Monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #a31515; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
<br />
<div class="csharpcode">
<pre class="alt"><span class="kwrd">using</span> System;</pre>
<pre><span class="kwrd">using</span> System.IO;</pre>
<pre class="alt"><span class="kwrd">using</span> System.Xml;</pre>
<pre><span class="kwrd">using</span> System.Xml.Serialization;</pre>
<pre class="alt"><span class="kwrd">using</span> Microsoft.Dynamics.GP.eConnect;</pre>
<pre><span class="kwrd">using</span> Microsoft.Dynamics.GP.eConnect.Serialization;</pre>
<pre class="alt"> </pre>
<pre><span class="kwrd">class</span> Program</pre>
<pre class="alt">{</pre>
<pre> <span class="kwrd">static</span> <span class="kwrd">void</span> Main(<span class="kwrd">string</span>[] args)</pre>
<pre class="alt"> {</pre>
<pre> Console.WriteLine(<span class="str">"Beginning integration test."</span>);</pre>
<pre class="alt"> </pre>
<pre> <span class="kwrd">using</span> (eConnectMethods eConnectMethods = <span class="kwrd">new</span> eConnectMethods())</pre>
<pre class="alt"> {</pre>
<pre> <span class="kwrd">try</span></pre>
<pre class="alt"> {</pre>
<pre> Console.WriteLine(<span class="str">"Creating a new customer."</span>);</pre>
<pre class="alt"> </pre>
<pre> <span class="rem">// Modify the connection string for your environment.</span></pre>
<pre class="alt"> <span class="kwrd">string</span> connectionString = <span class="str">@"data source=localhost; initial catalog=TWO; integrated security=SSPI"</span>;</pre>
<pre> </pre>
<pre class="alt"> <span class="rem">// Create the customer.</span></pre>
<pre> taUpdateCreateCustomerRcd customer = <span class="kwrd">new</span> taUpdateCreateCustomerRcd();</pre>
<pre class="alt"> customer.CUSTNMBR = <span class="str">"TEST001"</span>;</pre>
<pre> customer.CUSTNAME = <span class="str">"Test Customer"</span>;</pre>
<pre class="alt"> </pre>
<pre> <span class="rem">// Assign the customer to a new master customer type.</span></pre>
<pre class="alt"> RMCustomerMasterType customerMasterType = <span class="kwrd">new</span> RMCustomerMasterType();</pre>
<pre> customerMasterType.taUpdateCreateCustomerRcd = customer;</pre>
<pre class="alt"> </pre>
<pre> <span class="rem">// Assign the master customer type to a new collection of master customer types.</span></pre>
<pre class="alt"> RMCustomerMasterType[] customerMasterTypes = { customerMasterType };</pre>
<pre> </pre>
<pre class="alt"> <span class="rem">// Serialize the master vendor type in memory.</span></pre>
<pre> eConnectType eConnectType = <span class="kwrd">new</span> eConnectType();</pre>
<pre class="alt"> MemoryStream memoryStream = <span class="kwrd">new</span> MemoryStream();</pre>
<pre> XmlSerializer xmlSerializer = <span class="kwrd">new</span> XmlSerializer(eConnectType.GetType());</pre>
<pre class="alt"> </pre>
<pre> <span class="rem">// Assign the master customer types to the eConnectType.</span></pre>
<pre class="alt"> eConnectType.RMCustomerMasterType = customerMasterTypes;</pre>
<pre> </pre>
<pre class="alt"> <span class="rem">// Serialize the eConnectType.</span></pre>
<pre> xmlSerializer.Serialize(memoryStream, eConnectType);</pre>
<pre class="alt"> </pre>
<pre> <span class="rem">// Reset the position of the memory stream to the start. </span></pre>
<pre class="alt"> memoryStream.Position = 0;</pre>
<pre> </pre>
<pre class="alt"> <span class="rem">// Create an XmlDocument from the serialized eConnectType in memory.</span></pre>
<pre> XmlDocument xmlDocument = <span class="kwrd">new</span> XmlDocument();</pre>
<pre class="alt"> xmlDocument.Load(memoryStream);</pre>
<pre> memoryStream.Close();</pre>
<pre class="alt"> </pre>
<pre> <span class="rem">// Call eConnect to process the XmlDocument.</span></pre>
<pre class="alt"> eConnectMethods.CreateEntity(connectionString, xmlDocument.OuterXml);</pre>
<pre> </pre>
<pre class="alt"> Console.WriteLine(<span class="str">"Successfully created customer {0}."</span>, customer.CUSTNMBR);</pre>
<pre> }</pre>
<pre class="alt"> <span class="kwrd">catch</span> (Exception ex)</pre>
<pre> {</pre>
<pre class="alt"> Console.WriteLine(<span class="str">"Exception occured: "</span> + ex.Message);</pre>
<pre> }</pre>
<pre class="alt"> <span class="kwrd">finally</span></pre>
<pre> {</pre>
<pre class="alt"> eConnectMethods.Dispose();</pre>
<pre> }</pre>
<pre class="alt"> }</pre>
<pre> </pre>
<pre class="alt"> Console.WriteLine(<span class="str">"Integration test complete."</span> +</pre>
<pre> Environment.NewLine +</pre>
<pre class="alt"> Environment.NewLine);</pre>
<pre> Console.WriteLine(<span class="str">"Press <Enter> to continue..."</span>);</pre>
<pre class="alt"> Console.ReadLine();</pre>
<pre> }</pre>
<pre class="alt">}</pre>
</div>
<div>
<br />
Execute the project and you should see the following output:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgROq4N-72kxkqT6J8Bh29aNndYtSZgC08EsjFt9yL2RltpMOH3Ud1dyiVTi0NPYzMaZOjbBgog7ixmWzRXir5_t-0_jcnYYy-lP3UV30bEHVeC8qggnWJySm-hXJ5IjyTBpJ_e4Q/s1600/output.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="161" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgROq4N-72kxkqT6J8Bh29aNndYtSZgC08EsjFt9yL2RltpMOH3Ud1dyiVTi0NPYzMaZOjbBgog7ixmWzRXir5_t-0_jcnYYy-lP3UV30bEHVeC8qggnWJySm-hXJ5IjyTBpJ_e4Q/s320/output.png" width="320" /></a></div>
<br />
And you should see the vendor created in Dynamics GP:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlb799YP6ZhKFkDJubzlFzIwDUZdm_w3nQrKUpqQl58b1se-PDrzAUKlo9ggFuTZca4LgGrX3ESwg3I0w-VXcsb9UAcED9xkej5oQtY1fe2XELeYoMk7joNOFkv-wHK6o0Zl-LRQ/s1600/customer.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="275" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlb799YP6ZhKFkDJubzlFzIwDUZdm_w3nQrKUpqQl58b1se-PDrzAUKlo9ggFuTZca4LgGrX3ESwg3I0w-VXcsb9UAcED9xkej5oQtY1fe2XELeYoMk7joNOFkv-wHK6o0Zl-LRQ/s320/customer.png" width="320" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<br /></div>
<div class="blogger-post-footer">http://mbsguru.blogspot.com/atom.xml</div>Bryan Princehttp://www.blogger.com/profile/01546244332553420397noreply@blogger.com1tag:blogger.com,1999:blog-14548861.post-30516631911932040572012-10-05T12:49:00.001-05:002013-10-23T17:00:55.229-05:00Create a Vendor in Dynamics GP 2010 with eConnect using In Memory SerializationDeveloping several integrations between Microsoft Dynamics GP 2010 and various third-party systems the last few weeks reminded me to update my previous article on <a href="http://mbsguru.blogspot.com/2010/12/microsoft-dynamics-10-econnect-c-40-net.html" target="_blank">In Memory Serialization for eConnect 10</a>.<br />
<br />
Microsoft Dynamics GP 2010 uses eConnect version 11 which includes significant updates. Notably, the COM+ component has been changed to a WCF service.<br />
<br />
In this example, I am creating a new vendor record in Dynamics GP using the same in memory serialization technique. Why write a file to disk unnecessarily?<br />
<br />
To run the following code on your machine:<br />
<ol>
<li>Install the latest version of the eConnect 11 SDK.</li>
<li>Create a new Console Application in Microsoft Visual Studio.</li>
</ol>
<div>
Add references to these dynamic link libraries which are located by default in C:\Program Files (x86)\Microsoft Dynamics\eConnect 11.0\API\. (Ignore the x86 if you are using a 32-bit system.)</div>
<div>
<ol>
<li>Microsoft.Dynamics.GP.eConnect.dll</li>
<li>Microsoft.Dynamics.GP.eConnect.Serialization.dll</li>
</ol>
<div>
Replace the Program.cs class in the project for the new class below.<br />
<br /></div>
</div><!-- code formatted by http://manoli.net/csharpformat/ -->
<style type="text/css">
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: Consolas, "Courier New", Courier, Monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #a31515; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
<div class="csharpcode">
<pre class="alt"><span class="kwrd">using</span> System;</pre>
<pre><span class="kwrd">using</span> System.IO;</pre>
<pre class="alt"><span class="kwrd">using</span> System.Xml;</pre>
<pre><span class="kwrd">using</span> System.Xml.Serialization;</pre>
<pre class="alt"><span class="kwrd">using</span> Microsoft.Dynamics.GP.eConnect;</pre>
<pre><span class="kwrd">using</span> Microsoft.Dynamics.GP.eConnect.Serialization;</pre>
<pre class="alt"> </pre>
<pre><span class="kwrd">class</span> Program</pre>
<pre class="alt">{</pre>
<pre> <span class="kwrd">static</span> <span class="kwrd">void</span> Main(<span class="kwrd">string</span>[] args)</pre>
<pre class="alt"> {</pre>
<pre> Console.WriteLine(<span class="str">"Beginning integration test."</span>);</pre>
<pre class="alt"> </pre>
<pre> <span class="kwrd">using</span> (eConnectMethods eConnectMethods = <span class="kwrd">new</span> eConnectMethods())</pre>
<pre class="alt"> {</pre>
<pre> <span class="kwrd">try</span></pre>
<pre class="alt"> {</pre>
<pre> Console.WriteLine(<span class="str">"Creating a new customer."</span>);</pre>
<pre class="alt"> </pre>
<pre> <span class="rem">// Modify the connection string for your environment.</span></pre>
<pre class="alt"> <span class="kwrd">string</span> connectionString = <span class="str">@"data source=localhost; initial catalog=TWO; integrated security=SSPI"</span>;</pre>
<pre> </pre>
<pre class="alt"> <span class="rem">// Create the vendor.</span></pre>
<pre> taUpdateCreateVendorRcd vendor = <span class="kwrd">new</span> taUpdateCreateVendorRcd();</pre>
<pre class="alt"> </pre>
<pre> <span class="rem">// Assign the vendor to a new master vendor type.</span></pre>
<pre class="alt"> PMVendorMasterType vendorType = <span class="kwrd">new</span> PMVendorMasterType();</pre>
<pre> vendorType.taUpdateCreateVendorRcd = vendor;</pre>
<pre class="alt"> </pre>
<pre> <span class="rem">// Assign the master vendor type to a new </span></pre>
<pre class="alt"> <span class="rem">// collection of master vendor types.</span></pre>
<pre> PMVendorMasterType[] masterVendorTypes = { vendorType };</pre>
<pre class="alt"> </pre>
<pre> <span class="rem">// Serialize the master vendor type in memory.</span></pre>
<pre class="alt"> eConnectType eConnectType = <span class="kwrd">new</span> eConnectType();</pre>
<pre> MemoryStream memoryStream = <span class="kwrd">new</span> MemoryStream();</pre>
<pre class="alt"> XmlSerializer xmlSerializer = <span class="kwrd">new</span> XmlSerializer(eConnectType.GetType());</pre>
<pre> </pre>
<pre class="alt"> <span class="rem">// Assign the master vendor types to the eConnectType.</span></pre>
<pre> eConnectType.PMVendorMasterType = masterVendorTypes;</pre>
<pre class="alt"> </pre>
<pre> <span class="rem">// Serialize the eConnectType.</span></pre>
<pre class="alt"> xmlSerializer.Serialize(memoryStream, eConnectType);</pre>
<pre> </pre>
<pre class="alt"> <span class="rem">// Reset the position of the memory stream to the start. </span></pre>
<pre> memoryStream.Position = 0;</pre>
<pre class="alt"> </pre>
<pre> <span class="rem">// Create an XmlDocument from the serialized eConnectType in memory.</span></pre>
<pre class="alt"> XmlDocument xmlDocument = <span class="kwrd">new</span> XmlDocument();</pre>
<pre> xmlDocument.Load(memoryStream);</pre>
<pre class="alt"> memoryStream.Close();</pre>
<pre> </pre>
<pre class="alt"> <span class="rem">// Call eConnect to process the XmlDocument.</span></pre>
<pre> eConnectMethods.CreateEntity(connectionString, xmlDocument.OuterXml);</pre>
<pre class="alt"> </pre>
<pre> Console.WriteLine(<span class="str">"Successfully created vendor {0}."</span>, vendor.VENDORID);</pre>
<pre class="alt"> }</pre>
<pre> <span class="kwrd">catch</span> (Exception ex)</pre>
<pre class="alt"> {</pre>
<pre> Console.WriteLine(<span class="str">"Exception occured: "</span> + ex.Message);</pre>
<pre class="alt"> }</pre>
<pre> <span class="kwrd">finally</span></pre>
<pre class="alt"> {</pre>
<pre> eConnectMethods.Dispose();</pre>
<pre class="alt"> }</pre>
<pre> }</pre>
<pre class="alt"> </pre>
<pre> Console.WriteLine(<span class="str">"Integration test complete."</span> +</pre>
<pre class="alt"> Environment.NewLine +</pre>
<pre> Environment.NewLine);</pre>
<pre class="alt"> Console.WriteLine(<span class="str">"Press <Enter> to continue..."</span>);</pre>
<pre> Console.ReadLine();</pre>
<pre class="alt"> }</pre>
<pre>}</pre>
</div>
<div>
<br />
Execute the project and you should see the following output:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEil9CtT94bv50PCRK6p8LCL3IkroB5vhMkH3n8BE93y4-ECPCSUvpobL7omDMhZF0thVcPASWfpwogE7I-vxmkdHvdUqER2q7jS4onXQywC0MzsbDUoSOZdVJOaGsGGfYNLI5GpSw/s1600/output.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="202" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEil9CtT94bv50PCRK6p8LCL3IkroB5vhMkH3n8BE93y4-ECPCSUvpobL7omDMhZF0thVcPASWfpwogE7I-vxmkdHvdUqER2q7jS4onXQywC0MzsbDUoSOZdVJOaGsGGfYNLI5GpSw/s400/output.png" width="400" /></a></div>
<br />
And you should see the vendor created in Dynamics GP:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyvyvinlLH7Bnd2AfVjL4MAU8ah3YAtSBR6QtviFocnq8278-H3Oi04N9NIiKebwN6sM6BoLtUDYXQTx3r6B4WH4qeVUDzmr26htWhGEoGtnhd-T2xI7_Skiqf0HdAG-YVYWz0Zg/s1600/vendor.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="350" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyvyvinlLH7Bnd2AfVjL4MAU8ah3YAtSBR6QtviFocnq8278-H3Oi04N9NIiKebwN6sM6BoLtUDYXQTx3r6B4WH4qeVUDzmr26htWhGEoGtnhd-T2xI7_Skiqf0HdAG-YVYWz0Zg/s400/vendor.png" width="400" /></a></div>
<br /></div><div class="blogger-post-footer">http://mbsguru.blogspot.com/atom.xml</div>Bryan Princehttp://www.blogger.com/profile/01546244332553420397noreply@blogger.com0tag:blogger.com,1999:blog-14548861.post-15092073590322164422011-12-28T15:03:00.007-06:002011-12-28T15:29:28.915-06:00Dynamics GP ActiveX component can't create object run-time error 429<div>Recently I was asked to look into an error a client was receiving while standing up a new Citrix server installation for their Dynamics GP 9 clients:</div><div><br /></div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgALaFspsq6af9nLFrgXwuV5RbPTWlqljUSt4BWjB33m-qkpAgfefvoq4AHm8ccWs_Zlf4eUhbxqBxTWayeKqOcmFUbaak0Xur-f_gATfVrguaai7gU1hG6FxQStM82oJuriPxzjQ/s1600/error.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgALaFspsq6af9nLFrgXwuV5RbPTWlqljUSt4BWjB33m-qkpAgfefvoq4AHm8ccWs_Zlf4eUhbxqBxTWayeKqOcmFUbaak0Xur-f_gATfVrguaai7gU1hG6FxQStM82oJuriPxzjQ/s320/error.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5691288873081697330" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; width: 320px; height: 180px; " /></a><br /><div>NOTE: If you are recieving this error while attempting to upgrade from Dynamics GP 9 to Dynamics GP 10, see <a href="http://support.microsoft.com/kb/972245">this article</a>.</div><div><br /></div><div>When we hit the debug button to look at the underlying VBA code, we saw this line:</div><div><br /></div><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyPVj0CbpgHl_aVaVwV2nU0aiqlsnDEanKXGrdQgUe2fBV7LSKnjEfvlMJ7YP4pmr-fK08eGws8oAAndkQuxCdTlfb4wHV9bFOI2HJmK0qpLE_o1amso_hlSkaNpztERJXBwr1Yg/s400/vba.png" style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 32px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5691289605269996770" /><div><div style="text-align: left;">Based on the line of VBA code above, I knew that a connection to a database was needed, and the RetrieveGlobals9.dll was not installed on the new Citrix server. You might see slightly different code in your VBA, but the important part was that it was trying to call CreateObject on RetreiveGlobals9.</div><div style="text-align: left;"><br /></div><div style="text-align: left;">The first step to solve this problem was to download a copy of RetrieveGlobals9.dll from Partner Source at <a href="https://mbs.microsoft.com/partnersource/documentation/howtoarticles/modifiervbasamples90.htm?printpage=false">this URL</a>.<br /><br /></div><div style="text-align: left;">Contact your partner to download this for you if you don't have access to Partner Source. Place the file into the Microsoft Dynamics GP folder in the Program Files directory. Since this was a 64-bit machine, the Microsoft Dynamics GP folder was in Program Files (x86).</div><div style="text-align: left;"><br /></div><div style="text-align: left;">Next, open a command prompt in <a href="http://www.sevenforums.com/tutorials/783-elevated-command-prompt.html">elevated mode</a>.</div><div style="text-align: left;"><br /></div><div style="text-align: left;">Finally, to register the .dll, type:</div><div style="text-align: left;">Regsvr32 "C:\Program Files (x86)\Microsoft Dynamics\GP\RetrieveGlobals9.dll"</div><div style="text-align: left;"><br /></div><div style="text-align: left;">You will need to include the quotes because the directories have spaces in them.</div><div style="text-align: left;"><br /></div><div style="text-align: left;">If everything worked properly, you'll receive a confirmation that the .dll was registered successfully.</div><div style="text-align: left;"><br /></div><div><div><div style="text-align: left;"><br /></div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgz3WHk9NyuzfDGZ_6iE8NW0z_ZMmvTmvdId9mqM8OBroKLdwUjihH9M7UjWAtCuVrcb5_YLOV9OOv2BoNttOYDGkyYhIsKSbVKiduhzAHy9zkZqXOUn7RulQk7jHH5ghyphenhyphenQu67tfw/s1600/register.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 202px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgz3WHk9NyuzfDGZ_6iE8NW0z_ZMmvTmvdId9mqM8OBroKLdwUjihH9M7UjWAtCuVrcb5_YLOV9OOv2BoNttOYDGkyYhIsKSbVKiduhzAHy9zkZqXOUn7RulQk7jHH5ghyphenhyphenQu67tfw/s400/register.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5691289652499004818" /></a><br /></div><div>After these steps were complete, we were able to open and use Microsoft Dynamics GP without receiving the initial VBA error.</div><div><br /><div style="text-align: left;">Hope it helps!</div><div style="text-align: left;">Bryan Prince</div><div style="text-align: center;"><span class="Apple-style-span" ><u><br /></u></span></div><div style="text-align: center;"><span class="Apple-style-span" ><u><br /></u></span></div><br /><div><br /></div><div><br /></div><div><br /></div><div><br /></div></div></div></div><div class="blogger-post-footer">http://mbsguru.blogspot.com/atom.xml</div>Bryan Princehttp://www.blogger.com/profile/01546244332553420397noreply@blogger.com0tag:blogger.com,1999:blog-14548861.post-71963273514631055732011-08-28T11:37:00.004-05:002011-08-28T20:10:24.820-05:00Record Lock Trace v 2.0I've updated the <a href="http://mbsguru.blogspot.com/p/lock-trace-utility-for-dynamics-gp.html">Lock Trace Utility for Dynamics GP</a> with 2 new features.<br />
<br />
The first enhancement will replace the standard "This <u>batch</u> is being edited by <u>another user</u>" prompt when attempting to post or delete a SOP Batch with the name of the user that has the batch locked with an activity record in SY00800.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEier08_ZdnsPJHnbpPlYWcNwPw4vNuYHd1IbrNs1AUkD3CbuE-H8qjkrqWfYArcGqOridQR7jE8WV6BV0Ri4a7s4Ucq65YwpAsQQTCskxSaDqIWQkbR-o11tZ1ylY7O0WKt83htYA/s1600/BatchEditedAnotherUser.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="243" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEier08_ZdnsPJHnbpPlYWcNwPw4vNuYHd1IbrNs1AUkD3CbuE-H8qjkrqWfYArcGqOridQR7jE8WV6BV0Ri4a7s4Ucq65YwpAsQQTCskxSaDqIWQkbR-o11tZ1ylY7O0WKt83htYA/s400/BatchEditedAnotherUser.gif" width="400" /></a></div><div class="separator" style="clear: both; text-align: center;"><br />
</div><div class="separator" style="clear: both; text-align: left;">The second enhancement will clear all records that are locked by users that are not actively logged in to GP. This will be executed when attempting to access a transaction locked by a user that is not actively logged in. After, the record will be available and the following prompt will be presented.</div><div class="separator" style="clear: both; text-align: left;"><br />
</div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjO-guzujMrjWJXAhsuHpvAdjVfYnZJi4u3_oZYBOiNurqnSTJB-oXZ-kzMd-qj0Xv9TClYzNXE_2JpayZZiIvT1E5n5IlqeZKcdDMrpgPQDjJ1Iy_GInEBDMedNtS785MqAsPmvQ/s1600/LockedRecordsCleared.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="140" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjO-guzujMrjWJXAhsuHpvAdjVfYnZJi4u3_oZYBOiNurqnSTJB-oXZ-kzMd-qj0Xv9TClYzNXE_2JpayZZiIvT1E5n5IlqeZKcdDMrpgPQDjJ1Iy_GInEBDMedNtS785MqAsPmvQ/s400/LockedRecordsCleared.gif" width="400" /></a></div><div class="separator" style="clear: both; text-align: center;"><br />
</div><div class="separator" style="clear: both; text-align: left;">The basic delete statements executed by this feature are listed below:</div><div class="separator" style="clear: both; text-align: left;"><br />
</div><div class="separator" style="clear: both; text-align: left;"></div><div class="separator" style="clear: both; text-align: left;"><span class="Apple-style-span" style="font-size: x-small;">delete tempdb.dbo.dex_lock where session_id not in (select SQLSESID from dynamics.dbo.activity)</span></div><div class="separator" style="clear: both; text-align: left;"><span class="Apple-style-span" style="font-size: x-small;">delete tempdb.dbo.dex_session where session_id not in (select SQLSESID from dynamics.dbo.activity)</span></div><div class="separator" style="clear: both; text-align: left;"><span class="Apple-style-span" style="font-size: x-small;">delete DYNAMICS.dbo.SY00800 where userid not in (select USERID from DYNAMICS.dbo.activity)</span></div><br />
If you are not sure what version of the utility you have installed, since there isn't a GUI, I've updated the about message to include the version information.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhn9UV2LNa5X0MavtIvzZnQG4JaESKiv4cYXMPRp0QeXD-R1NHlnXLDMz4S99KNUv6UIfxTsEvzTgRyyGdU7Sb_rFI2wWqseiB356dcUbCTPAl89wOIaWjBDUv5eppAhccZ_PDiVg/s1600/AboutRecordLockTrace.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="146" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhn9UV2LNa5X0MavtIvzZnQG4JaESKiv4cYXMPRp0QeXD-R1NHlnXLDMz4S99KNUv6UIfxTsEvzTgRyyGdU7Sb_rFI2wWqseiB356dcUbCTPAl89wOIaWjBDUv5eppAhccZ_PDiVg/s400/AboutRecordLockTrace.gif" width="400" /></a></div><br />
<a href="http://www.box.net/shared/kz6cp83avl">Download Record Lock Trace for Dynamics GP here</a> or <a href="http://mbsguru.blogspot.com/p/lock-trace-utility-for-dynamics-gp.html">view the product page for more information</a>. Please leave a comment if there are other features or transaction types that you would like added to this utility.<div class="blogger-post-footer">http://mbsguru.blogspot.com/atom.xml</div>mbsguruhttp://www.blogger.com/profile/13675896847183138852noreply@blogger.com1tag:blogger.com,1999:blog-14548861.post-55536197379403647642011-08-09T21:53:00.005-05:002011-08-10T12:40:01.195-05:00Reconciling SOP Batches from WITHIN Dynamics GPAn article I posted sometime ago with a <a href="http://mbsguru.blogspot.com/2010/08/reconciling-sop-batches-in-dynamics-gp.html">SQL Script that would reconcile SOP Batch Totals</a> has really developed legs recently. It's been downloaded several times a week for several months. As a result, I felt some enhancement was in order.<br />
<br />
To that end, I've compiled the same logic, with few exceptions, into an assembly you can <a href="http://www.box.net/shared/poz7e15lsci05k5dkztr">download here</a>. Copy this to your Addins folder and then you can perform this same function from the Sales Batch Entry Additional Menu without having to run a SQL script or access the Reconcile Receivable Amounts Window in GP.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2Af7HUACkYDvrZvEXiso2WVhwjOA2oCXPiHloGDIJXe2f9wMn_noC-8IdmCN-SJtFM5x6aYY5El8ByOUAU7xo6ZuOsQc12XrUo9fkDu4AqzexMpYw7ZdiM2BoHMSLojgVq0NjXQ/s1600/SOPBatchRec.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="243" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2Af7HUACkYDvrZvEXiso2WVhwjOA2oCXPiHloGDIJXe2f9wMn_noC-8IdmCN-SJtFM5x6aYY5El8ByOUAU7xo6ZuOsQc12XrUo9fkDu4AqzexMpYw7ZdiM2BoHMSLojgVq0NjXQ/s400/SOPBatchRec.gif" width="400" /></a></div><br />
One exception to the logic in the script is that this <strong><em><u>will not delete empty batches</u></em></strong>. If you have an opinion as to how valuable that feature might be please leave a comment and I will evolve this accordingly. This utility will simply do the following:<br />
<ol><li><strong>Update batch totals for those that are <em>NOT locked by a user with a Batch Activity Record (SY00800).</em></strong> This was not designed to reconcile a specific batch but rather all batches at once. So, don't select a batch in Sales Batch Entry when executing this routine unless you want the batch selected to be excluded from the logic.</li>
<li><strong>Create missing Batch Header records for batches that do exist in SOP WORK (SOP10100) but not SY00500.</strong></li>
</ol>This will be especially useful if you want to enable GP users to resolve SOP Batch Total discrepancies on their own without having to grant them access to the Reconcile Receivables Amounts window.<br />
<br />
This was developed on GP 2010 and tested on both GP 2010 and GP 10.<div class="blogger-post-footer">http://mbsguru.blogspot.com/atom.xml</div>mbsguruhttp://www.blogger.com/profile/13675896847183138852noreply@blogger.com0tag:blogger.com,1999:blog-14548861.post-50955928374836320082011-06-07T13:35:00.003-05:002011-06-07T13:57:13.667-05:00Resolving "Error occurred in deployment step 'Activate Features': Invalid file name"The other day I was working on a SharePoint project that required the deployment of a Content Type, a List Template, a couple of List Instances and a couple of Feature Receivers. Things were coming along well until I started to reorganize the project. I dragged the List Instances into the List Template folder and renamed several folders to better represent their purposes. When I went to deploy, I got the error: "Error occurred in deployment step 'Activate Features': Invalid file name".<div><br /></div><div>I looked around the .spdata files, checked the Feature file and double-checked them all again. Everything looked right. The <a href="http://archive.msdn.microsoft.com/ULSViewer">ULS Logger</a> wasn't much help but it did give me the actual exception: "Exception: Microsoft.SharePoint.SPException: Invalid file name. The file name you specified could not be used. It may be the name of an existing file or directory, or you may not have permission to access the file"</div><div><br /></div><div>Still not much help. I removed all the items from the feature and was able to deploy successfully. Unfortunately, a feature that doesn't do anything isn't much good so I started adding items and deploying one at a time. Feature Receivers: Check. Content Type: Check. List Template: Check. List Instance: Failed.</div><div><br /></div><div>After looking at the List Instance for a while and not seeing the problem, I deleted the Instance from the project and recreated it from scratch. I added it to the feature, deployed and it failed again. </div><div><br /></div><div>I went through the List Template again and saw the familiar warning:</div><div><pre style="font-family: Consolas; font-size: 13px; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: white; background-position: initial initial; background-repeat: initial initial; "><span style="color: blue; "><?</span><span style="color: rgb(163, 21, 21); ">xml</span><span style="color: blue; "> </span><span style="color: red; ">version</span><span style="color: blue; ">=</span>"<span style="color: blue; ">1.0</span>"<span style="color: blue; "> </span><span style="color: red; ">encoding</span><span style="color: blue; ">=</span>"<span style="color: blue; ">utf-8</span>"<span style="color: blue; ">?></span></pre><pre style="font-family: Consolas; font-size: 13px; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: white; background-position: initial initial; background-repeat: initial initial; "><span style="color: blue; "></span><span class="Apple-style-span"><span class="Apple-style-span" style="color: rgb(0, 0, 255); "><</span>Elements</span><span style="color: blue; "> </span><span style="color: red; ">xmlns</span><span style="color: blue; ">=</span>"<span style="color: blue; ">http://schemas.microsoft.com/sharepoint/</span>"<span style="color: blue; ">></span></pre><pre style="font-family: Consolas; font-size: 13px; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: white; background-position: initial initial; background-repeat: initial initial; "><span style="color: blue; "></span><span class="Apple-style-span" style="color: rgb(0, 0, 255); "><</span><span style="color: blue; ">!--</span><span style="color: green; "> Do not change the value of the Name attribute below. </span></pre><pre style="font-family: Consolas; font-size: 13px; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: white; background-position: initial initial; background-repeat: initial initial; "><span style="color: green; ">If it does not match the folder name of the List Definition project item, </span></pre><pre style="font-family: Consolas; font-size: 13px; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: white; background-position: initial initial; background-repeat: initial initial; "><span style="color: green; ">an error will occur when the project is run. </span><span style="color: blue; ">--></span></pre><pre style="font-family: Consolas; font-size: 13px; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: white; background-position: initial initial; background-repeat: initial initial; "><span style="color: blue; "></span><span class="Apple-style-span" style="color: rgb(0, 0, 255); "><</span><span class="Apple-style-span" style="color: rgb(163, 21, 21); ">ListTemplate</span></pre><pre style="font-family: Consolas; font-size: 13px; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: white; background-position: initial initial; background-repeat: initial initial; "><span class="Apple-style-span" style="color: rgb(163, 21, 21); "></span><span style="color: blue; "> </span><span style="color: red; ">Name</span><span style="color: blue; ">=</span>"<span style="color: blue; ">OldFolderName</span>"</pre><pre style="font-family: Consolas; font-size: 13px; background-image: initial; background-attachment: initial; background-origin: initial; background-clip: initial; background-color: white; background-position: initial initial; background-repeat: initial initial; "><span style="color: blue; "> </span><span style="color: red; ">Type</span><span style="color: blue; ">=</span>"<span style="color: blue; ">10001</span>"</pre></div><div>I had renamed the List Template folder from within Visual Studio but it did not update the ListTemplate Name element.</div><div><br /></div><div>After correcting the Name to match the new folder name everything worked and the world was right again.</div><div><br /></div><div><div>Add Solution:</div><div> Found 1 deployment conflict(s). Resolving conflicts ...</div><div> Deleted list instance 'Lists/SomeAwesomeList' from server.</div><div> Adding solution 'SomeAwesomeSolution.wsp'...</div><div> Deploying solution 'SomeAwesomeSolution.wsp'...</div><div>Activate Features:</div><div> Activating feature 'SomeAwesomeFeature' ...</div><div>Run Post-Deployment Command:</div><div> Skipping deployment step because a post-deployment command is not specified.</div><div>========== Build: 1 succeeded or up-to-date, 0 failed, 0 skipped ==========</div><div>========== Deploy: 1 succeeded, 0 failed, 0 skipped ==========</div></div><div><br /></div><div class="blogger-post-footer">http://mbsguru.blogspot.com/atom.xml</div>Lance Russellhttp://www.blogger.com/profile/11780142384048582104noreply@blogger.com10tag:blogger.com,1999:blog-14548861.post-77475561714883089372011-04-25T18:42:00.000-05:002011-04-25T18:42:52.684-05:00The Dynamics GP Blogster: Microsoft Dynamics GP 2010 R2 is hot off the press...<a href="http://dynamicsgpblogster.blogspot.com/2011/04/microsoft-dynamics-gp-2010-r2-is-hot.html?spref=bl">The Dynamics GP Blogster: Microsoft Dynamics GP 2010 R2 is hot off the press...</a>: "Microsoft has made GP 2010 R2 available prior to the original launch date of May 1, 2011. The product can be downloaded from CustomerSource ..."<div class="blogger-post-footer">http://mbsguru.blogspot.com/atom.xml</div>Bryan Princehttp://www.blogger.com/profile/01546244332553420397noreply@blogger.com0tag:blogger.com,1999:blog-14548861.post-77273171855647297502011-04-15T20:16:00.004-05:002011-04-15T20:33:04.927-05:00File not found: VBA6.DLL in Microsoft Dynamics GP 9 Visual Basic EditorToday I started a new project that had a requirement to create a new form in Microsoft Dynamics GP 9 to track additional item attributes.<div><br /></div><div>On a clean install of Windows 7 32-bit, Office 2010, and Microsoft Dynamics GP 9, I received the file not found VBA6.dll error as soon as I'd made my first VBA modification:</div><div><br /></div><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFO2CmFi38qdZ03n14Hqi9rHpDUAaGOQQHk46MIOkYeJGrgcGpLbIOlcLVixSfHy42xwjqqH8rh8s-5tlKogMkwZDvbqx16AFuh6fKrLVQ-zmzsNU3xrMoD74Ln39k-GeCl0HBSA/s320/Filenotfound.png" style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 255px; height: 178px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5595985759163284498" /><div><br /></div><div>I tried a few fixes including downloading and registering a new copy of the VBA6.DLL, but the error persisted.</div><div><br /></div><div>Then I found <a href="http://blogs.msdn.com/b/developingfordynamicsgp/archive/2010/08/27/file-not-found-vba6-dll-error-occurs-or-gp-crashes-and-creats-a-watson-fault-bucket-1474386816.aspx">a post by Beth Gardner</a> describing the same problem. The resolution involved both a registry edit and the deletion of several files from the Dynamics GP folder.</div><div><br /></div><div>The solution worked perfectly for me and I expect to see this problem more in the future as it seems to be related directly to an install of Office 2010.</div><div><br /></div><div>I could not replicate the problem on a clean install of Windows Server 2008 R2 on which I had not installed Office 2010.</div><div><br /></div><div><br /></div><div class="blogger-post-footer">http://mbsguru.blogspot.com/atom.xml</div>Bryan Princehttp://www.blogger.com/profile/01546244332553420397noreply@blogger.com3tag:blogger.com,1999:blog-14548861.post-24992234297047280882011-04-03T11:45:00.000-05:002011-04-03T11:45:32.210-05:00Microsoft Responds with Excellent Customer ServiceI discovered a problem in the way Dynamics GP Evergreen Contract Lines calculated revenue when 1) billing annually and 2) entering a quantity > 1 on the Contract Line. Quite simply, it just didn't calculate the Total Amount on the Contact Line or the Invoice Amounts accurately. This client is running GP 2010.<br />
<br />
This was discovered late in the implementation finally being logged as a bug by Microsoft Support just days before data conversion was to be completed for the cutover to production. Yikes!! I was in quite a pinch without a good Plan B just days before go live. After discussing the situation with the Microsoft Field Service Development team they mobilized to produce a fix for this problem in just over 24 hours. Great response!<br />
<br />
They really saved the day to ensure a smooth go live and successful Field Service Series implementation for my client. A hotfix for this problem is forthcoming from Microsoft. If you find yourself struggling with this issue when working with Evergreen Contracts in Dynamics GP Contract Administration shoot me a message and I'll help you get by in the meantime.<div class="blogger-post-footer">http://mbsguru.blogspot.com/atom.xml</div>mbsguruhttp://www.blogger.com/profile/13675896847183138852noreply@blogger.com0tag:blogger.com,1999:blog-14548861.post-48632380625119404562011-03-28T08:52:00.000-05:002011-03-28T08:52:09.828-05:00Voting for the Most Influential People in Microsoft Dynamics continues...Check out the Dynamics Community blog post on the <a href="https://community.dynamics.com/product/gp/gptechnical/b/gpdba/archive/2011/03/22/top-100-most-influential-microsoft-dynamics-people-for-2011-new-links.aspx">voting for the most influential people in Microsoft Dynamics</a>. They did a great job of highlighting the Dynamics GP contingent to make it easy for you to vote. They've moved me to <a href="http://www.micropoll.com/a/mpview/1068215-406005">Poll 5</a>.<div class="blogger-post-footer">http://mbsguru.blogspot.com/atom.xml</div>mbsguruhttp://www.blogger.com/profile/13675896847183138852noreply@blogger.com0tag:blogger.com,1999:blog-14548861.post-71773555214262174572011-03-15T07:41:00.000-05:002011-03-15T07:41:01.847-05:00Dynamics World List of Influential PeopleI'm not really sure how, and no I did not nominate myself, but I made it into the top 260 nominees for Dynamics World's Microsoft Dynamics Most Influential People. Thanks to who ever did nominate me. You can view the list of nominees <a href="http://www.dynamicsworld.co.uk/2011Voting.php">here</a>.<br />
<br />
Several of my old friends are on the list; Mark Polino, Ross Carlson, Dwight Specht, Troy Ensor, Bob McAdam, and Shane Hall to a name a few. Plus some of my new friends like Mariano and Dave Musgrave will surely be moving up the list this year. People like Andy Hafer really deserve the recognition for their contributions to the community as do all of the Dynamics MVPs that we all hear from so often. Many of those who run the popular VAR and ISV organizations are on the list as well.<br />
<br />
You can vote for those that you think deserve recognition for their contributions at <a href="http://www.dynamicsworld.co.uk/2011Voting.php">http://www.dynamicsworld.co.uk/2011Voting.php</a>. You will have to scroll through the polls to find individuals you might want to vote for. I'm in <a href="http://micropoll.com/t/KEsEtZBwTW">Poll 11</a> as are Dwight Specht (IBIS), Tony DiBenedetto (TriBridge), Andy Hafer (GPUG), and Bill Marshall (MC2).<div class="blogger-post-footer">http://mbsguru.blogspot.com/atom.xml</div>mbsguruhttp://www.blogger.com/profile/13675896847183138852noreply@blogger.com0tag:blogger.com,1999:blog-14548861.post-80309760362909689222011-03-11T09:57:00.000-06:002011-03-11T09:57:25.080-06:00Ooops! I marked a SOP Line as Drop Ship after I fulfilled itI recently received a request to lock down the Sales Transaction Entry Line Drop Ship checkbox when a line had been fulfilled. This purpose was to prevent users from mistakenly marking a fulfilled line as Drop Shipped which automatically removes all of the Serial Numbers from the line.<div><br />
</div><div>To do this just add the Sales Transaction Entry window to Visual Basic. Then add the Quantity Fulfilled field and Drop Ship checkbox to your project. Copy the code below and paste it behind the SalesTransactionEntryDetail(Grid):</div><div><br />
</div><div><div><div>Private Sub Grid_AfterLineGotFocus()</div><div> DropShipLock</div><div>End Sub</div><div><br />
</div><div>Private Sub QtyFulfilled_AfterUserChanged()</div><div> DropShipLock</div><div>End Sub</div><div><br />
</div><div>Private Sub DropShipLock()</div><div> If QtyFulfilled.Value <> 0 Then</div><div> Dropship.Enabled = False</div><div> Else</div><div> Dropship.Enabled = True</div><div> End If</div><div>End Sub</div></div></div><div><br />
</div><div>This will enable or disable the Drop Ship checkbox based on whether the Quantity Fulfilled is equal to 0 on both the Grid After Line Got focus and Quantity Fulfilled After User Changed events.</div><div><br />
</div><div>You can do this yourself as I describe above or download and import the <a href="http://www.box.net/shared/gsfdefmmaa">package file with this code here</a>.</div><div class="blogger-post-footer">http://mbsguru.blogspot.com/atom.xml</div>mbsguruhttp://www.blogger.com/profile/13675896847183138852noreply@blogger.com1tag:blogger.com,1999:blog-14548861.post-5933111379398812932011-03-08T07:45:00.000-06:002011-03-08T07:45:29.648-06:00GP Password Expired mid-day... while I was posting a BatchI was recently talking shop with another consultant that has a customer who's Dynamics GP password was valid when they logged in but expired after causing a batch posting interruption. Has this ever happened to you?<br />
<br />
He submitted a support request to Microsoft to explain this issue and seek out a resolution. The response he received was:<br />
<br />
As for ways to overcome the password becoming invalid mid-day, there are two options:<br />
<br />
1. Keep the password synchronized (time-wise) with the windows password and use the windows password reminder as a GP password reminder<br />
2. Use the GP Password Expiration Notification utility, freely available from the blog link below<br />
<br />
<a href="http://mbsguru.blogspot.com/p/dynamics-gp-password-expiration-notice.html">http://mbsguru.blogspot.com/p/dynamics-gp-password-expiration-notice.html</a><br />
<br />
Microsoft recommended the GP Password Expiration Notification utility with qualification, of course, that it is not something Microsoft created or provides support for. Even so, it's nice to see that this utility is serving the community well by helping to solve and prevent common problems.<br />
<br />
If you haven't downloaded it already you should before you have to recover from a batch posting interruption because your password has expired.<div class="blogger-post-footer">http://mbsguru.blogspot.com/atom.xml</div>mbsguruhttp://www.blogger.com/profile/13675896847183138852noreply@blogger.com0tag:blogger.com,1999:blog-14548861.post-14778598697341545002011-03-04T10:57:00.003-06:002011-03-04T11:00:22.552-06:00Dynamics GP 2010 R2 Feature ListStraight out of Tech Conference in Fargo this week, thanks to Dave Musgrave <a href="http://blogs.msdn.com/b/developingfordynamicsgp/archive/2011/03/04/microsoft-dynamics-gp-technical-conference-2011-day-1-morning.aspx">http://blogs.msdn.com/b/developingfordynamicsgp/archive/2011/03/04/microsoft-dynamics-gp-technical-conference-2011-day-1-morning.aspx</a>, I came across this graphic that lists some of the exciting new features coming out with Dynamics GP 2010 R2:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizjtubZhdUCWzfU7QiyUt0H6Kf_wiqtEIYU6kMyfdDIT096ghtJDHpgFekarkprj_XqkbGmp4D6fEXqogRES7_ZY8o9IxzX903utnT3O5CQ9jN7Qqfp698BH5RQRqX-YsXtLjqKw/s1600/DynGP2010R2FeatureList.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="298" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizjtubZhdUCWzfU7QiyUt0H6Kf_wiqtEIYU6kMyfdDIT096ghtJDHpgFekarkprj_XqkbGmp4D6fEXqogRES7_ZY8o9IxzX903utnT3O5CQ9jN7Qqfp698BH5RQRqX-YsXtLjqKw/s400/DynGP2010R2FeatureList.gif" width="400" /></a></div><div class="separator" style="clear: both; text-align: center;"><br />
</div><div class="separator" style="clear: both; text-align: left;">Dave goes on to explain that not only is Dynamics GP not being laid to rest as some have speculated since Microsoft begin investing in Dynamics AX nearly a decade ago but rather in a future release they are planning to include a web based client for Dynamics GP. That's a great improvement that I think we can all look forward to but first let's look at what's coming now:</div><div class="separator" style="clear: both; text-align: left;"></div><ul><li>Field Service Series customers should be looking forward to some of the FSS enhancements on deck:</li>
<ul><li>The Contract Line Hold feature is well overdue. I've had several clients that need this functionality.</li>
<li>Tech Stock Replenishment will be a much welcomed addition. I'm actively working on a project where we are having to work around this.</li>
<li>Contract Transfer Approval Workflow is something else our Contract Admin clients have been asking for. It's as though Microsoft is reading my mind.</li>
</ul><li>The Reporting and BI enhancements for Dynamics GP seem endless:</li>
<ul><li>More Excel Report functionality; Bulk Deployment, Group Excel Reports, Multi-Company Support, and Default Column Ordering will be great enhancements.</li>
<li>MORE Analytical SSRS Reports and Metrics. I'm not sure any of us can get enough of those!</li>
<li>New Business Analyzer! Mariano touches on that in his coverage of the conference here <a href="http://dynamicsgpblogster.blogspot.com/2011/03/microsoft-dynamics-gp-technical_02.html">http://dynamicsgpblogster.blogspot.com/2011/03/microsoft-dynamics-gp-technical_02.html</a>.</li>
<li>MORE Word Templates; SOP Returns and Word Template Generator. I was skeptical of the Word Templates after first seeing them at Tech Conference 2010 but I have to admit they're growing on me.</li>
</ul></ul><br />
There are several other great features and enhancements to Extender, Deployment and Migration Tools, and Email Support among others. It's always good to see that Microsoft continues to invest in what is already such a fantastic product. Well done.<div class="blogger-post-footer">http://mbsguru.blogspot.com/atom.xml</div>mbsguruhttp://www.blogger.com/profile/13675896847183138852noreply@blogger.com0tag:blogger.com,1999:blog-14548861.post-80467153653943486302011-03-03T11:41:00.000-06:002011-03-03T11:41:05.572-06:00Join us at our Microsoft Dynamics CRM 2011 Launch EventAre you ready to renew your focus on business productivity? Then join us at our exclusive Microsoft Dynamics CRM 2011 launch event in Nashville where we will be exploring the power of the most highly anticipated CRM release in years.<br />
<br />
This in-person event, hosted by <a href="http://www.straightarrowusa.com/">Straight Arrow Consulting, Inc.</a> CEO <a href="http://www.linkedin.com/in/trkarp">Tom Karpowich</a>, will include a live demonstration from a true CRM expert - <a href="http://www.linkedin.com/in/benvollmer">Ben Vollmer</a>, as he shares with you ways he has helped other companies boost sales, improve marketing performance and enhance customer service through better use of their CRM technology. Ben is known for his impressive energy and deep technical expertise - You will enjoy this time with such a true CRM guru!<br />
<div><br />
</div><div>This event is geared towards a select group of business and technical professionals—allowing you to network with Microsoft professionals and other customers in your area in an open, round-table style discussion about the concept and place of CRM in modern business. </div><div><br />
</div><div>We’ll help you envision your organization reaching unparalleled levels of effectiveness with:</div><div><ul><li>The fluent Microsoft Office user experience which saves employees time and increases adoption</li>
<li>More insightful and actionable dashboard data</li>
<li>Built in business connections, team management and process collaboration</li>
</ul></div><div>The Microsoft Dynamics CRM 2011 Launch Event takes place on Wednesday, March 16th, 2011 at 8:15am. It could be that start you need to renew your focus on your own business’ productivity!</div><div><br />
</div><div>Visit <a href="http://www.straightarrowusa.com/microsoft-dynamics-crm/crm-2011">http://www.straightarrowusa.com/microsoft-dynamics-crm/crm-2011</a> for more information or register now at <a href="https://www.clicktoattend.com/invitation.aspx?code=152507">https://www.clicktoattend.com/invitation.aspx?code=152507</a>.</div><div><br />
</div><div>I hope to see you there!</div><div class="blogger-post-footer">http://mbsguru.blogspot.com/atom.xml</div>mbsguruhttp://www.blogger.com/profile/13675896847183138852noreply@blogger.com0tag:blogger.com,1999:blog-14548861.post-6251113978475964972011-03-02T07:47:00.006-06:002011-03-03T12:09:13.219-06:00Love, Hate and the ViewStateI was recently tasked with creating a SharePoint interface to Microsoft Dynamics GP Item Maintenance. As the client's business had grown, inconsistencies in theirItem Master became apparent. When new items were needed, a similar existing item was copied and the details updated to match the new item. If there were no similar items, a new item was created.<br />
<br />
The problem was, many of the existing items were not properly categorized. There were people in the organization who knew bits of information about items, but nobody had all the information to correctly set up an item. Setting up an item properly required a combination of phone calls, emails and a little bit of luck. It could sometimes take weeks to get the item set up. This held up BOMs, Routings and pretty much everything else dependent on the new item.<br />
<br />
As usual for a new project, we started with a discovery phase. We tried to identify the groups that knew the necessary bits of information about items and proceeded to schedule interviews. During the interviews we gathered a lot of information to help us get started. We also found several points that were unclear: i.e. Accounting said Billing provides this. Billing said it was Sales, Sales thought it was Purchasing, Purchasing pointed to Engineering and Engineering said it was Accounting. After a few round trips, we were able to pin most things down but in the end, there were still a few bits of information that nobody understood. <br />
<br />
It was clear the Workflow would have to be very flexible. Adding to the complexity, some Items could bypass entire groups. For example, there's no need to set a price on an item if you don’t sell it. And why bother Purchasing if you are making this item in your own shop? <br />
<br />
To solve this business problem, we needed to deliver a product with:<br />
<ul><li>Flexible Workflow rules that could be adapted as the business changes (and as the users work with the system and discover steps that had been overlooked.)</li>
<li>Field-Level security to ensure each group can only edit their section.</li>
<li>The ability to assign some fields to multiple groups and users.</li>
<li>The ability to add new fields and groups as new requirements surface.</li>
<li>Audit Logging for accountability.</li>
<li>An intuitive User Interface.</li>
<li>The ability to open, edit and copy existing GP Items.</li>
<li>The ability to push the approved changes back to GP.</li>
</ul>This was not a simple SharePoint WebPart with an ASP.NET Form you can throw on a Page and start using. The form had to be generated dynamically, with different sections editable by different users. Lookup Fields had to be populated dynamically. Some based on values stored in GP like Class Code, others with a Hard-Coded list of choices, like Item Type. Oh, and new lookup fields could be added at any time. <br />
<br />
What's more, the fields and their rules were not known at design time. All the metadata describing the rules had to be parsed during form generation and postback. <br />
<br />
While building this application I ran into a few challenges. One in particular had to do with updating posted values based on business rules and then rendering the fields, <strong>not as the user had posted, but as the rules dictated</strong>. Now that you know the background, how do we make this happen? <br />
<br />
The ViewState is great! It makes your life as a web developer so much easier. Some action causes a postback and all the fields are repopulated with their values. You can handle events for a control without having to worry about the rest of the form. Controls get their IDs set automatically. What's not to love? Plenty.<br />
<ol><li>The ViewState is transmitted and parsed with every page post/load cycle using bandwidth, memory and CPU cycles for the server and the client. </li>
<li>The ViewState, while encoded, is not encrypted. I've seen this argument and I don’t think it's really all that relevant. After all, you are sending the same information back and forth through the form fields. And if you need to keep a secret, use HTTPS. </li>
<li>The ViewState is <span style="text-decoration: line-through;">persistent </span>insistent. If I take the users' submitted data and do some processing on the backend, I just might want to change some values on the form when it is sent back. Suppose they tried to order 100 widgets but you just sold some and you only have 75. Send the form back to the user with quantity set to 75 and display a nice alert telling them they are lucky to get that many. Thanks to ViewState, the quantity field gets set back to 100 automatically. I know, JavaScript could validate the page before the user submits. But what if the user is running without JavaScript? I know I do unless I'm on a trusted page. Add-ons like NoScript offer significant protection while surfing and after a whitelisting your common sites, they pretty much stay out of the way. But even with JavaScript, if I'm dealing with Dynamic Data, (what other kind is there?) the validation rules may have changed since the page was loaded. I suppose I could build some AJAXy validation JavaScript, but again, you can't count on JavaScript being there and you should never trust anything a user submits, even if you think your JavaScript has sanitized it.</li>
</ol>So, lets say we want to prevent ViewState from running. Easy enough, just set the EnableViewState property of the control to false:<br />
<br />
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"> <span style="color: #2b91af;">TextBox</span> t = <span style="color: blue;">new</span> <span style="color: #2b91af;">TextBox</span>();
t.EnableViewState = <span style="color: blue;">false</span>;
t.Text = <span style="color: blue;">this</span>.ToString();
<span style="color: blue;">return</span> t;
</pre><br />
And what if you want to disable ViewState on the whole page? <br />
<br />
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"> <span style="color: blue;">private</span> <span style="color: blue;">void</span> Page_Init(<span style="color: blue;">object</span> sender, System.<span style="color: #2b91af;">EventArgs</span> e)
{
<span style="color: blue;">this</span>.EnableViewState = <span style="color: blue;">false</span>;
<span style="color: green;">//do some other interesting stuff </span>
}</pre><br />
So, you’ve defeated the ViewState on a couple of projects and now it's time to build a SharePoint Web Part. Create the Web Part, add some controls, disable ViewState, deploy the Web Part and life is good! And we still have time to make happy hour (the first one!) <br />
<br />
Wait a minute. Didn't you disable ViewState? Why aren't your backend changes sticking? Because SharePoint Web Parts love ViewState so much, they insist on using it. Disable it on the control? Doesn't matter. It happens anyway. <code>Control.ClearChildViewState()</code> doesn't even help. How about firing up SharePoint Designer and disabling it for the entire Page that hosts the Web Part? Congratulations, you've done it, and you’ve disabled pretty much all the SharePoint functionality too. No, there has to be way around this.<br />
<br />
Actually, there are two:<br />
<ol><li>Create a LiteralControl and build it's Text property with the HTML you need to create your form field. Now you can render the LiteralControl and IIS will never even see the field. Remember, you will have to inspect the Post Variables yourself to find out how many widgets you just sold. Unfortunately, I tend to make the occasional mistake dynamically building HTML from within a C Sharp app. Leave off a quote or miss a closing tag and your form starts acting really strange. That brings us to the other option. </li>
<li>Create your controls like normal and add them to parent controls if you like. No need to worry about the HTML, IIS will get it right. But instead of adding the controls to the page (or a page element) render them into the Text property of our friend the LiteralControl. Using a StringBuilder, a StringWriter and an HTMLTextWriter, it all falls into place <br />
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"> <span style="color: green;">//...Build your textbox as you like. </span>
<span style="color: green;">//Don't forget a unique ID. </span>
<span style="color: #2b91af;">TextBox</span> tbQuantity = <span style="color: blue;">new</span> <span style="color: #2b91af;">TextBox</span>();
<span style="color: #2b91af;">LiteralControl</span> LControl = <span style="color: blue;">new</span> <span style="color: #2b91af;">LiteralControl</span>();
LControl.Text = <span style="color: blue;">this</span>.RenderControlToString(tbQuantity);
<span style="color: blue;">this</span>.Controls.Add(LControl);
</pre><br />
<pre style="background: white; color: black; font-family: Consolas; font-size: 13;"> <span style="color: blue;">public</span> <span style="color: blue;">string</span> RenderControlToString(<span style="color: #2b91af;">WebControl</span> Control)
{
<span style="color: #2b91af;">StringBuilder</span> sb = <span style="color: blue;">new</span> <span style="color: #2b91af;">StringBuilder</span>();
<span style="color: blue;">using</span> (<span style="color: #2b91af;">StringWriter</span> sw = <span style="color: blue;">new</span> <span style="color: #2b91af;">StringWriter</span>(sb))
{
<span style="color: blue;">using</span> (<span style="color: #2b91af;">HtmlTextWriter</span> textWriter = <span style="color: blue;">new</span> <span style="color: #2b91af;">HtmlTextWriter</span>(sw))
{
Control.RenderControl(textWriter);
}
} <span style="color: blue;">return</span> sb.ToString();
}</pre></li>
</ol>Using the HtmlTextWriter, we have well-formed HTML without having to worry about ViewState moving our cheese. Even in a SharePoint Web Part. And as a bonus, the ID you assigned to the Control is the ID that will be returned. No prepending all the parent control IDs by IIS. This, too helps to reduce the page size and load time.<div class="blogger-post-footer">http://mbsguru.blogspot.com/atom.xml</div>Lance Russellhttp://www.blogger.com/profile/11780142384048582104noreply@blogger.com0tag:blogger.com,1999:blog-14548861.post-8830510266801509632011-02-25T07:59:00.000-06:002011-02-25T07:59:48.499-06:00Microsoft Dynamics ERP Push to the CloudThe <a href="http://www.softwareadvice.com/">Software Advice Blog</a> has a <a href="http://www.softwareadvice.com/articles/enterprise/can-microsoft-dynamics-erp-make-it-to-the-cloud-microsoft-executive-interview-1022211/">interview clip up with Guy Weismantel</a>, Microsoft's Director of ERP Marketing, in which he discusses their strategy for moving Dynamics ERP to the cloud.<br />
<br />
He makes a good point; many ERP components are already delivered as cloud based services and we continue to move in that direction. A complete, cloud based ERP won't be suitable for every Dynamics ERP customer but will prove to be a very good for many.<br />
<br />
Check out the clip at <a href="http://www.softwareadvice.com/articles/enterprise/can-microsoft-dynamics-erp-make-it-to-the-cloud-microsoft-executive-interview-1022211/">http://www.softwareadvice.com/articles/enterprise/can-microsoft-dynamics-erp-make-it-to-the-cloud-microsoft-executive-interview-1022211/</a>.<div class="blogger-post-footer">http://mbsguru.blogspot.com/atom.xml</div>mbsguruhttp://www.blogger.com/profile/13675896847183138852noreply@blogger.com0tag:blogger.com,1999:blog-14548861.post-48295346603171281792011-02-16T11:58:00.001-06:002011-08-28T11:41:15.235-05:00Updated: Lock Trace Utility for Dynamics GP - PO SupportI received a request to extend the Lock Trace functionality to support locked Purchase Orders. It was a very simple change so I went ahead and implemented that functionality. You can download this new version <a href="http://www.box.net/shared/kz6cp83avl">here</a> if you're interested in knowing who has a Purchase Order locked when you attempt to access it.<br />
<br />
I started working on another feature for this utility but didn't want to hold back this new feature while working on that. I created a product page <a href="http://mbsguru.blogspot.com/p/lock-trace-utility-for-dynamics-gp.html">here</a> where I'll document release notes as this utility evolves.<br />
<br />
Keep the feedback coming. I have several other ideas for this utility and would like to hear yours.<div class="blogger-post-footer">http://mbsguru.blogspot.com/atom.xml</div>mbsguruhttp://www.blogger.com/profile/13675896847183138852noreply@blogger.com3tag:blogger.com,1999:blog-14548861.post-80953633461797736442011-02-16T11:01:00.000-06:002011-02-16T11:01:54.733-06:00Register Now to Save - Convergence 2011 in Atlanta!The Early Registration Deadline for Convergence 2011 expires on February 21 and hotels are filling up. That's just 5 days away!<br />
<br />
Register now at <a href="http://www.microsoft.com/dynamics/convergence/atlanta11/registration.aspx">http://www.microsoft.com/dynamics/convergence/atlanta11/registration.aspx</a> to save $300 off the regular price that kicks in on the 21st.<br />
<br />
Register 3+ people and receive another $100 off for the the 3rd + Attendee. <a href="http://www.straightarrowusa.com/">Straight Arrow</a> took advantage of this one with many of us invading Atlanta this year. Hope to see you there!<div class="blogger-post-footer">http://mbsguru.blogspot.com/atom.xml</div>mbsguruhttp://www.blogger.com/profile/13675896847183138852noreply@blogger.com0tag:blogger.com,1999:blog-14548861.post-91605748419732473892011-02-13T15:51:00.001-06:002011-08-28T11:41:28.665-05:00Record Lock Trace Addon for Dynamics GP<div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;">Natively, Dynamics GP doesn't always do a good job of enabling users to resolve common issues on their own. A classic example of this is the prompt displayed when attempting to access a record that is locked by another user. By default, as a user you are presented with the very generic message:</div><div style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"><br />
</div><div class="separator" style="clear: both; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9P_HBHJ5CAfsqxYYG1Yx-Uia0kloQ-RfUJDkTrRr4Noks2tH6YfDKLIb8JkF0JK0uTv6JhXQnvxip_YHt60ChNuaGO1_5G9vhBFAyF3T8rHq4DHF1nU2sLBvOw80kehJKlORwSA/s1600/TrxEditedAnotherUser.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="155" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9P_HBHJ5CAfsqxYYG1Yx-Uia0kloQ-RfUJDkTrRr4Noks2tH6YfDKLIb8JkF0JK0uTv6JhXQnvxip_YHt60ChNuaGO1_5G9vhBFAyF3T8rHq4DHF1nU2sLBvOw80kehJKlORwSA/s400/TrxEditedAnotherUser.gif" style="cursor: move;" width="400" /></a></div><div class="separator" style="clear: both; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: center;"><br />
</div><div class="separator" style="clear: both; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;">This is the message presented when attempting to access a document that is locked by another user in Sales Transaction Entry. Now, you can download the <a href="http://www.box.net/shared/kz6cp83avl">free Record Lock Tracing addon for Dynamics GP</a> (Tested on v10 and GP2010) that will replace this generic message with a message that includes the specific user that has the record locked:</div><div class="separator" style="clear: both; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"><br />
</div><div class="separator" style="clear: both; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3V1tDdSy4zYXHoXi3ZlMAW0VeGyuNK3a_JzTMW7mq0pd3DY2HHP-A2xsNWAFin-k1IA2UJhAfVvdeMRun-x6Ok92Ag5YuiZE54IHr6sp_blixKyVSv0-x8GqJwcEjRoB0oc7sbA/s1600/TrxEditedSpecificUser.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="172" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3V1tDdSy4zYXHoXi3ZlMAW0VeGyuNK3a_JzTMW7mq0pd3DY2HHP-A2xsNWAFin-k1IA2UJhAfVvdeMRun-x6Ok92Ag5YuiZE54IHr6sp_blixKyVSv0-x8GqJwcEjRoB0oc7sbA/s400/TrxEditedSpecificUser.gif" style="cursor: move;" width="400" /></a></div><div class="separator" style="clear: both; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: center;"><br />
</div><div class="separator" style="clear: both; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;">This has already solved some headaches for some of my clients eliminating the need to contact their internal IT department in order to determine which user has a record locked. This is particularly useful during periods with heightened urgency such as when processing shipments and invoices at month end.</div><div class="separator" style="clear: both; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"><br />
</div><div class="separator" style="clear: both; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;">This can be extended to include other transactions such as Purchase Orders. I'm happy to build on this further if there is demand for it. Please leave me a comment or send me an e-mail and let me know how I might extend this to add value for you.</div><div class="separator" style="clear: both; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"><br />
</div><div class="separator" style="clear: both; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; text-align: left;"><a href="http://www.box.net/shared/kz6cp83avl">Download Record Lock Tracing for Dynamics GP</a></div><div class="blogger-post-footer">http://mbsguru.blogspot.com/atom.xml</div>mbsguruhttp://www.blogger.com/profile/13675896847183138852noreply@blogger.com12