<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Stephen Smith&#039;s Blog</title>
	<atom:link href="http://smist08.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://smist08.wordpress.com</link>
	<description>All things Sage ERP...</description>
	<lastBuildDate>Sat, 28 Jan 2012 17:32:27 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='smist08.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://0.gravatar.com/blavatar/6764c162e496d4afcacb10b98d93c438?s=96&#038;d=http%3A%2F%2Fs2.wp.com%2Fi%2Fbuttonw-com.png</url>
		<title>Stephen Smith&#039;s Blog</title>
		<link>http://smist08.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://smist08.wordpress.com/osd.xml" title="Stephen Smith&#039;s Blog" />
	<atom:link rel='hub' href='http://smist08.wordpress.com/?pushpress=hub'/>
		<item>
		<title>NoSQL for ERP?</title>
		<link>http://smist08.wordpress.com/2012/01/28/nosql-for-erp/</link>
		<comments>http://smist08.wordpress.com/2012/01/28/nosql-for-erp/#comments</comments>
		<pubDate>Sat, 28 Jan 2012 17:20:47 +0000</pubDate>
		<dc:creator>smist08</dc:creator>
				<category><![CDATA[Software Architecture]]></category>
		<category><![CDATA[accpac]]></category>
		<category><![CDATA[cap theorem]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[nosql]]></category>
		<category><![CDATA[relational]]></category>
		<category><![CDATA[Sage]]></category>
		<category><![CDATA[sage 300]]></category>
		<category><![CDATA[sage 300 erp]]></category>
		<category><![CDATA[sage accpac]]></category>
		<category><![CDATA[sage erp accpac]]></category>
		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">http://smist08.wordpress.com/?p=887</guid>
		<description><![CDATA[Introduction NoSQL databases are a class of database management systems that grew up with the Internet. Generally these refer to any database system that doesn’t use SQL as its query language (though some call them Not only SQL, meaning they support SQL and something else as well). This would make them any database system other [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=smist08.wordpress.com&amp;blog=6216385&amp;post=887&amp;subd=smist08&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://smist08.files.wordpress.com/2012/01/nosql.png"><img class="alignnone  wp-image-889" title="nosql" src="http://smist08.files.wordpress.com/2012/01/nosql.png?w=600&#038;h=160" alt="" width="600" height="160" /></a></p>
<p><strong>Introduction</strong></p>
<p><a href="http://en.wikipedia.org/wiki/NoSQL">NoSQL</a> databases are a class of database management systems that grew up with the Internet. Generally these refer to any database system that doesn’t use <a href="http://en.wikipedia.org/wiki/SQL">SQL</a> as its query language (though some call them Not only SQL, meaning they support SQL and something else as well). This would make them any database system other than the standard databases. However these are usually associated with a class of database system that is intended to server large Internet companies. In this article we are only considering the large distributed databases and not the specialized in-memory databases. The goal of these is to be highly distributed and highly redundant. As a database scales you would be able to scale usage by just adding servers and have them add to the capacity of the system in a linear manner. You would like to have your database distributed all over the world, so it can be accessed from anywhere with a very low <a href="http://en.wikipedia.org/wiki/Latency_(engineering)">latency</a>.</p>
<p>The main difference between traditional SQL databases and NoSQL databases comes down to the CAP Theorem which says out of the three things:</p>
<ul>
<li>Consistency – roughly meaning that all clients of a data store get responses to requests that ‘make sense’. For example, if Client A writes 1 then 2 to location X, Client B cannot read 2 followed by 1.</li>
<li>Availability – all operations on a data store eventually return successfully. We say that a data store is ‘available’ for, e.g. write operations.</li>
<li>Partition tolerance – if the network stops delivering messages between two sets of servers, will the system continue to work correctly?</li>
</ul>
<p>You have to choose two, you can’t have all three.</p>
<p>Then SQL databases choose consistency and partition tolerance and NoSQL databases choose availability and partition tolerance. The CAP Theorem is shown graphically below:</p>
<p><a href="http://smist08.files.wordpress.com/2012/01/cap-theorem.png"><img class="alignnone size-medium wp-image-891" title="CAP-theorem" src="http://smist08.files.wordpress.com/2012/01/cap-theorem.png?w=300&#038;h=225" alt="" width="300" height="225" /></a></p>
<p>Generally then there has been a proliferation of NoSQL databases that all make a slightly different tradeoffs for the CAP theorem. If they can’t have all three does it make sense to have 2/3 of each perhaps? Generally there has been some great research that has produced amazing results, but this has led to a bit of a tower of Babel of database access languages.</p>
<p><a href="http://smist08.files.wordpress.com/2012/01/babel.jpg"><img class="alignnone size-medium wp-image-892" title="babel" src="http://smist08.files.wordpress.com/2012/01/babel.jpg?w=300&#038;h=226" alt="" width="300" height="226" /></a></p>
<p><strong>Search Example</strong></p>
<p>The classic example is Google’s BigData database used to power the Google search engine. How is it that when you type a search into Google, you immediately get back a page of search results instantly? How is it translating what you typed into some sort of database query and how is that query operating so quickly? How is Google handling millions of these queries coming from all over the world so quickly? What is the database schema that allows this magic?</p>
<p>The structure of the database is a really simple key-value store. The key is every possible search term that anyone could type in. The value is the table of web sites (and descriptions) to return for this search term. The database is called BigData because this value consisting of all the search results could have millions of hits for you to scroll through. There is no limit to the size of the value and there is no limit to the number of keys. Even so an indexed binary tree read of such a table would still be quite slow and this is Google’s big advancement with an algorithm called MapReduce that lets these simple key reads happen so quickly. The BigTable database spreads this huge table over many servers to operate and it has redundancy of having the database in many places at once. The MapReduce algorithm is a parallel algorithm in that parts of the search can be done by multiple servers in parallel.</p>
<p>Sound wonderful? Google published the MapReduce algorithm and there is an open source implementation of it called <a href="http://hbase.apache.org/">Apache HBase</a>, so why doesn’t everyone use it? All the NoSQL databases provide a huge optimization on one of the things a SQL database does, but at a cost of making something else very slow, or eliminating something else entirely. In the case of BigTable, inserting and updating records in this table is very slow. But for Google search this is ok. Google operates a giant number of “<a href="http://en.wikipedia.org/wiki/Web_crawler">web spiders</a>” that are always out there traversing the web looking for new sites and updating the Google database of search results. These are running all the time and updating all the servers all the time. But these updates and inserts might take hours or days to happen, especially if you count the amount of time to find their way over all the thousands of servers involved. But Google doesn’t mind as long as it happens and is eventually consistent.</p>
<p><strong>ERP Database Usage</strong></p>
<p>Generally ERP packages rely very heavily on the tenants of a SQL type relational database. They require database transactioning and consistency (often referred to as <a href="http://en.wikipedia.org/wiki/ACID">ACID</a>). ERP packages require general SQL type queries. They need good performance writing transactions to the database as well as reading and reporting from the database. I blogged a bit about Sage 300 ERP’s database usage <a href="http://smist08.wordpress.com/2010/07/10/accpac-and-it%E2%80%99s-databases/">here</a>.</p>
<p>The NoSQL camp would contest these statements. For instance if I insert an Order, is it necessary that if I immediately list the Orders that I see it, or is it ok if it shows up in that list, say ten minutes later? Or do ERP packages believe they need all the benefits of SQL without weighing them against the other benefits of alternative systems? Often customers will prefer speed over customizability or functionality.</p>
<p>I like the way in SQL you can hit post and get back a response that a transaction is either all committed or all rolled back. However from working with SQL, I also know this is a huge cost, especially in our ability to scale out the database and is a definite limit on multi-user contention. For a large scale system, I’m really questioning the locking requirements that large transactions like entering an order place on the system.  Remember the “availability” part of NoSQL databases will ensure the Order is entered eventually.</p>
<p>Another problem is adhoc SQL queries. ERP packages tend to like to do reporting and data inquiries using adhoc SQL queries. Usually this is a no no in the NoSQL world. Often in the NoSQL world, all queries must be designed ahead of time using very complicated MapReduce formula. The question is whether this is really necessary. If you have a really powerful Google like search ability built into the database, then do you really need to search the data with SQL queries? Is it that we just do this because we know how and that in fact real users would much rather use the Google method than the SQL method?</p>
<p><strong>Hybrid Approach</strong></p>
<p>Suppose you want the data query ability of a NoSQL database, but still want the SQL transaction integrity and consistency? One approach has been hybrid systems. Think of these as two databases in one where both a SQL and NoSQL database engine operate on your data. Perhaps a cleaner solution is to take a data warehousing approach and create your data in a SQL database, but then archive it to a NoSQL database for various querying and analysis. This is the foundation of many cloud based BI solutions that are out there. With this approach you get some of the benefits of both. What you lack is the high availability and scalability of the database for data entry and regular SQL type queries. But still this can be a way to get a bit of the best of both worlds.</p>
<p><strong>Summary</strong></p>
<p>I think it will be a while longer before NoSQL databases gain acceptance in the ERP world. However the amount of innovation going on in the NoSQL world is huge and great strides are being taken. I suspect we will start to see NoSQL begin to be used for non-traditional BI via data warehouses. Even adding Google like search to ERP usually involves adding a NoSQL database on the side. I think once this starts to happen then we will see more and more functionality move to the NoSQL side of things and then perhaps down the road somewhere we will be able to remove the SQL database. But the jury is still our as to whether this is a good long term goal.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/smist08.wordpress.com/887/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/smist08.wordpress.com/887/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/smist08.wordpress.com/887/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/smist08.wordpress.com/887/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/smist08.wordpress.com/887/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/smist08.wordpress.com/887/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/smist08.wordpress.com/887/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/smist08.wordpress.com/887/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/smist08.wordpress.com/887/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/smist08.wordpress.com/887/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/smist08.wordpress.com/887/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/smist08.wordpress.com/887/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/smist08.wordpress.com/887/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/smist08.wordpress.com/887/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=smist08.wordpress.com&amp;blog=6216385&amp;post=887&amp;subd=smist08&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://smist08.wordpress.com/2012/01/28/nosql-for-erp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1cb7e8c59f979d5b9800a1adfd8fe0d4?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">smist08</media:title>
		</media:content>

		<media:content url="http://smist08.files.wordpress.com/2012/01/nosql.png?w=300" medium="image">
			<media:title type="html">nosql</media:title>
		</media:content>

		<media:content url="http://smist08.files.wordpress.com/2012/01/cap-theorem.png?w=300" medium="image">
			<media:title type="html">CAP-theorem</media:title>
		</media:content>

		<media:content url="http://smist08.files.wordpress.com/2012/01/babel.jpg?w=300" medium="image">
			<media:title type="html">babel</media:title>
		</media:content>
	</item>
		<item>
		<title>ERP and Crystal Reports</title>
		<link>http://smist08.wordpress.com/2012/01/21/erp-and-crystal-reports/</link>
		<comments>http://smist08.wordpress.com/2012/01/21/erp-and-crystal-reports/#comments</comments>
		<pubDate>Sat, 21 Jan 2012 16:32:29 +0000</pubDate>
		<dc:creator>smist08</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[Reporting]]></category>
		<category><![CDATA[Software Architecture]]></category>
		<category><![CDATA[TCO]]></category>
		<category><![CDATA[accpac]]></category>
		<category><![CDATA[crystal reports]]></category>
		<category><![CDATA[Sage]]></category>
		<category><![CDATA[sage 300]]></category>
		<category><![CDATA[sage 300 erp]]></category>
		<category><![CDATA[sage accpac]]></category>
		<category><![CDATA[sage erp 100]]></category>
		<category><![CDATA[sage erp 500]]></category>
		<category><![CDATA[sage erp accpac]]></category>

		<guid isPermaLink="false">http://smist08.wordpress.com/?p=880</guid>
		<description><![CDATA[Introduction I put a questionnaire on how people liked Crystal Reports up on the “Sage Partners, Employees &#38; Alumni Networking Group” group on LinkedIn and received a lot of good discussion. I’ve previously blogged on customizing Crystal Reports for Sage 300 ERP (Accpac) here. This blog is more about the history of how ERP to [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=smist08.wordpress.com&amp;blog=6216385&amp;post=880&amp;subd=smist08&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><strong>Introduction</strong></p>
<p>I put a questionnaire on how people liked <a href="http://crystalreports.com/">Crystal Reports</a> up on the “<a href="http://www.linkedin.com/groups?home=&amp;gid=106271">Sage Partners, Employees &amp; Alumni Networking Group</a>” group on <a href="http://www.linkedin.com/">LinkedIn</a> and received a lot of good discussion. I’ve previously blogged on customizing Crystal Reports for Sage 300 ERP (Accpac) <a href="http://smist08.wordpress.com/2011/05/21/customizing-crystal-reports-for-sage-erp-accpac/">here</a>. This blog is more about the history of how ERP to Crystal integrations have gone in the past and the various challenges faced.</p>
<p><strong>History</strong></p>
<p><a href="http://www.sageaccpac.com/">Accpac</a> (now Sage 300 ERP) was originally developed by the Basic Software Group in the eighties in Vancouver. They started a project to have a new <a href="http://en.wikipedia.org/wiki/WYSIWYG">WYSIWYG</a> report writer as part of the product rather than the codes based approach being used. This project was cancelled and some of the people involved quit and started their own company to develop Crystal Reports (then Quick Reports). This was originally developed as an add-in product for the <a href="http://en.wikipedia.org/wiki/MS-DOS">MS-DOS</a> based Accpac Plus. Then they generalized the product to dynamically look at any database and that became the Crystal Reports of today. The original founders then struck it rich when they sold their company to <a href="http://www.seagate.com/www/en-us/">Seagate</a> in 1994, which was trying to branch out from hard disks to software. Eventually Seagate gave up on this and Crystal went private and independent as <a href="http://en.wikipedia.org/wiki/Crystal_Decisions">Crystal Decisions</a>. Shortly after in 2003 it was sold again to <a href="http://en.wikipedia.org/wiki/Business_Objects">Business Objects</a>. Then in 2008 Business Objects was bought by <a href="http://en.wikipedia.org/wiki/SAP_AG">SAP</a> where it lives today.</p>
<p>All of Sage 100, 300, 500 and X3 ERP use Crystal Reports as their main reporting engine. Sage HRMS and Sage CRM also use Crystal. We all adopted Crystal long ago at some stage or another. Sage 300 ERP adopted Crystal when we switched from using CARET (the Computer Associates report writer) back at version 3.0A.</p>
<p>Most products started integrating with Crystal in the 16-Bit world of Windows 3.1. We all integrated via the DLL interface that was to the DLL: crpe.dll. This interface let us print reports to a printer, preview or file. It let us set parameters that were passed from application’s entry forms to Crystal for things like to/from ranges. The Crystal runtime that included crpe.dll was installed to a directory c:\windows\crystal. This meant that any product that installed the Crystal runtime would usually overwrite what was already there, meaning the last product using Crystal to be installed would usually work, whereas most other products using Crystal would then stop working. This was the famous <a href="http://en.wikipedia.org/wiki/DLL_Hell">DLL hell</a>.</p>
<p>In these days we had to use native drivers for accessing the database, Sage ERP 300 shipped two versions of its reports, one set using the native Btrieve driver and the other using ODBC for SQL Server. This tended to be a maintenance headache. Having multiple reports for different databases, or even different page sizes like letter vs. A4 vs. legal. Having different reports depending whether G/L is used or not. Over the years as Crystal functionality has improved and ODBC drivers have improved, we’ve been able to reduce the number of report versions. We now ship one version of reports using ODBC that is just configured to look at the correct database regardless of type.</p>
<p><a href="http://smist08.files.wordpress.com/2012/01/crystal2.jpg"><img class="alignnone size-full wp-image-883" title="crystal2" src="http://smist08.files.wordpress.com/2012/01/crystal2.jpg?w=700" alt=""   /></a></p>
<p>Then we all started to move to 32 bit Windows with the advent of Windows 95. Crystal produced a 32-bit version and the new interface DLL was crpe32.dll. This was a close match to the 16-bit version and programs could work with Crystal in the 32 bit world very similarly to how they did in the 16 bit world. However DLL hell still remained. Plus we started to see the appearance of Terminal Server and Citrix. To keep users separated on TS, anything that a user installs to the Windows directory actually goes to a local Windows directory. The problem now is that the Crystal directory would go to the local user’s private windows directory and hence Crystal would only work for the user that installed the product and not for any other users on the Terminal Server. This then led to a manual procedure of copying the Crystal subdirectory either to the main Windows directory or each user’s local Windows directory.</p>
<p>With Crystal Reports 9, Crystal moved to eliminate the DLL hell problem. They dropped support for calling the crpe32.dll directly and moved the Crystal runtimes file over under Program Files under a version labeled directory. This allowed multiple version of the Crystal runtime to be installed at the same time and fixed the problems with Terminal Server and Citrix. However applications that used Crystal had to switch from using the crpe32.dll to using Crystal’s COM interface.</p>
<p><a href="http://smist08.files.wordpress.com/2012/01/crystal3.jpg"><img class="alignnone size-medium wp-image-884" title="crystal3" src="http://smist08.files.wordpress.com/2012/01/crystal3.jpg?w=300&#038;h=241" alt="" width="300" height="241" /></a></p>
<p>Crystal X and XI then followed and these worked very similarly to Crystal 9. Another nice thing was at this point Crystal had adopted an extensible file format, so the file format stopped changing between versions making upgrades easier.</p>
<p>Crystal Reports 2008 then dropped their COM API and now only supports integration via .Net and Java interfaces. This presented a number of problems, namely since these interfaces were quite different than the ones that went before them. Plus Crystal Reports was a fairly major upgrade to XI and seemed to introduce quite a few bugs. At this point ERP packages integrating to Crystal either had trouble with the new interfaces or had trouble with existing reports not running properly. This led to a bit of a low adoption of CR 2008. However the file format remained the same, so you could use CR 2008 to edit reports that would later be rendered in the ERP package via an earlier Crystal runtime, and again co-existence of multiple versions isn’t a problem due to the side-by-side DLLs.</p>
<p>Crystal has now released Crystal Reports 2011 and this fixes most of the problem in CR 2008. So we should start to see ERP packages moving forwards again. This version still only supports .Net and Java interfaces but has fixed a number of bugs and deficiencies that were causing adoption problems.</p>
<p><strong>Challenges</strong></p>
<p>For setting parameters and running reports, most ERP packages can do this fairly handily. However when you start to push the integration, what are some of the problems you can run into?</p>
<p>Sage ERP 500 (previously MAS 500) tries to simplify report customization by actually generating reports based on a higher level report designer built into the Sage ERP 500 product. This then eliminates a lot of the challenges in customizing reports inside the Crystal Designer. However this means that Sage ERP 500 uses the Crystal Design API and this API changes a lot from version to version making upgrades much harder. Sage ERP 500 also controls access to its database via a customer ODBC driver that then adds the Sage ERP 500 security model to the generic ODBC access.</p>
<p>Sage ERP 300 (previously Accpac) has a concept called “datapipes”. These were originally created for CARET as a performance enhancement and then taken over to Crystal. The concept is that you use these in place of ODBC to connect to the database and then these datapipes use the Sage 300 ERP database ERP to access the database. This allows the datapipes to use special knowledge of the Sage 300 ERP database schema to provide faster access. We use them to “flatten” out subreports, since accessing subreports in Crystal can be slow. We also use these for controlling access to things like G/L accounts with our G/L security module so users don’t see data they aren’t entitled to.</p>
<p><strong>Reports Server</strong></p>
<p>Using the Crystal Reports runtime from an ERP package is fairly straight forwards and easy, it can be installed with the ERP package and usually works quite well, so the user doesn’t have any extra hardware, installation or management problems. If you need to customize reports you need to buy and install Crystal Reports, but to just run reports there is no extra overhead. However much new development by Crystal is requiring the Crystal Reports Server.</p>
<p>The Crystal Reports Server is a central server that manages the printing and distribution of reports. You can use it to schedule when reports run and who gets the results. Most new Crystal development is now requiring a Reports Server to operate. For instance if you want to use the new Crystal Data Universe to make creating reports easier then you need a Reports Server to hold these. Similarly several new technologies like Crystal’s dash-boarding technology require the Crystal Server.</p>
<p>For us ERP vendors, we now have to evaluate the ROI for our customers. Is requiring this new server worth it? Is it worth the hardware, setup and licensing costs? Long term, is this tying the ERP package too closely to Crystal making adopting other technologies harder? At this point I don’t have a clear answer to these questions, but we are working with the new things in Reports Server to see their costs and benefits.</p>
<p><strong>Summary</strong></p>
<p>Crystal Reports has a long and interesting history and has become the de facto standard in report writers across all ERP packages. It is very full functioned and works with any database server. It takes a bit to learn how to use it effectively and is a very powerful tool for Business Partners that use it. The main complaint about Crystal is that it’s hard for end users to customize their own reports, due to some of its complexities.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/smist08.wordpress.com/880/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/smist08.wordpress.com/880/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/smist08.wordpress.com/880/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/smist08.wordpress.com/880/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/smist08.wordpress.com/880/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/smist08.wordpress.com/880/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/smist08.wordpress.com/880/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/smist08.wordpress.com/880/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/smist08.wordpress.com/880/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/smist08.wordpress.com/880/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/smist08.wordpress.com/880/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/smist08.wordpress.com/880/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/smist08.wordpress.com/880/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/smist08.wordpress.com/880/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=smist08.wordpress.com&amp;blog=6216385&amp;post=880&amp;subd=smist08&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://smist08.wordpress.com/2012/01/21/erp-and-crystal-reports/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1cb7e8c59f979d5b9800a1adfd8fe0d4?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">smist08</media:title>
		</media:content>

		<media:content url="http://smist08.files.wordpress.com/2012/01/crystal2.jpg" medium="image">
			<media:title type="html">crystal2</media:title>
		</media:content>

		<media:content url="http://smist08.files.wordpress.com/2012/01/crystal3.jpg?w=300" medium="image">
			<media:title type="html">crystal3</media:title>
		</media:content>
	</item>
		<item>
		<title>Five Whys</title>
		<link>http://smist08.wordpress.com/2012/01/14/five-whys/</link>
		<comments>http://smist08.wordpress.com/2012/01/14/five-whys/#comments</comments>
		<pubDate>Sat, 14 Jan 2012 22:19:27 +0000</pubDate>
		<dc:creator>smist08</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[Software Development Lifecycle]]></category>
		<category><![CDATA[accpac]]></category>
		<category><![CDATA[five whys]]></category>
		<category><![CDATA[lean manufacturing]]></category>
		<category><![CDATA[root cause analysis]]></category>
		<category><![CDATA[Sage]]></category>
		<category><![CDATA[sage accpac]]></category>
		<category><![CDATA[sage erp]]></category>
		<category><![CDATA[sage erp 300]]></category>
		<category><![CDATA[sage erp accpac]]></category>
		<category><![CDATA[toyota]]></category>

		<guid isPermaLink="false">http://smist08.wordpress.com/?p=873</guid>
		<description><![CDATA[Introduction The “Five Whys” is a method for performing a “Root Cause Analysis” to detect the true cause of problems in a product or process. The Five Whys was developed by Taiichi Ohno, the father of the Toyota Production System and is a cornerstone for how Toyota achieves the quality it does. Software development is [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=smist08.wordpress.com&amp;blog=6216385&amp;post=873&amp;subd=smist08&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><strong>Introduction</strong></p>
<p>The “<a href="http://en.wikipedia.org/wiki/5_Whys">Five Whys</a>” is a method for performing a “<a href="http://en.wikipedia.org/wiki/Root_cause_analysis">Root Cause Analysis</a>” to detect the true cause of problems in a product or process. The Five Whys was developed by <a href="http://en.wikipedia.org/wiki/Taiichi_Ohno">Taiichi Ohno</a>, the father of the <a href="http://en.wikipedia.org/wiki/Toyota_Production_System">Toyota Production System</a> and is a cornerstone for how Toyota achieves the quality it does.</p>
<p>Software development is a complex process and modern business software is quite large and complicated. If something goes wrong, we have a tendency to just blame the first named culprit, for instance if a bug appears in the field then blame the <a href="http://en.wikipedia.org/wiki/Software_quality_assurance">QA</a> person that tested that feature. Then this is usually accompanied with a lot of talk about people being “<a href="http://en.wikipedia.org/wiki/Accountability">accountable</a>” for the work they do. But if you step back a bit you realize that actually a much larger system has failed. The QA person wasn’t the only person to look at that feature. The <a href="http://en.wikipedia.org/wiki/Programmer">programmer</a> was responsible for testing it (both manually and providing unit tests) before giving it to QA. A <a href="http://en.wikipedia.org/wiki/Software_architect">software architect</a> reviewed what the programmer was doing. The entire product went through a <a href="http://en.wikipedia.org/wiki/Regression_testing">regression test</a> before release. This feature was reviewed by a <a href="http://en.wikipedia.org/wiki/Business_analyst">Business Analyst</a> and a <a href="http://en.wikipedia.org/wiki/Usability">Usability Analyst</a>. The product and feature had gone through a customer Beta Testing phase. And then in-spite of all this process and review by all these responsible and accountable people, the bug still made it out into the field. So to just superficially blame one person doesn’t give a good perspective on what went wrong and doesn’t help preventing the problem happening in the future.</p>
<p>The real goal of these methods is to allow companies to learn from their mistakes rather than to assign blame. Generally the process works way better when everyone is confident that this is the real intent. If everyone believes the goal is to assign blame, then the whole process goes political and getting to the truth is usually impossible.</p>
<p>Learning from mistakes has its own pitfalls. One common theory for why successful companies eventually fail is that they dutifully analyze problems and learn from their mistakes. For every problem that happens they develop a process or procedure to prevent that problem ever happening again. The downfall here is that as time passes, the number of processes and procedures created from this process becomes huge. This makes the company very bureaucratic and getting things done very hard. Great care has to be taken that the outcome of these studies doesn’t just bury a company in procedures that get harder and harder to follow. The best result is if the current process can be simplified, perhaps eliminating the step that created the mistake. After all simple processes and procedures are much easier to follow and less error prone. When developing remedies to problems analyzed, careful attention has to be paid to the cost of the solution, so that the solution isn’t worse than the original problem.</p>
<p>Performing a Root Cause Analysis study takes time and attention. So when you want to get started with this, start with the worst and most easily defined problems first. Run a few pilots to get used to the methodology. One good place to start is problems found in the field by customers, as mentioned before these indicate a fairly serious systemic failure which might be useful to fix. Problems found in the field are usually categorized by severity, so you could start by looking at the most severe problem first and then working down the list.</p>
<p><strong>The Five Whys</strong></p>
<p>The basic concept behind the Five Whys is really simple. Basically keep asking why for five times to get past the superficial reasons to the underlying reason. It’s something that we all did as three year olds when we kept annoying our parents by asking why over and over again. Basically as children we perceived that this was a good way to get a deeper understanding of the world, but then we abandoned this technique as we got older (or were scolded enough times). Basically the insight here is that we had it right as three year olds and shouldn’t have given up.</p>
<p>As an example perhaps of an interviewer asking a programmer:</p>
<ul>
<li>Why did this defect make it into the product?<br />
- Because the code review and unit tests didn’t catch it.</li>
<li>Why didn’t the code review catch it?<br />
- Because we substituted a reviewer from another team.</li>
<li>Why did you substitute who was doing the reviews?<br />
- Because our team was frantically coding and couldn’t spare the time.</li>
<li>Why were they so busy coding?<br />
- Because the stories they committed to were larger than expected.</li>
<li>Why was that?<br />
- Two key dependencies were underestimated and forced a lot of extra work.</li>
</ul>
<p>This is a fairly simplified and abbreviated example, but shows the basic idea. Also notice that each question can often lead to several avenues of pursuit for the next level. It’s up to the interviewer to decide whether to pursue several or follow the main thread. The diagram below shows how this might go.</p>
<p><a href="http://smist08.files.wordpress.com/2012/01/fivewhys.png"><img class="alignnone size-medium wp-image-875" title="fivewhys" src="http://smist08.files.wordpress.com/2012/01/fivewhys.png?w=300&#038;h=195" alt="" width="300" height="195" /></a></p>
<p><strong>Root Cause Analysis</strong></p>
<p>When you perform a Root Cause Analysis (RCA), you usually follow the following phases:</p>
<p><a href="http://smist08.files.wordpress.com/2012/01/rca1.png"><img class="alignnone  wp-image-876" title="rca1" src="http://smist08.files.wordpress.com/2012/01/rca1.png?w=600&#038;h=80" alt="" width="600" height="80" /></a></p>
<p>The Five Whys are usually performed in the “Data Analysis and Assessment” step. The “Data Collection” step before is used to identify the correct people, so you know who to ask the Five Whys to. Typically you want to have a separate Five Whys interview with each of the people involved with the problem and then perhaps additional people depending on the outcome of the interviews.</p>
<p>Generally you do each interview separately and document all the questions and answers. We document everything to do with the process on a <a href="http://en.wikipedia.org/wiki/Wiki">Wiki</a>, so everything is kept transparent and visible. After all the interviews you then need perform the assessment to identify the root causes and choose the items you want to pursue. This is usually done in a couple of brainstorming sessions. First everyone studies the documented Five Why interviews then they get together to discuss what happened and make suggestions of how to change processes or make other changes. All these ideas are documented. Then some time is left to think about them and another meeting happens to decide which ideas will be implemented, keeping in mind that we don’t want solutions worse than the problem and don’t want to introduce unnecessary bureaucracy. Then we apply the solutions and inform all affected departments. Follow up is scheduled to ensure that the solution is working and we are getting the desired results, if they aren’t working they should be scrapped or changed.</p>
<p><strong>Summary</strong></p>
<p>Usually when people first read about RCA they take it as a very heavy handed procedure to address simple problems. However when you’ve run a few of these, you quickly realize that most problems aren’t that simple and that solving systemic problems can be quite difficult. I’ve found Five Whys an extremely effective method to get to the bottom of things, where one of the key benefits is that it forces people to take the time to really think about what happened. Then the documentation produced provides a lot of visibility into what happened which usually makes implementing the solution face less resistance.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/smist08.wordpress.com/873/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/smist08.wordpress.com/873/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/smist08.wordpress.com/873/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/smist08.wordpress.com/873/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/smist08.wordpress.com/873/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/smist08.wordpress.com/873/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/smist08.wordpress.com/873/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/smist08.wordpress.com/873/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/smist08.wordpress.com/873/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/smist08.wordpress.com/873/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/smist08.wordpress.com/873/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/smist08.wordpress.com/873/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/smist08.wordpress.com/873/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/smist08.wordpress.com/873/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=smist08.wordpress.com&amp;blog=6216385&amp;post=873&amp;subd=smist08&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://smist08.wordpress.com/2012/01/14/five-whys/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1cb7e8c59f979d5b9800a1adfd8fe0d4?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">smist08</media:title>
		</media:content>

		<media:content url="http://smist08.files.wordpress.com/2012/01/fivewhys.png?w=300" medium="image">
			<media:title type="html">fivewhys</media:title>
		</media:content>

		<media:content url="http://smist08.files.wordpress.com/2012/01/rca1.png?w=300" medium="image">
			<media:title type="html">rca1</media:title>
		</media:content>
	</item>
		<item>
		<title>Doing Work in Small Batches and Limiting Work in Progress</title>
		<link>http://smist08.wordpress.com/2012/01/08/doing-work-in-small-batches-and-limiting-work-in-progress/</link>
		<comments>http://smist08.wordpress.com/2012/01/08/doing-work-in-small-batches-and-limiting-work-in-progress/#comments</comments>
		<pubDate>Sun, 08 Jan 2012 00:35:18 +0000</pubDate>
		<dc:creator>smist08</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[Software Development Lifecycle]]></category>
		<category><![CDATA[accpac]]></category>
		<category><![CDATA[Sage]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[scrum]]></category>
		<category><![CDATA[sage accpac]]></category>
		<category><![CDATA[sage 300 erp]]></category>
		<category><![CDATA[sage 300]]></category>
		<category><![CDATA[sage erp accpac]]></category>
		<category><![CDATA[lean startup]]></category>
		<category><![CDATA[assembly line]]></category>
		<category><![CDATA[kanban]]></category>
		<category><![CDATA[lean]]></category>

		<guid isPermaLink="false">http://smist08.wordpress.com/?p=866</guid>
		<description><![CDATA[Recently Software Development has been borrowing a lot of ideas from Japanese Lean Manufacturing. In a way this mirrors the progression from the Detroit way of building cars pioneered by Henry Ford to the modern way pioneered by Toyota. The original Ford production line approach was that a car was assembled on an assembly line [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=smist08.wordpress.com&amp;blog=6216385&amp;post=866&amp;subd=smist08&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Recently Software Development has been borrowing a lot of ideas from Japanese <a href="http://en.wikipedia.org/wiki/Lean_manufacturing">Lean Manufacturing</a>. In a way this mirrors the progression from the <a href="http://en.wikipedia.org/wiki/Detroit">Detroit</a> way of building cars pioneered by <a href="http://en.wikipedia.org/wiki/Henry_Ford">Henry Ford</a> to the modern way pioneered by <a href="http://en.wikipedia.org/wiki/Toyota">Toyota</a>.</p>
<p><a href="http://smist08.files.wordpress.com/2012/01/berkey_john_ford_assembly_line.jpg"><img class="alignnone size-medium wp-image-869" title="Berkey_John_Ford_Assembly_Line" src="http://smist08.files.wordpress.com/2012/01/berkey_john_ford_assembly_line.jpg?w=300&#038;h=247" alt="" width="300" height="247" /></a></p>
<p>The original <a href="http://en.wikipedia.org/wiki/Ford_Motor_Company">Ford</a> production line approach was that a car was assembled on an <a href="http://en.wikipedia.org/wiki/Assembly_line">assembly line</a> by going through a series of specialized stations that were optimized to do one things really well and efficiently, so the car would go from perhaps the attach doors stations to the add Window glass station. Each station was optimized to do its job really well and the priority was to keep the assembly line moving no matter what. If the assembly line ever stopped then the hundreds of people working on it would be idled and this was considered a disaster. If problems occurred then they were noted and fixed post-assembly line. This process was then improved by optimizing each station to be quicker and more automated. Generally this produced a very good system of producing a very high volume of identical cars.</p>
<p><a href="http://smist08.files.wordpress.com/2012/01/toyota-assembly-line.jpg"><img class="alignnone size-medium wp-image-870" title="toyota-assembly-line" src="http://smist08.files.wordpress.com/2012/01/toyota-assembly-line.jpg?w=300&#038;h=200" alt="" width="300" height="200" /></a></p>
<p>From the outside a Toyota assembly line looks nearly identical. But it operates very differently. Toyota didn’t have the same large market as Detroit and didn’t need the volume. They needed to produce more specialized cars and needed to switch their assembly lines quickly from one run to another. Their emphasis wasn’t on making very specialized machines to do one task quickly; it was on producing general machines that could do a number of different things and could be switched quickly from doing one job to another. Toyota then does small runs on their assembly line rather than one massive long run. The big benefit to doing things in small batches was that quality problems are found much sooner. Hence they can stop the assembly line on the first car and fix a problem, rather than producing thousands of cars with the problem and then possibly not fixing the problem because it’s too expensive at that point. This also re-enforces the practice of fixing problems right away rather than letting them pile up and that it’s more cost effective to have the production line idle while the problem is fixed than having to fix it later.</p>
<p>Another example from the book “<a href="http://www.amazon.com/Lean-Thinking-Corporation-Revised-Updated/dp/0743249275">Lean Thinking</a>” by <a href="http://en.wikipedia.org/wiki/James_P._Womack">James Womack</a> and Daniel Jones recounts a story of one of the authors stuffing envelopes with their two young children. The children wanted to take the approach of folding all the letters, then putting all the folded letters in the envelopes then sealing all the envelopes then putting stamps on all the envelopes. This seems like an efficient and intuitive way to approach the problem. However the author insisted they do it the less intuitive way of one complete envelope at a time, i.e. folding one letter, stuffing it in an envelope, sealing it and putting a stamp on and then going on to the next one. Which way is faster? It turns out that researchers have timed groups of people performing this task and it turns out the one at a time approach is faster! It has a couple of other advantage as well. One is that if there is a problem, you find out right away; if the envelope is the wrong size, you find out on the first letter, not after you have folded all the letters, this could save you then having to refold all the letters to fit the envelopes. Similarly if you take a break you know how far along you are, if you’ve completed 40 out of 100 letters then you are 40% done and you can estimate your remaining time easily. You can’t do this when you do each step completely. This process is called “<a href="http://www.thetoyotasystem.com/lean_concepts/one_piece_flow.php">single piece flow</a>” and is an example of doing a task as lots of small batches rather than one large batch. This is a general principle you want to apply in everything you do, resisting the old Ford type assembly line type mentality. You also receive the first finished product off the assembly line quicker, so you can validate it with your customer before too many more are produced to ensure you are producing the right thing.</p>
<p><strong>Kanban vs Scrum</strong></p>
<p>To some degree batch size is at the heart of the difference between the <a href="http://en.wikipedia.org/wiki/Kanban_(development)">Kanban</a> and <a href="http://en.wikipedia.org/wiki/Scrum_(development)">Scrum</a> methods of developing software. Scrum tends to batch things into sprints (usually two or three weeks long) which is much smaller than traditional waterfall development, but Kanban wants to take it further. In Kanban you only work on one or two small things at a time and finish one before starting the next things. You operate on lots of small batches, but you also have to limit how many batches (or tasks) you can have in progress at a time. This is called limiting work in progress (<a href="http://www.investopedia.com/terms/w/workinprogress.asp#axzz1iiHNyUsu">WIP</a>). In Kanban you don’t worry about batching things up into sprints, just keeping the jobs small and limiting WIP. Kanban requires a lot of discipline and often if a development team hasn’t successfully progressed from waterfall to scrum, then adopting Kanban is a disaster.</p>
<p>The goal here is to produce small high quality increments that are immediately validated by customers. This way if you are going in the wrong direction, you won’t get too far before discovering it and not too much time will have been wasted (only a couple of small batches).</p>
<p>How do you get customer feedback, one small increment at a time? Obviously you can’t have dozens of customers download, install and play with a new version of your product every time you add a small increment and then interview them about it. But there are techniques you can use to do just this. The first is to produce your software via “<a href="http://radar.oreilly.com/2009/03/continuous-deployment-5-eas.html">continuous deployment</a>”. This means that every build of your software is automatically deployed to customers whether that means pushing it to a web server or loading it on an automatic software updater service. You need to be able to control which customers get it and you need to be able to roll it back if something goes wrong. To be confident with this sort of procedure you need really good automated testing in place to ensure you haven’t accidentally broken something. Then to find out whether your increments (or batches) provide customer value, you need really good instrumentation in your product to report back on customer usage, whether they use the feature, how long it takes to perform tasks and any other useful statistics.</p>
<p>Software products are large and complicated systems. Managing that complexity is a major challenge. Breaking large tasks down into many small tasks is a powerful tool to reducing complexity. Combining many small but high quality parts results in emergent complexity, but again it is much easier to manage by adding one small thing at a time rather than suddenly throwing several large items into the mix at once.</p>
<p><strong>Summary</strong></p>
<p>Most of the ideas in this blog posting come from my reading the “<a href="http://theleanstartup.com/">Lean Startup</a>” by <a href="http://en.wikipedia.org/wiki/Eric_Ries">Eric Ries</a> over the holidays. Quite a good book with many useful ideas on product development and innovation. Reducing Batch size and limiting WIP appeal to me to help make Sage more agile and innovative as we move forward.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/smist08.wordpress.com/866/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/smist08.wordpress.com/866/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/smist08.wordpress.com/866/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/smist08.wordpress.com/866/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/smist08.wordpress.com/866/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/smist08.wordpress.com/866/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/smist08.wordpress.com/866/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/smist08.wordpress.com/866/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/smist08.wordpress.com/866/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/smist08.wordpress.com/866/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/smist08.wordpress.com/866/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/smist08.wordpress.com/866/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/smist08.wordpress.com/866/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/smist08.wordpress.com/866/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=smist08.wordpress.com&amp;blog=6216385&amp;post=866&amp;subd=smist08&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://smist08.wordpress.com/2012/01/08/doing-work-in-small-batches-and-limiting-work-in-progress/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1cb7e8c59f979d5b9800a1adfd8fe0d4?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">smist08</media:title>
		</media:content>

		<media:content url="http://smist08.files.wordpress.com/2012/01/berkey_john_ford_assembly_line.jpg?w=300" medium="image">
			<media:title type="html">Berkey_John_Ford_Assembly_Line</media:title>
		</media:content>

		<media:content url="http://smist08.files.wordpress.com/2012/01/toyota-assembly-line.jpg?w=300" medium="image">
			<media:title type="html">toyota-assembly-line</media:title>
		</media:content>
	</item>
		<item>
		<title>On Customer Adoption</title>
		<link>http://smist08.wordpress.com/2012/01/01/on-customer-adoption/</link>
		<comments>http://smist08.wordpress.com/2012/01/01/on-customer-adoption/#comments</comments>
		<pubDate>Sun, 01 Jan 2012 21:49:12 +0000</pubDate>
		<dc:creator>smist08</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[Software Development Lifecycle]]></category>
		<category><![CDATA[accpac]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[auto update]]></category>
		<category><![CDATA[lean startup]]></category>
		<category><![CDATA[Sage]]></category>
		<category><![CDATA[sage 300]]></category>
		<category><![CDATA[sage 300 erp]]></category>
		<category><![CDATA[sage accpac]]></category>
		<category><![CDATA[sage erp accpac]]></category>
		<category><![CDATA[sdlc]]></category>

		<guid isPermaLink="false">http://smist08.wordpress.com/?p=858</guid>
		<description><![CDATA[The Problem Traditionally with ERP systems, a new version is released every 18 months or so. Typically customers will only upgrade every few versions for a number of reasons discussed below. This leads to a major problem, namely if a customer requests a new feature and we jump on it, then it still could be [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=smist08.wordpress.com&amp;blog=6216385&amp;post=858&amp;subd=smist08&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><strong>The Problem</strong></p>
<p>Traditionally with ERP systems, a new version is released every 18 months or so. Typically customers will only upgrade every few versions for a number of reasons discussed below. This leads to a major problem, namely if a customer requests a new feature and we jump on it, then it still could be four years before they see this feature. How this usually works is shown in the following timeline.</p>
<p><a href="http://smist08.files.wordpress.com/2012/01/timeline1.png"><img class="alignnone  wp-image-860" title="timeline1" src="http://smist08.files.wordpress.com/2012/01/timeline1.png?w=600&#038;h=270" alt="" width="600" height="270" /></a></p>
<p>In an agile on-line world, this seems like rather a slow process to provide value to customers. Most Sage products have an on-line suggestion web site, such as <a href="https://www11.v1ideas.com/SageERPAccpac/Accpac">https://www11.v1ideas.com/SageERPAccpac/Accpac</a> for Sage 300 ERP. However customers tend to give up on making suggestions to these once they enter a number of suggestions and don’t see any movement in the next few months. As more and more people are part of the <a href="http://en.wikipedia.org/wiki/MTV_Generation">MTV Generation</a> (or later) then instant gratification becomes the expectation.</p>
<p>Traditionally this is all part of a fairly large and involved <a href="http://en.wikipedia.org/wiki/New_product_development">Product Development Life Cycle</a>. Product Managers spend their time talking to customers and partners as well as evaluating various industry trends to come up with a list of features for the next version. Usually a number of themes are developed and implemented as major new features. R&amp;D then takes as many such themes and features that they think this can develop in 18 months. If all goes well, these are implemented, extensive testing is performed and an updated version of the product ships after these 18 months. Then if Product Management has done their job properly and R&amp;D has faithfully implemented what was laid out, then customers should be fairly happy with the new version.</p>
<p>Of course things aren’t quite that rigid anymore. Most development groups (including Sage ERP) have adopted the Agile Software Development Lifecycle where the development team is implementing features in small batches taken from a product backlog. The product backlog is in priority order so the higher priority features are implemented first. A side effect of this is that for lower priority items in the backlog, Product Management can swap these out with other higher priority features as business needs or understanding changes. This then leads to greater flexibility and does allow some newer customer suggestions to make it into a product sooner. I blogged on some aspects of this <a href="http://smist08.wordpress.com/2011/05/28/releasable-state/">here</a> and <a href="http://smist08.wordpress.com/2011/02/20/saasifying-sage/">here</a>.</p>
<p>Often we are tasked with the goal of shortening our release cycles; say from 18 months to 12 months or even 9 months. However we get a lot of resistance from customers and partners on this. The main reason is that traditionally upgrades are fairly costly and time consuming activities that can often be quite disruptive to a business. As a result customers typically don’t want to upgrade more than every three years, so there is no increase in customer value by providing more frequent releases. Even then the main reason customer’s site that they upgrade is to stay in support, since we only support the two most recent versions or to stay compatible with upgrades from other vendors, notably Microsoft. If you need to know you work well on Windows 7, then you need a more recent version of your products. A large part of this problem has been caused by us software vendors, when presented with a choice to add a new feature to a release or to make upgrading easier, we consistently choose to add the new feature and leave any difficulty with upgrading to the Business Partners to deal with; who, of course, pass this cost on to our customers. Right now 18 months works well because by supporting two versions, customers only need to upgrade every 3 years.</p>
<p>So out of this we have two significant problems to address:</p>
<ol>
<li>Making upgrades easier so it isn’t a huge inconvenience and cost to upgrade.</li>
<li>Make the features and functionality we add to our products more compelling so customers cite these as the reason for upgrading and not just keeping up with Microsoft compatibility problems.</li>
</ol>
<p><strong>Frictionless Upgrades</strong></p>
<p>To address the first point, we’ve been working hard to make the upgrade process easier. This is Sage’s Frictionless Upgrade initiative. We’ve just begun on this journey, but in a number of products we are already seeing results. Such as in Sage 300 ERP we’ve combined all the separate module installations into one master product installations, allow you to activate multiple applications to the new version in one go and to minimize database changes so Crystal Reports and Macros don’t need modifications.</p>
<p>Going Online with services like <a href="http://www.accpaconline.com/">www.accpaconline.com</a> can help, since now you don’t need to install the software yourself, but you still have the work of making sure custom reports still work and training staff on any changes to their workflow. Generally the process of upgrading can be done well or badly whether you are online or on-premise. Certainly we’ve seen cases where overnight changes to web sites like Facebook have been very disruptive.</p>
<p>Many products such as Windows or Apple iTunes have an auto-update feature, so even though these are on-premise installed on the local computer type applications, they can still be upgraded frequently with little fuss. Expect to see this sort of functionality come to more and more business applications allowing the software to be upgraded frictionlessly without requiring a major database conversion or requiring changes to customizations.</p>
<p><strong>Making Features Compelling</strong></p>
<p>The intent with all the customer visits, customer interviews and other research that Product Management performs is that the features we add to the product are compelling either to existing users or to attract new users. A lot of work goes into researching and collecting all the data that goes into this decision making. Generally this yields better results than being driven by technology trends or by what competitors are doing; however, we tend to not being seeing the results we would like. What is missing?</p>
<p>With the scientific method, like what you see in Physics, Chemistry or Biology, people come up with theories, but these aren’t really believed until they are backed by experimental evidence. In software development we tend to do a lot of work doing research and creating theories and spend a lot of time discussing these theories with customers, partners and analysts. However we don’t take the next step and scientifically test these theories in real customer situations.</p>
<p>We tend to rely on doing studies on customers using prototypes or mockups. But when customers aren’t in their real work environment, doing real work, the results tend to be suspect. Is the customer just telling you they like your new feature to make you feel good, even though they will probably never use it? Are the questions being asked at interviews slanted to get the answers the researcher wants?</p>
<p>I recently read “<a href="http://theleanstartup.com/">The Lean Startup</a>” by Eric Ries. This book, among other things, heavily recommends real scientific experiments with real customers in their real environment. No more separate studies with proof of concepts or mock ups. In a way we are doing this now. The only problem is that we don’t know the result until after four years and then it’s very hard to remove something that really didn’t work.</p>
<p>So how do we perform these experiments on real users in their real workplaces doing real work? Sure it’s easy for Facebook to try a new feature in say one town to see what the reaction is, but here we are talking about real business software that people rely on to run their businesses.</p>
<p>The real trick to this is to keep features small and only try small changes at a time. This is often referred to as a <a href="http://en.wikipedia.org/wiki/Minimum_viable_product">Minimum Viable Product</a> or MVP. Only the absolute minimum functionality to do the job is produced. Any additional functionality is only developed (and tested) due to customer demand. This tends to greatly reduce complexity and unnecessary bells and whistles that we see in so much software. This then allows features to be developed and tested quicker. In manufacturing this is referred to as keeping batch size small.</p>
<p>This requires a great deal of good instrumentation in the product, so we know if a feature is being used and if it is helping (are users really more productive entering invoices?). Creating a full release with all the changes from the work produced by a large team over a year is a major undertaking. But adding small changes that have been fully QA’ed is fairly easy. In fact we already do this with hotfixes. In a way each hotfix is an experiment as to whether we have fixed a defect (hopefully mostly we have). So why are small new features any different than hotfixes?</p>
<p>You might argue that SaaS vendors can do this easier, since they can introduced the change for just a few customers by routing them to a different application server. However with auto-update we could do the same for on-premise customers. Give them the new feature and then based on the results, if they are good, roll it out to all customers, but if they are bad, then roll it back for anyone that received it.</p>
<p>These techniques have produced great results in a number of well documented cases, but will they be accepted for business software? I think right now there will be a fair bit of resistance to these sort of practices, but I think it is really a PR exercise to prove to customers that by participating in these sort of experiments, that they will get the features they are asking for sooner and that the new features they receive will be far more valuable. One of the main advantages of these techniques is reducing waste, by detecting things that won’t work quickly and discarding them quickly. This way some really dumb idea can’t make its way all the way through development using all those resources, to just annoy users in the end. Chances are this will start with new <a href="http://smist08.wordpress.com/2011/01/22/on-connected-services/">connected services</a> or new on-line features, but I think eventually this could become more mainstream for even large ERP and CRM systems.</p>
<p><strong>Summary</strong></p>
<p>New techniques are being developed to develop customer value quickly and to get it into customer’s hands much faster than we have traditionally. However some of these techniques like experimenting on customers running live systems are going to take a bit of good PR to prove their value to get the necessary participation. If this all sounds crazy, give “The Lean Startup” a read, it paints a fairly compelling picture.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/smist08.wordpress.com/858/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/smist08.wordpress.com/858/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/smist08.wordpress.com/858/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/smist08.wordpress.com/858/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/smist08.wordpress.com/858/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/smist08.wordpress.com/858/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/smist08.wordpress.com/858/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/smist08.wordpress.com/858/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/smist08.wordpress.com/858/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/smist08.wordpress.com/858/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/smist08.wordpress.com/858/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/smist08.wordpress.com/858/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/smist08.wordpress.com/858/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/smist08.wordpress.com/858/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=smist08.wordpress.com&amp;blog=6216385&amp;post=858&amp;subd=smist08&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://smist08.wordpress.com/2012/01/01/on-customer-adoption/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1cb7e8c59f979d5b9800a1adfd8fe0d4?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">smist08</media:title>
		</media:content>

		<media:content url="http://smist08.files.wordpress.com/2012/01/timeline1.png?w=300" medium="image">
			<media:title type="html">timeline1</media:title>
		</media:content>
	</item>
		<item>
		<title>Tables and Data Flow of the Sage 300 ERP System Manager Module</title>
		<link>http://smist08.wordpress.com/2011/12/17/tables-and-data-flow-of-the-sage-300-erp-system-manager-module/</link>
		<comments>http://smist08.wordpress.com/2011/12/17/tables-and-data-flow-of-the-sage-300-erp-system-manager-module/#comments</comments>
		<pubDate>Sat, 17 Dec 2011 17:40:26 +0000</pubDate>
		<dc:creator>smist08</dc:creator>
				<category><![CDATA[Accpac 5.6A]]></category>
		<category><![CDATA[accpac]]></category>
		<category><![CDATA[administrative services]]></category>
		<category><![CDATA[bank]]></category>
		<category><![CDATA[common services]]></category>
		<category><![CDATA[database structure]]></category>
		<category><![CDATA[ERP]]></category>
		<category><![CDATA[Sage]]></category>
		<category><![CDATA[sage 300]]></category>
		<category><![CDATA[sage 300 erp]]></category>
		<category><![CDATA[sage accpac]]></category>
		<category><![CDATA[sage erp accpac]]></category>
		<category><![CDATA[system manager]]></category>
		<category><![CDATA[tax]]></category>

		<guid isPermaLink="false">http://smist08.wordpress.com/?p=852</guid>
		<description><![CDATA[This blog posting will be looking at the structure of some of the parts of the System Manager modules for the Sage 300 ERP product (previously known as Sage ERP Accpac). You can find the structure of the individual tables in the Sage 300 ERP Application Object Model (AOM). However this doesn’t tell you how [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=smist08.wordpress.com&amp;blog=6216385&amp;post=852&amp;subd=smist08&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>This blog posting will be looking at the structure of some of the parts of the <a href="http://findaccountingsoftware.com/directory/sage/accpac-erp/system-manager/">System Manager</a> modules for the <a href="http://www.sageaccpac.com/">Sage 300</a> ERP product (previously known as Sage ERP Accpac). You can find the structure of the individual tables in the <a href="https://customers.sagenorthamerica.com/irj/go/km/docs/sageKM/Sage%20Accpac%20ERP/Assets/AOM/Advantage.xml">Sage 300 ERP Application Object Model</a> (AOM). However this doesn’t tell you how the tables are related or how data flows from one table to another as you post various transactions. The System Manager tables consist of those of the mini-application modules that used to be bundled with System Manager (now just bundled with Sage 300 ERP). These include the 22 tables in Common Services, the 30 tables in <a href="http://www.youtube.com/watch?v=FgQjTpqa68Q">Bank Services</a>, the 9 tables in Tax Services and the 5 tables in G/L Sub-ledger Services. We’ll just look at a few interesting cases. Understanding these relationships can be especially important to people writing sophisticated custom reports or BI Views.</p>
<p>The main types of database tables in Sage 300 ERP applications can be categorized as:</p>
<ul>
<li>Setup</li>
<li>Master Data</li>
<li>Data Entry</li>
<li>Data Processing</li>
<li>Periodic Processing</li>
</ul>
<p>The System Manager tables contain information that is used in common by many of the main large Sage 300 ERP accounting modules like Account Receivable or Purchase Orders. The main concentration of tables is of the setup variety since these are setting up the company wide options and properties for the rest of the system.</p>
<p>Administrative Services keeps a few tables outside of the main database. Typically these are required to sign-on to the main database. These include the list of companies you can sign on to and the file with all the user ids and passwords. These are stored in a proprietary ISAM format derived from the old DOS based Accpac Plus database system.</p>
<p>A number of Currency and Security related tables are stored in the System Database. A System Database is shared by a number of Company Databases so that you can update this information in one place and have it used by many companies. The data in the System Database is replicated into each Company Database; so that when we are running we don’t need to do cross-database joins or open extra database connections to get this information. This way we get the advantages of sharing without the overhead of using extra database related resources.</p>
<p><a href="http://smist08.files.wordpress.com/2011/07/gl1.png"><img class="alignnone size-medium wp-image-636" title="gl1" src="http://smist08.files.wordpress.com/2011/07/gl1.png?w=300&#038;h=225" alt="" width="300" height="225" /></a></p>
<p><strong>Setup</strong></p>
<p>There are many setup tables across the System Manager functions:</p>
<p><em>Bank Services</em></p>
<p><strong>BKOPT (BK0010):</strong> Options.</p>
<p><strong>BKTT (BK0003):</strong> Distribution Codes (formally known as transaction types).</p>
<p><strong>BKTTX (BK0860):</strong> Bank Distribution Codes Tax Data.</p>
<p><strong>BKDISTH (BK0445):</strong> Bank Distribution Set Headers.</p>
<p><strong>BKDISTD (BK0440):</strong> Bank Distribution Set Details.</p>
<p><strong>BKCCTYP (BK0240):</strong> Credit Card Types.</p>
<p><strong>BKGLREF (BK0470):</strong> Bank G/L Integration.</p>
<p><em>Tax Services</em></p>
<p><strong>TXAUTH (TX0002):</strong> Tax authorities.</p>
<p style="padding-left:30px;"><strong>TXCLASS (TX0001):</strong> Tax classes.</p>
<p><strong>TXGRP (TX0003):</strong> Tax groups.</p>
<p><strong>TXRATE (TX0004):</strong> Tax rates.</p>
<p><strong>TXMATX (TX0902):</strong> Tax rate matrix. TXMATX controls interaction with TXRATE.</p>
<p><em>Administrative Services</em></p>
<p><strong>A4WUSER (AS0003):</strong> Users. This is an ISAM file and not in the database.</p>
<p><strong>A4WCUST (AS0004):</strong> Customization directories. This is an ISAM file and not in the database.</p>
<p><strong>ASORGS (AS0020):</strong> Companies.</p>
<p><strong>CSSEC (AS0001):</strong> Security groups. This is in the system database and cloned to all attached company databases.</p>
<p><strong>CSAUTH (AS0002):</strong> User authorizations. This is in the system database and cloned to all attached company databases.</p>
<p><strong>CSUICSH (AS0005):</strong> UI Cust. Profile Headers. This is in the system database and cloned to all attached company databases.</p>
<p style="padding-left:30px;"><strong>CSUICST (AS0006): </strong>UI Cust. Profile Details. This is in the system database and cloned to all attached company databases.</p>
<p><strong>CSUSCST (AS0007):</strong>  User UI Customizations. This is in the system database and cloned to all attached company databases.</p>
<p><em>Common Services</em></p>
<p><strong>CSCOM, CSCOM2 (CS0001):</strong> Company profile. (One view, two database tables).</p>
<p><strong>CSFSC (CS0002):</strong> Fiscal calendars.</p>
<p><strong>CSOPTFH (CS0011):</strong> Optional field headers.</p>
<p style="padding-left:30px;"><strong>CSOPTFD (CS0012):</strong> Optional field values.</p>
<p>All the currency tables are in the system database and cloned to all attached company databases.</p>
<p><strong>CSCCD (CS0003):</strong> Currency codes.</p>
<p><strong>CSCRT (CS0004):</strong> Rate types.</p>
<p><strong>CSCRH (CS0005):</strong> Currency tables.</p>
<p style="padding-left:30px;"><strong>CSCRD (CS0006):</strong> Currency rates.</p>
<p><strong>CSEUR (CS0010):</strong> Euro fixed conversion rates. This was only used during the transition period to the Euro. If the Euro falls apart, we may need one to transition out of the Euro.</p>
<p><strong>CSSKTB (CS0030):</strong> Schedules.</p>
<p style="padding-left:30px;">Optional Details:</p>
<p style="padding-left:30px;"><strong>CSSKAP (CS0032):</strong> Schedule Application Links.</p>
<p style="padding-left:30px;"><strong>CSSKCB (CS0034):</strong> Schedules.</p>
<p><strong>CSSKID (CS0036):</strong> Access to Scheduling.</p>
<p><strong>Master Data</strong></p>
<p>The only master data in System Manager is the always important Bank Accounts.</p>
<p><strong>BKACCT (BK0001):</strong> Bank Accounts.</p>
<p style="padding-left:30px;"><strong>BKCUR (BK0002):</strong> Currencies.</p>
<p style="padding-left:30px;"><strong>BKFORM (BK0008):</strong> Check stocks.</p>
<p>BKACCT has many more detail views to do with checks, deposits, entries and NSFs; but, we’ll cover those in the following sections.</p>
<p><strong>Data Entry</strong></p>
<p><em>Reconcile Statements</em></p>
<p>Most documents like checks, deposits, NSFs, etc. actually come from the sub-ledgers. The Bank module is mostly to reconcile these once your bank statements come in. However you do need to enter Bank entries and to start you need to enter some manual checks and deposits to setup the Bank balances correctly. This section covers all the tables involved in the process of entering bank documents and reconciling them. In Bank nearly everything is a detail of BKACCT, so this appears again at the top.</p>
<p><strong>BKACCT (BK0001):</strong> Banks.</p>
<p style="padding-left:30px;"><strong>BKTRANH (BK0845):</strong> Transaction Headers (can be withdrawal or deposit).</p>
<p style="padding-left:30px;">                <strong>BKTRAND (BK0840):</strong> Transaction Details.</p>
<p style="padding-left:30px;"><strong>BKENTH (BK0665):</strong> Bank Entry Headers.</p>
<p style="padding-left:30px;">                <strong>BKENTD (BK0660):</strong> Bank entry details.</p>
<p><strong>BKDCI (BK0104):</strong> Direct clearing interface. Superview on top of BKTRAN to help the UI reconcile withdrawals and deposits.</p>
<p><em>Journal Entry</em></p>
<p>The entry function in G/L Sub-ledger Services handles the case of whether G/L is activated or not. Rather than sub-ledgers writing to G/L directly, they write to these views. Then sub-ledger services either writes these through to G/L, or if G/L isn’t present then it writes them to CSV files that can be imported into another G/L.</p>
<p><strong>GPGLPO (GP0950):</strong> Transaction transfer. The superview stores data in the following views:</p>
<p style="padding-left:30px;"><strong>GPGLBB (GP0100):</strong> Subledger transactions.</p>
<p style="padding-left:30px;"><strong>GPGLBH (GP0120):</strong> Subledger entries.</p>
<p style="padding-left:30px;"><strong>GPGLBD (GP0110):</strong> Subledger details.</p>
<p><strong>Data Processing</strong></p>
<p>Bank has two big processing functions, namely printing checks and then posting reconciliations. Tax Services then has calculating sales tax and keeping sales tax records.</p>
<p><strong>BKREG (BK0009):</strong> Check register. Sub-ledgers put the checks they want printed here, then printing of checks is done through an icon in bank BK5000 &#8211; Check print User Interface.</p>
<p><strong>BKPOST (BK0101):</strong> Reconciliation posting.</p>
<p style="padding-left:30px;"><strong>BKJCTL (BK0020):</strong> Posting journal control.</p>
<p style="padding-left:30px;"><strong>BKJRNL (BK0011):</strong> Posting journal.</p>
<p style="padding-left:30px;"><strong>BKJTRANH (BK0655):</strong> Bank journal transaction header.</p>
<p style="padding-left:60px;"><strong>BKJTRAND (BK0650):</strong> Bank journal transaction details.</p>
<p style="padding-left:30px;"><strong>BKJENTH (BK0665):</strong> Entry posting journal header.</p>
<p style="padding-left:30px;">                <strong>BKJENTD (BK0660):</strong> Entry posting journal details.</p>
<p style="padding-left:30px;"><strong>BKJERR (BK0012):</strong> Posting journal errors.</p>
<p><strong>TXCALC (TX0901):</strong> Tax calculation (low level engine).</p>
<p><strong>TXDCALC (TX0910):</strong> Tax document calculation (higher level engine).</p>
<p><strong>TXALLOC (TX0904):</strong> Tax allocation (superview).</p>
<p><strong>TXAUDH (TX0011):</strong> Tax tracking.</p>
<p style="padding-left:30px;"><strong>TXAUDD (TX0012):</strong> Tax tracking details.</p>
<p><strong>Periodic Processing</strong></p>
<p>There are a set of superviews that perform various periodic processing functions. These Views typically don’t have tables behind them and perform maintenance type operations. Some of these include:</p>
<p><strong>BKCLEAR (BK0103):</strong> Clear reconciliation posting journals.</p>
<p><strong>BKDCHK (BK0100):</strong> Bank Integrity checker.</p>
<p><strong>TXCLEAR (TX0903):</strong> Tax audit clearing.</p>
<p><strong>TXDCHK (TX0990):</strong> Tax integrity checker.</p>
<p><strong>ASINTCHK (AS0010):</strong> Admin Services Integrity Checker.</p>
<p><strong>ASINTPR (AS0023):</strong> Data Integrity checker superview.</p>
<p><strong>ASRST (AS0021):</strong> Restart Records. (Actually an ISAM file and not in the database).</p>
<p><strong>CSDCHK (CS0009):</strong> Common Services Integrity checker.</p>
<p><strong>GPGLFMT (GP0800):</strong> Segment substitution.</p>
<p><strong>GPGLPE (GP0930):</strong> Transaction transfer.</p>
<p><strong>GPDCHK (GP0099):</strong> G/L Sub-ledger Services Integrity checker.</p>
<p><strong>Summary</strong></p>
<p>Hopefully this blog posting provides a bit more insight into how the various System Manager modules operates and hopefully helps when you use them, interface to them or are creating custom reports.</p>
<p><strong> </strong></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/smist08.wordpress.com/852/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/smist08.wordpress.com/852/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/smist08.wordpress.com/852/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/smist08.wordpress.com/852/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/smist08.wordpress.com/852/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/smist08.wordpress.com/852/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/smist08.wordpress.com/852/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/smist08.wordpress.com/852/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/smist08.wordpress.com/852/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/smist08.wordpress.com/852/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/smist08.wordpress.com/852/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/smist08.wordpress.com/852/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/smist08.wordpress.com/852/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/smist08.wordpress.com/852/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=smist08.wordpress.com&amp;blog=6216385&amp;post=852&amp;subd=smist08&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://smist08.wordpress.com/2011/12/17/tables-and-data-flow-of-the-sage-300-erp-system-manager-module/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1cb7e8c59f979d5b9800a1adfd8fe0d4?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">smist08</media:title>
		</media:content>

		<media:content url="http://smist08.files.wordpress.com/2011/07/gl1.png?w=300" medium="image">
			<media:title type="html">gl1</media:title>
		</media:content>
	</item>
		<item>
		<title>Tables and Data Flow of the Sage 300 ERP Payroll Module</title>
		<link>http://smist08.wordpress.com/2011/12/10/tables-and-data-flow-of-the-sage-300-erp-payroll-module/</link>
		<comments>http://smist08.wordpress.com/2011/12/10/tables-and-data-flow-of-the-sage-300-erp-payroll-module/#comments</comments>
		<pubDate>Sat, 10 Dec 2011 19:45:14 +0000</pubDate>
		<dc:creator>smist08</dc:creator>
				<category><![CDATA[Accpac 5.6A]]></category>
		<category><![CDATA[database structure]]></category>
		<category><![CDATA[database tables]]></category>
		<category><![CDATA[payroll]]></category>
		<category><![CDATA[Sage]]></category>
		<category><![CDATA[sage 300]]></category>
		<category><![CDATA[sage 300 erp]]></category>
		<category><![CDATA[sage accpac]]></category>
		<category><![CDATA[sage erp accpac]]></category>

		<guid isPermaLink="false">http://smist08.wordpress.com/?p=840</guid>
		<description><![CDATA[This blog posting will be looking at the structure of some of the parts of the Canadian and U.S. Payroll modules for the Sage 300 ERP product (previously known as Sage ERP Accpac). You can find the structure of the individual tables in the Sage 300 ERP Application Object Model (AOM). However this doesn’t tell [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=smist08.wordpress.com&amp;blog=6216385&amp;post=840&amp;subd=smist08&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>This blog posting will be looking at the structure of some of the parts of the Canadian and U.S. <a href="http://en.wikipedia.org/wiki/Payroll">Payroll</a> modules for the <a href="http://www.sageaccpac.com/">Sage 300</a> ERP product (previously known as Sage ERP Accpac). You can find the structure of the individual tables in the <a href="https://customers.sagenorthamerica.com/irj/go/km/docs/sageKM/Sage%20Accpac%20ERP/Assets/AOM/Advantage.xml">Sage 300 ERP Application Object Model</a> (AOM). However this doesn’t tell you how the tables are related or how data flows from one table to another as you post various transactions. There about 99 database tables in either the U.S. or Canadian Payroll module, so obviously we can’t describe each in a single blog post. We’ll just look at a few interesting cases. Understanding these relationships can be especially important to people writing sophisticated custom reports or BI Views.</p>
<p>The main types of database tables in Payroll can be categorized as:</p>
<ul>
<li>Setup</li>
<li>Master Data</li>
<li>Data Entry</li>
<li>Data Processing</li>
<li>Periodic Processing</li>
</ul>
<p>The Payroll modules feed data into both General Ledger and Project and Job Costing. Payroll also interacts very closely with the Bank module for the processing of paychecks. Each Payroll module contains a main common portion which is mostly shared; these contain all the files that start with cp or up. Then for each Payroll there is a Payroll calculation module which has the country specific tables, reports and calculations; these include the tables that start with: CT or UT. Often as the government changes the Payroll rules and rates, we just need to updated and distribute updated CT and UT applications rather than the larger core CP or UP application.</p>
<p>In the descriptions below we will list the U.S. Payroll table name and View IDs. However to get the Canadian Payroll versions, just replace the UP with CP and you have it. Most of these are compiled from the same source code (which uses PR) and then UP or CP are substituted in as part of the product build process.</p>
<p>Incidentally this is the same Payroll module that is used in the Sage HRMS SQL Payroll product, so everything here applies there as well.</p>
<p><a href="http://smist08.files.wordpress.com/2011/07/gl1.png"><img class="alignnone size-medium wp-image-636" title="gl1" src="http://smist08.files.wordpress.com/2011/07/gl1.png?w=300&#038;h=225" alt="" width="300" height="225" /></a></p>
<p><strong>Setup</strong></p>
<p>Setting up Payroll correctly is the most crucial task to have things run smoothly. If all the employees and their earnings and deductions are configured correctly then processing Payroll will go much smoother. The Setup Tables are:</p>
<p><strong>UPOPTS (UP0023):</strong> Options.</p>
<p><strong>UPCLAS (UP0006):</strong> Class codes.</p>
<p><strong>UPDTLM (UP0007):</strong> Earnings/deductions. (UPDTLX, UP0099 is UP0007, without some of its functionality for faster read access.)</p>
<p style="padding-left:30px;"><strong>UPINCL (UP0015):</strong> Include list. Used by UPTXMS, too. Holds the applicable taxes for each E/D.</p>
<p style="padding-left:30px;"><strong>UPDIST (UP0009):</strong> Distribution codes.</p>
<p><strong>UPWCCH (UP0036):</strong> Worker’s compensation master.</p>
<p style="padding-left:30px;"><strong>UPWCCD (UP0037): </strong>Worker’s compensation codes.</p>
<p><strong>UPOTSC (UP0022):</strong> Overtime schedules.</p>
<p><strong>UPSHFT (UP0025):</strong> Shift differential schedules.</p>
<p><strong>UPSHFD (UP0038):</strong> Shift Differential Details.</p>
<p><strong>UPSHFB (UP0039):</strong> Shift Differential Billing Details.</p>
<p><strong>UPTXMS (UP0029):</strong> Company payroll taxes.</p>
<p style="padding-left:30px;"><strong>UPINCL (UP0015):</strong> Include list.</p>
<p style="padding-left:30px;"><strong>UPDIST (UP0009):</strong> Distribution codes.</p>
<p style="padding-left:30px;"><strong>UPTXMO (UP0124):</strong> Taxes Optional Field Values.</p>
<p><strong>UPWRKC (UP0027):</strong> Work Classification Codes.</p>
<p><strong>UPOFH (UP0120):</strong> Optional Field Locations.</p>
<p><strong>UPOFD (UP0121):</strong> Optional Field Values.</p>
<p><strong>UPGLREF (UP0057):</strong> G/L Reference Intergration.</p>
<p><strong>Master Data</strong></p>
<p>The main master data file for Payroll is the Employees. Then secondarily we have Employee selection lists.</p>
<p><strong>UPEMPL (UP0014):</strong> Employees</p>
<p style="padding-left:30px;"><strong>UPEMPD (UP0008):</strong> Employee earnings/deductions.</p>
<p style="padding-left:30px;"><strong>UPEMPT (UP0010):</strong> Employee taxes.</p>
<p style="padding-left:30px;"><strong>UPEMPC (UP0053):</strong> Employee notes.</p>
<p style="padding-left:30px;"><strong>UPEMBK (UP0201):</strong> Employee EFT Banks.</p>
<p style="padding-left:30px;"><strong>UPEMPO (UP0122):</strong> Employee Optional Field Values.</p>
<p style="padding-left:30px;"><strong>UPEMTF (UP0062):</strong> Employee Tax Fields (Implicitly handled by UP0014).</p>
<p><strong>UPESLH                (UP0045):</strong> Employee selection lists.</p>
<p style="padding-left:30px;"><strong>UPESLD (UP0046):</strong> Employee selection list members.</p>
<p>There is no master of monetary balances as GL has.  The detail for all checks issued is kept in the following, which serves as a master and detail archive all in one.</p>
<p><strong>UPCHKH (UP0048):</strong> Check Header. (Holds completed and un-posted checks.)</p>
<p style="padding-left:30px;"><strong>UPCHKD (UP0049): </strong>Check Details.</p>
<p style="padding-left:30px;">                <strong>UPCHDO (UP0134):</strong> Check detail optional field values.</p>
<p style="padding-left:30px;">                <strong>UPCHJB (UP0056):</strong> Check job details.</p>
<p style="padding-left:30px;">                                <strong>UPCHJO (UP0144):</strong> Check job details optional field values.</p>
<p style="padding-left:30px;"><strong>UPCHKC (UP0052):</strong> Check comment details.</p>
<p style="padding-left:30px;"><strong>UPCHKE (UP0202):</strong> Check EFT details.</p>
<p style="padding-left:30px;"><strong>UPCHHO (UP0133):</strong> Check header optional field values.</p>
<p><strong>Data Entry</strong></p>
<p>The main data entry task for Payroll is the entry of Timecards. A common integration is for ISVs to feed Timecard data into Payroll from an external system (like a time clock check-in system). You may also need to enter some manual checks.</p>
<p><strong>UPTCHD (UP0031):</strong> Timecard headers.</p>
<p style="padding-left:30px;"><strong>UPTCDT (UP0032):</strong> Timecard details.</p>
<p style="padding-left:30px;">                <strong>UPTCDO (UP0128):</strong> Timecard detail optional field values.</p>
<p style="padding-left:30px;">                <strong>UPTCJB (UP0042):</strong> Timecard job details.</p>
<p style="padding-left:30px;">                                <strong>UPTCJO (UP0141):</strong> Timecard jobs optional field values.</p>
<p style="padding-left:30px;"><strong>UPTCHO (UP0127):</strong> Timecard optional field values.</p>
<p><a href="http://smist08.files.wordpress.com/2011/12/payroll1.png"><img class="alignnone size-medium wp-image-843" title="payroll1" src="http://smist08.files.wordpress.com/2011/12/payroll1.png?w=300&#038;h=195" alt="" width="300" height="195" /></a></p>
<p><strong>UPMCHD (UP0019):</strong> Manual check headers</p>
<p style="padding-left:30px;"><strong>UPMCDT (UP0020):</strong> Manual check details.</p>
<p style="padding-left:30px;">                <strong>UPMCDO (UP0130):</strong> Manual check detail optional field values.</p>
<p style="padding-left:30px;">                <strong>UPMCJB (UP0043):</strong> Manual check job details.</p>
<p style="padding-left:30px;">                                <strong>UPMCJO (UP0142):</strong> Manual check job detail optional field values.</p>
<p style="padding-left:30px;"><strong>UPMCHO (UP0129):</strong> Manual check optional field values.</p>
<p><a href="http://smist08.files.wordpress.com/2011/12/payroll2.png"><img class="alignnone size-medium wp-image-844" title="payroll2" src="http://smist08.files.wordpress.com/2011/12/payroll2.png?w=300&#038;h=195" alt="" width="300" height="195" /></a></p>
<p><a href="http://smist08.files.wordpress.com/2011/12/payroll3.png"><img class="alignnone size-medium wp-image-845" title="payroll3" src="http://smist08.files.wordpress.com/2011/12/payroll3.png?w=300&#038;h=200" alt="" width="300" height="200" /></a></p>
<p><strong>Data Processing</strong></p>
<p>The Calculate Payroll process is the central part of Payroll. This takes all the setup, employee and timecard data and calculates the Payroll. This includes all taxes and deductions, sets up everything to print checks and advice and record all the values that need to be accrued.</p>
<p><strong>UPCALC (UP0083):</strong> Superview to calculate payroll.</p>
<p style="padding-left:30px;"><strong>UPCLCO (UP0137):</strong> Calculate payroll optional field values. Since UPCALC has no data, these optional fields have no header.</p>
<p style="padding-left:30px;"><strong>UPCALE  (UP0084):</strong> E/D/T List, helper to UP0083</p>
<p style="padding-left:30px;"><strong>UPTXMC (UP0100):</strong> Include List, table helper, used internally in conjunction with Tax Master by UP0084.</p>
<p style="padding-left:30px;"><strong>UPCALT (UP0085): </strong>Timecard List, helper to UP0083.</p>
<p style="padding-left:30px;"><strong>UPCALA (UP0086):</strong> Cost Center Allocations (there is data here).</p>
<p style="padding-left:30px;"><strong>UPCHKR (UP0088):</strong> Check Run Header, temporary table helper to UP0083.</p>
<p style="padding-left:30px;"><strong>UPCTRL (UP0026):</strong> Concurrency Control.</p>
<p style="padding-left:30px;"><strong>UPXCPT (UP0064): </strong>Calculate Payroll Exceptions, produced by UP0083 if errors detected.</p>
<p><a href="http://smist08.files.wordpress.com/2011/12/payroll4.png"><img class="alignnone size-medium wp-image-847" title="payroll4" src="http://smist08.files.wordpress.com/2011/12/payroll4.png?w=300&#038;h=204" alt="" width="300" height="204" /></a></p>
<p>Once the calculate Payroll is performed, the next big process is printing all the checks.</p>
<p><strong>UPPMAN (UP0065):</strong> Process Manual Checks (called by UP0078 , UI ‘Process’ button, and Process Icon).</p>
<p><strong>UPCTRL (UP0026):</strong> Concurrency Control.</p>
<p><strong>UPXCPT (UP0064):</strong> Calc Payroll Exceptions, produced by UP0065 if errors detected.</p>
<p><strong>UPHHAU (UP0021):</strong> History Audit Headers.</p>
<p><strong>UPHHOA (UP0135):</strong> History audit header optional field values.</p>
<p><strong>UPHDAU (UP0024): </strong>History Audit Details.</p>
<p><strong>                UPHDOA (UP0136):</strong> History Audit detail optional field values.</p>
<p><strong>UPPCKS (UP0078):</strong> Print Checks, controls the Print process and calls Post (UP0050).</p>
<p><strong>UPPCKF                (UP0089): </strong>Print Checks Trans, temporary helper to UP0078.</p>
<p>Updates the following staging tables for printing. When you print checks, part of the header is transfer to the BKCHK table which drives check printing. Then the Payroll Crystal check forms will join back to the following two tables to get all the Payroll specific data they need for the check and advice.</p>
<p><strong>UPPCKH (UP0079):</strong> Print Checks Header.</p>
<p style="padding-left:30px;"><strong>UPPCKD (UP0080):</strong> Print Checks Details.</p>
<p><a href="http://smist08.files.wordpress.com/2011/12/payroll5.png"><img class="alignnone size-medium wp-image-848" title="payroll5" src="http://smist08.files.wordpress.com/2011/12/payroll5.png?w=300&#038;h=209" alt="" width="300" height="209" /></a></p>
<p><em>Post All Checks</em></p>
<p>Called internally by UP0078, UP0083 and UP0012.</p>
<p><strong>UPPOST (UP0050):</strong> Post checks.</p>
<p>Updates the following tables as needed:</p>
<p><strong>UPMCHD (UP0019):</strong> Manual Checks Header</p>
<p style="padding-left:30px;"><strong>UPMCDT (UP0020):</strong> Manual Checks Detail</p>
<p><strong>UPCHKH (UP0048):</strong> Check Header</p>
<p style="padding-left:30px;"><strong>UPCHKD (UP0049):</strong> Check Detail</p>
<p><strong>UPYTDS                (UP0047):</strong> Employee YTD summaries</p>
<p><strong>CPEUIC (UP0030):</strong> Employee EI history (Canadian payroll only).</p>
<p><strong>Periodic Processing</strong></p>
<p>There are a set of superviews that perform various periodic processing functions. These Views typically don’t have tables behind them and perform maintenance type operations. Some of these include:</p>
<p><strong>UPMAIN (UP0018):</strong>  Delete inactive records.</p>
<p><strong>UPDCHK: (UP0016): </strong>Integrity checker.</p>
<p>Update All employees:</p>
<p><strong>UPGMET (UP0058):</strong> Globally modify process.</p>
<p style="padding-left:30px;">Uses the following table:</p>
<p style="padding-left:30px;"><strong>UPGLBM (UP0051):</strong> Globally modify list.</p>
<p><strong>Summary</strong></p>
<p>Hopefully this blog posting provides a bit more insight into how Payroll operates and hopefully helps when you use Payroll, interface to Payroll or are creating custom Payroll reports.</p>
<p><strong> </strong></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/smist08.wordpress.com/840/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/smist08.wordpress.com/840/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/smist08.wordpress.com/840/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/smist08.wordpress.com/840/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/smist08.wordpress.com/840/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/smist08.wordpress.com/840/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/smist08.wordpress.com/840/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/smist08.wordpress.com/840/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/smist08.wordpress.com/840/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/smist08.wordpress.com/840/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/smist08.wordpress.com/840/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/smist08.wordpress.com/840/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/smist08.wordpress.com/840/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/smist08.wordpress.com/840/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=smist08.wordpress.com&amp;blog=6216385&amp;post=840&amp;subd=smist08&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://smist08.wordpress.com/2011/12/10/tables-and-data-flow-of-the-sage-300-erp-payroll-module/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1cb7e8c59f979d5b9800a1adfd8fe0d4?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">smist08</media:title>
		</media:content>

		<media:content url="http://smist08.files.wordpress.com/2011/07/gl1.png?w=300" medium="image">
			<media:title type="html">gl1</media:title>
		</media:content>

		<media:content url="http://smist08.files.wordpress.com/2011/12/payroll1.png?w=300" medium="image">
			<media:title type="html">payroll1</media:title>
		</media:content>

		<media:content url="http://smist08.files.wordpress.com/2011/12/payroll2.png?w=300" medium="image">
			<media:title type="html">payroll2</media:title>
		</media:content>

		<media:content url="http://smist08.files.wordpress.com/2011/12/payroll3.png?w=300" medium="image">
			<media:title type="html">payroll3</media:title>
		</media:content>

		<media:content url="http://smist08.files.wordpress.com/2011/12/payroll4.png?w=300" medium="image">
			<media:title type="html">payroll4</media:title>
		</media:content>

		<media:content url="http://smist08.files.wordpress.com/2011/12/payroll5.png?w=300" medium="image">
			<media:title type="html">payroll5</media:title>
		</media:content>
	</item>
		<item>
		<title>Unit Testing Web UIs in Sage 300 ERP</title>
		<link>http://smist08.wordpress.com/2011/12/03/unit-testing-web-uis-in-sage-300-erp/</link>
		<comments>http://smist08.wordpress.com/2011/12/03/unit-testing-web-uis-in-sage-300-erp/#comments</comments>
		<pubDate>Sat, 03 Dec 2011 17:07:09 +0000</pubDate>
		<dc:creator>smist08</dc:creator>
				<category><![CDATA[Software Architecture]]></category>
		<category><![CDATA[Software Development Lifecycle]]></category>
		<category><![CDATA[accpac]]></category>
		<category><![CDATA[easymock]]></category>
		<category><![CDATA[ERP]]></category>
		<category><![CDATA[gwt]]></category>
		<category><![CDATA[gwttestcase]]></category>
		<category><![CDATA[junit]]></category>
		<category><![CDATA[mvc]]></category>
		<category><![CDATA[Sage]]></category>
		<category><![CDATA[sage 300]]></category>
		<category><![CDATA[sage 300 erp]]></category>
		<category><![CDATA[sage accpac]]></category>
		<category><![CDATA[sage accpac erp]]></category>
		<category><![CDATA[unit testing]]></category>

		<guid isPermaLink="false">http://smist08.wordpress.com/?p=833</guid>
		<description><![CDATA[Introduction Unit Testing is a technique to test individual units of source code. Usually in the Java world this means a set of tests to test an individual class. The idea is to test the class (or unit) in complete isolation from the rest of the system, so calls to other parts of the system [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=smist08.wordpress.com&amp;blog=6216385&amp;post=833&amp;subd=smist08&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://smist08.files.wordpress.com/2011/12/bugs.png"><img class="alignnone size-medium wp-image-835" title="bugs" src="http://smist08.files.wordpress.com/2011/12/bugs.png?w=300&#038;h=35" alt="" width="300" height="35" /></a></p>
<p><strong>Introduction</strong></p>
<p><a href="http://en.wikipedia.org/wiki/Unit_testing">Unit Testing</a> is a technique to test individual units of source code. Usually in the Java world this means a set of tests to test an individual class. The idea is to test the class (or unit) in complete isolation from the rest of the system, so calls to other parts of the system would be <a href="http://en.wikipedia.org/wiki/Method_stub">stubbed</a> or <a href="http://en.wikipedia.org/wiki/Mock_object">mocked</a> out. Unit test are typically written by the software developer to perform white box testing for their class. Unit testing is only one sort of testing there would be other types of testing for various integration testing, user testing, load testing, manual testing, etc.</p>
<p>The goal of unit testing is to show that the individual parts of a program are correct and then to deliver the following benefits:</p>
<ul>
<li>Establish a well-defined written contract of what the code must do.</li>
<li>Find problems early in the development cycle.</li>
<li>Facilitate change and refactoring since you can rely on the unit tests to prove things still work.</li>
<li>Simplify integration since you know the building blocks work correctly.</li>
<li>Provide documentation, the unit tests show examples of actually using the class being tested.</li>
</ul>
<p>In <a href="http://en.wikipedia.org/wiki/Extreme_Programming">Extreme Programming</a> and <a href="http://en.wikipedia.org/wiki/Test-driven_development">Test Driven Development</a>, the unit tests are written first and then passing the unit tests acts as an acceptance criterion that the code is complete.</p>
<p><strong>JUnit</strong></p>
<p><a href="http://en.wikipedia.org/wiki/JUnit">JUnit</a> is a unit testing framework for Java programs. It is integrated into most IDEs like Eclipse and it is easy to run the tests from build tools like Ant. Usually in Eclipse you have a test tree with all the test classes, usually a test class for each real class and the test class containing all the tests for the real class. JUnit support a number of annotations that you put on the methods in the test class to specify which ones are tests to run as well as optionally specifying any order or dependency requirements (the best unit tests run completely independently of each other). Then it adds a number of methods to call to test for pass and failure of the tests (via various forms of assert) and to report the results back to the test framework.</p>
<p><strong>GWT</strong></p>
<p>The <a href="http://en.wikipedia.org/wiki/Google_Web_Toolkit">Google Web Toolkit (GWT)</a> supports unit testing with something called GWTTestCase which bridges GWT to JUnit. If you want to interact with GWT controls then you have to use this. However it’s relatively slow. You want unit tests to run blazingly fast. A unit test should only take a few milliseconds to execute. If it takes longer then it won’t be run often. You want it so your unit tests can be run every time you compile and so they don’t slow you down as you work.</p>
<p>We use GWTTestCase to test our extension of the GWT CellTable widget. These tests take 10 minutes to run. This is way too slow to expect them to be run on a regular basis. Hence they don’t provide the immediate feedback to a developer working on this widget that we would like.</p>
<p>Fortunately since in GWT you are writing all your classes in Java, if you structure your program correctly you can have most of your classes not interact with GWT or easily mock the GWT part of it. Then you can use JUnit directly to unit test your program.</p>
<p><strong>MVC</strong></p>
<p>One of the key goals of us enforcing <a href="http://smist08.wordpress.com/2011/10/29/sage-300-erp-web-uis-and-mvc/">MVC</a> design patterns on our developers creating UIs is to facilitate good unit testing. This way if most of the code that needs testing is the Model and Controller, these can be tested with JUnit and we don’t need to use GWTTestCase. This greatly simplifies unit testing and greatly improves the productivity and speed of the tests. Usually our View part is very small and mostly implemented in the SWT framework, so the unit testing is then in framework unit tests (many of which are GWTTestCase), and not in the actual UIs.</p>
<p><strong>EasyMock</strong></p>
<p><a href="http://easymock.org/">EasyMock</a> is a library that can dynamically “mock” classes that aren’t part of the test. With unit tests we only want to test the one class at a time and we want the tests to run quickly. We don’t want to require a particular database be in place and then have to wait for the tests to run as it makes database queries. We want the tests to run in milliseconds and we want the tests to run in spite of what might be happening in the rest of the system. To this end the test framework needs to replace the real classes that the class being tested calls and interacts with, with something appropriate for testing. These test replacement classes then have the ability to return unexpected or rare results such as network disconnection errors, or other rare hard to setup type of scenarios. One way to do this is to write “stub” classes that replace the real classes and then only have code to do what is required for the testing. Writing and maintaining stub classes is difficult since you need to keep them in sync with the classes they are stubbing; keeping these correct can become a major amount of work.</p>
<p>EasyMock offers an easier way. It generates the classes on the fly using Java’s proxy mechanism. This way the class interface is always up to date since it is generated from the real class. You first run in a “recording” mode where you record what you want the various methods to return to the test cases. Then you switch to “play” mode and run the tests.</p>
<p>For this to work effectively, you must design classes so classes they use can be mocked. This usually means creating them externally and then passing them to the constructor rather than creating secret internal instances. Generally this is good object oriented design anyway and usually difficulty in constructing unit tests is a “<a href="http://en.wikipedia.org/wiki/Code_smell">code smell</a>” that something is wrong with the design.  For simple utility classes or simple classes in the same package, it’s often easier to leave them in place rather than mock them, then they get a bit of testing as well and as long as they run quickly, shouldn’t be a problem.</p>
<p><strong>Example</strong></p>
<p>Below is one of the tests from the BOM Detail popup form in Order Entry. This shows the structure of a JUnit test and shows how to mock a big class (namely the Model) that this class interacts with. Notice that the Model is created externally to this class and passed into the constructor, so it is easy to mock. First we record what the mock class should do and then we switch to replay mode to do the actual test.</p>
<p><strong>public</strong> <strong>class</strong> NestedViewBOMDetailsCallbackTest<br />
{<br />
<strong>private</strong> <strong>static</strong> <strong>final</strong> <strong>int</strong> <em>TEST_PARENT_COMPONENT_NUMBER</em> = 42;</p>
<p>/**<br />
* Tests that the callback&#8217;s onPopupClosed handler will filter on the child<br />
* BOMs of the parent component number that was passed in at <span style="text-decoration:underline;">callback<br />
</span>    * creation time.<br />
*/<br />
@Test<br />
<strong>public</strong> <strong>void</strong> testOnPopupClosedFiltersOnChildrenOfCallerParentBOMNumber()<br />
{<br />
// Set up the mock model and the expected method calls that should be<br />
// made on it by the class under test.<br />
OEDocumentBOMDetailsModel mockModel = <span style="text-decoration:underline;">EasyMock</span>.createMock(OEDocumentBOMDetailsModel.<strong>class</strong>);<br />
mockModel.filterOnChildBOMsOf(<span style="text-decoration:underline;">EasyMock</span>.eq(<em>TEST_PARENT_COMPONENT_NUMBER</em>), <span style="text-decoration:underline;">EasyMock</span>.isA(EntryFilterCallback.<strong>class</strong>));<br />
<span style="text-decoration:underline;">EasyMock</span>.expectLastCall();</p>
<p>// Tell EasyMock we&#8217;ve finished our setup so that any time we interact<br />
// with the mock, EasyMock records what calls were made on the mock.<br />
<span style="text-decoration:underline;">EasyMock</span>.replay(mockModel);</p>
<p>// Call the class under test to exercise the method under test.<br />
NestedViewBOMDetailsCallback callback = <strong>new</strong> NestedViewBOMDetailsCallback(mockModel, <span style="text-decoration:underline;">EasyMock<br />
</span>            .createMock(BOMDetailsView.<strong>class</strong>), <em>TEST_PARENT_COMPONENT_NUMBER</em>);<br />
callback.onPopupClosed(<strong>null</strong>);</p>
<p>// Check that the expected method calls on the mock happened when we<br />
// exercised the method under test.<br />
<span style="text-decoration:underline;">EasyMock</span>.verify(mockModel);<br />
}<br />
}</p>
<p><strong>Summary</strong></p>
<p>Unit testing is an effective form of testing that does find quite a few bugs and helps keep code running smoothly as a system is developed and refactored going forwards. Sometimes the discipline of unit testing forces programmers to ensure they fully understand a problem before coding resulting in a better solution. Certainly this can’t be the only form of testing, but it is an important building block to a quality software system.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/smist08.wordpress.com/833/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/smist08.wordpress.com/833/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/smist08.wordpress.com/833/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/smist08.wordpress.com/833/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/smist08.wordpress.com/833/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/smist08.wordpress.com/833/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/smist08.wordpress.com/833/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/smist08.wordpress.com/833/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/smist08.wordpress.com/833/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/smist08.wordpress.com/833/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/smist08.wordpress.com/833/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/smist08.wordpress.com/833/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/smist08.wordpress.com/833/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/smist08.wordpress.com/833/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=smist08.wordpress.com&amp;blog=6216385&amp;post=833&amp;subd=smist08&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://smist08.wordpress.com/2011/12/03/unit-testing-web-uis-in-sage-300-erp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1cb7e8c59f979d5b9800a1adfd8fe0d4?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">smist08</media:title>
		</media:content>

		<media:content url="http://smist08.files.wordpress.com/2011/12/bugs.png?w=300" medium="image">
			<media:title type="html">bugs</media:title>
		</media:content>
	</item>
		<item>
		<title>Competing Web Development Systems</title>
		<link>http://smist08.wordpress.com/2011/11/26/competing-web-development-systems/</link>
		<comments>http://smist08.wordpress.com/2011/11/26/competing-web-development-systems/#comments</comments>
		<pubDate>Sat, 26 Nov 2011 18:36:44 +0000</pubDate>
		<dc:creator>smist08</dc:creator>
				<category><![CDATA[Software Architecture]]></category>
		<category><![CDATA[Software Development Lifecycle]]></category>
		<category><![CDATA[accpac]]></category>
		<category><![CDATA[dart]]></category>
		<category><![CDATA[ERP]]></category>
		<category><![CDATA[gwt]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[node.js]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[Sage]]></category>
		<category><![CDATA[sage 300]]></category>
		<category><![CDATA[sage 300 erp]]></category>
		<category><![CDATA[sage accpac]]></category>
		<category><![CDATA[sage erp accpac]]></category>

		<guid isPermaLink="false">http://smist08.wordpress.com/?p=828</guid>
		<description><![CDATA[Introduction The pace of development of Web based applications has been frenetic. The pace of development of tools to program the Web is also frenetic. There are new programming languages, libraries, servers and systems announced daily. Whatever happened to the good old days where you got a new version of Visual Studio and an updated [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=smist08.wordpress.com&amp;blog=6216385&amp;post=828&amp;subd=smist08&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://smist08.files.wordpress.com/2011/11/logos.png"><img class="alignnone size-medium wp-image-830" title="logos" src="http://smist08.files.wordpress.com/2011/11/logos.png?w=300&#038;h=122" alt="" width="300" height="122" /></a></p>
<p><strong>Introduction</strong></p>
<p>The pace of development of Web based applications has been frenetic. The pace of development of tools to program the Web is also frenetic. There are new programming languages, libraries, servers and systems announced daily. Whatever happened to the good old days where you got a new version of Visual Studio and an updated C compiler every three years or so? In this blog posting, I want to look at the problems that people are trying to solve and the innovations they are trying to introduce to address them.</p>
<p>One nice thing about working at Sage is that we have so many products; someone will be using one of the systems mentioned in this article. For instance <a href="http://www.sageone.com/">SageOne</a> and <a href="http://www.billingboss.com/">Sage Billing Boss</a> are written in Ruby on Rails. <a href="http://www.sageaccpac.com/">Sage 300 ERP</a> and <a href="https://www.sagecrm.com/northamerica/">SageCRM</a> use GWT extensively. Other products use JQuery and Node.JS. Several of the mobile offerings were produced with <a href="http://jquerymobile.com/">JQuery Mobile</a>. So within Sage we have some opportunity to compare these on real non-trivial projects.</p>
<p><strong>The Perfect Programming System</strong></p>
<p>The real goal of all this is delivering real value to customers (end users). All other goals are in support of this. Nearly everyone is adopting some sort of Agile development process centered around delivering value (or even delights) to their customers. Once you are delivering customer value, then the next question is always: how to do that faster? Everyone are looking for a software development toolset that delivers customer delights and improves productivity.</p>
<p>That’s the high level goal, but what are the more detailed goals:</p>
<ul>
<li>Quick to enter changes, ideally just edit some code, save it and refresh the browser to see the results.</li>
<li>Easy to test. Meaning there are good ways to write unit tests that can run quickly every build. That the system promotes test driven development.</li>
<li>Easy to maintain. The system produces readable code that is easy for another programmer to figure out and change.</li>
<li>Little impedance between problem domain and language. When thinking about what you want to do, it isn’t a huge change of perspective to write the code; somehow the code reflects what you want to do naturally.</li>
<li>Easy to learn. You don’t need to know 3 programming languages, 5 scripting languages and 27 runtime libraries all of which interact in a complicated way to get up and running.</li>
<li>Large ecosystem – lots of tools and libraries to save you work.</li>
<li>Produces correct code. You don’t have to worry about unexpected syntax errors or other strange unexpected runtime errors that testing might have missed. By the same token you don’t have to spend a lot of time testing for and removing these sorts of things.</li>
<li>Easy to install and setup. It’s easy for programmers to setup the development environment and get up and running quickly.</li>
<li>Easy to deploy. It’s easy to transfer changes from the development environment to a live environment.</li>
<li>Ability to integrate with (consume) modules that are part of legacy systems.</li>
<li>The generated code is very small, fast and scalable.</li>
<li>Great development tools for debugging, code analysis, etc.</li>
</ul>
<p>In life, there are many tradeoffs to make. The same in programming. You might want three things, but you can only have two. Which do you pick? Which do other people pick? Usually with a large set of goals, some practical tradeoffs need to be made. Usually there will be a lot of disagreement in a group of people as to which goals are the most important and which ones can be lived without. Often the group will break up into different camps each with the conviction they have made the correct choice and theirs is the correct way to do things. So too with programming and hence all the different camps of web developers. Here we’ll look at a number of the camps and the tradeoffs they are making. Obviously I have my own opinions and preferences and the members of these various camps will probably disagree with my assessments.</p>
<p>For instance would you want to sacrifice several of the items for scalability? Everyone would like to be as popular as Facebook, but if you are a new web site, then perhaps it’s better to go live quicker to get feedback rather than spend the extra time engineering scalability. Often it’s more important to get feedback quicker so you can adapt your plans rather than over-engineer and be slower to market and slower to react. This fits in with the “fail fast” methodology of innovation where you are trying lots of things to see what works, you want them live as fast as possible to see what is good. Then you can take the good ideas and engineer them for the projected growth once you know what that will be.</p>
<p><strong>Client Side Programming</strong></p>
<p>As a Web developer you are targeting being able to run inside of Browsers. Here you can rely on HTML, CSS and JavaScript. Nothing else is common and nothing else will run on a large enough selection of Browsers and devices. If you don’t care about rich interaction or looks, you can just write using HTML and server side code, but this is Web 1.0 and probably won’t be very popular with your customers. There are good layout tools, or just text editors for writing HTML whether it’s static or generated by a server program. For CSS the tools aren’t as good, but there is help from libraries like <a href="http://css3pie.com/">CSSPie</a> or <a href="http://sass-lang.com/">Sass</a>. Then for JavaScript, you can either write directly in JavaScript or use something that compiles another language into JavaScript; the merits of either approach are fiercely debated. Of course when writing in JavaScript you can use libraries like JQuery to hide the complexities and provide a lot of missing support.</p>
<p><strong>Server Side Programming</strong></p>
<p>You control the server and you control what runs on it, so you can theoretically use any programming language that can receive HTTP requests via a network socket. But usually you want something that integrates with a Web Server like IIS or Apache. There are good server frameworks to create the server programs in Java, .Net, C or any of a thousand scripting languages. Nearly every programming language has been adapted to write Web server applications with, even <a href="http://infogoal.com/cbd/cbdweb.htm">COBOL</a>.</p>
<p><strong>Client and Server Together</strong></p>
<p>Although it is possible to program the Browser and the Web Server completely separately and independently. Perhaps only communicating through a well defined RESTful Web Services protocol. Usually we would like to leverage the skills of one to help with the other. We would also like a unified debugging and problem solving system. We would also like to reduce the number of specialized tools that people need to learn. Wouldn’t it be nice if the separation between client and server is largely transparent to the programmer? How well the client and server environments are harmonized is often a critical deciding factor in decision making.</p>
<p><strong>Some Leading Development Platforms/Libraries</strong></p>
<p><a href="http://jquery.com/">JQuery</a> is a leading framework for developing using raw JavaScript. The innovation with JQuery was separating the JavaScript code out from the HTML that it controls. It uses a method to interact with the HTML very similar to CSS. The Query part of JQuery refers to how you build queries to specify which DOM objects to operate on, rather than having the JavaScript attached to each DOM object directly. JQuery has a powerful extension framework allowing many powerful libraries to be added to JQuery like <a href="http://www.sproutcore.com/">SproutCore</a>. A key goal of JQuery is to separate the JavaScript code from the HTML and then to insulate the JavaScript programmer from many of the Browser dependent parts of JavaScript like making AJAX RPC calls. The difficult part of JQuery is how it interacts with the DOM, although very powerful is quite complex and tricky. JQuery by itself is a client framework, but it integrates to pretty much any server framework. In fact Microsoft has given up on running .Net in the Browser and is now promoting using JavaScript with JQuery communicating back to .Net running on the server.</p>
<p><a href="http://nodejs.org/">Node.js</a> is a JavaScript server framework. For people who love JavaScript and JQuery, it then kills them to have to program the server in something else like Java, .Net, PHP or Ruby. They love JavaScript and would like to do all their work in JavaScript. With the Chrome Browser, Google introduced the incredibly powerful V8 JavaScript engine. Node.JS then uses the Chrome V8 engine to run JavaScript on the server. Additionally the Node.js developers consider using a thread to execute each web request as too much overhead (nearly every other server framework uses threads). So they also brought all the asynchronous ideas associated with JavaScript from the Browser to the Server. So anything that is executed outside of Node.js is done purely asynchronously, such as calls to the database, operating system or such. This is very powerful and very low overhead for highly scalable systems. However it is fairly difficult to program with (according to me, not Node.js fans). To help tame the asynchronous problem, Bruno Jouhier, an Architect at Sage developed streamline.js which he talked about <a href="http://www.stateofcode.com/2011/05/bruno-jouhier/">here</a>.</p>
<p><a href="http://rubyonrails.org/">Ruby on Rails</a> is a server framework for developing the server side of things in the Ruby scripting language. In a way Ruby on Rails is a contradiction, since it is a framework that was developed to eliminate frameworks. Many people feel that frameworks and libraries just get in the way. Why do you need all these middleware components to connect things up? Why can’t the UI just access things in the database directly without a lot of messing around with intervening layers? Ruby on Rails implements web screens using a strict MVC model, where Ruby helps generate the Model part directly on SQL database tables, so the Model part is your business logic. After all why would you need anything else? Ruby on Rails is a server framework similar to ASP or JSP, but people want AJAX web applications, so you write any richer or interactive parts of your web pages in JavaScript with JQuery that then talks back to the Ruby components on the server.</p>
<p><a href="http://code.google.com/webtoolkit/">Google Web Toolkit (GWT)</a> is a framework where you program in Java which is then compiled to JavaScript for the Browser half of the application. The server side is programmed in Java which runs as a Java Servlet under a Java container like <a href="http://tomcat.apache.org/">Tomcat</a> or <a href="http://jetty.codehaus.org/jetty/">Jetty</a>. The nice thing is that you do all your programming in Java so you are only using one language. You also get to use all the thousands of tools and libraries that have been created for Java over the years. Since it’s a compiled language, you will not get runtime errors due to typo’s in your code like you do for scripting languages (some just ignore the errors which is even more confusing). On the downside you have to compile your code, so you can’t run it as quickly as you can with a scripting language. I’m not really sure which is faster, since when I use scripting languages I’m always fixing undefined variables and syntax errors, so although I can run quickly, I have to run many times to get things working. GWT also lets you use the Java symbolic debugger to debug your code which is very helpful.</p>
<p><a href="http://www.dartlang.org/">Dart</a> is a new project from Google that attempts to combine the best of the worlds of JavaScript/JQuery/Node.JS with Java/GWT. The idea is that Dart is a structured object oriented language (like Java) but you can choose whether variables need to be defined and adds a number of dynamic features usually only seen in scripting languages. Then the idea is that Dart can be run in some Browsers natively, allowing scripting type rapid development and for Browsers that don’t support it (like probably IE), you compile Dart to JavaScript. Dart isn’t ready for primetime yet, and it isn’t clear whether it will succeed, but it does show that the pace of development of these tools and systems is continuing at a rapid pace. Some theorize that the real intent of Dart is to replace Java as the tool used to develop Android applications, mainly due to all the frivolous <a href="http://www.infoworld.com/t/intellectual-property/oracles-android-lawsuit-pandoras-box-serious-evils-359">lawsuits</a> from Oracle.</p>
<p><strong>Which to Choose?</strong></p>
<p>The choice comes down to which items are most important to you in the list of what makes a perfect programming system. Which one gives you the best vibes, or feels right for what you want to do. Often this is heavily influenced by your current experience; what technologies are you most fluent in already; which new ones will you need to learn. This usually goes beyond a single person and you have to consider the expertise and experience of your development team.</p>
<p>A big influencer is whether you are writing a new system completely from scratch or you have to extend or integrate to a large existing system. If you need to extend or integrate then often your choices are limited to things that can easily do that. If you are writing a new system then you are much free’er to choose. For the new system, often it depends how much you want to rapidly prototype, versus how much the requirements are set and you want to implement quickly.</p>
<p>You also have to consider the longevity of the tools you are choosing. Perhaps you don’t care since you just want to rapidly prototype and start from scratch every few months. Or perhaps you know the system you are developing will need to be maintained and extended for the next ten or twenty years. Then you have to look carefully at the health of the open source community around the tool, or the commitment of the company behind the product to keep developing it.</p>
<p><strong>Summary</strong></p>
<p>There are many more systems in use. As I mentioned, nearly every programming language ever invented has a Web Development framework. People fuss quite a bit about which one to use, but I think once you bite the bullet and dive in, you can’t go that wrong with any of these. Also most of these can interact and interoperate at different levels, so usually you can build a composite system using many different tools (you just have to learn them all). Anyway the Web continues to be a platform that promotes innovation and fosters continuing learning.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/smist08.wordpress.com/828/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/smist08.wordpress.com/828/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/smist08.wordpress.com/828/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/smist08.wordpress.com/828/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/smist08.wordpress.com/828/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/smist08.wordpress.com/828/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/smist08.wordpress.com/828/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/smist08.wordpress.com/828/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/smist08.wordpress.com/828/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/smist08.wordpress.com/828/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/smist08.wordpress.com/828/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/smist08.wordpress.com/828/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/smist08.wordpress.com/828/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/smist08.wordpress.com/828/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=smist08.wordpress.com&amp;blog=6216385&amp;post=828&amp;subd=smist08&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://smist08.wordpress.com/2011/11/26/competing-web-development-systems/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1cb7e8c59f979d5b9800a1adfd8fe0d4?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">smist08</media:title>
		</media:content>

		<media:content url="http://smist08.files.wordpress.com/2011/11/logos.png?w=300" medium="image">
			<media:title type="html">logos</media:title>
		</media:content>
	</item>
		<item>
		<title>20 Years of Change in ERP</title>
		<link>http://smist08.wordpress.com/2011/11/19/20-years-of-change-in-erp/</link>
		<comments>http://smist08.wordpress.com/2011/11/19/20-years-of-change-in-erp/#comments</comments>
		<pubDate>Sat, 19 Nov 2011 22:31:45 +0000</pubDate>
		<dc:creator>smist08</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[accpac]]></category>
		<category><![CDATA[ERP]]></category>
		<category><![CDATA[Sage]]></category>
		<category><![CDATA[sage 300]]></category>
		<category><![CDATA[sage 300 erp]]></category>
		<category><![CDATA[sage accpac]]></category>
		<category><![CDATA[sage erp accpac]]></category>

		<guid isPermaLink="false">http://smist08.wordpress.com/?p=820</guid>
		<description><![CDATA[Then Previously I blogged on where I think ERP is going in the next ten years, recently I was thinking about where we have come from over the last twenty years. I started working on the Accpac product at Computer Associates back in 1992 to work on Accpac Plus for Windows*. At that time our [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=smist08.wordpress.com&amp;blog=6216385&amp;post=820&amp;subd=smist08&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><strong>Then</strong></p>
<p>Previously I blogged on where I think ERP is going in the <a href="http://smist08.wordpress.com/2011/05/14/erp-vision-2020/">next ten years</a>, recently I was thinking about where we have come from over the last twenty years. I started working on the <a href="http://www.sageaccpac.com/">Accpac</a> product at <a href="http://en.wikipedia.org/wiki/CA_Technologies">Computer Associates</a> back in 1992 to work on Accpac Plus for Windows<strong><sup>*</sup></strong>. At that time our customers installed our software from 5¼” <a href="http://en.wikipedia.org/wiki/Floppy_disk">floppy disks</a> onto PCs running <a href="http://en.wikipedia.org/wiki/MSDOS">MS-DOS</a> connected to <a href="http://en.wikipedia.org/wiki/Novell">Novell</a> Networks. Usually the Accounting department had a separate LAN from everyone else due to security concerns. In QA we validated the hardware and BIOS we would run on, supporting only certain IBM and Compaq models. Going online usually meant having a <a href="http://en.wikipedia.org/wiki/CompuServe">CompuServe</a> or <a href="http://en.wikipedia.org/wiki/AOL">AOL</a> account connected via a modem on your phone line.</p>
<p><strong>Evolution of ERP</strong></p>
<p>The core of an ERP system is the <a href="http://en.wikipedia.org/wiki/Double-entry_bookkeeping_system">double-entry accounting method</a> which has been around since it was codified by <a href="http://en.wikipedia.org/wiki/Luca_Pacioli">Luca Pacioli</a> in the 15<sup>th</sup> century. The basics of how this works has largely remained the same since then. Efforts to “modernize” double-entry accounting have repeatedly resulted in financial fiascos like <a href="http://en.wikipedia.org/wiki/Enron">Enron</a>. Much of the work over the past twenty years has been expanding the ERP system beyond basic financial accounting. Expanding to the front office through CRM, expanding to the HR department with HR and Payroll functionality, expanding into planning with advanced operation modules and project and job costing.</p>
<p><strong>Now</strong></p>
<p>Jump ahead 20 or so years to the present day. The product name is now Sage 300 ERP. We’ve progressed from Windows 3.1 through 95, 98, NT, 2000, XP, Vista to the present day Windows 7. We’ve progressed through 5¼” to 3½” floppies to CDs to DVDs to now downloading and installing the product from the Internet. Not only is the Accounting department typically on the main corporate network (usually a Windows Server network), but horror of horrors they are even connected to the Internet. We now support any PC, Workstation or Laptop that runs Windows regardless of manufacturer.</p>
<p>A lot of these changes are due to the industry maturing, buying a new computer isn’t such an adventure as you hope its <a href="http://en.wikipedia.org/wiki/BIOS">BIOS</a> is compatible with what you need to run. You can now safely buy computers from thousands of manufacturers running various CPUs from multiple companies like <a href="http://en.wikipedia.org/wiki/Amd">AMD</a> or <a href="http://en.wikipedia.org/wiki/Intel">Intel</a>. You can trust that you can use any <a href="http://en.wikipedia.org/wiki/Usb">USB</a> device with that computer. Very rarely do you ever install a new hardware piece in a drive bay or motherboard slot. Most people have a dedicated high speed link to the Internet.</p>
<p>Another advance that we’ve seen is the rise of <a href="http://en.wikipedia.org/wiki/Virtualization">virtualization</a>. Who would have thought twenty years ago that you could run another copy of your operating system in another window? Twenty years ago, multi-tasking barely worked. Now we can run all sorts of virtualized operating systems on our laptop at once. We have servers hosting dozens for virtualized servers that can be accessed from anywhere. Virtual images even integrate with the host environment so when you run a program you don’t know if it’s native or virtualized.</p>
<p>Twenty years ago, Windows was strictly single user. Now with Terminal Services and Citrix, Windows is truly multi-user. Users can access a central Windows server using a thin client to see their desktop. This allows easier centralized installations and management, since only one central server needs to be maintained. Additionally there is client software from all sorts of computers and devices to access your Windows session. With this you can access Sage 300 from a table like the iPad or from a non-Windows PC like a Macbook. Certainly UNIX/Linux fans aren’t impressed with this, but it did bring multi-user back into the mainstream.</p>
<p><strong>Online</strong></p>
<p>Utilizing the multi-user and virtualization technologies allowed us to offer a cloud version of Sage 300 ERP with <a href="http://accpaconline.com/">AccpacOnline.com</a>. With this, Sage manages the datacenter and handles all the tasks like backing up the data, keeping the hardware and software up to date. Then the customer just has to use our ERP package, accessing it from a Citrix client. This then gives our customers a choice between buying or subscribing to our product. We have been doing this for ten years or so now. The diagram below shows the choices this gives you.</p>
<p><a href="http://smist08.files.wordpress.com/2011/11/choice.png"><img class="alignnone size-medium wp-image-822" title="choice" src="http://smist08.files.wordpress.com/2011/11/choice.png?w=300&#038;h=240" alt="" width="300" height="240" /></a></p>
<p><strong>Connected Services</strong></p>
<p>Today we enhance your ERP system with “connected services”. These services all run in the cloud and your ERP package connects to them for additional functionality and services. A prime example is the Sage Payment Solutions connected service which allows you to take credit card transactions right in your application and then have it call the online service to process the transaction in real time. The diagram below shows our connected service web strategy, how our on premise or hosted business applications access all these cloud services.</p>
<p><a href="http://smist08.files.wordpress.com/2011/11/webstrat.png"><img class="alignnone size-medium wp-image-824" title="webstrat" src="http://smist08.files.wordpress.com/2011/11/webstrat.png?w=300&#038;h=209" alt="" width="300" height="209" /></a></p>
<p><strong>Summary</strong></p>
<p>We’ve come a long way in twenty years from MS-DOS character based applications to 16-Bit Windows applications to 32-Bit Windows applications to Web applications. We’ve had many improvements in hardware, operating systems and connectivity. All this generally keeps things from getting boring or stale. As we move forwards we are seeing ERP spreading to devices beyond PC to tablets and phones and much great utilization of connectivity, sharing and social interaction that this enables.</p>
<p><strong><sup>*</sup></strong> You can still see remnants of the old names in the product files. For instance there is the runtime\plus.ini which is still left over from the original name. In the original 16-bit version all the DLLs started with capw (CA Plus for Windows) and later were changed to start with a4w for the 32-Bit version. Generally if you look through the file names, or the SDK API documentation you can tell when something was introduced by the naming convention used.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/smist08.wordpress.com/820/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/smist08.wordpress.com/820/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/smist08.wordpress.com/820/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/smist08.wordpress.com/820/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/smist08.wordpress.com/820/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/smist08.wordpress.com/820/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/smist08.wordpress.com/820/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/smist08.wordpress.com/820/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/smist08.wordpress.com/820/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/smist08.wordpress.com/820/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/smist08.wordpress.com/820/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/smist08.wordpress.com/820/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/smist08.wordpress.com/820/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/smist08.wordpress.com/820/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=smist08.wordpress.com&amp;blog=6216385&amp;post=820&amp;subd=smist08&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://smist08.wordpress.com/2011/11/19/20-years-of-change-in-erp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/1cb7e8c59f979d5b9800a1adfd8fe0d4?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">smist08</media:title>
		</media:content>

		<media:content url="http://smist08.files.wordpress.com/2011/11/choice.png?w=300" medium="image">
			<media:title type="html">choice</media:title>
		</media:content>

		<media:content url="http://smist08.files.wordpress.com/2011/11/webstrat.png?w=300" medium="image">
			<media:title type="html">webstrat</media:title>
		</media:content>
	</item>
	</channel>
</rss>
