John Wallwork

About John Wallwork

John Wallwork is a Senior Systems Engineer. He has a BS in Chemistry and has taken graduate courses in chemistry and computer science at NC State University. John has over 16 years of IT experience and has the following software skills: VB, ASP, .NET, C, C++, XML, Delphi, SQL, Crystal Reports, VMS, Unix, MS Access, SQL Server
25 05, 2015

How to Integrate ASPDotNetStorefront with back end systems.

By | 2017-07-20T09:17:11+00:00 May 25th, 2015|Categories: Web Development|

The Business case for Integration

One of the most frequent inquiries we get from customers is what can be done to reduce our cost in managing our website?   The business will have back end systems (QuickBooks, MAS90, Fishbowl, etc.) that they use for their  operations that require data (orders, shipping, products) to be synchronized with the website.  Typically they have a designated person who is responsible for the website sites content and products and a couple of customer service reps who are responsible for orders and interacting with customers.  Initially, the amount of time maintaining the website may be small, but as orders increase and the need to keep content relevant increase, they get squeezed for time.  That’s when we get questions on what can be done to reduce the time  spent maintaining the site and the amount of double data entry being done.   The answer is to integrate ASPDotNetStorefront with the back end systems.

Options for Integration

There are several vendors that provide off the shelf ASPDotNetStorefront integration packages for popular back end systems.   One of the most popular back end system’s we get requests to integrate with is QuickBooks.  For this scenario, we typically recommend Atandra’s T-Hub Advanced (  It integrates product management, order management and shipping information between QuickBooks and ASPDotNetStorefront.  We then assist in the setup, configuration and training.  Setup typically consists of installing files on the website, installing the T-Hub client on the Business’s PC’s, connecting it to Quickbooks, and then setting up a periodic batch job on the Business PC to synchronize QuickBooks and ASPDotNetStorefront.  This works for this scenario, but there are issues that can preclude this solution.  The first and foremost one is there are only a few back end systems that are supported with off the shelf solutions.  Second, custom business requirements may preclude the use of off the shelf packages, ass the packages may not support the option required.  When using an off the shelf package, you are using the rules they wrote to and expect, deviating from them may cause the system to fail or corrupt data between the two system.  Corrupted data is not fun.  Third, it ties your version of ASPDotNetStorefront to the version of the package.  If a new version of ASPDotNetStorefront is released, you may not be able to upgrade until the package has a version that supports the new release.  Fourth, cost can be an issue.  These packages will require an initial payment and may require a recurring licensing fees, this may be prohibitive for an organization.  Additionally they may require upgrade fees to support new versions of ASPDotNetStorefront.

An alternative to an off-shelf integration solution, is write a custom integration.  This can be done by hiring a company like Beacon Technologies, or if you have the knowledge and resources by yourself.  One of the most frequently requested integration’s is synchronizing the  inventory from  the back end system to the website, especially if the business has multiple sales channels (Brick and Mortar Store(s), Phone/Catalog Sales,  Websales).  If a back end system can export an inventory list, than a simple program can be written to import the data into ASPDotNetStorefront.  With the following steps, you can create a simple page (Inventory_Uploader) to read the inventory from a CSV file and update your ASPDotNetStorefront database.

Programming a simple Inventory Upload Page

ASPDotNetStorefront saves inventory data in two different tables depending on how a product is configured.  If it is a general product inventory is stored in the “ProductVariant”  table.  If the product is configures to support inventory tracking by Color/Size feature on the product manager, then the data is stored in the “Inventory” table.  Four this example, we will not be using the “Track Inventory By Size and Color” feature.

Source: Inventory_Uploader

Open your Web site in Microsoft Visual Studio:



After the website is  loaded,  In the Solution Tab, find your Admin folder and right click, select “Add New Item”.



Select the “Visual C#” template and Web Form.  Enter “Inventory_UpLoader.aspx” and save.     In the Solution window, find the new page and open in the editor.



We’ll need to edit this file to support the ASPDotNetStorefront Namespace.  Modify the inherits attribute to:

Inherits = “AspDotNetStorefrontAdmin.Admin_Inventory_Uploader”

and add the MasterPageFile attribute:



Because the file uses a master template, you need to remove the standard HTML Tags and replace them with a content place holder.













The inventory loader’s user interface will consist of a File Select Button, an Upload Button and then an area to report the results of the processing.  Fo the results I want to know how many records were sent, the number processed correctly and then any errors encountered.


In the Solutions Window, find the Inventory_Uploader.aspx.cs code file and open it in the editor.  We’ll need to add an ASPDotNetStorefront library and some additional Microsoft .Net libraries.


Add the ASPDotNetStorefront Namespace


Modify the Class definition to inherit from ASPDotNetStorefront Base Admin class instead of the standard page class.


Add the function to handle the “Upload” button click to the class.


When the button is clicked, we will want to get the name of the file and then upload it to the server for processing.



After uploading the file, the program will need to open the file and process the lines.  For this example the file is a simple CSV file with two fields:  SKU and Inventory.



After uploading the file to the server.  The file will be opened and then each line will be processed.



As each line is read, the Product SKU and Inventory are parsed out.


After reading the SKU and inventory from the file we will need to determine which record to update in the database.  Depending on the business rules, the logic to do this can be complicated, so I like to put this in its own function.


add the following function to the class:


The purpose of this function will be to map the SKU sent in the feed file to a variant record in database.  To do this it is critical to know how your SKU’s are configured in the back end system.  In fact prior to setting up products in ASPDotNetStorefront it is worth looking at whether you SKU model will support multiple variants for products or Color/Size Options for products.   For this demo, the products are configured to support having  multiple variants but not color/size options. The rules are pretty simple:

  1. The first part of the SKU is the main product SKU.
  2.  If the product has variants, the variant suffix is separated by a hyphen.

If you wanted to support Color/Size inventory management, then rules would need to be defined for these options and the search logic modified.

Using the previously defined rules for the SKU, we can write the code to parse out the main product’s SKU and retrieve the variant suffix if applicable


After parsing the SKU data, we can search ASPDotNetStorefront for the variant records in the database.  This SQL assumes that  the variant suffix will be unique.  If that case was not true,  than we would need additional rules to find the unique record and adjust the code accordingly.


If a record is found, we can then update it with the inventory provided in the feed file.


To download the source files Inventory_Uploader.

The source is for version of ASPDotNetStorefront, if using an earlier version of 9.X than modify  line 18  in Inventory_Uploader.aspx.cs to “string dbConn = WebConfigurationManager.AppSettings[“DBConn”];”

7 02, 2011

Notes from the field.

By | 2020-01-29T15:04:13+00:00 February 7th, 2011|Categories: Ecommerce|Tags: , , , , |

I attended a Webinar hosted by Vortx recently and had a chance to learn a few things that can affect conversions of shoppers.

1. 75% of shoppers use the search box to find products. They pointed out that the top 10 e-tailers all have the same style search box: a long narrow search box prominently displayed in the header.

2. You have 7 seconds to impact a shopper with the product detail, after that they will typically go to another product.

3. There are 3 main pieces of information shopper want to see quickly:

  • Product Image
  • Product Description
  • Pricing/ Add to Cart

These items need to be clearly defined and prominent. Add to Cart button should be above the fold and use a color scheme to draw the eye to it.

4. The use of tabs is fading, major e-tailers are no longer using them to convey information.

4 02, 2011

Caught with the Hand in the Cookie Jar?

By | 2016-11-18T14:46:54+00:00 February 4th, 2011|Categories: SEO|Tags: , , , |

There’s in interesting war of words going on between Microsoft and Google regarding search. An article at Search Engine Land alleging that Microsoft was copying search results from Google was the first salvo in the war. Microsoft followed up by accusing Google of click fraud.

The gist of Google’s claim, seems to be that Microsoft’s uses the data collected from the suggested sites/Bing toolbar feature to populate Bing’s search engine results even if the search results come from Google’s website.

Microsoft’s defense appears to be that they do incorporate the results into Bing, but it is one of many parameters when ranking a link. That the scenario Google executed was not legitimate since Google created false links to nonsensical search terms and then had there employees click on those links.

Who’s right and who’s wrong? Well both are right and both are wrong. Google’s honeypot essentially peeled away Microsoft’s aggregating of the parameters used to rank sites. By using uncommon search terms, Google was able to populate a false relationship between the search term and the site. If a popular term had been entered, the other parameters would have minimized the ranking. Microsoft however is using the search results from a competitor as part of it’s ranking algorithm. They are just letting their end user’s be the means of populating the data. Google’s honeypot just showed that when the other parameters are not relevant, then Google’s results will appear.

27 12, 2010

Microsoft and the big Poopy.

By | 2016-11-21T17:20:06+00:00 December 27th, 2010|Categories: Web Development|Tags: , , |

The other morning, when my wife and I went to get our boys, we had one of those moments parents both love and hate.  When we opened the door, we were greeted by a smiling giggling toddler.  G. looked at us, smiled and said “Big Poopy!!” then held his arms apart to to indicate something being big.  This statement was then corroborated by our nostrils.  As parents we were appreciative of the warning and hopeful that this may be the first step in him being ready for potty training, but we were also dreading the cleanup.  After all, how big does it have to be for a 2 year old to say it is big (it was).   Later that day, Microsoft gave me a “big Poopy” moment

I was reading an article about Microsoft’s plans for Internet Explorer 9 to support HTML5, the work in progress update to the HTML standard.  Microsoft has announced it will be supporting the version under the governance of the World Wide Web Consortium (W3C), but not recognize the Web Hypertext Application Technology Working Group (WHATWG).  As a developer this fills me with hope (the new features of HTML5) and dread (Microsoft’s definition of “support” and “standards”).  HTML5 will be offering several new tags to add features that currently have to be done via third party mechanisms and should really enhance  the web experience for end users.  Microsoft’s implementations of standards in the past has been less then thrilling however (IE6 anyone).  In fact I just encountered a “bug” with a standards issue in IE 8, that has been around since IE 6.

For several days, I had been working on an update for a website that required the use of cascading drop down boxes using AJAX.  The goal was for the values of a drop down box to be populated from a database, based on a previous value selected by an end user.  All seemed to going well, until I tested my code in IE8.  In my other browsers (Firefox, Chrome and Safari), my AJAX code worked fine, however it would not work in IE8.  When my code was executed, an extra “option” tag was being pre-pended to the HTML string, thereby blowing up the HTML in the select boxes.  My code was using the “innerhtml” attribute of the Document Object Model (DOM) to do the update to the select box, however Microsoft’s implementation of the DOM standard has had issues with the “innerhtml” attribute since version 6 and has not addressed it.  After finding this out, I had to rip out my code and rewrite it using JQuery. This lack of addressing bugs with existing standards, makes me very wary of Microsoft’s support of “New” standards.  This trepidation is further exacerbated because HTML5 makes extensive use of the DOM.

Microsoft and my son’s pronouncements that day give me hope for a less messy future, but both still make me fear the cleanup. The worst thing to happen would be if Microsoft causes a fracture in the standards and developers have to continue to browser specific code.

20 12, 2008

When an error isn’t.

By | 2017-02-21T12:05:18+00:00 December 20th, 2008|Categories: Web Development|Tags: |

For the past two weeks I’ve been working on a project that makes use of Microsoft’s new AJAX controls for .Net.  These controls add a bit of snazziness to a website and help to increase usability and appearance.  With the completion of the User Interface data load, I turned my attention to fleshing out the action buttons on the screen.  That’s when progress came to a screeching halt.  When clicking on a button (any button), a nasty .Net error message would appear.  This message was appearing before any of the pages code could execute on the postback.  After researching the error message on the web, I came to the conclusion that this was a known issue others had run into and that some people had some work arounds.  However the example code for the work arounds was in Visual C# and not in the visual basic that this project was using.   After several hours of migrating the code, I got a sample page that worked in the same manner   the projects page.  When I applied the new techniques to project page, the error still occurred.  This aroused my suspicions, so I did what doctor’s do for surgery:  when in doubt: rip it out, thinking that maybe some portion of my code was blowing up the page. I begain by removing all of my custom event processing code:  error still occurred.  I then removed all non useful HTML:  error still occurred.  Next went all of the .Net textbox, literals, combo boxes etc:  error still occured.  When I finally got down to exact match to my working example:  the error still occured.  Ah ha I thought, something has realy snafued on the page.  So I deleted everything from the page, copied the example code over, and tested:  button click works, no error.  I started adding portions of my code back ( I had saved my original code before deleting code snippets), with each successive addition working fine.  When I had all my original code back, the page worked fine, no error.  So after a day of researching and coding my page, it was back to where I started.

The only explanation for original error kept seeing is this:  The page I was working on at some point had been saved as a Unix type file without the standard PC Carriage return/linefeed combo.  I believe this confused the IIS when it parsed the file resulting in the original error message.  When I copied the code, I saved it with notepad, thereby putting in the CR/LF’s.  When the code was copied back, IIS could parse it correctly resulting in no error.

So after a day of research, recoding, testing.  I’m back to were I started know to try saving the file in notepad before I start fixing an error.