<?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/"
	>

<channel>
	<title>Advent IT</title>
	<atom:link href="http://www.advent-it.co.uk/feed" rel="self" type="application/rss+xml" />
	<link>http://www.advent-it.co.uk</link>
	<description>Creating software for busy people</description>
	<lastBuildDate>Wed, 11 Jan 2012 08:52:38 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Focus on getting your data out</title>
		<link>http://www.advent-it.co.uk/archives/1589</link>
		<comments>http://www.advent-it.co.uk/archives/1589#comments</comments>
		<pubDate>Wed, 02 Feb 2011 09:19:41 +0000</pubDate>
		<dc:creator>Ian Brownbill</dc:creator>
				<category><![CDATA[Ian's Blog]]></category>
		<category><![CDATA[data]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[reports]]></category>
		<category><![CDATA[requirements]]></category>
		<category><![CDATA[stakeholders]]></category>
		<category><![CDATA[statistics]]></category>

		<guid isPermaLink="false">http://www.advent-it.co.uk/?p=1589</guid>
		<description><![CDATA[When opening a savings account we focus on how much we are going to get out and how easy it is to access. With the abundance of savings products in the market place we first choose an account by its interest rate and then we ask can we transfer money from one account to another, [...]]]></description>
			<content:encoded><![CDATA[<p>When opening a savings account we focus on how much we are going to get out and how easy it is to access.  With the abundance of savings products in the market place we first choose an account by its interest rate  and then  we ask can we transfer money from one account to another, can it be viewed online, can money be added at anytime and so on. It’s a customer-centred world so we know that there is a lot we can ask for and expect.  </p>
<p>If you have a medical registry, research or business project for which you need to collect and secure data you will be considering the software you need to store it. Define  the key questions you want your project or research to deliver and decide how you want to analyse, export or display your data. Make sure that your software will maximise the information you get from it  thus repaying the time and effort you and your team spend  putting data into it.</p>
<p>Your requirements  list should be more like a recipe than a shopping list. Include all the ingredients and processing you need to make the outcome a success.   Consider and document all your criteria from: your validation checks;  to security and user access needs; to the displays required for your  suppliers, customers, managers, patients, researchers or students.</p>
<p>Your data can be displayed in a host of different ways. It can be browsed, sorted and searched on the criteria that are useful and meaningful to you. Consider asking for data to be exported in the tables you need for a research paper or in the charts required by your shareholders at your AGM? If you need a statistical analysis to be performed on your data, ask for this to be automated too.  </p>
<p>Once you've compiled your initial requirements list, talk to a software consultant who understands your field.   Ask for a free consultation to discuss your needs and assess whether or not they have helped you move forward.  Are they likeable and easy to talk to and are they able tease out all your obvious but unspoken requirements raising issues from their own experience? Look for signs that they are weighing up all the options for you and are even considering the suitability of  another supplier's existing product.  Remember that you have many choices for your software just as you do for your savings so identify the criteria that are most important to you and shop around for the best product.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.advent-it.co.uk/archives/1589/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A nudge in time?</title>
		<link>http://www.advent-it.co.uk/archives/1534</link>
		<comments>http://www.advent-it.co.uk/archives/1534#comments</comments>
		<pubDate>Tue, 30 Nov 2010 13:39:45 +0000</pubDate>
		<dc:creator>Ian Brownbill</dc:creator>
				<category><![CDATA[Ian's Blog]]></category>
		<category><![CDATA[health promotion]]></category>
		<category><![CDATA[healthcare economics]]></category>

		<guid isPermaLink="false">http://www.advent-it.co.uk/?p=1534</guid>
		<description><![CDATA[We all need a nudge to look after our health especially in the festive season when turning down a drink or a piece of Christmas pudding seems churlish. Today local councils have been put in charge of encouraging healthier lifestyles in their communities. This may be the best way to tackle health inequalities; a recent [...]]]></description>
			<content:encoded><![CDATA[<p>We all need a nudge to look after our health especially in the festive season when turning down a drink or a piece of Christmas pudding seems churlish. Today local councils have been put in charge of encouraging healthier lifestyles in their communities. This may be the best way to tackle health inequalities; a recent survey shows that death rates in 19 NHS trusts are too high, perhaps because some of these trusts have the highest rates of smoking, alcohol abuse and obesity in the country.</p>
<p>So will a nudge help people lead healthier lifestyles? Health professionals and local government workers amongst you will be trying to answer that question. Well surely, the most important thing is knowing whether the nudge is making a difference. As with any new initiative, it's essential to decide how to <a href="http://www.advent-it.co.uk/case-studies/nhpha">collect and analyse the data</a> needed to measure its success before embarking on it. Doing this will ensure the most effective delivery of lifestyle promotion and provide important data for studying healthcare economics.  </p>
<p>We know it makes sense to protect lives by wearing seat belts, taking exercise, not smoking and by drinking and eating responsibly. We're all wary of government initiatives, but this one, designed to help us whilst reducing NHS costs, is a no brainer. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.advent-it.co.uk/archives/1534/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>This will get your back up!</title>
		<link>http://www.advent-it.co.uk/archives/1509</link>
		<comments>http://www.advent-it.co.uk/archives/1509#comments</comments>
		<pubDate>Fri, 26 Nov 2010 11:47:31 +0000</pubDate>
		<dc:creator>Ian Brownbill</dc:creator>
				<category><![CDATA[Ian's Blog]]></category>
		<category><![CDATA[backup]]></category>
		<category><![CDATA[data]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[disaster recovery]]></category>
		<category><![CDATA[restore]]></category>

		<guid isPermaLink="false">http://www.advent-it.co.uk/?p=1509</guid>
		<description><![CDATA[We take an umbrella when we go out because our weather is so unpredictable. We carry a spare tyre in the boot of our car just in case we have a puncture. We leave the car in gear even though the handbrake is on. If we had to specify the features of a new automobile, [...]]]></description>
			<content:encoded><![CDATA[<p>We take an umbrella when we go out because our weather is so unpredictable. We carry a spare tyre in the boot of our car just in case we have a puncture. We leave the car in gear even though the handbrake is on. If we had to specify the features of a new automobile, these backup fail safes would be high on the list. </p>
<p>Similarly when commissioning new software it is essential to include a backup strategy at the design stage.  This is equally necessary  whether you need a small in-house stock control system or a large online medical registry. Improving efficiency is often a key reason for commissioning new software and the benefits could be compromised if your data is not backed up.</p>
<p>Devise a backup policy that is tailored to the way that you work, by working out how long it would take you to re-input  your lost data for the last hour, day or month. You’ll need to make sure that your backup regime will meet the standards of  your organisation. </p>
<p>Where will you store your backups? It’s a question you need to address as the benefit of backups could be lost if they are stored in the same place as your computers. This would leave your backup media open to the same risks of fire, flood or theft as your data. Copies of your backups should be routinely stored off site either by using internet backups, cloud hosting or by physically transferring the media. Make sure they're not taken via the pub!</p>
<p>Have you ever had an umbrella that jammed when you tried to open it? Just having an umbrella doesn't mean that you won't get soaked and backed-up data is only any good if it can be restored.  So in addition to your backup regime you will need a restoration schedule. This will enable you to perform regular test restores to reassure yourself that  your backups will save your data even in the event of a serious hardware failure.  </p>
<p>Lastly consider what would happen if your backups were stolen? Look out for my upcoming article on data security and encryption.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.advent-it.co.uk/archives/1509/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Customer service with the power to delight</title>
		<link>http://www.advent-it.co.uk/archives/1224</link>
		<comments>http://www.advent-it.co.uk/archives/1224#comments</comments>
		<pubDate>Tue, 26 Oct 2010 13:07:06 +0000</pubDate>
		<dc:creator>Ian Brownbill</dc:creator>
				<category><![CDATA[Ian's Blog]]></category>
		<category><![CDATA[Customer service]]></category>
		<category><![CDATA[Problem solving]]></category>
		<category><![CDATA[Technical Support]]></category>

		<guid isPermaLink="false">http://www.advent-it.co.uk/?p=1224</guid>
		<description><![CDATA[We can all learn from watching bad customer service such as that delivered by the hotelier, Basil in ‘Fawlty Towers’. Similarly, hearing politicians deliberately missing the point of their constituents’ questions, isn’t just frustrating, it’s alienating. So when a customer calls to report a problem we need to take it seriously and focus on putting [...]]]></description>
			<content:encoded><![CDATA[<p>We can all learn from watching bad customer service such as that delivered by the hotelier, Basil in ‘Fawlty Towers’. Similarly, hearing politicians deliberately missing the point of their constituents’ questions, isn’t just frustrating, it’s alienating.</p>
<p>So when a customer calls to report a problem we need to take it seriously and focus on putting it right. Additionally, we need to understand that they may be anxious or tense about making the call. They often feel that the problem is their fault or are calling because they are under pressure from pushy colleagues to 'just fix it'.</p>
<p>Very few customers give a logical list of symptoms for the problem they are experiencing. Those that do, you might well consider employing or at least signing them up to test your new products. The real support skill is to actively listen and filter out those elements and diagnostics that will enable you to hone in on both the problem and the possible causes.</p>
<p>Most customers will feel hugely better after they have imparted their problem to you and you have listened thoughtfully. We add more value by listening than talking and as the ousted Shibby, on BBC's ‘The Apprentice’, remarked: ‘We have two ears and one mouth; we should use them in that ratio’.</p>
<p>An electronic message is displayed on the dashboard of my car when the tyres are below their optimum pressure. This is really helpful because it’s an early warning that I need to take some action. Having monitoring on your customer’s software will warn you when problems occur before they report them to you. A proactive phone call advising a customer of an imminent problem or providing a fix to a technical failure, will really impress them. It both removes their fear that it may be their fault and provides you with the opportunity to find out how well the customer is getting on with their software. Getting feedback is always constructive and you may be able to further please your customer by providing some instant, over the phone, training.</p>
<p>Providing good customer service means that you have the opportunity to get things right and, even better, to delight.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.advent-it.co.uk/archives/1224/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Business Search Wizard - Case Study 2007</title>
		<link>http://www.advent-it.co.uk/archives/703</link>
		<comments>http://www.advent-it.co.uk/archives/703#comments</comments>
		<pubDate>Sun, 22 Apr 2007 12:47:14 +0000</pubDate>
		<dc:creator>Pat Brownbill</dc:creator>
				<category><![CDATA[Case studies from our old website]]></category>

		<guid isPermaLink="false">http://leo.advent-it.co.uk/?p=703</guid>
		<description><![CDATA[We have implemented a flexible querying tool for a client to help them search and retrieve their business data. This solution integrates the Microsoft SQL Server Reporting Services Web Service with .NET Windows Forms to provide a flexible and intuitive search, sort and export system for their data.]]></description>
			<content:encoded><![CDATA[<h2>Introduction</h2>
<p>We have implemented a flexible querying tool for a client to help them search and retrieve their business data. This solution integrates the Microsoft SQL Server Reporting Services Web Service with a .NET Windows desktop application to provide a flexible and intuitive search, sort and export system for their data.</p>
<p>We are able to describe this business search wizard generically although we are unable to release specific details of our client’s customized product.</p>
<h2>Requirements</h2>
<p>To provide an application to allow staff to query their company’s data with the following specification:</p>
<h2>Selection specification</h2>
<ul>
<li>A simple and intuitive selection screen</li>
<li>Several parameters to select from (15)</li>
<li>Easy selection (and de-selection) of criteria with drop down choice boxes where possible and a text translation for all coded fields</li>
<li>Ability to select more than one value from a parameter where appropriate</li>
<li>Date picker settings for date ranges</li>
<li>Changeable default settings for all criteria</li>
<li>Easy resetting of criteria to defaults</li>
<li>Ability to choose which field set to be displayed</li>
<li>Buttons to run or abort a selection</li>
</ul>
<h2>Display specification</h2>
<ul>
<li>Data displayed in a data sheet manner on a new screen (Microsoft Excel style) after the selection is run</li>
<li>A pre-determined list of fields returned and displayed in a pre-determined order</li>
<li>Ability to sort on all or most fields after they are displayed</li>
<li>Navigation to return to selection screen in order to refine selection</li>
<li>A count of the records displayed</li>
</ul>
<h2>Export specification</h2>
<ul>
<li>Button to export displayed fields to Microsoft Excel or other specified package</li>
<li>Ability to choose the file name and location of the exported file</li>
<li>Navigation to return to another screen</li>
</ul>
<h2>Solution</h2>
<p>We integrated the SQL Server Reporting Services web service with a Windows Forms .NET application to produce a fast, easy to use, interface for our client to perform ad hoc data searches. Two screens were provided:</p>
<ul>
<li>Search Criteria interface screen with a wide range of named fields to select: some with drop-down lists; some with data range options and some facilitating multi-choice selection.</li>
<li>Results Display Screen showing the returned records in datasheet format with options to automatically export to Microsoft Excel.</li>
</ul>
<h2>Benefits</h2>
<ul>
<li>Users will be able to perform queries themselves without waiting for the availability of a SQL programmer.</li>
<li>Users will be able to refine and fine tune their searches enabling them to directly answer management questions.</li>
<li>Users will be able to sort the data file on any field of their choice.</li>
<li>Users will be able to export the data to a file of their choice.</li>
<li>Users will be able to spot and report data inconsistencies before data is released.</li>
</ul>
<h2>Overview</h2>
<p>A search wizard is a valuable tool for any organization that has a database at the core of its business. It enables staff to answer the majority of questions that occur from day-to-day without needing to understand the database structure or language.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.advent-it.co.uk/archives/703/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>What are databases and what are their benefits?</title>
		<link>http://www.advent-it.co.uk/archives/681</link>
		<comments>http://www.advent-it.co.uk/archives/681#comments</comments>
		<pubDate>Tue, 22 Aug 2006 11:16:02 +0000</pubDate>
		<dc:creator>Pat Brownbill</dc:creator>
				<category><![CDATA[Articles from our old website]]></category>

		<guid isPermaLink="false">http://leo.advent-it.co.uk/?p=681</guid>
		<description><![CDATA[What is a database? At the heart of all businesses, whether they are scientific, medical, educational, research-based or commercial, are data. Companies acquire data from their clients, patients, subscribers, customers and suppliers and from their own products and services. Businesses often require data from other sources as reference data for their own products or services. [...]]]></description>
			<content:encoded><![CDATA[<h2><strong>What is a database?</strong></h2>
<p>At the heart of all businesses, whether they are scientific, medical, educational, research-based or commercial, are data. Companies acquire data from their clients, patients, subscribers, customers and suppliers and from their own products and services. Businesses often require data from other sources as reference data for their own products or services. This reference data includes information such as: population and demographic data; stocks and share prices; consumer profiles; medical code lists; telephone and email directories. The key to a company’s success is how they organise their data.</p>
<p>When business data is kept in several disparate formats, manual intervention is needed in order to cross reference data or link one or more datasets to each other. When a company has lots of separate datasets it is challenging for any one individual to fully understand the company’s business. By analysing the company’s business with a view to bringing datasets together it is possible to document and display all the facets of a company’s data. Design methods are then used to arrange the different datasets in a manner that any grouping, search or calculation can be made across all a company’s datasets and the power of the data can be harnessed and fully exploited. This designed arrangement of data is called a database design. Once the design is agreed a database can be developed to provide an integral business solution.</p>
<h2>The benefits of databases</h2>
<p>Implementing a database solution for a business will enhance productivity and accuracy. Duplicated processes can be eradicated; data can be entered by several people simultaneously, data can be validated on data-entry; data-entry can be reduced by providing pre-typed lookup lists and duplicate records can be exposed and removed. Data can be displayed dynamically to anyone who has permitted access in a wealth of different formats and reports. When web based solutions are used, data can be securely, entered and viewed anywhere in the world. A company’s web site can be kept up-to-date from their database facilitating marketing and sales.</p>
<p>Interrogating databases empowers organizations to achieve their targets. Knowing which customers are also suppliers; calculating the effect of international exchange rates on product or component prices; deriving population based incidence rates or calculating the potential size of a company’s client base can be keys to marketing success; better sales margins; achieving research goals or business plan acceptance.</p>
<h2>Who needs databases?</h2>
<p>In short all businesses need to store their data in fully relational databases which will enable them to utilise and exploit their data. For some business models there is excellent ‘off the shelf’ software which will be perfect for their purposes, while for specialist and research businesses it will be necessary to request customised software developed by specialists such as Advent IT.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.advent-it.co.uk/archives/681/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Microsoft SQL Server Reporting Services - Case Study 2006</title>
		<link>http://www.advent-it.co.uk/archives/707</link>
		<comments>http://www.advent-it.co.uk/archives/707#comments</comments>
		<pubDate>Thu, 22 Jun 2006 12:50:30 +0000</pubDate>
		<dc:creator>Ian Brownbill</dc:creator>
				<category><![CDATA[Case studies from our old website]]></category>

		<guid isPermaLink="false">http://leo.advent-it.co.uk/?p=707</guid>
		<description><![CDATA[Advent IT have implemented a reporting solution for Momenta to help them manage the DTI's Knowledge Transfer Partnership (KTP) Programme. This solution integrates Microsoft SQL Server Reporting Services with SoftArtisans OfficeWriter to provide a powerful, centralised reporting and mail merge system. Please read the case study on the Microsoft site for more information.]]></description>
			<content:encoded><![CDATA[<p>Advent IT have implemented a reporting solution for Momenta to help them manage the DTI's Knowledge Transfer Partnership (KTP) Programme. This solution integrates Microsoft SQL Server Reporting Services with SoftArtisans OfficeWriter to provide a powerful, centralised reporting and mail merge system.</p>
<p><a href="http://lib.store.yahoo.net/lib/softartisans/OfficeWriterReportingServicesCaseStudy.pdf" target="_blank">Please read the case study on the Microsoft site for more information.</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.advent-it.co.uk/archives/707/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Inner And Outer Joins In SQL Statements</title>
		<link>http://www.advent-it.co.uk/archives/693</link>
		<comments>http://www.advent-it.co.uk/archives/693#comments</comments>
		<pubDate>Thu, 16 Jan 2003 13:01:13 +0000</pubDate>
		<dc:creator>Pat Brownbill</dc:creator>
				<category><![CDATA[Articles from our old website]]></category>

		<guid isPermaLink="false">http://leo.advent-it.co.uk/?p=693</guid>
		<description><![CDATA[When joining two tables in a SQL database it is necessary to consider what type of join is required. There are 4 possible ways in which these tables can be joined; Inner Join, Left Join, Right Join and Full Join (all of which may give different outcomes). Left, Right and Full Joins are all outer [...]]]></description>
			<content:encoded><![CDATA[<p>When joining two tables in a SQL database it is necessary to consider what type of join is required.</p>
<p>
There are 4 possible ways in which these tables can be joined; Inner Join, Left Join, Right Join and Full Join (all of which may give different outcomes).  Left, Right and Full Joins are all outer Joins. The mystery of outer joins often puts people off them but this article seeks to explain left and right joins with a set of simple examples.
</p>
<p>
The following examples use two tables in a hospital database. The patient table tblPatient (11 records) contains a code (PatientDisease) for their disease and the codelist or lookup table tlkpDisease (12 records) contains a list of disease codes (DiseaseID) and their meaning in words (DiseaseText).
</p>
<h2>1. Inner Join</h2>
<p style="font-style:italic;">
This is where only those records from the table on the Left of the Join that match those from the table on the Right of the Join are returned.
</p>
<h3>SQL statement</h3>
<table>
<tr style="color:#FF0000; text-align:left;">
<td>
<b>SELECT</b>
</td>
<td colspan="5">
Indexno, PatientDisease, DiseaseID, DiseaseText
</td>
</tr>
<tr style="color:#FF0000; text-align:center;">
<td></td>
<td>
<b>FROM</b>
</td>
<td>
tblPatient
</td>
<td>
<b>INNER JOIN</b>
</td>
<td>
tlkpDisease
</td>
<td>
<b>ON</b> PatientDisease=DiseaseID
</td>
</tr>
<tr style="color:#0000FF; text-align:center; font-style:italic;">
<td colspan="2">
</td>
<td>
(left table)
</td>
<td>
(join)
</td>
<td>
(right table)
</td>
<td>
(join criteria)
</td>
</tr>
</table>
<p style="font-style:italic;">Note: The word Inner may be omitted as Inner joins are assumed by default.</p>
<p>This returns the following results set:</p>
<table style="color:Green;">
<tr style="font-weight:bold;">
<td width="125">IndexNo</td>
<td width="125">PatientDisease</td>
<td width="125">DiseaseID</td>
<td width="125">DiseaseText</td>
</tr>
<tr>
<td>17001</td>
<td>30</td>
<td>30</td>
<td>Leukaemia</td>
</tr>
<tr>
<td>840001</td>
<td>37</td>
<td>37</td>
<td>Breast cancer</td>
</tr>
<tr>
<td>841001</td>
<td>50</td>
<td>50</td>
<td>Carcinoma</td>
</tr>
<tr>
<td>831001</td>
<td>58</td>
<td>58</td>
<td>Other neoplasm</td>
</tr>
<tr>
<td>846001</td>
<td>60</td>
<td>60</td>
<td>Epilepsy</td>
</tr>
<tr>
<td>840001</td>
<td>62</td>
<td>62</td>
<td>Allergic condition</td>
</tr>
<tr>
<td>838001</td>
<td>24399</td>
<td>24399</td>
<td>Thyroid insufficiency</td>
</tr>
<tr>
<td>835001</td>
<td>32299</td>
<td>32299</td>
<td>Meningitis</td>
</tr>
<tr>
<td>831001</td>
<td>49399</td>
<td>49399</td>
<td>Asthma</td>
</tr>
</table>
<p style="font-style:italic;">Note: Only those 9 patients who have a patientdisease which is in the disease codelist table are returned in this results set.</p>
<h2>2. Left Join</h2>
<p style="font-style:italic;">
This is where all records from the table on the Left of the Join are returned and only those that match from the table on the Right of the Join.
</p>
<h3>SQL statement</h3>
<table>
<tr style="color:#FF0000; text-align:left;">
<td>
<b>SELECT</b>
</td>
<td colspan="5">
Indexno, PatientDisease, DiseaseID, DiseaseText
</td>
</tr>
<tr style="color:#FF0000; text-align:center;">
<td></td>
<td>
<b>FROM</b>
</td>
<td>
tblPatient
</td>
<td>
<b>LEFT JOIN</b>
</td>
<td>
tlkpDisease
</td>
<td>
<b>ON</b> PatientDisease=DiseaseID
</td>
</tr>
<tr style="color:#0000FF; text-align:center; font-style:italic;">
<td colspan="2">
</td>
<td>
(left table)
</td>
<td>
(join)
</td>
<td>
(right table)
</td>
<td>
(join criteria)
</td>
</tr>
</table>
<p>This returns the following results set:</p>
<table style="color:Green;">
<tr style="font-weight:bold;">
<td width="125">IndexNo</td>
<td width="125">PatientDisease</td>
<td width="125">DiseaseID</td>
<td width="125">DiseaseText</td>
</tr>
<tr>
<td>17001</td>
<td>30</td>
<td>30</td>
<td>Leukaemia</td>
</tr>
<tr>
<td>840001</td>
<td>37</td>
<td>37</td>
<td>Breast cancer</td>
</tr>
<tr>
<td>841001</td>
<td>50</td>
<td>50</td>
<td>Carcinoma</td>
</tr>
<tr>
<td>845001</td>
<td>57</td>
<td>NULL</td>
<td>NULL</td>
</tr>
<tr>
<td>831001</td>
<td>58</td>
<td>58</td>
<td>Other neoplasm</td>
</tr>
<tr>
<td>846001</td>
<td>60</td>
<td>60</td>
<td>Epilepsy</td>
</tr>
<tr>
<td>840001</td>
<td>62</td>
<td>62</td>
<td>Allergic condition</td>
</tr>
<tr>
<td>838001</td>
<td>24399</td>
<td>24399</td>
<td>Thyroid insufficiency</td>
</tr>
<tr>
<td>835001</td>
<td>32299</td>
<td>32299</td>
<td>Meningitis</td>
</tr>
<tr>
<td>836001</td>
<td>33699</td>
<td>NULL</td>
<td>NULL</td>
</tr>
<tr>
<td>831001</td>
<td>49399</td>
<td>49399</td>
<td>Asthma</td>
</tr>
</table>
<p style="font-style:italic;">Note: All 11 patients from the patients table and all 12 diseases from the disease codelist table are returned in the results set.</p>
<h2>3. Right Join</h2>
<p style="font-style:italic;">
This is where all records from the table on the Right of the Join are returned and only those that match from the table on the Left of the Join are returned.
</p>
<h3>SQL statement</h3>
<table>
<tr style="color:#FF0000; text-align:left;">
<td>
<b>SELECT</b>
</td>
<td colspan="5">
Indexno, PatientDisease, DiseaseID, DiseaseText
</td>
</tr>
<tr style="color:#FF0000; text-align:center;">
<td></td>
<td>
<b>FROM</b>
</td>
<td>
tblPatient
</td>
<td>
<b>RIGHT JOIN</b>
</td>
<td>
tlkpDisease
</td>
<td>
<b>ON</b> PatientDisease=DiseaseID
</td>
</tr>
<tr style="color:#0000FF; text-align:center; font-style:italic;">
<td colspan="2">
</td>
<td>
(left table)
</td>
<td>
(join)
</td>
<td>
(right table)
</td>
<td>
(join criteria)
</td>
</tr>
</table>
<p>This returns the following results set:</p>
<table style="color:Green;">
<tr style="font-weight:bold;">
<td width="125">IndexNo</td>
<td width="125">PatientDisease</td>
<td width="125">DiseaseID</td>
<td width="125">DiseaseText</td>
</tr>
<tr>
<td>17001</td>
<td>30</td>
<td>30</td>
<td>Leukaemia</td>
</tr>
<tr>
<td>840001</td>
<td>37</td>
<td>37</td>
<td>Breast cancer</td>
</tr>
<tr>
<td>841001</td>
<td>50</td>
<td>50</td>
<td>Carcinoma</td>
</tr>
<tr>
<td>831001</td>
<td>58</td>
<td>58</td>
<td>Other neoplasm</td>
</tr>
<tr>
<td>846001</td>
<td>60</td>
<td>60</td>
<td>Epilepsy</td>
</tr>
<tr>
<td>840001</td>
<td>62</td>
<td>62</td>
<td>Allergic condition</td>
</tr>
<tr>
<td>838001</td>
<td>24399</td>
<td>24399</td>
<td>Thyroid insufficiency</td>
</tr>
<tr>
<td>NULL</td>
<td>NULL</td>
<td>29909</td>
<td>Infantile autism</td>
</tr>
<tr>
<td>835001</td>
<td>32299</td>
<td>32299</td>
<td>Meningitis</td>
</tr>
<tr>
<td>NULL</td>
<td>NULL</td>
<td>35109</td>
<td>Bell's palsy</td>
</tr>
<tr>
<td>831001</td>
<td>49399</td>
<td>49399</td>
<td>Asthma</td>
</tr>
<tr>
<td>NULL</td>
<td>NULL</td>
<td>74921</td>
<td>Cleft palate</td>
</tr>
</table>
<p style="font-style:italic;">Note: All 12 diseases from the disease codelist table are returned in the results set whether or not there is a patient with that disease in the patient table.</p>
<h2>4. Full Join</h2>
<p style="font-style:italic;">
This is where all records from the table on the Left of the Join are returned and all those from the table on the Right of the Join are returned.
</p>
<h3>SQL statement</h3>
<table>
<tr style="color:#FF0000; text-align:left;">
<td>
<b>SELECT</b>
</td>
<td colspan="5">
Indexno, PatientDisease, DiseaseID, DiseaseText
</td>
</tr>
<tr style="color:#FF0000; text-align:center;">
<td></td>
<td>
<b>FROM</b>
</td>
<td>
tblPatient
</td>
<td>
<b>FULL JOIN</b>
</td>
<td>
tlkpDisease
</td>
<td>
<b>ON</b> PatientDisease=DiseaseID
</td>
</tr>
<tr style="color:#0000FF; text-align:center; font-style:italic;">
<td colspan="2">
</td>
<td>
(left table)
</td>
<td>
(join)
</td>
<td>
(right table)
</td>
<td>
(join criteria)
</td>
</tr>
</table>
<p>This returns the following results set:</p>
<table style="color:Green;">
<tr style="font-weight:bold;">
<td width="125">IndexNo</td>
<td width="125">PatientDisease</td>
<td width="125">DiseaseID</td>
<td width="125">DiseaseText</td>
</tr>
<tr>
<td>17001</td>
<td>30</td>
<td>30</td>
<td>Leukaemia</td>
</tr>
<tr>
<td>840001</td>
<td>37</td>
<td>37</td>
<td>Breast cancer</td>
</tr>
<tr>
<td>841001</td>
<td>50</td>
<td>50</td>
<td>Carcinoma</td>
</tr>
<tr>
<td>845001</td>
<td>57</td>
<td>NULL</td>
<td>NULL</td>
</tr>
<tr>
<td>831001</td>
<td>58</td>
<td>58</td>
<td>Other neoplasm</td>
</tr>
<tr>
<td>846001</td>
<td>60</td>
<td>60</td>
<td>Epilepsy</td>
</tr>
<tr>
<td>840001</td>
<td>62</td>
<td>62</td>
<td>Allergic condition</td>
</tr>
<tr>
<td>838001</td>
<td>24399</td>
<td>24399</td>
<td>Thyroid insufficiency</td>
</tr>
<tr>
<td>NULL</td>
<td>NULL</td>
<td>29909</td>
<td>Infantile autism</td>
</tr>
<tr>
<td>835001</td>
<td>32299</td>
<td>32299</td>
<td>Meningitis</td>
</tr>
<tr>
<td>836001</td>
<td>33699</td>
<td>NULL</td>
<td>NULL</td>
</tr>
<tr>
<td>NULL</td>
<td>NULL</td>
<td>35109</td>
<td>Bell's palsy</td>
</tr>
<tr>
<td>831001</td>
<td>49399</td>
<td>49399</td>
<td>Asthma</td>
</tr>
<tr>
<td>NULL</td>
<td>NULL</td>
<td>74921</td>
<td>Cleft palate</td>
</tr>
</table>
<p style="font-style:italic;">Note: All 11 patients from the patients table and all 12 diseases from the disease codelist table are returned in the results set.
</p>
<h2>Summary</h2>
<p>
The above SQL statement returned four different results sets using the same join criteria on the same tables with different join types.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.advent-it.co.uk/archives/693/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Self joins in SQL statements</title>
		<link>http://www.advent-it.co.uk/archives/697</link>
		<comments>http://www.advent-it.co.uk/archives/697#comments</comments>
		<pubDate>Wed, 15 Jan 2003 13:08:19 +0000</pubDate>
		<dc:creator>Pat Brownbill</dc:creator>
				<category><![CDATA[Articles from our old website]]></category>

		<guid isPermaLink="false">http://leo.advent-it.co.uk/?p=697</guid>
		<description><![CDATA[Self-joins are useful in SQL select statements and are often used to identify duplicate entries or entries linked in other ways such as customers who share the same telephone number or patients who share the same address. A self-join is an internal table (or view) join. The self-join is between fields in a table and [...]]]></description>
			<content:encoded><![CDATA[<p>Self-joins are useful in SQL select statements and are often used to identify duplicate entries or entries linked in other ways such as customers who share the same telephone number or patients who share the same address.</p>
<p>A self-join is an internal table (or view) join. The self-join is between fields in a table and fields within a virtual copy of the table. For instance in a hospital database the patients’ address and postcode details are kept in the table tblAddress with the identifier of the patient in the field PatientID.</p>
<p>The following SQL statement can be run in Query Analyzer in order for the hospital administrators to list the patients who share an address and patients who have been erroneously registered twice under different PatientID’s:</p>
<p><strong>SQL statement</strong></p>
<table>
<tbody>
<tr>
<td><strong>SELECT</strong></td>
<td>A1.PatientID</td>
<td><strong>AS</strong></td>
<td>PatientID1,</td>
<td>A1.Address</td>
<td><strong>AS</strong></td>
<td>Address1,</td>
<td>A1.Postcode</td>
<td><strong>AS</strong></td>
<td>Postcode1</td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
<td>Alias</td>
<td></td>
<td></td>
<td>Alias</td>
<td></td>
<td></td>
<td>Alias</td>
</tr>
</tbody>
</table>
<table>
<tbody>
<tr>
<td><strong>FROM</strong></td>
<td>tblAddress</td>
<td><strong>AS</strong></td>
<td>A1</td>
<td><strong>INNER JOIN</strong></td>
<td>tblAddress</td>
<td><strong>AS</strong></td>
<td>A2</td>
<td><strong>ON</strong></td>
<td>A1.Postcode =A2.Postcode</td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
<td>Alias</td>
<td></td>
<td></td>
<td></td>
<td>Alias</td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
<table>
<tbody>
<tr>
<td><strong>WHERE LEFT</strong>(A1.Address,3)=<strong>LEFT</strong>(A2.Address,3) <strong>AND</strong> A1.PatientID &lt;&gt; A2.PatientID</td>
</tr>
<tr>
<td><strong>ORDER BY</strong> A1.Postcode</td>
</tr>
</tbody>
</table>
<p>Note: aliases are used to distinctly name fields or tables with the same name to clarify ambiguities.</p>
<p>This returns the following results set:</p>
<table>
<tbody>
<tr>
<td width="100">PatientID1</td>
<td width="300">Address1</td>
<td width="100">Postcode1</td>
</tr>
<tr>
<td>231234</td>
<td>3 Montgomery Lane, Hartshead</td>
<td>AT12 7DS</td>
</tr>
<tr>
<td>432122</td>
<td>3 Mongomery La, Rushington,Hartshead</td>
<td>AT12 7DS</td>
</tr>
<tr>
<td>27923</td>
<td>21 Cystine Road, Sefton, Merseyside</td>
<td>L87 9ZZ</td>
</tr>
<tr>
<td>3987</td>
<td>21 Cystine Rd, Liverpool</td>
<td>L87 9ZZ</td>
</tr>
</tbody>
</table>
<p>The Patients corresponding to these ID pairs can then be investigated to test whether they are duplicates registrations or different patients, possibly relatives, with the same address.</p>
<p>Self-joins can also be written as outer joins.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.advent-it.co.uk/archives/697/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Secure Microsoft Access Development</title>
		<link>http://www.advent-it.co.uk/archives/700</link>
		<comments>http://www.advent-it.co.uk/archives/700#comments</comments>
		<pubDate>Sat, 22 Apr 2000 12:13:02 +0000</pubDate>
		<dc:creator>David Coates</dc:creator>
				<category><![CDATA[Articles from our old website]]></category>

		<guid isPermaLink="false">http://leo.advent-it.co.uk/?p=700</guid>
		<description><![CDATA[Many people have said to us that they find Access Workgroup security impossibly difficult, and the more they read, the worse it gets! We have adopted a simple and yet effective approach, for which we are indebted to our colleague David Hay. Although you can, if you wish, employ the full capabilities of the security [...]]]></description>
			<content:encoded><![CDATA[<p>Many people have said to us that they find Access Workgroup security impossibly difficult, and the more they read, the worse it gets! We have adopted a simple and yet effective approach, for which we are indebted to our colleague David Hay.</p>
<p>Although you can, if you wish, employ the full capabilities of the security mechanism which Microsoft supply (groups of users with allocated rights, and/or specific rights for individuals), we feel that this is not only a high-maintenance approach (you need to keep editing the settings as people join, move around and leave), but it also fails to encompass some of the features which we regularly need, such as reporting structure and telephone extension, so we prefer to include a users table in the database (we normally call this USysUsers, by the way, so that it is normally hidden in the database window. If you haven’t discovered the “USys” prefix, it is a very useful trick for all sorts of cases!).</p>
<p>Some observations about the non-secured Access installation are as follows:</p>
<ul>
<li>The default creator, and hence owner, of ALL databases and contained objects in the environment initially will be “Admin”.</li>
<li>There is an Admin user on all installations of Access, and security is in place, but because there is no password for admin, no login screen appears.</li>
<li>You can change the ownership of any object except the database itself – this is a common cause of frustration!</li>
<li>The workgroup file includes by default two “Groups”: Admins and Users. The Admin user is a member of both; there must be at least one user in Admins (otherwise it would be impossible to administer databases…).</li>
<li>Permissions (rights) are allocated for both of these groups in the default file. The permissions which apply are the least restrictive set available to a user. So, although they may be restricted as an individual, they may gain extra privileges through membership of groups. The Admin user has full rights to all non-Microsoft objects.</li>
<li>Members of the Admins group, plus the owner of an object, can change the permissions on an object.</li>
</ul>
<p>Our approach uses a new Workgroup (MDW) file in which the Admin user is joined by one other “Super-user” to whom all the powers are given. Poor old Admin is demoted to have only the permissions which this upstart decrees. The new workgroup file is used when you are creating and administering databases; but (and this is the cunning part) you can give your MDB files to anyone else in the world to use, and, because they don’t have a “Super-user” in the System.mdw which was created when Access installed on their machine, they are stuck with the settings you have dictated.</p>
<h2>Step-by-step</h2>
<p>Use the Workgroup Administrator tool to create a brand new Workgroup file. Ensure that you enter a unique and non-guessable “WorkgroupID” (like an extended PIN number) and give the file a recognisable name. A good tip is to take a screen dump of the confirmation screen which appears towards the end of the process; paste the picture into Word and print it out for retention in a safe place: you’ll need the information should you ever need to re-build the workgroup file.</p>
<ul>
<li>“Join” the new workgroup file (ultimately it is a good idea to have two desktop icons to launch Access; one has the standard command line, and the other includes the “/Wrkgrp xxx.MDW” flag to join your new group for the session of using Access: you naturally employ this icon when you are going to do some development).</li>
<li>Start Access and, via Tools/Security/User and Group Accounts, set a password for Admin.</li>
<li>Also create a new user: we’ll call it SuperUser here, but please choose something for yourself! Again, ensure that you note the PIN Number which you chose for this user. SuperUser may have a password, but does not actually need to.</li>
<li>Add the new user to the Admins Group, then close Access.</li>
<li>Start the program again, this time logging-in as SuperUser.</li>
<li><strong>Remove the Admin user from the Admins group – vital!</strong></li>
</ul>
<p>You are now ready to begin creating secure databases! Just remember to log-in as SuperUser when you start a new project or whenever you are working on the database structure (rather than the data).</p>
<ul>
<li>Under Tools/Security/user and Group Permissions, we recommend that you remove ALL permissions from both Groups (i.e. no-one gets any spurious permissions just because they happen to belong to a specific group).</li>
</ul>
<p>It is easiest to set the default permissions for users before you create any objects within the database; for each type of object, simply select the “” entry in the list and reduce the permissions as you feel appropriate. Then you can forget the whole issue!</p>
<h2>Retro-fitting security to a database</h2>
<p>If you need to apply restrictions to an existing database, the first thing to remember is that you cannot change the ownership of the database. So, you need to create a new database and import into it all of the objects from the original file. Change their owner to be SuperUser, and then adjust the permissions of all of the objects as above (it is easy to select all of the members of the lists, but don’t try to change the ownership or permissions on Microsoft’s MSys objects!).</p>
<p>The User-level Security Wizard will do all of this for you, but in Access 97 do remember that you must be logged-in as your SuperUser, otherwise you’ll see no effect! Access 2000 automatically prevents this possibility.</p>
<p>One other tip is that, if you use the common “two-database approach” with a data file and a “front-end” file, you’ll need to grant Admin permissions on the tables in the front-end file if there will be the need to change the connection string (i.e. if the back-end file may move or be mapped to a different drive on users’ machines).</p>
<p>The other, vital tip is to remember to take with you a copy of your developer’s MDW file when you go on-site – otherwise you won’t be able to make any changes to the database structure!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.advent-it.co.uk/archives/700/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

