Upgrading or redeploying your Microsoft Dynamics CRM (MSCRM) 3.0 installation, you get the error: "the specified database has a later version" in the final checks of the installation wizard.
This is a warning only, so the wizard will allow you to continue. To remove the error though, you can update the Build Number field in the MSCRM Build Version table:
UPDATE BuildVersion SET Revision = 0 WHERE BuildNumber = 5300
Saturday, June 13, 2009
MSCRM: you cannot mix small business edition and professional edition license keys
Upgrading or redeploying your Microsoft Dynamics CRM (MSCRM) 3.0 installation, you get the error: "you cannot mix small business edition and professional edition license keys" in the final checks of the installation wizard.
Try deleting all the rows from the MSCRM License table:
DELETE FROM MY_Organisation_MSCRM.dbo.License
Try deleting all the rows from the MSCRM License table:
DELETE FROM MY_Organisation_MSCRM.dbo.License
Friday, June 12, 2009
GOGLOBAL: update that adds support for Windows Update KB968537
Hilltops IT is pleased to announce the availability of the Compatibility Update that adds support to GO-Global for:
username: ggw-updates
password: 1Kc3waJtw
or alternately,
ftp://ggw-updates:1Kc3waJtw@ftp.graphon.com
File name is: CompatibilityUpdate3.1.1_Jun11_2009.exe
GO-Global for Windows 3.1.1.3544 is a prerequisite for the 3.1.1 Compatibility Update.
Please go to this link to get the list of supported Windows updates:
http://www.graphon.com/support/Windows_Updates_Summary.htm
- Windows 3.1.1 for Windows Update KB968537 on Windows Server 2003 (SP1 and SP2),
- Windows XP (SP2 and SP3), and
- Windows 2000-SP4.
The update can be downloaded from GraphOn at the following location:
ftp://ftp.graphon.comusername: ggw-updates
password: 1Kc3waJtw
or alternately,
ftp://ggw-updates:1Kc3waJtw@ftp.graphon.com
File name is: CompatibilityUpdate3.1.1_Jun11_2009.exe
GO-Global for Windows 3.1.1.3544 is a prerequisite for the 3.1.1 Compatibility Update.
Please go to this link to get the list of supported Windows updates:
http://www.graphon.com/support/Windows_Updates_Summary.htm
Thursday, June 11, 2009
MSCRM: testing a User's Role (CRM 4.0 only)
Code required to test whether the logged in user to Microsoft CRM has a particular role:
function currentUserHasRole(roleName)
{
//get Current User Roles
var oXml = GetCurrentUserRoles();
if(oXml != null)
{
//get list of role names
var roles = oXml.selectNodes("//BusinessEntity/q1:name");
if(roles != null)
{
for( i = 0; i < roles.length; i++)
{
if(roles[i].text == roleName)
{
//return true if user has this role
return true;
}
}
}
}
//not found, return false
return false;
}
function GetCurrentUserRoles()
{
var xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
"<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">" +
GenerateAuthenticationHeader() +
" <soap:Body>" +
" <RetrieveMultiple xmlns=\"http://schemas.microsoft.com/crm/2007/WebServices\">" +
" <query xmlns:q1=\"http://schemas.microsoft.com/crm/2006/Query\" xsi:type=\"q1:QueryExpression\">" +
" <q1:EntityName>role</q1:EntityName>" +
" <q1:ColumnSet xsi:type=\"q1:ColumnSet\">" +
" <q1:Attributes>" +
" <q1:Attribute>name</q1:Attribute>" +
" </q1:Attributes>" +
" </q1:ColumnSet>" +
" <q1:Distinct>false</q1:Distinct>" +
" <q1:LinkEntities>" +
" <q1:LinkEntity>" +
" <q1:LinkFromAttributeName>roleid</q1:LinkFromAttributeName>" +
" <q1:LinkFromEntityName>role</q1:LinkFromEntityName>" +
" <q1:LinkToEntityName>systemuserroles</q1:LinkToEntityName>" +
" <q1:LinkToAttributeName>roleid</q1:LinkToAttributeName>" +
" <q1:JoinOperator>Inner</q1:JoinOperator>" +
" <q1:LinkEntities>" +
" <q1:LinkEntity>" +
" <q1:LinkFromAttributeName>systemuserid</q1:LinkFromAttributeName>" +
" <q1:LinkFromEntityName>systemuserroles</q1:LinkFromEntityName>" +
" <q1:LinkToEntityName>systemuser</q1:LinkToEntityName>" +
" <q1:LinkToAttributeName>systemuserid</q1:LinkToAttributeName>" +
" <q1:JoinOperator>Inner</q1:JoinOperator>" +
" <q1:LinkCriteria>" +
" <q1:FilterOperator>And</q1:FilterOperator>" +
" <q1:Conditions>" +
" <q1:Condition>" +
" <q1:AttributeName>systemuserid</q1:AttributeName>" +
" <q1:Operator>EqualUserId</q1:Operator>" +
" </q1:Condition>" +
" </q1:Conditions>" +
" </q1:LinkCriteria>" +
" </q1:LinkEntity>" +
" </q1:LinkEntities>" +
" </q1:LinkEntity>" +
" </q1:LinkEntities>" +
" </query>" +
" </RetrieveMultiple>" +
" </soap:Body>" +
"</soap:Envelope>";
var xmlHttpRequest = new ActiveXObject("Msxml2.XMLHTTP");
xmlHttpRequest.Open("POST", "/mscrmservices/2007/CrmService.asmx", false);
xmlHttpRequest.setRequestHeader("SOAPAction"," http://schemas.microsoft.com/crm/2007/WebServices/RetrieveMultiple");
xmlHttpRequest.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
xmlHttpRequest.setRequestHeader("Content-Length", xml.length);
xmlHttpRequest.send(xml);
var resultXml = xmlHttpRequest.responseXML;
return(resultXml);
}
The code need to be placed at the top of any Form Event where you want to use the function. the function can then simply be called as follows:
if(currentUserHasRole(‘Salesperson')){
//do this stuff
}else{
//do other stuff
}
We hope this helps anyone getting to grips with java script coding in MSCRM 4.0!
Please post any thoughts or improvements that you have to this.
Thanks, Hilltops IT
function currentUserHasRole(roleName)
{
//get Current User Roles
var oXml = GetCurrentUserRoles();
if(oXml != null)
{
//get list of role names
var roles = oXml.selectNodes("//BusinessEntity/q1:name");
if(roles != null)
{
for( i = 0; i < roles.length; i++)
{
if(roles[i].text == roleName)
{
//return true if user has this role
return true;
}
}
}
}
//not found, return false
return false;
}
function GetCurrentUserRoles()
{
var xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +
"<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">" +
GenerateAuthenticationHeader() +
" <soap:Body>" +
" <RetrieveMultiple xmlns=\"http://schemas.microsoft.com/crm/2007/WebServices\">" +
" <query xmlns:q1=\"http://schemas.microsoft.com/crm/2006/Query\" xsi:type=\"q1:QueryExpression\">" +
" <q1:EntityName>role</q1:EntityName>" +
" <q1:ColumnSet xsi:type=\"q1:ColumnSet\">" +
" <q1:Attributes>" +
" <q1:Attribute>name</q1:Attribute>" +
" </q1:Attributes>" +
" </q1:ColumnSet>" +
" <q1:Distinct>false</q1:Distinct>" +
" <q1:LinkEntities>" +
" <q1:LinkEntity>" +
" <q1:LinkFromAttributeName>roleid</q1:LinkFromAttributeName>" +
" <q1:LinkFromEntityName>role</q1:LinkFromEntityName>" +
" <q1:LinkToEntityName>systemuserroles</q1:LinkToEntityName>" +
" <q1:LinkToAttributeName>roleid</q1:LinkToAttributeName>" +
" <q1:JoinOperator>Inner</q1:JoinOperator>" +
" <q1:LinkEntities>" +
" <q1:LinkEntity>" +
" <q1:LinkFromAttributeName>systemuserid</q1:LinkFromAttributeName>" +
" <q1:LinkFromEntityName>systemuserroles</q1:LinkFromEntityName>" +
" <q1:LinkToEntityName>systemuser</q1:LinkToEntityName>" +
" <q1:LinkToAttributeName>systemuserid</q1:LinkToAttributeName>" +
" <q1:JoinOperator>Inner</q1:JoinOperator>" +
" <q1:LinkCriteria>" +
" <q1:FilterOperator>And</q1:FilterOperator>" +
" <q1:Conditions>" +
" <q1:Condition>" +
" <q1:AttributeName>systemuserid</q1:AttributeName>" +
" <q1:Operator>EqualUserId</q1:Operator>" +
" </q1:Condition>" +
" </q1:Conditions>" +
" </q1:LinkCriteria>" +
" </q1:LinkEntity>" +
" </q1:LinkEntities>" +
" </q1:LinkEntity>" +
" </q1:LinkEntities>" +
" </query>" +
" </RetrieveMultiple>" +
" </soap:Body>" +
"</soap:Envelope>";
var xmlHttpRequest = new ActiveXObject("Msxml2.XMLHTTP");
xmlHttpRequest.Open("POST", "/mscrmservices/2007/CrmService.asmx", false);
xmlHttpRequest.setRequestHeader("SOAPAction"," http://schemas.microsoft.com/crm/2007/WebServices/RetrieveMultiple");
xmlHttpRequest.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
xmlHttpRequest.setRequestHeader("Content-Length", xml.length);
xmlHttpRequest.send(xml);
var resultXml = xmlHttpRequest.responseXML;
return(resultXml);
}
The code need to be placed at the top of any Form Event where you want to use the function. the function can then simply be called as follows:
if(currentUserHasRole(‘Salesperson')){
//do this stuff
}else{
//do other stuff
}
We hope this helps anyone getting to grips with java script coding in MSCRM 4.0!
Please post any thoughts or improvements that you have to this.
Thanks, Hilltops IT
MSCRM: testing a User's Role (CRM 3.0 only)
This is quite an old tip now, on several blogs and forums, but we'd thought we'd repeat it here to keep it with the updated code for MSCRM 4.0 (see next post). The code below needs to be put in either the global.js file (by default located here C:\Program Files\Microsoft CRM\CRMWeb\_common\scripts\) of in the top of each Form event where you need to call the function. It's then just a case of calling the following in the Form Event:
if(currentUserHasRole(‘System Administrator’)){
//do this stuff
}else{
//do other stuff
}
Note that putting the code in the global.js is a risky strategy as if a patch or update is installed, then the changes may be lost. It does save copy/pasting into each and every Event; the choice is yours!
Java script code to test whether a User has a particular Role:
function getUserId()
{
try
{
var command = new RemoteCommand("SystemUser", "WhoAmI", "/MSCRMServices/");
var oResult = command.Execute();
if (oResult.Success)
{
return oResult.ReturnValue.UserId;
}
}
catch(e)
{
alert("Error while retrieving userid.");
}
return null;
}
function getUserRoles(userId)
{
try
{
var command = new RemoteCommand("UserManager", "GetUserRoles");
command.SetParameter("userIds", "<guid>" + userId + "</guid>");
var oResult = command.Execute();
if (oResult.Success)
{
return oResult.ReturnValue;
}
}
catch(e)
{
alert("Error while retrieving roles.");
}
return null;
}
function userHasRole(userId, roleName)
{
result = getUserRoles(userId);
if (result != null)
{
var oXml = new ActiveXObject("Microsoft.XMLDOM");
oXml.resolveExternals = false;
oXml.async = false;
oXml.loadXML(result);
roleNode = oXml.selectSingleNode("/roles/role[name='" + roleName + "']");
if (roleNode != null)
{
if (roleNode.selectSingleNode("roleid[@checked='true']") != null)
return true;
}
}
return false;
}
function currentUserHasRole(roleName)
{
userId = getUserId();
return userHasRole(userId, roleName);
}
if(currentUserHasRole(‘System Administrator’)){
//do this stuff
}else{
//do other stuff
}
Note that putting the code in the global.js is a risky strategy as if a patch or update is installed, then the changes may be lost. It does save copy/pasting into each and every Event; the choice is yours!
Java script code to test whether a User has a particular Role:
function getUserId()
{
try
{
var command = new RemoteCommand("SystemUser", "WhoAmI", "/MSCRMServices/");
var oResult = command.Execute();
if (oResult.Success)
{
return oResult.ReturnValue.UserId;
}
}
catch(e)
{
alert("Error while retrieving userid.");
}
return null;
}
function getUserRoles(userId)
{
try
{
var command = new RemoteCommand("UserManager", "GetUserRoles");
command.SetParameter("userIds", "<guid>" + userId + "</guid>");
var oResult = command.Execute();
if (oResult.Success)
{
return oResult.ReturnValue;
}
}
catch(e)
{
alert("Error while retrieving roles.");
}
return null;
}
function userHasRole(userId, roleName)
{
result = getUserRoles(userId);
if (result != null)
{
var oXml = new ActiveXObject("Microsoft.XMLDOM");
oXml.resolveExternals = false;
oXml.async = false;
oXml.loadXML(result);
roleNode = oXml.selectSingleNode("/roles/role[name='" + roleName + "']");
if (roleNode != null)
{
if (roleNode.selectSingleNode("roleid[@checked='true']") != null)
return true;
}
}
return false;
}
function currentUserHasRole(roleName)
{
userId = getUserId();
return userHasRole(userId, roleName);
}
Wednesday, June 10, 2009
QUOTEWERKS: QuoteWerks v4.0 build 47 released
QuoteWerks v4.0 build 47 released; details of new features and fixes below.
Free evaluation available for download here.
New Features
1. Added support for SugarCRM (versions 5.1 and 5.2) open source web based contact management software ( www.sugarcrm.com ). The integration includes: a) SugarCRM can be searched to find Contacts or Accounts to pull into the quote. b) QuoteWerks will create/update a linked document (as a SugarCRM note attachment). c) QuoteWerks will create/update a follow up call (as a SugarCRM Call). d) QuoteWerks will create/update a Sales Opportunity (as a SugarCRM Opportunity). e) The QuoteWerks DataLink feature can be used with SugarCRM enabling you to retrieve information like Terms and shipping method from the SugarCRM Contact or Account into the quote. f) When printing, QuoteWerks can retrieve Contact or Account data from SugarCRM and include it in the printed output. g) SugarCRM Contact and Account data can be retrieved using the F2 Lookup macro of ~SugarCRM_Macro().
2. Online Ordering module can place online orders with D & H (USA and Canada) from within QuoteWerks (requires Real-time and Online Ordering modules). Order items from a single order, or combine items from multiple QuoteWerks orders into a single D & H order. This will save you the time and hassle of calling your D & H sales rep and reading each part number, quantity, and price to him/her. Another benefit is that the order date and D & H sales order number will automatically be stored with your QuoteWerks order for reference. When placing D & H online orders electronically through QuoteWerks, there is an option that will let you place the order on hold. This will afford you an opportunity to review the order with your distributor rep and negotiate pricing without the time consuming process of reading to your sales rep all the part numbers, quantities, ship to location, etc. No more calling your distributor sales rep only to reach voice mail (understandable - sales reps can't be on the phone with more than one customer at a time) and then have to remember try again later in the day to place the order - or wait for a call back! This is truly the best of both worlds - automation with sales rep service!
3. Added Real-time Pricing & Availability support for D&H Canada.
4. Real-time Pricing and Availability is now available for IT distributor BlueStar ( www.bluestarinc.com ).
5. GoldMine 8.5 (Premium Edition) is now supported!
6. Peachtree 2010 is now supported!
7. Added support for linking to Microsoft Access 2007 databases as a Product Data Source.
8. Added Misc Access right CannotModifyLiterature, this is useful in preventing users from modifying these files from the Literature tab on the Print window.
9. Added Misc Access right CannotModifySpecSheets, this is useful in preventing users from modifying these files from the Spec Sheets tab on the Print window, and also on the Advanced tab of the Edit Product window.
10. Added Misc Access right CannotModifyFieldValue:DH_DocStatus.
11. Formula based line items can now references prices in group header line items.
12. Added Edit Append Paste menu.
13. Added support for setting the Document default values for CustomText13 - 20 through the SITE.INI file. Under the [Defaults] section of the SITE.INI file, you can set ini keys (for example) of CustomText13=my default.
14. On the Lookup Contact window the [Select for Sold To], [Select for Ship To], and [Select for Bill To] buttons now display their customized labels instead of their hard coded names (if they have been customized).
15. On the Defaults tab of the QuickBooks Setup window, increased the size of the account dropdowns enabling you to fully see larger account names, and also added tooltip support for extremely long account names.
16. For QuickBooks users, on the Create QuickBooks Item the size of the account dropdowns has been increased, enabling you to fully see larger account names, and also added tooltip support for extremely long account names.
17. Updated the View Log file window to add support for shortcut keys CTRL-F for find and F3 for find next. Also the text to find will default to the text that is currently selected.
18. If an error occurs while submitting an online order a .log file containing the error details will be created with the same base file name as the online order xml response file.
19. With the improved implementation of the &SYS_InstallPath macro you do not have to setup Path Translations between the Master and Remote installations as long as the external files being synchronized are located under the \QuoteWerks installation folder of both the Master installation and the Remote Installation and both have the same relative path under the \QuoteWerks folder.
20. In SITE.INI file under the [Contact Managers] section added support for the following INI keys (With their default values specified) "SalesLogixOppStatusOpenValue=Open", "SalesLogixOppStatusClosedLostValue=Closed - Lost", "SalesLogixOppStatusClosedWonValue=Closed - Won". This is particularly useful for German or Non-English versions of SalesLogix.
21. For API users, added new DocFunctions.DocumentSaveAsNextRevision(byval bDeletePreviousRevision As Boolean) method.
22. For API users, when an unknown field is requested through the the DocFunctions.GetDocumentHeaderValue method, a message box will no longer be displayed (which would stop the API application). Instead an error code "$$$Error:002" will be returned.
23. On the File Insert Document window, the last selected operator is now memorized (per user), so the next time you open this window, it will be remembered.
24. On the QuoteWerks Contact Lookup window, the last selected operator is now memorized (per user), so the next time you open this window, it will be remembered.
25. For API users, added support for the macros "&ReadOnlyMode", "&ViewOnlyMode", "&NeverBeenSaved" available through the DocFunctions.GetDocumentHeaderValue method.
26. On the System tab of the HelpAbout menu, there is a new value of "Terminal Services Detected".
27. On the System tab of the HelpAbout menu, there is a new value of "UAC Enabled".
Misc Features
1. When the logged in user opens a document that the user has "View" rights to, but not "Modify" rights, "(View only)" will appear in the title bar, and all the fields on the tabs will be locked from manual input. Like before, any changes made to this open quote cannot be saved.
2. In preparation for Windows 7 support, Windows 7 is now detected. Windows 7 UTC (versus GMT) terminology is now supported.
3. Updated the Version Checker with the updated Codejock.ReportControl.v13.0.0.ocx file.
4. The D&H Real-time URL was updated.
Fixes
1. When synchronizing external data sources, the path macro &SYS_InstallPath was not being resolved.
2. The AfterContactSelection API event was firing if the user clicked on the [Select] button even if no contact was actually selected.
3. On the Tech Data and Ingram Micro subtab of the Real-time tab under the ToolsOptions menu, the Online Ordering [Setup] button would be enabled even if the Online Ordering Module was not present.
4. For Outlook BCM users, the last character of the OS logged in user name (used in the Outlook BCM opportunity) would sometimes be truncated.
5. For Outlook BCM users, when creating Outlook BCM opportunity, the Expiration date and Delivery date would sometimes default to "01/01/4501".
6. For Outlook BCM users, Follow up calls (Appointment entries) and Linked documents (Journal entries) would not display under the Communication History for the Business Contact or Account they were associated with.
7. If an external file was selected for synchronization, if no path translation was setup for between the master install and the remote install, an attempt would be made to copy the file on top of itself which would fail and also result in renaming the original file to a .bxx extension.
8. On the Product Lookup window when searching a native product database, and selecting the {NONE} item in the Folder drop down no results would be returned. Now, if you select the option, all products that have not been associated with a folder will be displayed in the results. Additionally, the blank entry has been replaced with the entry which is used to search for a product no matter which folder it is associated with.
9. For Corporate Edition installations rehosted to SQL, When importing a an xml file (formatted to QuoteWerks specifications) from the FileImport Document menu and the data for a field was longer than the length supported by QuoteWerks, an error would be displayed, and that record (the DocumentHeader record, or a DocumentItems record) would not be imported.
10. For API users, in the QuoteWerksBackend object, the Database.Recordset.GetValue method was returning empty values for date fields.
11. When trying to select/add an item using the Configurator by double-clicking the item and a picture was linked to that item and the picture was not found, the item would not be selected. The message box that displayed the file not found error would interfere with the double-click, so now this message can be viewed by hovering over the "Image not Found" image.
12. For Peachtree users using the Peachtree Customer list as the contact manager, after searching for a contact using the ContactsLookup menu, double-clicking on a contact would not select it.
13. Created a workaround for a bug in Peachtree. When updating the price of an existing Peachtree item in the Peachtree Items list, all 3 GL Accounts are reset to the Peachtree default GL Account values. The QuoteWerks workaround fix is to retrieve the existing GL Account values for the Peachtree item and then update these same GL Accounts in the Peachtree item whenever updating the Price of the Peachtree item.
14. For Outlook users, the introduction of the "Advanced Outlook Integration" feature set was accompanied by a requirement that the current contact being pulled into the quote must be located inside the same folder (or subfolder) as defined on the General Tab of the Outlook Integration Setup window. Users would receive an error message even though the "Advanced Integration" was not enabled.
15. If a document (for example AAAQ1001) was saved as a next revision (AAAQ1001-01), then the revision AAAQ1001-01 was deleted, and then the document AAAQ1001 was opened, and a save as next revision was performed on it, the document number for the new revision would be "AAAQ1001-" instead of "AAAQ1001-01".
16. When the API method FindAndCopyProductIntoSLIBuffer was called for an external product data source like QuickBooks or Peachtree, and they were not running, a message box would be displayed to that effect. This would interrupt the program execution of the external API application. Now, no message boxes are displayed if there is a problem with QuickBooks or Peachtree not running; essentially normal usage. However, if there is a configuration or setup issue, message boxes may still be displayed.
17. For ACT! 4.0, 2000/5.0, 6.0 users, when exporting to QuickBooks or Peachtree, the DocStatus field was being updated to reflect that the document was exported, but the DTF file associated with the document was not getting updated.
18. In the Paste Special Wizard, when selecting the "Start session using the settings of a template" option, and changing a column mapping, the data would be pasted into both the originally mapped field AND the currently mapped field. If this change was saved to the Paste Special Template, you will need to open the template and re-save it to fix this issue.
19. When selecting a Paste Special Template file in the Paste Special Wizard and the file was corrupt, the error would close QuoteWerks.
Free evaluation available for download here.
New Features
1. Added support for SugarCRM (versions 5.1 and 5.2) open source web based contact management software ( www.sugarcrm.com ). The integration includes: a) SugarCRM can be searched to find Contacts or Accounts to pull into the quote. b) QuoteWerks will create/update a linked document (as a SugarCRM note attachment). c) QuoteWerks will create/update a follow up call (as a SugarCRM Call). d) QuoteWerks will create/update a Sales Opportunity (as a SugarCRM Opportunity). e) The QuoteWerks DataLink feature can be used with SugarCRM enabling you to retrieve information like Terms and shipping method from the SugarCRM Contact or Account into the quote. f) When printing, QuoteWerks can retrieve Contact or Account data from SugarCRM and include it in the printed output. g) SugarCRM Contact and Account data can be retrieved using the F2 Lookup macro of ~SugarCRM_Macro().
2. Online Ordering module can place online orders with D & H (USA and Canada) from within QuoteWerks (requires Real-time and Online Ordering modules). Order items from a single order, or combine items from multiple QuoteWerks orders into a single D & H order. This will save you the time and hassle of calling your D & H sales rep and reading each part number, quantity, and price to him/her. Another benefit is that the order date and D & H sales order number will automatically be stored with your QuoteWerks order for reference. When placing D & H online orders electronically through QuoteWerks, there is an option that will let you place the order on hold. This will afford you an opportunity to review the order with your distributor rep and negotiate pricing without the time consuming process of reading to your sales rep all the part numbers, quantities, ship to location, etc. No more calling your distributor sales rep only to reach voice mail (understandable - sales reps can't be on the phone with more than one customer at a time) and then have to remember try again later in the day to place the order - or wait for a call back! This is truly the best of both worlds - automation with sales rep service!
3. Added Real-time Pricing & Availability support for D&H Canada.
4. Real-time Pricing and Availability is now available for IT distributor BlueStar ( www.bluestarinc.com ).
5. GoldMine 8.5 (Premium Edition) is now supported!
6. Peachtree 2010 is now supported!
7. Added support for linking to Microsoft Access 2007 databases as a Product Data Source.
8. Added Misc Access right CannotModifyLiterature, this is useful in preventing users from modifying these files from the Literature tab on the Print window.
9. Added Misc Access right CannotModifySpecSheets, this is useful in preventing users from modifying these files from the Spec Sheets tab on the Print window, and also on the Advanced tab of the Edit Product window.
10. Added Misc Access right CannotModifyFieldValue:DH_DocStatus.
11. Formula based line items can now references prices in group header line items.
12. Added Edit Append Paste menu.
13. Added support for setting the Document default values for CustomText13 - 20 through the SITE.INI file. Under the [Defaults] section of the SITE.INI file, you can set ini keys (for example) of CustomText13=my default.
14. On the Lookup Contact window the [Select for Sold To], [Select for Ship To], and [Select for Bill To] buttons now display their customized labels instead of their hard coded names (if they have been customized).
15. On the Defaults tab of the QuickBooks Setup window, increased the size of the account dropdowns enabling you to fully see larger account names, and also added tooltip support for extremely long account names.
16. For QuickBooks users, on the Create QuickBooks Item the size of the account dropdowns has been increased, enabling you to fully see larger account names, and also added tooltip support for extremely long account names.
17. Updated the View Log file window to add support for shortcut keys CTRL-F for find and F3 for find next. Also the text to find will default to the text that is currently selected.
18. If an error occurs while submitting an online order a .log file containing the error details will be created with the same base file name as the online order xml response file.
19. With the improved implementation of the &SYS_InstallPath macro you do not have to setup Path Translations between the Master and Remote installations as long as the external files being synchronized are located under the \QuoteWerks installation folder of both the Master installation and the Remote Installation and both have the same relative path under the \QuoteWerks folder.
20. In SITE.INI file under the [Contact Managers] section added support for the following INI keys (With their default values specified) "SalesLogixOppStatusOpenValue=Open", "SalesLogixOppStatusClosedLostValue=Closed - Lost", "SalesLogixOppStatusClosedWonValue=Closed - Won". This is particularly useful for German or Non-English versions of SalesLogix.
21. For API users, added new DocFunctions.DocumentSaveAsNextRevision(byval bDeletePreviousRevision As Boolean) method.
22. For API users, when an unknown field is requested through the the DocFunctions.GetDocumentHeaderValue method, a message box will no longer be displayed (which would stop the API application). Instead an error code "$$$Error:002" will be returned.
23. On the File Insert Document window, the last selected operator is now memorized (per user), so the next time you open this window, it will be remembered.
24. On the QuoteWerks Contact Lookup window, the last selected operator is now memorized (per user), so the next time you open this window, it will be remembered.
25. For API users, added support for the macros "&ReadOnlyMode", "&ViewOnlyMode", "&NeverBeenSaved" available through the DocFunctions.GetDocumentHeaderValue method.
26. On the System tab of the HelpAbout menu, there is a new value of "Terminal Services Detected".
27. On the System tab of the HelpAbout menu, there is a new value of "UAC Enabled".
Misc Features
1. When the logged in user opens a document that the user has "View" rights to, but not "Modify" rights, "(View only)" will appear in the title bar, and all the fields on the tabs will be locked from manual input. Like before, any changes made to this open quote cannot be saved.
2. In preparation for Windows 7 support, Windows 7 is now detected. Windows 7 UTC (versus GMT) terminology is now supported.
3. Updated the Version Checker with the updated Codejock.ReportControl.v13.0.0.ocx file.
4. The D&H Real-time URL was updated.
Fixes
1. When synchronizing external data sources, the path macro &SYS_InstallPath was not being resolved.
2. The AfterContactSelection API event was firing if the user clicked on the [Select] button even if no contact was actually selected.
3. On the Tech Data and Ingram Micro subtab of the Real-time tab under the ToolsOptions menu, the Online Ordering [Setup] button would be enabled even if the Online Ordering Module was not present.
4. For Outlook BCM users, the last character of the OS logged in user name (used in the Outlook BCM opportunity) would sometimes be truncated.
5. For Outlook BCM users, when creating Outlook BCM opportunity, the Expiration date and Delivery date would sometimes default to "01/01/4501".
6. For Outlook BCM users, Follow up calls (Appointment entries) and Linked documents (Journal entries) would not display under the Communication History for the Business Contact or Account they were associated with.
7. If an external file was selected for synchronization, if no path translation was setup for between the master install and the remote install, an attempt would be made to copy the file on top of itself which would fail and also result in renaming the original file to a .bxx extension.
8. On the Product Lookup window when searching a native product database, and selecting the {NONE} item in the Folder drop down no results would be returned. Now, if you select the option, all products that have not been associated with a folder will be displayed in the results. Additionally, the blank entry has been replaced with the entry which is used to search for a product no matter which folder it is associated with.
9. For Corporate Edition installations rehosted to SQL, When importing a an xml file (formatted to QuoteWerks specifications) from the FileImport Document menu and the data for a field was longer than the length supported by QuoteWerks, an error would be displayed, and that record (the DocumentHeader record, or a DocumentItems record) would not be imported.
10. For API users, in the QuoteWerksBackend object, the Database.Recordset.GetValue method was returning empty values for date fields.
11. When trying to select/add an item using the Configurator by double-clicking the item and a picture was linked to that item and the picture was not found, the item would not be selected. The message box that displayed the file not found error would interfere with the double-click, so now this message can be viewed by hovering over the "Image not Found" image.
12. For Peachtree users using the Peachtree Customer list as the contact manager, after searching for a contact using the ContactsLookup menu, double-clicking on a contact would not select it.
13. Created a workaround for a bug in Peachtree. When updating the price of an existing Peachtree item in the Peachtree Items list, all 3 GL Accounts are reset to the Peachtree default GL Account values. The QuoteWerks workaround fix is to retrieve the existing GL Account values for the Peachtree item and then update these same GL Accounts in the Peachtree item whenever updating the Price of the Peachtree item.
14. For Outlook users, the introduction of the "Advanced Outlook Integration" feature set was accompanied by a requirement that the current contact being pulled into the quote must be located inside the same folder (or subfolder) as defined on the General Tab of the Outlook Integration Setup window. Users would receive an error message even though the "Advanced Integration" was not enabled.
15. If a document (for example AAAQ1001) was saved as a next revision (AAAQ1001-01), then the revision AAAQ1001-01 was deleted, and then the document AAAQ1001 was opened, and a save as next revision was performed on it, the document number for the new revision would be "AAAQ1001-" instead of "AAAQ1001-01".
16. When the API method FindAndCopyProductIntoSLIBuffer was called for an external product data source like QuickBooks or Peachtree, and they were not running, a message box would be displayed to that effect. This would interrupt the program execution of the external API application. Now, no message boxes are displayed if there is a problem with QuickBooks or Peachtree not running; essentially normal usage. However, if there is a configuration or setup issue, message boxes may still be displayed.
17. For ACT! 4.0, 2000/5.0, 6.0 users, when exporting to QuickBooks or Peachtree, the DocStatus field was being updated to reflect that the document was exported, but the DTF file associated with the document was not getting updated.
18. In the Paste Special Wizard, when selecting the "Start session using the settings of a template" option, and changing a column mapping, the data would be pasted into both the originally mapped field AND the currently mapped field. If this change was saved to the Paste Special Template, you will need to open the template and re-save it to fix this issue.
19. When selecting a Paste Special Template file in the Paste Special Wizard and the file was corrupt, the error would close QuoteWerks.
Monday, June 8, 2009
DEVELOPMENT: good software development practices
Here's a list of 5 Good Programming Habits we picked up from Amy Bennett in her article at IT World:
- The best trick I have is to type the sequences/use cases like a story before I write any code. The outline I create is read over and over, tweaking as I go." (Dan Douglas)
- Solve small, individual problems (The rule of 'encapsulation'). If I try to make one part of my code do too much, then I've invited trouble. (Sean Devlin)
- I like to write a routine first as pseudocode in comments, then translate the comments into source code. I find that this is a much faster method for me than writing the source code first. Any mistakes I make in the pseudocode are more easily fixed there than if I wrote the code first. As a bonus, I have accurate and useful comments when the routine is completed. (Jeffrey Henning)
- Make improvements often -- even if they are small -- so you are always making some progress. (James Stauffer)
- I make sure that I get a reasonable amount of sleep and that I come back to each piece of code/design/etc. after 'sleeping on it' so that I see/think about it from different angles and states of mind. This helps with everything. (John Mitchell)
Our "top tip" is to code defensively - always be thinking "what if?". We find this particularly useful and helpful because the code module or class we're writing for application "A" may well be used in application "B" at some point in the future. If the module or class hasn't been coded defensively to produce solid bug-free code, then this could mean a lot of re-writes for the developer on application "B".
Please share your thoughts and tips on how to produce great software development products.
Labels:
software development,
website development
Subscribe to:
Posts (Atom)