You are on page 1of 163

JOMO KENYATTA UNIVERSITY OF AGRICULTURE AND TECHNOLOGY

BACHALOR OF SCIENCE IN INFORMATION TECHNOLOGY


ICS 2304 REPORT

MEWA PHARMACY SOFTWARE SYSTEM

ABDULREHMAN AHMED MOHAMED CS211-C005-0043/11

SUPERVISED BY AISHA MOHAMED

JUNE 2012 STAGE III SEMESTER I 2011/2012


i

DECLARATION

I hereby declare that I am responsible for the work submitted in this project, that the original work is my own and conducted only in collaboration with Aisha Mohamed, who is my supervisor and except as specified in the references and acknowledgements, and that the original work contained herein have not been taken or done by unspecified sources or persons.

ABDULREHMAN AHMED MOHAMED CS211-C005-043/11

Signature Date_______________________________________________

This report has been submitted for examination with my approval as University supervisor.

AISHA MOHAMED MODHAR

Signature _____________________________________________ Date________________________________________________

ii

ABSTRACT
The project analysis and evaluates the current Pharmacy system of MEWA Hospital Pharmacy department, feasibility and practicalilty as well as develop a new proposed system to the deparment and organization

Currently MEWA pharmacy departments does not have an automated system to analyze stock and statistical records, generate monthly reports, pricing and invoicing of the patients which has lead to organization to compromise the core pharmacist work of dispensing and customer care hence leading to inefficiency causing high patient waiting time and loss of patients to competitors.

The main object of this project is to automate the current manual pharmacy system by implementing computer based Pharmacy Information system, which will address the inefficiency of the department leading loss of patients to competitors.

The target users of the pharmacy system are all users of pharmacy department at different dispensing outlets namely Outpatient Pharmacy, Inpatient Pharmacy, HIV Testing & Counseling (HTC) Pharmacy, Theatre Pharmacy, Surgical Pharmacy, Procurement Pharmacy and Drug Store.

The sample sampling technique entails to take employees and divided into stratum according to their outlet since the Population is heterogeneous a stratified random sampling technique was graphed. Three were selected from each outlet where a simple representatives

random sampling was


iii

conducted to select a few employees; the questionnaires

were then

distributed to the staffs as per outlet. Each outlet was given three questionnaires.

The questionnaire method of data collection was adopted to collect primary data. The Questionnaires administered contained closed questions and were hand delivered to the Targeted group.

The proposed system will run on windows platform using Microsoft Visual Studio 2008 programming language, with Microsoft Access 2007 as the database. The Visual Studio is an ideal programming language for creating sophisticate applications, its based on graphical user interface (GUI) friendly interface for all system users.

This project will involve the analysis of the methodology technique put in use to aid in the creation of the proposed system and the successful development and implementation of the system. The methodology that will be used will be Phase Development Methodology of Rapid Application Development (RAD).

From the above discussion it can be recommended that although pharmacy system has been computerized, after gap analysis and literature review there are many areas of improvement

iv

TABLE OFCONTENTS
PREFACE .................................................................................................... i-xii Declaration ...................................................................................................... i Abstract ..................................................................................................... ii-iii Table of Content........................................................................................ iv-vii Table of Figures ......................................................................................viii-ix List of Table .................................................................................................... x Acronyms ................................................................................................. xi-xii

CHAPTER 1

INTRODUCTION ....................................................................................... 1- 8 1.1 Background .......................................................................................... 1- 4 1.2 Statement of the problem ..................................................................... 4- 5 1.3 Objective .................................................................................................. 5 1.3.1 Specific Objective ............................................................................. 5 -6 1.4 Justification .......................................................................................... 6 -7 1.5 Project Scope ............................................................................................ 7 1.6 Target Users ......................................................................................... 7 - 8 1.7 Project Limitation .................................................................................... 8 1.8 Summary .................................................................................................. 8 CHAPTER 2

LITERATURE REVIEW .......................................................................... 9-26 2.1 Introduction .............................................................................................. 9 2.2 Theoretical Review ............................................................................. 9-12 2.3 System Review .................................................................................. 13-25 2.4 System Critique ................................................................................. 25-26
v

2.5 System Adaption .................................................................................... 26 CHAPTER 3

ANALYSIS AND DESIGN ...................................................................... 27-51 3.1 Introduction ............................................................................................ 27 3.2 Development Approach ......................................................................... 27

3.2.1 System Design ....................................................................... 27-28 3.2.2 Systems Development Lifecycle (SDLC) Steps .................... 28-30 3.2.3 Structured Design ....................................................................... 30 3.2.4 RAD (Rapid Application Development) ............................... 31-36 3.2.5 Methodology Justification ..................................................... 36-38

3.3 Fact Finding Approach........................................................................... 38

3.3.1 Research Design ......................................................................... 38 3.3.2 Target Population ....................................................................... 39 3.3.3 Sample and Sample techniques .................................................. 39 3.3.4 Data Collection Tools ................................................................. 39

3.4 Requirement Specification ..................................................................... 40 3.5 Logical Design ....................................................................................... 41

3.5.1 Activity Diagram ........................................................................ 41 3.5.2 Data Flow Diagram .................................................................... 42 3.5.3 Use Case Diagram ...................................................................... 43

3.6 Database Design ............................................................................... 44- 49


vi

3.7 Interface Design ..................................................................................... 49 3.8.1 Specific Platform ................................................................................. 49 3..8.2 Hardware Specification ...................................................................... 50 3.9 Justification ............................................................................................ 50 3.10 Conclusion ........................................................................................... 51

CHAPTER 4

IMPLEMENTATION ............................................................................ 52 - 59 4.1 Introduction ............................................................................................ 52 4.2 Construction and Coding ................................................................ 52 - 58 4.3 Findings and Results ....................................................................... 58 - 59

CHAPTER 5

CONCLUSION AND RECOMMENDATIONS .................................. 60 - 62

5.1 Introduction ............................................................................................ 60 5.2 Summary .......................................................................................... 60 -61 5.3 Conclusions ............................................................................................ 61 5.4 Recommendations ............................................................................ 61 -62

REFERENCES ..................................................................................... 63 -64 APPENDICES .................................................................................... 65 -150

1.5 Appendices A ............................................................................................ 65 A.1 Project Budget ...................................................................................... 65 A.2 Expected Completion Time ........................................................... 66 - 67

1.6 Appendices B ................................................................................ 68 - 144


vii

B.1 Login System Code ........................................................................ 68 - 72 B.2 Main Dash Board Code .................................................................. 72 - 73

B.3 Sales Report Code .......................................................................... 73 - 74 B.4 Staff Work load Cod........................................................................ 75 - 76

B.5 Stock level .................................................................................... 76 - 144 1.7 Appendices C . ............................................................................. 145 -150

C.1 User Acceptance Test Form ........................................................ 145 -146 C.2 Letter to organization .......................................................................... 147

C.3 Questionnaire .............................................................................. 148 - 150

viii

1.1 List of Figures


CHAPTER 2 LITERATURE REVIEW ............................................................................... 9 Figure 2.1 Apothesoft, (2001). Main treatment filling screen ..................... 14 Figure 2.2 Apothesoft, (2001). Patient information screen .......................... 15 Figure 2.3 Apothesoft, (20010. Patient profile screen .................................. 16 Figure 2.4 Care Right Tech (2006). Prescription generation ....................... 18 Figure 2.5 Care Right Tech (2006). Dispensing medication ........................ 19 Figure 2.6 Care Right Tech (2006). Consulting the drug formulary ........... 20 Figure 2.7 Care Right Tech (2006). Consulting for prescription ................. 21 Figure 2.8 Wasifable, (2011). Main menu ................................................... 23 Figure 2.9 Wasifable, (2011). Setting up pharmacy store ............................ 24 Figure 2.10 Wasifable, (2011). Making sales of medicine .......................... 25 CHAPTER 3 ANALYSIS AND DESIGN .................................................................... 27 - 51 Figure 3.1 Eton Digital, (2004). Structure design methodology .................. 31 Figure 3.2 Eton Digital, (2004). Phased development methodology ........... 33

Figure 3.3 Eton Digital, (2004). Prototyping methodology ......................... 34 Figure 3.4 Eton Digital, (2004). Throw-away prototyping methodology .... 36 Figure 3.5 Eton Digital, (2004). Traditional and RAD methodology .......... 38
ix

Figure 3.6 Activity diagram, Pharmacy login system (2012) ...................... 41 Figure 3.7 Data flow diagram, Login validation system (2012) .................. 42 Figure 3.8 Use case diagram, Pharmacy dispensing system (2012) ............ 43 Figure 3.9 Access database, Pharmacy system database (2012) .................. 44 Figure 3.10 Data flow diagram, MEWA pharmacy system (2012) ............. 45

CHAPTER 4 IMPLEMENTATION ............................................................................. 52 -59 Figure 4.1 MEWA Pharmacy login window (2012) ..................................... 52 Figure 4.2 MEWA Pharmacy Main dash board window (2012) .................. 53 Figure 4.3 MEWA Pharmacy Sales report (2012) ........................................ 54 Figure 4.4 MEWA Pharmacy Staff workload (2012) ................................... 55 Figure 4.5 MEWA Pharmacy Stock level (2012) ......................................... 55 Figure 4.6 MEWA Pharmacy Administration (2012) ................................... 56 Figure 4.7 MEWA Pharmacy Prescription (2012)........................................ 57 Figure 4.8 MEWA Pharmacy Purchase invoice (2012) ................................ 58 APPENDICES Appendices A............................................................................................ 65 - 67 Figure 1.0 Resource budget cost (2012) ...................................................... 65 Figure 1.1 MEWA pharmacy development activity (2012) ........................ 66 Figure 1.2 MEWA Pharmacy schedule (2012) ............................................ 67

1.2 List of Tables


CHAPTER 3 ANALYSIS AND DESIG) ...................................................................... 45 - 49 Table 3.1 Access database, Login table (2007) ............................................ 45 Table 3.2 Access database, Purchase table (2007)........................................ 45 Table 3.3 Access database, Invoice table (2007) .......................................... 46 Table 3.4 Access database, Prescription table (2007) ................................... 46 Table 3.5 Access database, Sales table (2007).............................................. 47 Table 3.6 Access database, Workload table (2007) ...................................... 47 Table 3.7 Access database, Stock table (2007) ............................................. 48 Table 3.8 Access database, Vendor table (2007) .......................................... 48 Table 3.9 Access database, Pharmacy System Database (2007) .................. 49

xi

1.3

Acronyms
Muslim Education and Welfare Association

MEWA

ATM

Automated Teller Machine

HTC

HIV Testing and counseling

HIV

Human Immunodeficiency Virus

AIDS

Acquired Immune Deficiency Virus

TB

Tubercle Bacillius

LPO

Local Purchase Order

GUI

Graphical User Interface

RAM

Random Access Memory

MB

Mega Bytes

MHz

Mega Hertz

GB

Giga Bytes

xii

CBIS

Computer Based Information System

PIS

Pharmacy Information System

DUR

Drug Utilization Review

MIS

Management Information System

RAD

Rapid Application Development

SDLC

Software Development Life Cycle

4G

Fourth Generation Dont Repeat Yourself

DRY

TDD

Test Driven Development

xiii

CHAPTER 1

INTRODUCTION

1.1

Background

Troiano (1999), explains the basic functions commonly needed in a pharmacy department information system, how they are used, and important features related to them, should provide support to the following activities performed in the pharmacy:

Inpatient order entry, management, and dispensing; Outpatient order entry, management, and dispensing; Inventory and purchasing management Reporting (utilization, workload, and financial); Clinical monitoring; Manufacturing and compounding; Intervention management; Medication administration; Connectivity to other systems; Pricing, charging, and billing.

Inpatient Order Entry: Typically there are three steps in initial order entry. The first is the physical entry of the order (which may involve persons outside of the pharmacy department). This may come from an order communications system where a physician, nurse, or ward clerk has entered it, or may be directly entered into the pharmacy system. The differences between orders entered by pharmacy department personnel and orders entered by other parties are explained at subsequent points in this article.

The second step is the pharmacists validation of the order. When an order is entered by anyone other than a pharmacist, it must be given a conditional or 1

pending status. These orders are subject to review by a pharmacist prior to being dispensed to a patient.

The third step is the initial dispensing of the medication in preparation for administration to the patient. Order entry in the pharmacy is typically used to identify a pharmaceutical product that is suitable to meet the physician order. This includes identification of crucial aspects of the order such as item strength, package size, method of administration, as well as the ingredients that must be prepared by the pharmacy. In order to ensure a continuing supply of the medication to the patient, the location, method of distribution, and supplier must also be specified. This allows for an efficient, ongoing automated resupply of the medication. Typically, there are six types of orders that may occur in relation to the specific product being used in an inpatient setting, the schedule of the administrations, and the method of resupply:

Inpatient Order Management and Dispensing: Because physicians or pharmacists frequently must change pharmacy orders, it is important that a pharmacy be able to change the orders quickly and easily, while maintaining a complete and easily accessible audit trail. The patient profile is the primary order review screen used in most pharmacies. This screen provides a summary-level view of the patients orders. It is desirable to have a number of options for sorting and displaying orders and subsets of orders. This allows the pharmacist to have a full understanding of the patients orders, and to focus on those of a specific type, such as IV, antibiotic, or those of a certain drug. The profile should provide easy drill-

down to the detail of the orders. This detail should include the entire history of the order, audit trails, drug interactions, dispensing history, charges, and any other comments or notes. Easy access to pharmacy order details is also important; the program user should be able to access specific pieces of information directly and with little effort.

The use of automation in the inpatient setting to perform routine dispensing has become quite common. There are principally two types of pharmacy dispensing automation systems, centralized and decentralized. The pharmacy computer system must be able to handle both types of systems jointly or separately.

The centralized dispensing device is typically a large robot that has access to the most frequently used medications. It can perform labeling of medications for patients or place medications in patient-specific drawers in an exchange cart. The interface to the centralized automation is generally a one way, periodic interface used to handle refills of ongoing orders and, less frequently, the initial dispensing for orders recently entered into the system.

The decentralized dispensing device is analogous to an ATM (Automated Teller Machine). These devices generally contain two-way interfaces and are located near the patient care area. The pharmacy information system may send a list of verified orders for each patient to the device. This permits some devices to provide a check on the person requesting the medication for a specific patient. If the patient does not have an order for the medication, the

requestor is notified and may even be prohibited from obtaining the medication. There is a billing interface from the dispensing device, networked to the pharmacy system, to log which medications have been dispensed for which patients.

The project aims to automate the current MEWA Hospital Pharmacy department manual system, pushing paperwork, for ages. They have had cumbersome working procedures and this has led to low productivity occasioned by highly inept manual system.

MEWA Hospital was founded in 1985 in Mombasa and its principle objective is to promote, encourage and improve the medical, educational, socioeconomical and cultural welfare of all Kenyans. (MEWA 2000)

1.2

Statement of the problem

Currently MEWA pharmacy departments does not have an automated system to analyze stock and statistical records, generate monthly reports, pricing and invoicing of the patients which has lead to organization to compromise the core pharmacist work of dispensing and customer care hence leading to inefficiency causing high patient waiting time and loss of patients to competitors.

The Manual system has made it more difficult to keep up with the prices updates as changes in prices are daily norms due to the fluctuation of the foreign currency. This has result in undercharging or overcharging the patient, consuming a lot of time and materials. 4

The results of the interview with the pharmacy staff yield the following problems:

i.

Going through physical stock count and using bin card to generate replenishment orders to the suppliers.

ii.

Manually filling in of various procurement documents i.e. Local Purchase Order, Requisition Forms, Issues Notes etc, which has proved to be cumbersome and time consuming.

iii.

Calculating the prices of each and every medicine for the purpose of quotation or a sale to the patient, which is time consuming and cumbersome.

iv.

Manual inventory controls where bin cards are to be manually updated for each and every sale or purchase.

v.

The manual recording of prescriptions on a prescription book, as per pharmacy practice requirement of CAP 244 of Kenya Law.

1.3

Objective

The main purpose of this project is to automate the current manual pharmacy system by implementing computer based Pharmacy Information system, which will address the inefficiency of the department leading loss of patients to competitors.

1.3.1

Specific Object

The specific objective entails to develop system modules that will

i.

To reduced pharmacist work load by half.

ii. iii.

To harmonize prices within different outlets To reduced patient service time (time taken for a patient to be served) by at least half.

iv.

To keep track of the inventory

1.4

Justification

The significance of this project is the automation of current Manual Information System to a Computer Based Information System (CBIS) will benefit its users as Reduced patient waiting time The pharmacist time will be reduced as most of the functions will be replaced by the Computer based information system as a result patient will be attended much faster as compared to the current system. ii. Reduced users work load The general work load of the pharmacist will be significant reduced and give room to the pharmacist to give better services especially in the areas of patient medication compliance and customer care. iii. Up to date prices The system will entail prices which can be view in all outlets at any time. While any changes of prices are reflected immediately and the pharmacist doesnt bother to memorize the price, as it is taken care by the system iv. Up to date stock levels The stock levels will be automated by system. This will give the pharmacist information to avoid over stocking, under stocking and to avoid stock outs.

i.

v.

Automated orders using reorder levels - The stock levels will be automated by system. This will give the pharmacist the re-order level as the cost of out of stock may lead to patient dead.

1.5

Project Scope

The scope of this project is MEWA Hospital Pharmacy department situated at Sharif Kassim Street, Kingorani next to Musa Mosque Mombasa Kenya.

1.6

Target Users

The target users of the pharmacy system are all users of pharmacy department at different dispensing outlets namely

i.

Outpatient Pharmacy: This is an outlet that deals with patient who are seen for all general illness and medication are prescribed and the patient does not need hospitalization but allowed to go home.

ii.

Inpatient Pharmacy: This outlet deals with critically ill patients who need specialized professional care. These patients need to be hospitalized and be monitored around the clock. Special medications are prepared for them.

iii.

HIV Testing & Counseling (HTC) Pharmacy: This outlet specializes with patients suffering HIV/AIDS and TB diseases. The pharmacist deals with drug compliance counseling of Anti-retrial and Anti-TB therapy.

iv.

Theatre Pharmacy: It is an outlet that specializes with anesthetists medication, pre-operative medication and post-operative medication. These are patient who need surgery to elevate their suffering. 7

v.

Surgical Pharmacy: It is an outlet that mostly deals with other medical department within the hospital. The outlet deals with surgical consumables like syringes, needles, gloves, and many others.

vi.

Procurement Pharmacy: It is an outlet that deals with inventory controls. It deals with suppliers, Local Purchase Orders (LPO), quotations, discounts and so on.

vii.

Drug Store: It is an outlet that deals with store management. Both medical and surgical supplies are store in required conditions as speculated by the manufacture to preserve potency.

1.7

Project Limitation

i. ii.

Subjective biases reported on data reported by the respondents Not all employees responded

1.8

Summary

MEWA Hospital has been operating on manual systems, stand alone systems, pushing paperwork, for ages. They have had cumbersome working procedures and this has led to low productivity occasioned by highly inept manual systems.

In MEWA Hospital there is an increased recognition of information as an important corporate resource that is key to good decision making in a competitive and ever dynamic environment; and technology- hardware, software, telecommunications and related technologies- is now fairly priced and therefore more affordable to take this decision.

CHAPTER 2

LITERATURE REVIEW

2.1

Introduction

This chapter examines the related literature on the development of pharmacy software system in different organizations. It also examines the different

literature on pharmacy practice and dispensing procedures as prescribed by different pharmaceutical regulatory boards or government agencies.

2.2

Theoretical Review

According to Biohealthmatics (2012), Pharmacy information systems (PIS) are complex computer systems that have been designed to meet the needs of a pharmacy department. Through the use of such systems, pharmacists can supervise and have inputs on how medication is used in a hospital.

Some of the activities which Pharmacy Information Systems have been employed in pharmacy departments include: Clinical Screening: The Pharmacy Information System can assist in patient care by the monitoring of drug interactions, drug allergies and other possible medication-related complications.

When a prescription order is entered, the system can check to see if there are any interactions between two or more drugs taken by the patient simultaneously or with any typical food, any known allergies to the drug, and if the appropriate dosage has been given based on the patients age, weight and 9

other physiologic factors. Alerts and flags come up when the system picks up any of these.

Prescription Management: The Pharmacy Information System can also be use to mange prescription for inpatients and/or outpatients. When prescription orders are received, the orders are matched to available pharmaceutical products and then dispensed accordingly depending on whether the patient is an inpatient or outpatient. It is possible to track all prescriptions passed through the system from who prescribed the drug, when it was prescribed to when it was dispensed. It is also possible to print out prescription labels and instructions on how medication should be taken based on the prescription.

Inventory Management: Pharmacies require a continuous inventory culture in order to ensure that drugs do not go out of stock. This is made even more difficult when there are multiple dispensing points. When don manually it is very difficult to maintain an accurate inventory.

Pharmacy Information Systems aid inventory management by maintaining an internal inventory of all pharmaceutical products, providing alerts when the quantity of an item is below a set quantity and providing an electronic ordering system that recommends the ordering of the affected item and with the appropriate quantity from approved suppliers.

10

Patient Drug Profiles: These are patient profiles managed by the Pharmacy Information System and contain details of their current and past medications, known allergies and physiological parameters. These profiles are used for used for clinical screening anytime a prescription is ordered for the patient.

Report Generation: Most Pharmacy Information Systems can generate reports which range from determining medication usage patterns in the hospital to the cost of drugs purchased and or dispensed.

Interactivity with other systems: It is important that Pharmacy Information Systems should be able to interact with other available systems such as the clinical information systems to receive prescription orders and financial information system for billing and charging.

Damle and Puri (2007), mentioned the key benefits of pharmacy management systems are to automating processes, streaming workflow and thereby enhancing the customer base which are attractive enough to draw retail pharmacy chains competing in a world of growing challenges. However, the choices are tough with handful of products and high cost of customized solutions.

Pharmacy chains competing for growth in the face of significant competitive face of dire need to improve productivity t cope withe sever shortage of trained pharmacy staff and regulatory government bodies like pharmacy and poision board. To address these challenges, the need to develop customers pharmacy

11

management systems to suit a particular country regulation and requirement, (Damle and Puri , 2007).

Pharmacy Management Systems Critical Features Pharmacy management system must work unfailingly, flawlessly and seamlessly in complex multi-outles, to enable drugstore chains to operate efficiently and profitably.

Some of the functionality driven critical features include: Smooth workflow processes enabling external services such as third payments, DUR (Drug Utilization Review), consultation, wait time calculation. Integration capabilities for refill alerts, grouping of prescription, point of sale, order/inventory management and order-to-promise. Centralized view of data including patient history, inventory and ability to fill prescription anywhere in the outlet and prescription transfers. Workload balancing ability to off-load activities to alternative outlets. Ability to extend services and integrate across channels, viz, e-commerce, eprescription and mail-orders.

From the architecture perspective, pharmacy management systems can be centralized with corporate as the hub and client terminals as the outlets. An alternative could be standalone outlet-driven systems where frequent connectivity with the headquarters is not essential, or even a combination of the two. The model to be selected would be based on the pharmacy practise of a particular countrys regulations and rules.

12

2.3

System Review

The market entails various pharmaceutical information systems but there is no one general prototype that can be applied to all types pharmacy outlets. Therefore there is a need for customized software information system to solve user customer need. The following are a few among several information systems with varying degrees of functionalities depending on the user customer needs.

2.3.1

ApotheSoft Pharmacy Management Software

The ApotheSoft pharmacy management software was designed by a Pharmacist who fills prescriptions everyday with the Apothesoft pharmacy software. The ApotheSoft pharmacy software does dual third party insurance billing. The ApotheSoft program has been designed and is intended for small retail pharmacies that have script volumes of 100 to 500 prescriptions per day, as report by ApotheSoft, (2001).

The ApotheSoft Pharmacy management software was designed with the following functionality models:

i. ii. iii. iv. v. vi.

Entering a New Patient (Customer). Entering the Doctor's Information. Inputting Inventory. Entering Insurance Claim Information. Pricing Table. Inputting Compounds. 13

vii. viii. ix. x.

Entering Intravenous Medication Compounds. Entering Prescriptions. Running Reports. Medication Administration Records.

The Figure 2.1 below is the main screen of the ApotheSoft Pharmacy Management Software, and has the following modules

Figure 2.1

ApotheSoft, (2001). Main Treatment Filling Screen

Treatment Information: It is compose of the unique number of for the treatment regime, filled date of the drugs, the next refill date, the drug labels and patient status

Patient Name and Information: It is compose of patient details like patient name, patient date of birth, insurance number and insurance plans. 14

Doctor Name and Information: It is compose of doctor name, doctor phone, doctor DEA number and doctor fax.

Drug Name and Information: It is compose of Drug name, Drug NDC number, Generic Name and treatment Id number.

Cost / Price Information: It is compose of Unit cost, Unit / Packet price, amount of markup, amount of discount and total amount.

Treatment fill data: It is composed of quantity dispensed, the print label of drug instruction, total amount, dispensed to date, quality remaining and total amount authorized

The Figure 2.2 below is the Patient Information screen of the ApotheSoft Pharmacy Management Software, and has the following modules

Figure 2.2

ApotheSoft, (2001). Patient Information Screen

15

Patient Search: The search window consists of different types of searches for a patient. The pharmacist can search the patient using patient last name, or patient phone number, and or patient address.

Adding New Patient: This window consists of the bio-data of the patient. It entails the patient full names, patient insurance number, patient phone number, patient insurance limit and patient address.

Insurance Information: The Insurance window mainly deals with insurance details. The information is insurance plan, insurance code, employee id, person code, insurance verification code and insurance card validity.

The Figure 2.3 below is the Patient Profile screen of the ApotheSoft Pharmacy Management Software, and has the following modules

Figure 2.3

ApotheSoft, (2001). Patient Profile Screen (Summary) 16

Patient Detail: The Patient detail window entails the basic patient information. The Patient detail is the patient name, patient prescription number, patient insurance policy plan and the patient treatment regime.

Patient History: The patient history window entails the patient treatment regime history. The module entails specify date criteria from a specify date to a current date. The prescribing habit for a particular doctor can also be accessed.

Drug Interaction: The drug interaction window entails a list of all medication of the patient currently taking. This list gives a snap shot view to pick any drug reaction or interaction in the list for patient safety.

2.3.2

MedRight Medication Management Software

According to Care Right Tech (2006), MedRight Medication Management Software was designed specifically for long term care facilities; MedRight medication management software differentiates itself from other Electronic Medication Administration Record systems with its easy to use functionality and its transparent state of the art technology.

The MedRight medication Management software has the following features

i. ii. iii. iv. v. vi.

Full medication profile for residents Pharmacy integration Biometric authentication Eliminate monthly changeover Patient directives viewable Medication check-in & Inventory counts 17

vii. viii. ix. x.

Late medication, follow-up reminders Insulin sliding scale setup available Bar code scanner (optional) Flexible & powerful reporting

Dispensing Medication

The Figure 2.4 below is the Prescription Generation screen of the MedRight Medication Management Software, and has the following modules

Figure 2.4

Care Right Tech (2006). Prescription Generation

Prescription Generation The figure 2.4 entails the following functionalities; the doctors or prescribers name, the date of the prescription, the new treatment or regime prescribed to

18

the patient, the treatment name, the doctors diagnosis, the treatment starting date and treatment ending date.

There is a calendar for ease access for patient drug management schedules for the treatment regime compliance.

There are also two buttons one for cancel if the pharmacist is unsure and made any mistake and another for submit the information to be saved in the database.

Dispensing Medication

The Figure 2.5 below is the Dispensing Medication screen of the MedRight Medication Management Software, and has the following modules

Figure 2.5

Care Right Tech (2006). Dispensing Medication

19

Dispensing Medication window: It gives a full detail of a typical legal prescription with all the components of the prescription. It entails doctors name, prescription date, drug names and drugs strength, and drug frequency and drug duration

It has three buttons for validation of dispensing. The one label Give for dispensed drugs, the other label Not Given for non-dispensed drugs and the lastly label Options for special instruction and drug instruction information to the patient.

Consulting the drug formulary

The Figure 2.6 below is the Consulting the drug formulary screen of the MedRight Medication Management Software, and has the following modules

Figure 2.6

Care Right Tech (2006). Consulting the drug formulary 20

The Figure 2.6 shows the pharmacist if the doctor is prescribing rational. A drug formulary is a list prepared by the pharmacists and other stalk holders including insurance company to control type of drugs to be prescribed and dispensed to the patient.

In this window a comparison of the prescription and the of the formulary is done while those drugs not supposed to be dispensed to a particular patient are marked NOT ACTIVE

Consulting for prescription conformity

The Figure 2.7 below is the Consulting for prescription conformity screen of the MedRight Medication Management Software, and has the following modules

Figure 2.7 Care Right Tech (2006). Consulting for prescription conformity

21

Consulting for prescription conformity

The new routing medication window show the prescription conformity details which include the doctors name, order date, order type, type of medication, medication name, the start and end of the prescription, number of doses, treatment type and diagnosis.

2.3.3

Axis Pharmacy Manager Software

According to Wasifable (2011), Axis Pharmacy Manager Software is a comprehensive solution designed to automate the activities of

Medical/Pharmaceutical Retailers. Axis Pharmacy Manager has the Capability to administer the total enterprise and efficiency and manage information. It is designed with an easy-to-use interface. Axis Pharmacy Manager is an automated system for any large/medium Pharmaceutical Retailers. It covers Complete Customer Management, Inventory Reporting, Cashier with integrated accounts, Product database etc. Thus this software is a complete business management/medical stores-shop management/ retail chemists and druggists management.

The following are the features of Axis Pharmacy Manager Software

i. ii. iii. iv. v. vi.

Purchase, Sales, Cash receipts/payments. Stock, sales, Inventory and MIS Reports. Information list views for faster data location. Easy-to-use, User friendly Graphical user interface. Faster accessing, accuracy, more efficiency, more security. Better service to customer. Enhanced administration and control. 22

The Main Menu The figure 2.8 below entails the following modules sales, sales return, customer, purchase, purchase return, vendors and the items

Figure 2.8

Wasifable, (2011). Main Menu

The Figure 2.9 below describes the system how it can create new pharmacy outlets. It entails the store name, address, city, country, e-mail, drug license numbers, additional tax among others.

23

Figure 2.9

Wasifable, (2011). Setting up the pharmacy stores (Outlets)

The Figure 2.10 below shows details when sales of the medicine. It describe and display information of the sales number, sales date, customer type, customer name, address, sold by, amount and tax.

24

Figure 2.10

Wasifable, (2011). Making sales of medicine

2.4

System Critique

The above three softwares vary in the functionality and integration with other health management system. This integration biasness, depend on the country regulatory bodies, which shows broad responsibility of a pharmacist. Theses difference alert the professional regulatory bodies to standardized pharmacy practice across the globe to enable system developers to come up with one pharmacy management prototype.

25

Although pharmacy training across institutions of learning are standard but pharmacy practice remains a challenge across the global where government regulatory bodies regulates its professionals to work within certain limits.

This challenge has lead to the development of several variants of pharmacy management systems, creating a need for toiler made software for a particular region or even a particular outlet. This makes it impossible to create standard pharmacy software that can be implemented across the globe.

2.5

System Adaption

There is a general demand on institutional managers to deliver high quality service; there is increasing need for management productivity; efficiency brought about by the systems; there is the increased recognition of information as an important corporate resource that is key to good decision making in a competitive and ever dynamic environment; and technology- hardware, software, telecommunications and related technologies- is now fairly priced and therefore more affordable to many institutions.

In pharmaceutical departments, the stock control has been an issue especially the variance which cannot be eliminated due various reasons among them theft. This system will make stock control problems a thing of the past. In procurement procedures, partnering reorder level will also be address by this software hence justifying all the purchases as reorder level, will be automatically generate therefore eliminating the use of bin card to make orders.

26

CHAPTER 3

ANALYSIS AND DESIGN

3.1

Introduction

This chapter will involve the analysis of the methodology technique put in use to aid in the creation of the proposed system and the successful development and implementation of the system. The methodology that will be used will be Phase Development Methodology of Rapid Application Development (RAD).

Therefore, the project analyses and evaluates the current MEWA Hospital Pharmacy system , its feasibility, design and its practicalibily as well as to developed a new proposed system to the deparment and organization as a whole.

3.2

DEVELOPMENT APPROACH

3.2.1

System Design

As reported by Maner Walter (1997), in order to ensure high responsiveness, projects are designed with fixed timescales, sacrificing functionality if necessary. This allows the development team to focus on the pieces of functionality that have the highest business value, and deliver that functionality rapidly. Change is often the reason for delays in application development.

In long linear development processes, changes in functionality requirements or project scope, particularly after a lot of time has been invested in planning,

27

design, development and testing, cause many months to be lost and significant expense to be incurred for redesigning and redevelopment.

Rapid Application Development (RAD) combats scope and requirements creep by limiting the project's exposure to change -- shortening the development cycle and limiting the cost of change by incorporating it up-front before large investments are made in development and testing."

3.2.2

Systems Development Lifecycle (SDLC) Steps

It covers many activities; starts from understanding why the system should be built, studying the project feasibility, analyzing problems, choosing the system design and architecture, implementing and testing it, up to delivering the system as product to the user. SDLC is a process of gradual refinement, meaning that it is done through several development phases. Each phase continues and refines whats done in the previous phase. Commonly known development phases in SDLC are:

Planning: It is the process of understanding why the system should be built and defining its requirements. It also includes feasibility study from several different perspectives, technical, economic, and organization feasibility aspects.

Analysis: This phase includes activities such as problems identifying and analysis, and even predicting potential problems that may arise in the future

28

regarding the system. The deliverables / products of this phase will drive how the system will be built and guide the developers works.

Design: System analysis leads to design decision, which exactly determines how the system operates in terms of process, data, hardware, network infrastructures, user interface, and other important factors in the system environment.

Implementation: This is probably the most resource-, cost-, and timeconsuming phase of all. This is when the system is actually built, tested, and finally installed. It also includes activities such as user training and system maintenance. Some experts like to separate them into different phases Deployment and Maintenance. However the four phases are the most commonly known and accepted steps.

EtonDigital (2004), elaborate that, Software Development Life Cycle (SDLC) tries to achieve high quality system that meets or exceeds the requirements. Many methodologies have been developed and introduced in order to implement SDLC; some of them also try to improve other (previously) known methodology. Although each method follows certain different techniques and steps, they are all must go into the same development phases described above.

There are many system development methods known today, but most of them basically are extended from three main methodologies which are Structured

29

Design, RAD (Rapid Application Development), and Object-oriented Analysis and Design.

3.2.3

Structured Design

As reported by EtonDigital

(2004), the method follows a step-by-step

approach which moves logically from one phase to the next. The works done in each phase need to be approved by the project sponsor (this is usually the customer or the business analyst in an organization) before it can proceed to the next development phase.

The Waterfall development methodology can be classified as this kind of methodology. This rigor and inflexible manner make this methodology vulnerable to any business changes that happen while the development is still on the way, as it is extremely difficult to go backwards. This may require repeating the whole development process from the start and throw away all thats been done, and in the worst case it could cause the change of project contract or agreement with the customer.

There are two approaches in developing system using this methodology, process-centered and data-centered approaches. Process-centered approach attempts to get the works done mainly from the perspective of the processes that exist in the operation of the system, which will likely result in system that constructed by process-oriented components. On the other hand, the datacentered approach concentrates on the data used by and involved in the system.

30

Structured design methodology has some advantages in that the rigor manner of this method forces the developers (analyst and his/her team) to well identify and understand system requirements long time before the implementation phase begins. At least it should have been approved by the sponsor before the developers start coding any programs.

The lack of ability to go backwards of the development phases makes this methodology un-accommodateable to business process changes as the project proceeds. Projects done using this methodology take a long time until users receive some deliverables because usually the system being built cannot be presented until it is completely done at the end of the implementation phase.

Figure 3.1

EtonDigital, (2004) Structured Design Methodology

The Figure 3.1 above shows the structured design methodology of water fall model where one phase has to be completed before proceeding to the next phase and there is no flexibility of revisiting the previous phase.

31

3.2.4

RAD (Rapid Application Development)

It is reported by EtonDigital (2004), RAD methodology enters to overcome the weaknesses of Structured Design method. RAD-based development tries to adjust the SDLC phases to have some part of the system (most likely the core function of the system) developed quickly to be delivered to the users. Certain types of RAD method also try to be adaptive to possible changes in the business process by concurrently perform all development phases at (roughly) the same time, like those manifested in the Prototyping RAD and Agile Development Methodology. RAD methodology introduced the use of advance development tools like code generators and the visual fourth-generation (4G) programming languages such as Microsoft Visual Basic and Borland Delphi. The use of these tools speed up the development process and in some degree produces higher quality of codes. However as the system can be delivered quickly, users tend to change their expectations of what the system can do, thus the requirements tend to change and expand.

There are three categories of RAD:

Phased Development

This method breaks the requirements into a series of versions, based on which several versions of system will be built sequentially, being the most fundamental and important functions bundled in the first version. Sequentially here means that the next version development will begin only after the preceding version has been approved and implemented. Each version has its

32

own Analysis-Design-Implementation phases (in a smaller scale compared to the overall system). All of these versions will later be tailored to form a complete system that meets the requirements. This method delivers useful system very quickly to users, though it doesnt cover all functions just yet. And as the system will be built based on many sequential versions, it is very critical to identify important and fundamental functions to be included in the first version, an in-depth initial analysis of the system is needed.

Figure 3.2

EtonDigital, (2004) Phased Development Methodology

The above Figure 3.2 shows the RAD, Phased Development Methodology where various versions of the systems are build with minimum functionalities and keeping on improving until a final version is achieved.

33

Prototyping

According to EtonDigital (2004), the methodology used usually when the business process is likely to be changed as the project proceeds or when the project sponsor has little idea of what system to be built. The Analysis, Design, and Implementation phases performed concurrently and on each cycle resulting in a system prototype that will be reviewed by the project sponsor. The cycle repeated continually based on the sponsor comments until the prototype successfully meets the requirements. The last prototype will then be called the system.

Prototyping development needs only initial basic analysis and design, but as the result important system functions may not be recognized until somewhere in the middle of project timeline. Thus there is a possibility to alter the initial design decision and start all over again from the beginning. It can delivers system quickly to users, though it not exactly meets the requirements.

Figure 3.3

EtonDigital, (2004) Prototyping Methodology 34

The above Figure 3.3 shows the RAD Prototyping Methodology, which entails of building several functioning prototypes from analysis phase to implementation phase then going back to the stake holders to see if it meets their specification until when specification are meet.

Throw-away Prototyping

Adi (2008), describes the throw-away Prototyping is similar to the Prototyping method in that it also develops a prototype. But the throw-away prototype is rather presentational only, the prototype actually does nothing. It is intended to help users visualize the system being built. Based on the users comments, the next prototype continuously built until it can visualize the real working system.

The next step would be implementing the real system. This throw-away prototype is also called dummy (mock-up) prototype. It is best if possible to do a thorough initial analysis before the developers start working on the first dummy prototype, as the dummy needs to contain enough details about the real system. This method doesnt deliver incomplete systems within the project timeline like prototyping method, but in the end it delivers the complete system very quickly. It generally has shorter project timeline compared to other methods, because building dummies is considered easier and less timeconsuming than building working prototypes.

35

Figure 3.4

EtonDigital, (2004) Throw-away Prototyping Methodology

The above Figure 3.4 is based on the users comments, where the prototype is continuously built until it can visualize the real working system. This prototype has no functionality it gives the user an over view of the whole system in the early development of the system.

3.2.5

Methodology Justification

EtonDigital (2004), describes the Rapid Application Development (RAD) is a methodology for compressing the analysis, design, build and test phases into a series of short, iterative development cycles. This has a number of distinct advantages over the traditional sequential development model.

One of the principles of RAD is to start developing as early as possible in the project, possibly the day the order has been signed, so that clients can review a working prototype and offer additional direction. The application then gets 36

built in an iterative process, releasing increasingly feature-rich versions in short development cycles and which, most importantly, involve the client in the build of their project.

The advantages for the client are numerous. For a start, their developer doesn't need to factor in potential future changes when implementing a feature and therefore the client can request changes as the project evolves. When changes to functionality are inevitably requested during development, existing code usually has to be re-written, a process called refactoring. Refactored code is moved to other places according to its nature and in the special case of duplicate code, this is refactored to a single place, thus applying the Dont Repeat Yourself (DRY) principle.

And to make sure that the clients application still runs when it changes constantly, it needs a full set of automated unit tests. If well written, unit tests are a solid way to ensure that nothing is broken by adding or refactoring code in real time. Some development methodologies even stipulate writing tests before coding, a practice thats that's called Test-Driven Development (TDD).

37

Figure 3.5

EtonDigital, (2004) Traditional and RAD Methodologies

The Figure 3.5 above shows the different phase both for the traditional and RAD Methodologies. It describes the system from analysis phase to the implementation phase. It also show the inflexibility of the traditional method where phases are executed sequentially, and the iterative nature of RAD whereby prototype are seen at the early stages of the project.

3.3

Fact Finding Approach

This section discuss the research design, target population, sample size and sampling technique, research instruments, data collection procedures and various methods of Data collection instruments that is being used in the course of the project

3.3.1

Research Design

The design for this project is sampling. Sampling is an attempt where we select a group of subjects for study from a larger group. Each individual is chosen 38

entirely by chance and each member of the population has an equal chance of being included in the sample.

3.3.2

Target Population

The research was carried out at the MEWA Hospital Pharmacy department and Administration department. The population targeted for the study comprised of employees spread out in seven different outlets from where a source of 33 employees were selected.

3.3.3

Sample and Sample techniques

The employees were divided into stratum according to their outlet since the Population is heterogeneous a stratified random sampling technique was graphed. Three simple representatives were selected from each outlet whos a

random sampling was conducted to select a few employees; the were then distributed to the staffs as per outlet. Each outlet

questionnaires

was given three questionnaires.

3.3.4 Data Collection Tools The questionnaire method of data collection was adopted to collect primary data. The Questionnaires administered contained closed questions and were hand delivered to the Targeted group. The questionnaires method was a preference because most staff could only spare a short time to complete the questionnaire and since they are pressured with the nature of their work there was no time for lengthy discussion. The respondents were required to tick from the option given. The procedure for data collection involved the distribution of questionnaires. 39

3.4

Requirement Specification

The pharmacy software system will include the following functionalities Login system for security and data integrity, where the user is control for access of the system. The user has to provide user name and password and system check against the stored data and verified in order the user to log in. Sales System where client can make sales, the user selects the requested medicine to be dispensed, and automatically gives the prices of the drug and the available stock. The sales is completed by giving the grand total of the sale. Report System the ability to generate various reports e.g. stock transfers to different outlets, total sales, staff workload, total purchases and closing stock. Administration password management, the system administrator is able to create users and give them various rights to access the system and also deny some functions to particular users. Prescription Patient records of drugs consumed, according to pharmacy and poison board and Cap 244 of Kenya patient records in the form of prescription should be recorded and keep for at least two years before are destroyed Purchases purchase type, vendors, invoices etc, the suppliers information and history of suppliers both of the product, medicines and cost can be tract to keep good relationship.

40

3.5

LOGICAL DESIGN

3.5.1

Activity Diagram

The activity diagram below shows how users will login in the Pharmacy system. It further displays how users will be managed for accountability and data integrity.

Figure 3.6

Activity Diagram, Pharmacy login system (2012)

The above Figure 3.6 above shows the pharmacy login system, where the administrator has the privilege to create account to users to login in the system. Also the administrator can assign to users, different privilege to access the intended sections of the system.

41

3.5.2

Data Flow Diagram

The Figure 3.7 below shows how the login validation system uses validation procedures to keep away unauthorized people from accessing the system hence enhancing the system security

Figure 3.7

Data Flow Diagram, login validation system (2012)

42

3.5.3

Use Case Diagram

The Figure 3.8 below shows a use case diagram that captures the interaction between users and the business logic of the pharmacy system. It shows different modules and how they interact with the both the client and the server.

Figure 3.8

Use Case Diagram, Pharmacy dispensing system (2012)

43

Figure 3.9 System Data Flow Diagram, MEWA Pharmacy System (2012)

The following functionalities are depicted:

The sales modules, where a user can make sales of the drug. The report module is able to generate various reports, the stock transfers to various pharmacy outlets, sales report, staff work load report, purchase report, and stock report. The administrator modules, which enables the system administrator to manager access to the system. The Prescription modules, it has the functionality of keeping patient records and list of medication given. The purchase module entails the purchase made, the vendors information, and the invoice and receipt.

3.6

Database Design

The Pharmacy management system entails the following tables of the database:

44

The Table 3.1 below shows the login table design consisting of various fields, primary key is UserID and others fields are Username, Password, Surname, Firstname, SecurityPhrase, SecurityAnswer and TimeDate.

Table 3.1

Access Database Login Table (2007)

The Table 3.2 below shows the Purchases table with ID field as its primary key. The other fields are hospital departments which are supplied with medicine by pharmacy department, which include Nursing, pharmacy (outlets), others, DepartmentName, Totalin and TotalOut.

Table 3.2

Access Database Purchase Table (2007)

45

The Table 3.3 below shows the Invoice Table with primary key field as InvoiceID. The other fields consist of ItemDescription, ItemID, Units, Quantity, VAT, Discount, SubTotal, Total, InvoiceTo and Dates

Table 3.3

Access Database Invoice Table (2007)

The Table 3.4 below shows the Prescription Table with the ID field having the primary key. The other fields consists of the PatientsNo, PrescriptionNo, DrugName, Quantity, TotalCost, DoctorsName, Dipensed, Dispenser,

Remarks, price and patientName.

Table 3.4

Access Database Prescription Table (2007) 46

The Table 3.5 below shows the Sales Table with the primary key of ID field which will be automatic generated with AutoNumber data type. The other fields are InvoiceID, DrugName, Price, Quantity, Total, Dates, Paid, Dispenser, Doctor, PatientsName and Dispensed.

Table 3.5

Access Database Sales Table (2007)

The Table 3.6 below shows the StaffWorkload Tables with ID field as ist primary key. Other fields are Dispenser, Dates, TotalSale, TotalPrescription, TotalPatients and TotalPrescriptionItems

Table 3.6

Access Database Workload Table (2007) 47

The Table 3.7 shows the Stock Table with the primary key field of DrugID. The other field names are the DrugName, Quantity, ExpiryDate, SalePrice, DiscountPrice, StorageType, DateOfPurchase, Formulation, DrugBalance and ReOrder

Table 3.7

Access Database Stock Table (2007)

The Table 3.8 shows the Vendors table with ID field as the primary key. The other fields include the VendorName, Telephone, Email, CreditLimit, ContactName, Balance and Discount.

Table 3.8

Access Database Vendor Table (2007) 48

The Figure 3.9 shows the pharmacy software database entity relationship. The database consists of the login table, purchases table, sales table, staff work load table, invoice table, stock table, vendors table and prescription table.

Figure 3.9

Access Database, Pharmacy system database (2007)

3.7

Interface Design

The Figure 3.10 above shows how the Pharmacy system integrates the different functionality of the system. It also depicts the functionalities of the system in a snap shot.

3.8.1

Specific Platform

The system will run on windows platform using Microsoft Visual Studio 2008 programming language, with Microsoft Access 2007 as the database.

49

The Visual Studio is an ideal programming language for creating sophisticate applications, its based on graphical user interface (GUI) friendly interface for all system users

3.8.2

Hardware Specification

The system requires the following in order to function effectively:

RAM Size at least 128 MB A printer for printing the output Processor speed of above 200 MHz Hard Disk of at least 15 GB. Free space at least 100MB

This is the identification and indication of what information/assets the system development will require in order for the system to be completed successfully. The requirement specifications are classified according to their categories. They include: Input, Output, Processes, Hardware, Software, File

specifications etc.

3.9

Justification

The Microsoft Access data has a great flexibility with the Microsoft visual studio since are made by the same vendors as compared to other database. There is also reliable and competitive support in the market today as many people having using them for a long time.

50

3.10

Conclusion

To conclude this chapter it is therefore shown that Phase development methodology of Rapid Application Development is the feasiable and practical way to implement this project. As a result the design of this project will take this route to implement the project inorder to deliver the pharmacy software system to MEWA Hospital pharmacy.

The Rapid Application Development methodology, due to its flexibilty will ensure that the project is completed within the required time. The RAD iterative nature will also ensure that specification and quality of the product is not compromise in any way.

51

CHAPTER 4

IMPLEMENTAION

4.1

Introduction

The main purpose of this chapter is to turn the above system specification using the design methodology tools into a running system. The snap shots and figures are taken from the prototype of the MEWA Pharmacy Software System. This will involve coding for each module, which will also feature in this chapter. The users and the owners were involved during the iterative phase and their recommendations were immediately implemented. The design methodology of RAD entails iteration until the users specifications are meet. Therefore the final deliverables will be achieved once all the users specifications are addressed. 4.2 Construction and coding

The Figure 4.1 below shows the pharmacy software prototype of the login module window. The user has to enter user name and pass word in order to access the system.

Figure 4.1

MEWA Pharmacy Software Login window (2012) 52

Incorrect pass word or user name triggers a message and denies entry to the system. The user is given three chances to enter the correct user name and pass word, after which the system is lock. The above function can be implemented using the code reference in the Appendices B.1 The Figure 4.2 below shows the pharmacy software prototype of the main dash board window. This window has five sub windows with different functionalities. These windows are the sales window, report window, administration window, prescription window and purchase window.

Figure 4.2

MEWA Pharmacy Main Dash board window (2012)

The Main Dash Board Window to implement the above module is reference in the Appendices B.2 The Figure 4.3 below shows the pharmacy software prototype of the Sales Report window. The sales window report captures the date, invoice id, drug name, price, quantity sold and total.

53

Figure 4.3

MEWA Pharmacy Sales Report (2012)

The sales generated report can be sorted by date and can be filter to display report between two dates. The sales report also shows the grand total sales, the grand total quantity and grand total transfers to other department. The code that creates the sales report module can be reference from the Appendices B.3 The Figure 4.4 below shows the pharmacy software prototype of the staff work load. It consists of the date, total prescription, total sales and total patient served by a dispenser.

54

Figure 4.4

MEWA Pharmacy Staff Workload (2012)

The staff workload module can be implemented using the code reference in the Appendices B.4 The Figure 4.5 below shows the pharmacy software prototype of the stock level. It consist of the drug id which is the primary key uniquely identifying the drug, the drug name, the quantity of drugs in stock, the cost price, sales price, discount price, the storage type, date of purchase, drug formulation, drug balance and the reorder level.

55

Figure 4.5

MEWA Pharmacy Stock level (2012)

The reorder level helps the pharmacist in inventory control. The drug formulation entails classification of drugs in the route of administration. The tables or capsules, injectables, infusions, creams, virginal pessaries, lozenges and syrups to mention a few. The code to implement the above stock level module can be reference in the Appendences B.5 The Figure 4.3 below shows the pharmacy software prototype of the administration window. The window entails change of password of the user. It has three text boxes, for old password, new password and confirm password.

Figure 4.6

MEWA Pharmacy Administration (2012)

The two buttons are also incooperated one the change the password and other to clear the text box for any errors during entries. The Administration module can be implement using the code referencing the Appendices B.6

56

The Figure 4.7 below shows the pharmacy software prototype of the prescription. It contains three parts, patient information, drug information and dispense prescription.

Figure 4.7

MEWA Pharmacy Prescription (2012)

The patient information features the name of the patient, date, patient name doctors name, patient number and prescription number. The drug information consists of drug name, drug cost, drug balance, quantity dispensed and total cost.

There is also two buttons one for calculating the total drug cost and another dispensed which populate the prescription with prescription number, patient name, drug name, price, quantity, total price and doctors name.

The implementation of the prescription module can be reference in the Appendices B.7

The Figure 4.8 below shows the pharmacy software prototype of the Purchase Invoice. 57

Figure 4.8

MEWA Pharmacy Purchase Invoice (2012)

The purchase invoice consists of two section, vendors information and drugs information. The vendors information consists of vendors name, telephone number and the email address. While the drug information consist of the drug code, drug description, quantity, unit, unit price, discount and total. The above pharmacy purchase invoice module can be implemented using the code reference to the Appendices B.8

4.3

Findings and Results

The users and the owners were involved during the iterative phase and their recommendations were immediately implemented. The prototype functionalities have satisfied the users specification at this point; although there are some suggestions from user to further improve the system. The system has been received well by the users, with respect to usability and ease of learning because all the processes of the old system have be integrated in to new system. 58

The system has also been flexible and scalable; where the user and owners had their changes are addressed immediately. The found the system to dynamic that it can integrate any expansions of the system in future.

59

CHAPTER 5

CONCLUSIONS AND RECOMMENDATIONS

5.1

Introduction

This chapter deals with the overall findings of the project. The developer attempts to review the objectives and the purpose of this project by presenting the summary of findings, conclusion and possible

recommendations.

5.2

Summary

The project analysed and evaluated the old Pharmacy system of MEWA Hospital Pharmacy department, and carried out a feasibility as well as developed a new proposed compuer based system to the deparment and organization

MEWA Hospital was founded in 1985 in Mombasa and its principle objective is to promote, encourage and improve the medical, educational, socio-economical and cultural welfare of all Kenyans.

The project was designed using Phase Development Methodology of Rapid Application Development (RAD). It involved the analysis of the methodology the technique put in use to aid in the creation of the system and the successful development and implementation of the system.

The project implementation was done using the various implementation and development tools. Therefore, since the system run on windows platform, Microsoft Visual Studio 2008 programming language was used to 60

implement the graphical user interface (GUI) and the business logic, while the Microsoft Access 2007 was used as database of choice, to implement the service side where the data is stored.

The users and the owners were involved and consulted during the project and especially during the implementation of the product in the iterative phase, where their recommendations and comments were acted upon immediately to affect changes. Users and owners changes where aim at the project specification to be achieved and hand over the deliverables.

5.3

Conclusions

From the above discussion it can be noted that, the new MEWA pharmacy system was well received by the stalk holders. The main objective of the project of implementing computer based system was realized as the work load of the users is drastically reduced.

The patient waiting time has also reduced leading to good customer service hence improved profit to the organization. The user standard operating procedures (SOPs) were completely changed, giving a digital age to pharmacy professional of MEWA hospital pharmacist.

5.4

Recommendations

From the above discussion it can be recommended that although pharmacy system has been computerized, after gap analysis and literature review there are many areas of improvement.

61

Currently, the pharmacist has to reference to various materials for drug reaction and interaction, in order to advice the patient on the medication. This functionality and automatic dosage calculation are the areas of future improvement for the MEWA pharmacy system.

62

REFERENCE

ApotheSoft, (2001). ApotheSoft Pharmacy Management Software: Retrieved 08, July, 2012, from http://www.apothesoft.com/index.html

Biohealthmatics.com, (2012). Pharmacy Information System: Retrieved 18th July 2012 from http://www.biohealthmatics.com/technologies/his/pis.aspx

Care Right Tech, (2006). MedRight Medication Management Software: Retrieved 03, July, 2012, from http://www.carerighttech.com/

Cellnet Ltd Mombasa, Ali Asgar, Sales Manager (2012)

Damle, P. & Puri K. (2007). The Right Pharmacy Management System: Retrieved June 04, 2012, from http://www.infosys.com/industries/retail/whitepapers/Documents/pharmacy-management-system.pdf

EtonDigital, (2004). Rapid Application Development: Retrieved 04, July, 2012, from http://www.etondigital.com/blog/

Laudon, K. & Laudon, J. (2000). Management Information Systems: Organisation and technology. In a networked enterprise. 6th ed. New Jersey, Prentice Hall.

Maner, W. (1997). Rapid Application Development: from Sun: Retrieved June 04, 2012, from http://csweb.cs.bgsu.edu/maner/domains/RAD.htm

63

MEWA, (2000). MEWA Office Secretariat: Retrieved 07, July, 2012, from http://www.secretariat@mewa.or.ke Nyandiere, C. (2007). Increasing role of computerbased information syste ms in the management of higher education institutions (Unpublished master dissertation) University of Nairobi, Nairobi, Kenya. OBrien, J.(1999) Management Information Systems: Managing Information Technology. In the Internetworked Enterprise. 4th Ed. Boston, McGraw Hill- Irwin inc.

Troiano, D. (1999). A primer on Pharmacy Information System: Retrieved 07, July, 2012, from http://www.himss.org/content/files/jhim/133/him13305.pdf

Wiras Adi, (2008).System Development: Retrieved 04, July, 2012, from http://www.slepi.net/blog/

64

APPENDICES A

A.1

Project Budget

Market analysis to procure the resources needed for this project yielded the following best quotation

Kshs. 20,000.00

Kshs. 9,000.00

RESOURCE BUDGET COST

Figure 1.0 Resource budget cost (2012) 65

Since MEWA Hospital is non-profit institution and heavily depends on donation, the above Figure 1.0 shows the budget of the project which is subject to donors contributions

A.2

Expected Completion Time

The Expected Time (/Te) = 1/6(a + 4m + b) where a = optimistic time, m = most likely time and b = pessimistic time,

Therefore if a = 4 months, b = 6 months & m = 8 months then the expected completion time is 1/6(4 + 4x8 + 6) = 7 Months

CALENDER OF ACTIVITIES

Figure 1.1 MEWA Pharmacy development activities (2012) The above Figure 1.2 show the calender of activies of the project and how long will the whole project be completed to give it deliverables

66

GANTT CHART

Time Schedule Gantt Chart


Project Implementation Project Testing Project Development Project Design Project Analysis Project Identification 0 20 40 60 80 100 120 140 Duration

Figure 1.2 MEWA Pharmacy Software Schedule (2012) The above Figure 1.2 shows graphical the activies of the project against the duration of each activites to give the deliverables. The project starts with project identification and it duration of 8 days as shown in Figure 1.1 and ends with project implementation and its duration of 30 days as shown in Figure 1.1 above.

67

APPENDICES B B.1 The Log in System Code

Function chsckUserPass, it checks the validity of user password which is store in the mewa database table login Function chsckServerUserPass, it checks the validity of bothe user name and password are present in the server database.
Imports System.Data.OleDb Public Class frmLogin Dim Count As Integer = 0 Dim userOK As Boolean Private Sub btExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btExit.Click End End Sub Function chsckUserPass() As Boolean Dim srn As String Dim myPassCommand As OleDbCommand Try strSql = "SELECT * FROM tblLogin WHERE Username = '" & (txtUsername.Text) & "' AND Password = '" & (txtPassword.Text) & "'" MainContainer.MainProgress.Value = 1 myPassCommand = New OleDbCommand MainContainer.MainProgress.Value = 2 myPassCommand.CommandText = strSql MainContainer.MainProgress.Value = 3 myPassCommand.Connection = myCon myCon.Open() myDR = myPassCommand.ExecuteReader MainContainer.MainProgress.Value = 5 myDR.Read() srn = (myDR("Surname")) MainContainer.MainProgress.Value = 7 GlobalV.Surname = srn GlobalV.Firstname = (myDR("Firstname")) ' MsgBox("Your Surname is " & srn)

frmPharmacy.Show() MainContainer.tslStatus.Text = (srn & " Logged In Successfully") MainContainer.MainProgress.Value = 10 MainContainer.LogoutToolStripMenuItem.Enabled = True

68

MainContainer.MainProgress.Value = 0 myCon.Close() Me.Close() myCon.Close() Return True

Catch ex As Exception MsgBox("Incorrect Username and/or Password") myCon.Close() Return False End Try

End Function Function chsckServerUserPass() As Boolean Dim srn As String Dim myPassCommand As OleDbCommand Try strSql = "SELECT * FROM tblLogin WHERE Username = '" & (txtUsername.Text) & "' AND Password = '" & (txtPassword.Text) & "'" myPassCommand = New OleDbCommand myPassCommand.CommandText = strSql myPassCommand.Connection = serverCon serverCon.Open() myDR = myPassCommand.ExecuteReader myDR.Read() srn = (myDR("Surname")) GlobalV.Surname = srn GlobalV.Firstname = (myDR("Firstname")) ' MainContainer.lblStatus.Text = (srn & " Logged In Successfully") ' MsgBox("Your Surname is " & srn) serverCon.Close() Me.Close()

Return True

Catch ex As Exception MsgBox(ex.Message) serverCon.Close() Return False End Try

69

End Function Private Sub btLogin_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btLogin.Click If cbServer.Checked = True Then If (Count <= 2) Then chsckServerUserPass() Count = Count + 1 txtPassword.Clear() Else CheckUsernameServer() If userOK = True Then GlobalV.Username = txtUsername.Text frmSecurity.Show() End If End If ElseIf cbServer.Checked = False Then If (Count <= 2) Then chsckUserPass() Count = Count + 1 txtPassword.Clear() Else CheckUsername() If userOK = True Then GlobalV.Username = txtUsername.Text frmSecurity.Show() End If End If End If ' txtPassword.Clear()

End Sub Function CheckUsername() As Boolean Dim srn As String Dim myPassCommand As OleDbCommand Try strSql = "SELECT * FROM tblLogin WHERE Username = '" & (txtUsername.Text) & "'" ' AND Password = '" & (txtPassword.Text) & "'" myPassCommand = New OleDbCommand myPassCommand.CommandText = strSql myPassCommand.Connection = serverCon serverCon.Open() myDR = myPassCommand.ExecuteReader myDR.Read()

70

srn = (myDR("Surname")) GlobalV.Surname = srn GlobalV.Firstname = (myDR("Firstname")) ' MsgBox("Your Surname is " & srn) serverCon.Close() userOK = True Return True

Catch ex As Exception ' MsgBox(ex.Message) serverCon.Close() Return False End Try End Function Function CheckUsernameServer() As Boolean Dim srn As String Dim myPassCommand As OleDbCommand Try strSql = "SELECT * FROM tblLogin WHERE Username = '" & (txtUsername.Text) & "'" ' AND Password = '" & (txtPassword.Text) & "'" myPassCommand = New OleDbCommand myPassCommand.CommandText = strSql myPassCommand.Connection = serverCon serverCon.Open() myDR = myPassCommand.ExecuteReader myDR.Read() srn = (myDR("Surname")) GlobalV.Surname = srn GlobalV.Firstname = (myDR("Firstname")) ' MsgBox("Your Surname is " & srn) serverCon.Close() userOK = True Return True

Catch ex As Exception ' MsgBox(ex.Message) serverCon.Close() Return False End Try End Function

71

Private Sub Label2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label2.Click End Sub Private Sub GroupBox1_Enter(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles GroupBox1.Enter End Sub Private Sub frmLogin_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load Me.MdiParent = MainContainer End Sub End Class

B.2

The Main Dash Board Window Code

The following is the code that validates the above logic and consists of the modules
Public Class MainContainer Private Sub MainContainer_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load frmLogin.MdiParent = Me frmSecurity.MdiParent = Me frmLogin.Show() LogoutToolStripMenuItem.Enabled = False MainProgress.Minimum = 0 MainProgress.Maximum = 10 MainProgress.Value = 0 End Sub Private Sub LoginToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles LoginToolStripMenuItem.Click End End Sub Private Sub LogoutToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles LogoutToolStripMenuItem.Click frmPharmacy.Close() frmLogin.StartPosition = FormStartPosition.CenterScreen ' frmLogin.WindowState.Normal() frmLogin.Show() End Sub Private Sub MainTimer_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MainTimer.Tick

72

theClock.Text = Now.ToString End Sub Private Sub MainContainer_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove End Sub End Class

B.3

The Sales Report Module Code

The following is the code that shows the child list view ( lvStock) that created the sales report module:
Imports System.Data.OleDb Public Class frmReports Private Sub frmReports_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.MdiParent = MainContainer End Sub Private Sub btLoadAll_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btLoadAll.Click LoadStockReport() End Sub Function LoadStockReport() As Boolean Try strSql = "SELECT * FROM tbStock" myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myDR = myCmd.ExecuteReader lvStock.Items.Clear() While (myDR.Read()) With lvStock.Items.Add(myDR("DrugID")) .subitems.add(myDR("DrugName")) .subitems.add(myDR("Quantity")) .subitems.add(myDR("ExpiryDate")) .subitems.add(myDR("CostPrice")) .subitems.add(myDR("SalePrice")) .subitems.add(myDR("DiscountPrice")) .subitems.add(myDR("StorageType")) .subitems.add(myDR("DateOfPurchase")) .subitems.add(myDR("Formulation")) .subitems.add(myDR("DrugBalance")) .subitems.add(myDR("ReOrder")) End With

73

End While myCon.Close() Return True Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False End Try End Function Function LoadSalesReport() As Boolean Try strSql = "SELECT * FROM tbSales WHERE Paid = TRUE" myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myDR = myCmd.ExecuteReader lvSales.Items.Clear() While (myDR.Read()) With lvSales.Items.Add(myDR("InvoiceID")) .subitems.add(myDR("DrugName")) .subitems.add(myDR("Price")) .subitems.add(myDR("Quantity")) .subitems.add(myDR("Total")) .subitems.add(myDR("Dates")) .subitems.add(myDR("Dispenser")) End With End While myCon.Close() Return True Catch ex As Exception myCon.Close() Return False End Try End Function Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btLoadAllSales.Click 'TheListView = lvSales 'ExportListViewToExcel() LoadSalesReport() End Sub Private Sub lvSales_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lvSales.SelectedIndexChanged End Sub End Class

74

B.4

Staff work load Code

The following is the code that implements the modules of the staff work load.
Imports System.Data.OleDb Public Class frmReports Private Sub frmReports_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.MdiParent = MainContainer End Sub Private Sub btLoadAll_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btLoadAll.Click LoadStockReport() End Sub Function LoadStockReport() As Boolean Try strSql = "SELECT * FROM tbStock" myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myDR = myCmd.ExecuteReader lvStock.Items.Clear() While (myDR.Read()) With lvStock.Items.Add(myDR("DrugID")) .subitems.add(myDR("DrugName")) .subitems.add(myDR("Quantity")) .subitems.add(myDR("ExpiryDate")) .subitems.add(myDR("CostPrice")) .subitems.add(myDR("SalePrice")) .subitems.add(myDR("DiscountPrice")) .subitems.add(myDR("StorageType")) .subitems.add(myDR("DateOfPurchase")) .subitems.add(myDR("Formulation")) .subitems.add(myDR("DrugBalance")) .subitems.add(myDR("ReOrder")) End With End While myCon.Close() Return True Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False End Try End Function Function LoadSalesReport() As Boolean Try strSql = "SELECT * FROM tbSales WHERE Paid = TRUE" myCmd = New OleDbCommand myCmd.CommandText = strSql

75

myCmd.Connection = myCon myCon.Open() myDR = myCmd.ExecuteReader lvSales.Items.Clear() While (myDR.Read()) With lvSales.Items.Add(myDR("InvoiceID")) .subitems.add(myDR("DrugName")) .subitems.add(myDR("Price")) .subitems.add(myDR("Quantity")) .subitems.add(myDR("Total")) .subitems.add(myDR("Dates")) .subitems.add(myDR("Dispenser")) End With End While myCon.Close() Return True Catch ex As Exception myCon.Close() Return False End Try End Function Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btLoadAllSales.Click 'TheListView = lvSales 'ExportListViewToExcel() LoadSalesReport() End Sub Private Sub lvSales_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lvSales.SelectedIndexChanged End Sub Private Sub tpStaff_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tpStaff.Click End Sub End Class

B.5

Stock level

The following code implement the stock level module and it functionalities
Imports System.Data.OleDb Public Class frmPharmacy Dim FullName As String Dim DName As String

76

Public SalesQuantity As Integer Public Price As Integer Dim TotalSales As Integer Dim InvoiceID As String Dim theCount As Integer Dim QuoteQty As Integer Dim theIndex As Integer Dim prenum As Integer

Private Sub frmPharmacy_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load Me.MdiParent = MainContainer lblDate.Text = Date.Now.ToShortDateString FullName = String.Concat(Firstname, " ", Surname) txtDispencerName.Text = FullName.ToUpper LoadQue() lblInvoiceDate.Text = Date.Now.ToShortDateString LoadSuppliers() End Sub Public Function GrandTotal() As Boolean Dim StartBalance As Integer Dim newBalance As Integer Try StartBalance = txtGrandTotal.Text newBalance = StartBalance + TotalSales txtGrandTotal.Text = newBalance Catch ex As Exception End Try End Function Public Function DrugBalance() As Boolean Try strSql = "UPDATE tbStock SET [DrugBalance] = [DrugBalance] - " & (SalesQuantity) & " WHERE DrugName = '" & (lvSales.SelectedItems(0).SubItems(1).Text) & "'" MsgBox(strSql) myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myCmd.ExecuteNonQuery() myCon.Close() Return True Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False End Try End Function Public Function DrugBalanceAdd() As Boolean Try QuoteQty = lvQuotation.SelectedItems(0).SubItems(1).Text MsgBox(QuoteQty)

77

strSql = "UPDATE tbStock SET [DrugBalance] = [DrugBalance] + " & (QuoteQty) & " WHERE DrugName = '" & (lvQuotation.SelectedItems(0).SubItems(0).Text) & "'" MsgBox(strSql) myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myCmd.ExecuteNonQuery() myCon.Close() Return True Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False End Try End Function Public Function CalculateSales() As Boolean Dim newDrugBalance As Integer newDrugBalance = lvSales.SelectedItems(0).SubItems(5).Text - SalesQuantity TotalSales = SalesQuantity * Price Try With lvQuotation.Items.Add(lvSales.SelectedItems(0).SubItems(1).Text ) .SubItems.Add(SalesQuantity) .SubItems.Add(Price) .SubItems.Add(TotalSales) End With With frmCheckOut.lvCheckout.Items.Add(lvSales.SelectedItems(0).SubIt ems(1).Text) .SubItems.Add(TotalSales) .SubItems.Add(newDrugBalance) End With GrandTotal() AddSaletoDB() theCount = theCount + 1 Catch ex As Exception End Try End Function Function OldPassword() As Boolean Try strSql = "SELECT * FROM tblLogin WHERE Password ='" & (GlobalV.Password) & "'" myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon

78

myCon.Open() myDR = myCmd.ExecuteReader myDR.Read() Dim oldpass As String oldpass = txtOldPassword.Text If (GlobalV.Password = oldpass) Then End If myCon.Close() Return True Catch ex As Exception myCon.Close() MsgBox(ex.Message) Return False End Try End Function Function UpdatePassword() As Boolean Try strSql = "UPDATE tblLogin SET [Password] = '" & (txtNewPassword.Text) & "'" myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myCmd.ExecuteNonQuery() myCon.Close() Return True Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False End Try End Function Function ConfirmPassword() As Boolean Dim confirmpass As String confirmpass = txtConfirmPassword.Text Try If (OldPassword() = confirmpass) Then UpdatePassword() MsgBox("Your password has successful change") Return True Else txtNewPassword.Clear() txtConfirmPassword.Clear() MsgBox("Your password was wrong") End If Catch ex As Exception MsgBox(ex.Message)

79

Return False End Try End Function Private Sub btClear_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btClear.Click txtConfirmPassword.Clear() txtNewPassword.Clear() txtOldPassword.Clear() End Sub Private Sub Panel1_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Panel1.Paint End Sub Private Sub txtNewPassword_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtNewPassword.TextChanged End Sub Private Sub txtConfirmPassword_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtConfirmPassword.TextChanged End Sub Private Sub btChangePass_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btChangePass.Click If (OldPassword() = True) Then 'End If ConfirmPassword() End If End Sub Private Sub tpPrescription_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tpPrescription.Click End Sub Private Sub txtDrugName_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtDrugName.TextChanged SearchDrugs() End Sub Function SearchDrugs() As Boolean Try strSql = "SELECT * FROM tbStock WHERE DrugName LIKE '%" & (txtDrugName.Text) & "%'" myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myDR = myCmd.ExecuteReader lbDrugs.Items.Clear()

80

While (myDR.Read()) lbDrugs.Items.Add(myDR("DrugName")) ' .subitems.add(myDR("DrugID")) End While myCon.Close() Return True Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False End Try End Function Function SearchMoreDrug() As Boolean Try strSql = "SELECT * FROM tbStock WHERE DrugName ='" & (DName) & "'" myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myDR = myCmd.ExecuteReader myDR.Read() txtAmount.Text = (myDR("SalePrice")) txtDrugBalance.Text = (myDR("DrugBalance"))

myCon.Close() Return True Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False End Try End Function Private Sub lbDrugs_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lbDrugs.SelectedIndexChanged DName = lbDrugs.SelectedItem.ToString txtDrugName.Text = DName SearchMoreDrug() End Sub Private Sub btCalculate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btCalculate.Click Dim Cost As Integer Dim Qty As Integer Dim Total As Integer Cost = txtAmount.Text

81

Qty = txtQuantityDispenced.Text Total = Cost * Qty txtTotalCost.Text = Total End Sub Private Sub btLoadAllToday_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btLoadAllToday.Click LoadDayPrescription() End Sub Function LoadDayPrescription() As Boolean Try strSql = "SELECT * FROM tbPrescriptions WHERE Dates = " & (String.Concat("#", Date.Now.ToShortDateString, "#")) & "" ' MsgBox(strSql) myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myDR = myCmd.ExecuteReader lvPrescriptions.Items.Clear() While (myDR.Read()) With lvPrescriptions.Items.Add(myDR("PrescriptionNo")) .subitems.add(myDR("PatientName")) .subitems.add(myDR("DrugName")) .subitems.add(myDR("Price")) .subitems.add(myDR("Quantity")) .subitems.add(myDR("TotalCost")) .subitems.add(myDR("DoctorsName")) End With End While myCon.Close() Return True Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False End Try End Function Function GeneratePrescriptonNo() As Boolean Try strSql = "SELECT * FROM tbPrescriptions ORDER BY PrescriptionNo DESC" ' MsgBox(strSql) myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myDR = myCmd.ExecuteReader myDR.Read() prenum = (myDR("PrescriptionNo")) MsgBox(prenum) myCon.Close()

82

Return True Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False End Try End Function Function CAllLAtestPrescripton() As Boolean Try strSql = "SELECT * FROM tbPrescriptions WHERE PatientNo = '" & (txtPatientNo.Text) & "' ORDER BY PrescriptionNo DESC" 'MsgBox(strSql) myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myDR = myCmd.ExecuteReader myDR.Read() prenum = (myDR("PrescriptionNo")) myCon.Close() Return True Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False End Try End Function Function LoadPresc() As Boolean Try strSql = "SELECT * FROM tbPrescriptions WHERE PatientsNo = '" & (txtPatientNo.Text) & "' AND PrescriptionNo = " & (preNum) & "" MsgBox(strSql) myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myDR = myCmd.ExecuteReader lvPrescriptions.Items.Clear() While (myDR.Read()) With lvPrescriptions.Items.Add(myDR("PrescriptionNo")) .subitems.add(myDR("PatientName")) .subitems.add(myDR("DrugName")) .subitems.add(myDR("Price")) .subitems.add(myDR("Quantity")) .subitems.add(myDR("TotalCost")) .subitems.add(myDR("DoctorsName")) End With End While myCon.Close() Return True Catch ex As Exception MsgBox(ex.Message)

83

myCon.Close() Return False End Try End Function Function LoadByDate() As Boolean Try strSql = "SELECT * FROM tbPrescriptions WHERE Dates = " & (String.Concat("#", dtpOld.Value.ToShortDateString, "#")) & "" 'MsgBox(strSql) myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myDR = myCmd.ExecuteReader lvPrescriptions.Items.Clear() While (myDR.Read()) With lvPrescriptions.Items.Add(myDR("PrescriptionNo")) .subitems.add(myDR("PatientName")) .subitems.add(myDR("DrugName")) .subitems.add(myDR("Price")) .subitems.add(myDR("Quantity")) .subitems.add(myDR("TotalCost")) .subitems.add(myDR("DoctorsName")) End With End While myCon.Close() Return True Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False End Try End Function Function LoadByPrescriptionNo() As Boolean Try strSql = "SELECT * FROM tbPrescriptions WHERE PrescriptionNo = " & (txtPrescriptionNo.Text) & "" ' MsgBox(strSql) myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myDR = myCmd.ExecuteReader lvPrescriptions.Items.Clear() While (myDR.Read()) With lvPrescriptions.Items.Add(myDR("PrescriptionNo")) .subitems.add(myDR("PatientName")) .subitems.add(myDR("DrugName")) .subitems.add(myDR("Price")) .subitems.add(myDR("Quantity")) .subitems.add(myDR("TotalCost")) .subitems.add(myDR("DoctorsName")) End With End While

84

myCon.Close() Return True Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False End Try End Function Private Sub btOldPrescription_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btOldPrescription.Click LoadByDate() End Sub Private Sub btPrescriptmberionNu_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btPrescriptmberionNu.Click LoadByPrescriptionNo() End Sub Private Sub btDispensee_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btDispensee.Click 'GeneratePrescriptonNo() Dispense() UpdateDrugBalance() 'CAllLAtestPrescripton() LoadPresc() If CheckDate() = True Then myCon.Close() UpdateStaffWorkload() Else myCon.Close() AddNEwDate() myCon.Close() UpdateStaffWorkload() End If End Sub Function AddNEwDate() As Boolean Try strSql = "INSERT INTO tbStaffWorkload([Dispenser],[Dates],[TotalSale],[TotalPrescript ions],[TotalPatients],[TotalPrescriptionItems]) VALUES('" & (String.Concat(Firstname, " ", Surname)) & "'," & (String.Concat("#", Date.Today.ToShortDateString, "#")) & ",0,0,0,0)" MsgBox(strSql)

85

myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myCmd.ExecuteNonQuery() myCon.Close() Return True Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False End Try End Function Function UpdateStaffWorkload() As Boolean Dim totalsale As Integer Dim qty As Integer totalsale = txtTotalCost.Text qty = txtQuantityDispenced.Text Try strSql = "UPDATE tbStaffWorkload SET [TotalSale] = [TotalSale] + " _ & (totalsale) & ",[TotalPrescriptions] = [TotalPrescriptions] + 1,[TotalPatients] = [TotalPatients] + 1,[TotalPrescriptionItems] = [TotalPrescriptionItems] + " _ & (qty) & " WHERE [Dates] = " & (String.Concat("#", Date.Today.ToShortDateString, "#")) & " AND [Dispenser] = '" & (String.Concat(Firstname, " ", Surname)) & "'" myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myCmd.ExecuteNonQuery() myCon.Close() Return True Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False End Try End Function Function CheckDate() As Boolean Try strSql = "SELECT * FROM tbStaffWorkload WHERE Dates = " & (String.Concat("#", Date.Today.ToShortDateString, "#")) & "" myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myDR = myCmd.ExecuteReader

86

myDR.Read() ' Dim dater As Date If IsDBNull(myDR("Dates")) Then myCon.Close() AddNEwDate() UpdateStaffWorkload() Else myCon.Close() UpdateStaffWorkload() End If myCon.Close() Return True Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False End Try End Function Function UpdateDrugBalance() As Boolean Try strSql = "UPDATE tbStock SET [DrugBalance] = [DrugBalance] -" & (txtQuantityDispenced.Text) & " WHERE [DrugName] = '" & (txtDrugName.Text) & "'" MsgBox(strSql) myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myCmd.ExecuteNonQuery() myCon.Close() Return True Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False End Try End Function Function Dispense() As Boolean Try strSql = "INSERT INTO tbPrescriptions([PatientsNo],[PrescriptionNo],[Dates],[DrugName ],[Quantity],[TotalCost],[DoctorsName],[Dispensed],[Dispenser], [Remarks],[Price],[PatientName]) VALUES('" _ & (txtPatientNo.Text) & "','" _ & (prenum) & "'," _

87

& (String.Concat("#", Date.Now.ToShortDateString, "#")) & ",'" _ & (txtDrugName.Text) & "'," _ & (txtQuantityDispenced.Text) & "," _ & (txtTotalCost.Text) & ",'" _ & (txtDoctorName.Text) & "',TRUE,'" _ & (txtDispencerName.Text) & "','" _ & (txtRemarks.Text) & "'," _ & (txtAmount.Text) & ",'" _ & (txtPatientName.Text) & "')" ' MsgBox(strSql) myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myCmd.ExecuteNonQuery() myCon.Close() Return True Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False End Try End Function Function SearchSalesByName() As Boolean Try strSql = "SELECT * FROM tbStock WHERE DrugName LIKE '%" & (txtSalesDrugName.Text) & "%'" myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myDR = myCmd.ExecuteReader lvSales.Items.Clear() While (myDR.Read()) With lvSales.Items.Add(myDR("DrugID")) .subitems.add(myDR("DrugName")) .subitems.add(myDR("SalePrice")) .subitems.add(myDR("ExpiryDate")) .subitems.add(myDR("ReOrder")) .subitems.add(myDR("DrugBalance")) End With End While myCon.Close() Return True Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False End Try End Function

88

Function SearchSalesByName2() As Boolean Try myCon.Close() strSql = "SELECT * FROM tbStock WHERE DrugName = '" & (txtSalesDrugName.Text) & "'" myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myDR = myCmd.ExecuteReader ' lvSales.Items.Clear() While (myDR.Read()) With lvSales.Items.Add(myDR("DrugID")) .subitems.add(myDR("DrugName")) .subitems.add(myDR("SalePrice")) .subitems.add(myDR("ExpiryDate")) .subitems.add(myDR("ReOrder")) .subitems.add(myDR("DrugBalance")) End With End While myCon.Close() Return True Catch ex As Exception ' MsgBox(ex.Message) myCon.Close() Return False End Try End Function Function SearchSalesByID() As Boolean Try strSql = "SELECT * FROM tbStock WHERE DrugID LIKE '%" & (txtSalesDrugID.Text) & "%'" myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myDR = myCmd.ExecuteReader lvSales.Items.Clear() While (myDR.Read()) With lvSales.Items.Add(myDR("DrugID")) .subitems.add(myDR("DrugName")) .subitems.add(myDR("SalePrice")) .subitems.add(myDR("ExpiryDate")) .subitems.add(myDR("ReOrder")) End With End While myCon.Close() Return True Catch ex As Exception MsgBox(ex.Message) myCon.Close()

89

Return False End Try End Function Private Sub txtSalesDrugName_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtSalesDrugName.TextChanged SearchSalesByName() End Sub Private Sub txtSalesDrugID_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtSalesDrugID.TextChanged SearchSalesByID() End Sub Private Sub lvSales_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lvSales.SelectedIndexChanged ' CreatInvoiceID() frmQuantity.Show() End Sub Function CreatInvoiceID() As Boolean Try Dim Datedstr As String Datedstr = Date.Now ' Datedstr.Remove(Char "/") 'Dim str As String = "to## remove' all"" special^& characters from string" Dim sb As New System.Text.StringBuilder For Each ch As Char In Datedstr If Char.IsLetterOrDigit(ch) Then sb.Append(ch) End If Next ' MsgBox(sb.ToString) InvoiceID = sb.ToString Catch ex As Exception End Try End Function Public Function AddSaletoDB() As Boolean ' Dim var1 As String = lv ' Dim var2 As Integer ' Dim var3 As Integer ' Dim var4 As Integer

Try

90

strSql = "INSERT INTO tbSales([InvoiceID],[DrugName],[Price],[Quantity],[Total],[Date s]) VALUES('" _ & (InvoiceID) & "','" _ & (lvQuotation.Items(theCount).SubItems(0).Text) & "','" _ & (lvQuotation.Items(theCount).SubItems(1).Text) & "','" _ & (lvQuotation.Items(TheCount).SubItems(2).Text) & "','" _ & (lvQuotation.Items(theCount).SubItems(3).Text) & "'," _ & (String.Concat("#", Date.Now.ToShortDateString, "#")) & ")" ' MsgBox(strSql) myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myCmd.ExecuteNonQuery() myCon.Close() Return True Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False End Try End Function Private Sub btRemoveItems_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btRemoveItems.Click DrugBalanceAdd() RemovefromTable() RemoveItem()

End Sub Function Deduct() As Boolean Dim startingBalance As Integer Dim EndBalance As Integer Dim DeductBalance As Integer Try DeductBalance = lvQuotation.SelectedItems(0).SubItems(3).Text startingBalance = txtGrandTotal.Text EndBalance = startingBalance - DeductBalance txtGrandTotal.Text = EndBalance Catch ex As Exception

91

End Try End Function Function RemoveItem() As Boolean Deduct() lvQuotation.SelectedItems(0).Remove()

End Function

Private Sub btBegin_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btBegin.Click CreatInvoiceID() lvSales.Enabled = True End Sub Function RemovefromTable() As Boolean Try strSql = "DELETE * FROM tbSales WHERE InvoiceID = '" & (InvoiceID) & "' AND DrugName = '" & (lvQuotation.SelectedItems(0).SubItems(0).Text) & "'" ' MsgBox(strSql) myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myCmd.ExecuteNonQuery() myCon.Close() Return True Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False End Try End Function Private Sub lvQuotation_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lvQuotation.SelectedIndexChanged End Sub Private Sub cmdCheckout_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdCheckout.Click frmCheckOut.Show() End Sub Private Sub btNewPre_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btNewPre.Click GeneratePrescriptonNo() prenum = prenum + 1 txtPrescriptionNo.Text = prenum

92

End Sub Function LoadQue() As Boolean Try myCon.Close() strSql = "SELECT * FROM tbPrescriptions WHERE Dispensed = FALSE" ' MsgBox(strSql) myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() Dim DA As New OleDbDataAdapter(strSql, myCon) Dim DS As New DataSet DA.Fill(DS, "tbPrescription") Dim dt As New DataTable dt = DS.Tables(0) Dim dr As DataRow For Each dr In dt.Rows() cmbQue.Items.Add(dr("PatientName")) Next cmbQue.SelectedIndex = -1 myCon.Close() Return True Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False End Try End Function Private Sub cmbQue_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbQue.SelectedIndexChanged myCon.Close() LoadArray() End Sub Function LoadArray() As Boolean ' Dim Drugs() As String myCon.Close() Try myCon.Close() strSql = "SELECT * FROM tbPrescriptions WHERE PatientName = '" & (cmbQue.Text) & "'" myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myDR = myCmd.ExecuteReader myDR.Read() 'Drugs = (myDR("DrugName"))

93

' myCon.Close() ' MsgBox(Drugs) txtDrugName.Text = (myDR("DrugName"))

SearchSalesByName2() myCon.Close() txtDrugName.Clear()

Return True Catch ex As Exception ' MsgBox(ex.Message) myCon.Close() Return False End Try End Function Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) frmReports.Show() End Sub Private Sub btLoadAllStock_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btLoadAllStock.Click LoadStockReport() End Sub Function LoadStockReport() As Boolean Try strSql = "SELECT * FROM tbStock" myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myDR = myCmd.ExecuteReader lvStock.Items.Clear() While (myDR.Read()) With lvStock.Items.Add(myDR("DrugID")) .subitems.add(myDR("DrugName")) .subitems.add(myDR("Quantity")) .subitems.add(myDR("ExpiryDate")) .subitems.add(myDR("CostPrice")) .subitems.add(myDR("SalePrice")) .subitems.add(myDR("DiscountPrice")) .subitems.add(myDR("StorageType")) .subitems.add(myDR("DateOfPurchase")) .subitems.add(myDR("Formulation"))

94

.subitems.add(myDR("DrugBalance")) .subitems.add(myDR("ReOrder")) End With End While myCon.Close() Return True Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False End Try End Function Function TotalDrugs() As Boolean Try strSql = "SELECT SUM(DrugBalance) FROM tbStock" myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myDR = myCmd.ExecuteReader myDR.Read() txtTotalDrugStock.Text = (myDR.GetValue(0)) myCon.Close() Return True Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False End Try End Function Private Sub btLoadAll_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btLoadAll.Click LoadStockReport() TotalDrugs() End Sub Function LoadSalesReport() As Boolean Try myCon.Close() strSql = "SELECT * FROM tbSales" ' MsgBox(strSql) myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myDR = myCmd.ExecuteReader lvSalesReport.Items.Clear() While (myDR.Read()) With lvSalesReport.Items.Add(myDR("InvoiceID")) .subitems.add(myDR("DrugName"))

95

.subitems.add(myDR("Price")) .subitems.add(myDR("Quantity")) .subitems.add(myDR("Total")) .subitems.add(myDR("Dates")) ' .subitems.add(myDR("Dispenser")) End With End While myCon.Close() Return True Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False End Try End Function Function SumTotalSale() As Boolean Try myCon.Close() strSql = "SELECT SUM(Total) FROM tbSales" ' MsgBox(strSql) myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myDR = myCmd.ExecuteReader myDR.Read() txtTotalSales.Text = myDR.GetValue(0) myCon.Close() Return True Catch ex As Exception myCon.Close() Return False End Try End Function Function TotalQuantitySale() As Boolean Try myCon.Close() strSql = "SELECT SUM(Quantity) FROM tbSales" ' MsgBox(strSql) myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myDR = myCmd.ExecuteReader myDR.Read() txtTotalQuantity.Text = myDR.GetValue(0) myCon.Close() Return True

96

Catch ex As Exception myCon.Close() Return False End Try End Function Function CountTotalSale() As Boolean Try myCon.Close() strSql = "SELECT Count(Total) FROM tbSales" ' MsgBox(strSql) myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myDR = myCmd.ExecuteReader myDR.Read() txtTotalTransaction.Text = myDR.GetValue(0) myCon.Close() Return True Catch ex As Exception myCon.Close() Return False End Try End Function Private Sub btLoadAllSales_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btLoadAllSales.Click loadsalesreport() SumTotalSale() CountTotalSale() TotalQuantitySale() End Sub Function LoadSalesByDate() As Boolean Try myCon.Close() strSql = "SELECT * FROM tbSales WHERE Dates BETWEEN " & (String.Concat("#", dtpFrom.Value.ToShortDateString, "#")) & " AND " & (String.Concat("#", dtpTo.Value.ToShortDateString, "#")) & "" ' MsgBox(strSql) myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myDR = myCmd.ExecuteReader lvSalesReport.Items.Clear() While (myDR.Read()) With lvSalesReport.Items.Add(myDR("InvoiceID")) .subitems.add(myDR("DrugName")) .subitems.add(myDR("Price"))

97

.subitems.add(myDR("Quantity")) .subitems.add(myDR("Total")) .subitems.add(myDR("Dates")) ' .subitems.add(myDR("Dispenser")) End With End While myCon.Close() Return True Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False End Try End Function Private Sub btByDate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btByDate.Click LoadSalesByDate() End Sub Function LoadStaffWorkLoad() As Boolean Try strSql = "SELECT * FROM tbStaffWorkload WHERE Dispenser = '" & (String.Concat(Firstname, " ", Surname)) & "'" ' MsgBox(strSql) myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myDR = myCmd.ExecuteReader lvStaff.Items.Clear() While (myDR.Read()) With lvStaff.Items.Add(myDR("Dates")) .subitems.add(myDR("TotalSale")) .subitems.add(myDR("TotalPrescriptions")) .subitems.add(myDR("TotalPrescriptionItems")) .subitems.add(myDR("TotalPatients")) End With End While myCon.Close() Return True

Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False

98

End Try End Function Private Sub btSTaffWorkload_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btSTaffWorkload.Click LoadStaffWorkLoad() End Sub Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Try TheListView = lvStock ExportListViewToExcel() ' Return True Catch ex As Exception ' MsgBox(ex.Message) End Try End Sub Private Sub Label29_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) End Sub Private Sub TabPage3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TabPage3.Click End Sub Function SearchVendor() As Boolean Try strSql = "SELECT * FROM tbVendors WHERE VendorName = '" & (txtVendor.Text) & "'" myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myDR = myCmd.ExecuteReader myDR.Read() txtVendor.Text = myDR("VendorName") txtPTelephone.Text = myDR("Telephone") txtPEmail.Text = myDR("Email") txtPContactName.Text = myDR("ContactName") txtVCreditLimit.Text = myDR("CreditLimit") myCon.Close() Return True Catch ex As Exception MsgBox(ex.Message) myCon.Close()

99

Return False End Try End Function Private Sub cmdSearchVendor_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdSearchVendor.Click SearchVendor() End Sub Function AddNewPurchase() As Boolean Try strSql = "INSERT INTO tbVendors([VendorName],[Telephone],[Email],[CreditLimit],[Conta ctName]) VALUES('" & (txtVendor.Text) & "','" _ & (txtPTelephone.Text) & "','" _ & (txtPEmail.Text) & "'," _ & (txtVCreditLimit.Text) & ",'" _ & (txtPContactName.Text) & "')" MsgBox(strSql) myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myCmd.ExecuteNonQuery() myCon.Close() Return True Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False End Try End Function Function UpdatePurchase() As Boolean Try strSql = "UPDATE tbVendors SET [CreditLimit] = " & (txtVCreditLimit.Text) & " WHERE [VendorName] = '" & (txtVendor.Text) & "'" 'MsgBox(strSql) myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myCmd.ExecuteNonQuery() myCon.Close() MsgBox("Credit Limit successfully changed to " & txtVCreditLimit.Text) Return True Catch ex As Exception MsgBox(ex.Message)

100

myCon.Close() Return False End Try End Function Private Sub btPAddNew_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btPAddNew.Click AddNewPurchase() End Sub Private Sub btPEdit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btPEdit.Click UpdatePurchase() End Sub Function LoadSuppliers() As Boolean Try myCon.Close() strSql = "SELECT * FROM tbVendors" ' MsgBox(strSql) myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() Dim DA As New OleDbDataAdapter(strSql, myCon) Dim DS As New DataSet DA.Fill(DS, "tbVendors") Dim dt As New DataTable dt = DS.Tables(0) Dim dr As DataRow For Each dr In dt.Rows() cmbSupplier.Items.Add(dr("VendorName")) Next cmbSupplier.SelectedIndex = -1 myCon.Close() Return True Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False End Try End Function Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage End Sub Private Sub cmbSupplier_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbSupplier.SelectedIndexChanged

101

PopulateVendorDetails() End Sub Function PopulateVendorDetails() As Boolean Try strSql = "SELECT * FROM tbVendors WHERE VendorName = '" & (cmbSupplier.Text) & "'" myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myDR = myCmd.ExecuteReader myDR.Read() txtCreditLimit.Text = myDR("CreditLimit") txtPDiscount.Text = myDR("Discount") myCon.Close() Return True Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False End Try End Function Function SearchUnit() As Boolean Try strSql = "SELECT * FROM tbStock WHERE DrugName = '" & (txtPUnit.Text) & "'" myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myDR = myCmd.ExecuteReader myDR.Read() txtPAmount.Text = myDR("CostPrice") myCon.Close() Return True Catch ex As Exception ' MsgBox(ex.Message) myCon.Close() Return False End Try End Function Private Sub txtPUnit_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtPUnit.TextChanged If txtPUnit.TextLength > 2 Then SearchUnit() End If End Sub

102

Private Sub TabPage2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TabPage2.Click End Sub Private Sub tpAdmin_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tpAdmin.Click End Sub End Class

B.6 Administration Module Code

The following code will implement the Pharmacy Administration module


Function OldPassword() As Boolean Try strSql = "SELECT * FROM tblLogin WHERE Password ='" & (GlobalV.Password) & "'" myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myDR = myCmd.ExecuteReader myDR.Read() Dim oldpass As String oldpass = txtOldPassword.Text If (GlobalV.Password = oldpass) Then End If myCon.Close() Return True Catch ex As Exception myCon.Close() MsgBox(ex.Message) Return False End Try End Function Function UpdatePassword() As Boolean Try strSql = "UPDATE tblLogin SET [Password] = '" & (txtNewPassword.Text) & "'" myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myCmd.ExecuteNonQuery() myCon.Close() Return True

103

Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False End Try End Function Function ConfirmPassword() As Boolean Dim confirmpass As String confirmpass = txtConfirmPassword.Text Try If (OldPassword() = confirmpass) Then UpdatePassword() MsgBox("Your password has successful change") Return True Else txtNewPassword.Clear() txtConfirmPassword.Clear() MsgBox("Your password was wrong") End If Catch ex As Exception MsgBox(ex.Message) Return False End Try End Function Private Sub btClear_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btClear.Click txtConfirmPassword.Clear() txtNewPassword.Clear() txtOldPassword.Clear() End Sub Function ConfirmPassword() As Boolean Dim confirmpass As String confirmpass = txtConfirmPassword.Text Try If (OldPassword() = confirmpass) Then UpdatePassword() MsgBox("Your password has successful change") Return True Else txtNewPassword.Clear() txtConfirmPassword.Clear() MsgBox("Your password was wrong") End If

104

Catch ex As Exception MsgBox(ex.Message) Return False End Try End Function Private Sub btClear_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btClear.Click txtConfirmPassword.Clear() txtNewPassword.Clear() txtOldPassword.Clear() End Sub Private Sub Panel1_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Panel1.Paint End Sub Private Sub txtNewPassword_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtNewPassword.TextChanged End Sub Private Sub txtConfirmPassword_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtConfirmPassword.TextChanged End Sub Private Sub btChangePass_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btChangePass.Click If (OldPassword() = True) Then 'End If ConfirmPassword() End If End Sub Private Sub tpPrescription_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tpPrescription.Click End Sub Private Sub txtDrugName_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtDrugName.TextChanged SearchDrugs() End Sub

B.7

Prescription Module Code 105

The following is the code use to implement the prototype interface of the prescription module.
Imports System.Data.OleDb Public Class frmPharmacy Dim FullName As String Dim DName As String Public SalesQuantity As Integer Public Price As Integer Dim TotalSales As Integer Dim InvoiceID As String Dim theCount As Integer Dim QuoteQty As Integer Dim theIndex As Integer Dim prenum As Integer Private Sub frmPharmacy_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load Me.MdiParent = MainContainer lblDate.Text = Date.Now.ToShortDateString FullName = String.Concat(Firstname, " ", Surname) txtDispencerName.Text = FullName.ToUpper LoadQue() lblInvoiceDate.Text = Date.Now.ToShortDateString LoadSuppliers() End Sub Public Function GrandTotal() As Boolean Dim StartBalance As Integer Dim newBalance As Integer Try StartBalance = txtGrandTotal.Text newBalance = StartBalance + TotalSales txtGrandTotal.Text = newBalance Catch ex As Exception End Try End Function Public Function DrugBalance() As Boolean Try strSql = "UPDATE tbStock SET [DrugBalance] = [DrugBalance] - " & (SalesQuantity) & " WHERE DrugName = '" & (lvSales.SelectedItems(0).SubItems(1).Text) & "'" MsgBox(strSql) myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myCmd.ExecuteNonQuery() myCon.Close() Return True Catch ex As Exception MsgBox(ex.Message)

106

myCon.Close() Return False End Try End Function Public Function DrugBalanceAdd() As Boolean Try QuoteQty = lvQuotation.SelectedItems(0).SubItems(1).Text MsgBox(QuoteQty) strSql = "UPDATE tbStock SET [DrugBalance] = [DrugBalance] + " & (QuoteQty) & " WHERE DrugName = '" & (lvQuotation.SelectedItems(0).SubItems(0).Text) & "'" MsgBox(strSql) myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myCmd.ExecuteNonQuery() myCon.Close() Return True Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False End Try End Function Public Function CalculateSales() As Boolean Dim newDrugBalance As Integer newDrugBalance = lvSales.SelectedItems(0).SubItems(5).Text - SalesQuantity TotalSales = SalesQuantity * Price Try With lvQuotation.Items.Add(lvSales.SelectedItems(0).SubItems(1).Text ) .SubItems.Add(SalesQuantity) .SubItems.Add(Price) .SubItems.Add(TotalSales) End With With frmCheckOut.lvCheckout.Items.Add(lvSales.SelectedItems(0).SubIt ems(1).Text) .SubItems.Add(TotalSales) .SubItems.Add(newDrugBalance) End With GrandTotal() AddSaletoDB() theCount = theCount + 1 Catch ex As Exception

107

End Try End Function Function OldPassword() As Boolean Try strSql = "SELECT * FROM tblLogin WHERE Password ='" & (GlobalV.Password) & "'" myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myDR = myCmd.ExecuteReader myDR.Read() Dim oldpass As String oldpass = txtOldPassword.Text If (GlobalV.Password = oldpass) Then End If myCon.Close() Return True Catch ex As Exception myCon.Close() MsgBox(ex.Message) Return False End Try End Function Function UpdatePassword() As Boolean Try strSql = "UPDATE tblLogin SET [Password] = '" & (txtNewPassword.Text) & "'" myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myCmd.ExecuteNonQuery() myCon.Close() Return True Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False End Try End Function Function ConfirmPassword() As Boolean Dim confirmpass As String confirmpass = txtConfirmPassword.Text

108

Try If (OldPassword() = confirmpass) Then UpdatePassword() MsgBox("Your password has successful change") Return True Else txtNewPassword.Clear() txtConfirmPassword.Clear() MsgBox("Your password was wrong") End If Catch ex As Exception MsgBox(ex.Message) Return False End Try End Function Private Sub btClear_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btClear.Click txtConfirmPassword.Clear() txtNewPassword.Clear() txtOldPassword.Clear() End Sub Private Sub Panel1_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Panel1.Paint End Sub Private Sub txtNewPassword_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtNewPassword.TextChanged End Sub Private Sub txtConfirmPassword_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtConfirmPassword.TextChanged End Sub Private Sub btChangePass_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btChangePass.Click If (OldPassword() = True) Then 'End If ConfirmPassword() End If End Sub Private Sub tpPrescription_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tpPrescription.Click End Sub

109

Private Sub txtDrugName_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtDrugName.TextChanged SearchDrugs() End Sub Function SearchDrugs() As Boolean Try strSql = "SELECT * FROM tbStock WHERE DrugName LIKE '%" & (txtDrugName.Text) & "%'" myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myDR = myCmd.ExecuteReader lbDrugs.Items.Clear() While (myDR.Read()) lbDrugs.Items.Add(myDR("DrugName")) ' .subitems.add(myDR("DrugID")) End While myCon.Close() Return True Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False End Try End Function Function SearchMoreDrug() As Boolean Try strSql = "SELECT * FROM tbStock WHERE DrugName ='" & (DName) & "'" myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myDR = myCmd.ExecuteReader myDR.Read() txtAmount.Text = (myDR("SalePrice")) txtDrugBalance.Text = (myDR("DrugBalance"))

myCon.Close() Return True Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False End Try End Function

110

Private Sub lbDrugs_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lbDrugs.SelectedIndexChanged DName = lbDrugs.SelectedItem.ToString txtDrugName.Text = DName SearchMoreDrug() End Sub Private Sub btCalculate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btCalculate.Click Dim Cost As Integer Dim Qty As Integer Dim Total As Integer Cost = txtAmount.Text Qty = txtQuantityDispenced.Text Total = Cost * Qty txtTotalCost.Text = Total End Sub Private Sub btLoadAllToday_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btLoadAllToday.Click LoadDayPrescription() End Sub Function LoadDayPrescription() As Boolean Try strSql = "SELECT * FROM tbPrescriptions WHERE Dates = " & (String.Concat("#", Date.Now.ToShortDateString, "#")) & "" ' MsgBox(strSql) myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myDR = myCmd.ExecuteReader lvPrescriptions.Items.Clear() While (myDR.Read()) With lvPrescriptions.Items.Add(myDR("PrescriptionNo")) .subitems.add(myDR("PatientName")) .subitems.add(myDR("DrugName")) .subitems.add(myDR("Price")) .subitems.add(myDR("Quantity")) .subitems.add(myDR("TotalCost")) .subitems.add(myDR("DoctorsName")) End With End While myCon.Close() Return True Catch ex As Exception MsgBox(ex.Message)

111

myCon.Close() Return False End Try End Function Function GeneratePrescriptonNo() As Boolean Try strSql = "SELECT * FROM tbPrescriptions ORDER BY PrescriptionNo DESC" ' MsgBox(strSql) myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myDR = myCmd.ExecuteReader myDR.Read() prenum = (myDR("PrescriptionNo")) MsgBox(prenum) myCon.Close() Return True Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False End Try End Function Function CAllLAtestPrescripton() As Boolean Try strSql = "SELECT * FROM tbPrescriptions WHERE PatientNo = '" & (txtPatientNo.Text) & "' ORDER BY PrescriptionNo DESC" 'MsgBox(strSql) myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myDR = myCmd.ExecuteReader myDR.Read() prenum = (myDR("PrescriptionNo")) myCon.Close() Return True Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False End Try End Function Function LoadPresc() As Boolean Try

112

strSql = "SELECT * FROM tbPrescriptions WHERE PatientsNo = '" & (txtPatientNo.Text) & "' AND PrescriptionNo = " & (preNum) & "" MsgBox(strSql) myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myDR = myCmd.ExecuteReader lvPrescriptions.Items.Clear() While (myDR.Read()) With lvPrescriptions.Items.Add(myDR("PrescriptionNo")) .subitems.add(myDR("PatientName")) .subitems.add(myDR("DrugName")) .subitems.add(myDR("Price")) .subitems.add(myDR("Quantity")) .subitems.add(myDR("TotalCost")) .subitems.add(myDR("DoctorsName")) End With End While myCon.Close() Return True Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False End Try End Function Function LoadByDate() As Boolean Try strSql = "SELECT * FROM tbPrescriptions WHERE Dates = " & (String.Concat("#", dtpOld.Value.ToShortDateString, "#")) & "" 'MsgBox(strSql) myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myDR = myCmd.ExecuteReader lvPrescriptions.Items.Clear() While (myDR.Read()) With lvPrescriptions.Items.Add(myDR("PrescriptionNo")) .subitems.add(myDR("PatientName")) .subitems.add(myDR("DrugName")) .subitems.add(myDR("Price")) .subitems.add(myDR("Quantity")) .subitems.add(myDR("TotalCost")) .subitems.add(myDR("DoctorsName")) End With End While myCon.Close() Return True Catch ex As Exception MsgBox(ex.Message) myCon.Close()

113

Return False End Try End Function Function LoadByPrescriptionNo() As Boolean Try strSql = "SELECT * FROM tbPrescriptions WHERE PrescriptionNo = " & (txtPrescriptionNo.Text) & "" ' MsgBox(strSql) myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myDR = myCmd.ExecuteReader lvPrescriptions.Items.Clear() While (myDR.Read()) With lvPrescriptions.Items.Add(myDR("PrescriptionNo")) .subitems.add(myDR("PatientName")) .subitems.add(myDR("DrugName")) .subitems.add(myDR("Price")) .subitems.add(myDR("Quantity")) .subitems.add(myDR("TotalCost")) .subitems.add(myDR("DoctorsName")) End With End While myCon.Close() Return True Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False End Try End Function Private Sub btOldPrescription_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btOldPrescription.Click LoadByDate() End Sub Private Sub btPrescriptmberionNu_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btPrescriptmberionNu.Click LoadByPrescriptionNo() End Sub Private Sub btDispensee_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btDispensee.Click 'GeneratePrescriptonNo() Dispense() UpdateDrugBalance()

114

'CAllLAtestPrescripton() LoadPresc() If CheckDate() = True Then myCon.Close() UpdateStaffWorkload() Else myCon.Close() AddNEwDate() myCon.Close() UpdateStaffWorkload() End If End Sub Function AddNEwDate() As Boolean Try strSql = "INSERT INTO tbStaffWorkload([Dispenser],[Dates],[TotalSale],[TotalPrescript ions],[TotalPatients],[TotalPrescriptionItems]) VALUES('" & (String.Concat(Firstname, " ", Surname)) & "'," & (String.Concat("#", Date.Today.ToShortDateString, "#")) & ",0,0,0,0)" MsgBox(strSql) myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myCmd.ExecuteNonQuery() myCon.Close() Return True Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False End Try End Function Function UpdateStaffWorkload() As Boolean Dim totalsale As Integer Dim qty As Integer totalsale = txtTotalCost.Text qty = txtQuantityDispenced.Text Try strSql = "UPDATE tbStaffWorkload SET [TotalSale] = [TotalSale] + " _ & (totalsale) & ",[TotalPrescriptions] = [TotalPrescriptions] + 1,[TotalPatients] = [TotalPatients] + 1,[TotalPrescriptionItems] = [TotalPrescriptionItems] + " _

115

& (qty) & " WHERE [Dates] = " & (String.Concat("#", Date.Today.ToShortDateString, "#")) & " AND [Dispenser] = '" & (String.Concat(Firstname, " ", Surname)) & "'" myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myCmd.ExecuteNonQuery() myCon.Close() Return True Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False End Try End Function Function CheckDate() As Boolean Try strSql = "SELECT * FROM tbStaffWorkload WHERE Dates = " & (String.Concat("#", Date.Today.ToShortDateString, "#")) & "" myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myDR = myCmd.ExecuteReader myDR.Read() ' Dim dater As Date If IsDBNull(myDR("Dates")) Then myCon.Close() AddNEwDate() UpdateStaffWorkload() Else myCon.Close() UpdateStaffWorkload() End If myCon.Close() Return True Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False End Try End Function Function UpdateDrugBalance() As Boolean

116

Try strSql = "UPDATE tbStock SET [DrugBalance] = [DrugBalance] -" & (txtQuantityDispenced.Text) & " WHERE [DrugName] = '" & (txtDrugName.Text) & "'" MsgBox(strSql) myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myCmd.ExecuteNonQuery() myCon.Close() Return True Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False End Try End Function Function Dispense() As Boolean Try strSql = "INSERT INTO tbPrescriptions([PatientsNo],[PrescriptionNo],[Dates],[DrugName ],[Quantity],[TotalCost],[DoctorsName],[Dispensed],[Dispenser], [Remarks],[Price],[PatientName]) VALUES('" _ & (txtPatientNo.Text) & "','" _ & (prenum) & "'," _ & (String.Concat("#", Date.Now.ToShortDateString, "#")) & ",'" _ & (txtDrugName.Text) & "'," _ & (txtQuantityDispenced.Text) & "," _ & (txtTotalCost.Text) & ",'" _ & (txtDoctorName.Text) & "',TRUE,'" _ & (txtDispencerName.Text) & "','" _ & (txtRemarks.Text) & "'," _ & (txtAmount.Text) & ",'" _ & (txtPatientName.Text) & "')" ' MsgBox(strSql) myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myCmd.ExecuteNonQuery() myCon.Close() Return True Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False End Try End Function Function SearchSalesByName() As Boolean Try

117

strSql = "SELECT * FROM tbStock WHERE DrugName LIKE '%" & (txtSalesDrugName.Text) & "%'" myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myDR = myCmd.ExecuteReader lvSales.Items.Clear() While (myDR.Read()) With lvSales.Items.Add(myDR("DrugID")) .subitems.add(myDR("DrugName")) .subitems.add(myDR("SalePrice")) .subitems.add(myDR("ExpiryDate")) .subitems.add(myDR("ReOrder")) .subitems.add(myDR("DrugBalance")) End With End While myCon.Close() Return True Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False End Try End Function Function SearchSalesByName2() As Boolean Try myCon.Close() strSql = "SELECT * FROM tbStock WHERE DrugName = '" & (txtSalesDrugName.Text) & "'" myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myDR = myCmd.ExecuteReader ' lvSales.Items.Clear() While (myDR.Read()) With lvSales.Items.Add(myDR("DrugID")) .subitems.add(myDR("DrugName")) .subitems.add(myDR("SalePrice")) .subitems.add(myDR("ExpiryDate")) .subitems.add(myDR("ReOrder")) .subitems.add(myDR("DrugBalance")) End With End While myCon.Close() Return True Catch ex As Exception ' MsgBox(ex.Message) myCon.Close() Return False

118

End Try End Function Function SearchSalesByID() As Boolean Try strSql = "SELECT * FROM tbStock WHERE DrugID LIKE '%" & (txtSalesDrugID.Text) & "%'" myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myDR = myCmd.ExecuteReader lvSales.Items.Clear() While (myDR.Read()) With lvSales.Items.Add(myDR("DrugID")) .subitems.add(myDR("DrugName")) .subitems.add(myDR("SalePrice")) .subitems.add(myDR("ExpiryDate")) .subitems.add(myDR("ReOrder")) End With End While myCon.Close() Return True Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False End Try End Function Private Sub txtSalesDrugName_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtSalesDrugName.TextChanged SearchSalesByName() End Sub Private Sub txtSalesDrugID_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtSalesDrugID.TextChanged SearchSalesByID() End Sub Private Sub lvSales_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lvSales.SelectedIndexChanged ' CreatInvoiceID() frmQuantity.Show() End Sub

119

Function CreatInvoiceID() As Boolean Try Dim Datedstr As String Datedstr = Date.Now ' Datedstr.Remove(Char "/") 'Dim str As String = "to## remove' all"" special^& characters from string" Dim sb As New System.Text.StringBuilder For Each ch As Char In Datedstr If Char.IsLetterOrDigit(ch) Then sb.Append(ch) End If Next ' MsgBox(sb.ToString) InvoiceID = sb.ToString Catch ex As Exception End Try End Function Public Function AddSaletoDB() As Boolean ' Dim var1 As String = lv ' Dim var2 As Integer ' Dim var3 As Integer ' Dim var4 As Integer

Try strSql = "INSERT INTO tbSales([InvoiceID],[DrugName],[Price],[Quantity],[Total],[Date s]) VALUES('" _ & (InvoiceID) & "','" _ & (lvQuotation.Items(theCount).SubItems(0).Text) & "','" _ & (lvQuotation.Items(theCount).SubItems(1).Text) & "','" _ & (lvQuotation.Items(TheCount).SubItems(2).Text) & "','" _ & (lvQuotation.Items(theCount).SubItems(3).Text) & "'," _ & (String.Concat("#", Date.Now.ToShortDateString, "#")) & ")" ' MsgBox(strSql) myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myCmd.ExecuteNonQuery() myCon.Close() Return True Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False End Try

120

End Function Private Sub btRemoveItems_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btRemoveItems.Click DrugBalanceAdd() RemovefromTable() RemoveItem()

End Sub Function Deduct() As Boolean Dim startingBalance As Integer Dim EndBalance As Integer Dim DeductBalance As Integer Try DeductBalance = lvQuotation.SelectedItems(0).SubItems(3).Text startingBalance = txtGrandTotal.Text EndBalance = startingBalance - DeductBalance txtGrandTotal.Text = EndBalance Catch ex As Exception End Try End Function Function RemoveItem() As Boolean Deduct() lvQuotation.SelectedItems(0).Remove()

End Function

Private Sub btBegin_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btBegin.Click CreatInvoiceID() lvSales.Enabled = True End Sub Function RemovefromTable() As Boolean Try strSql = "DELETE * FROM tbSales WHERE InvoiceID = '" & (InvoiceID) & "' AND DrugName = '" & (lvQuotation.SelectedItems(0).SubItems(0).Text) & "'" ' MsgBox(strSql) myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myCmd.ExecuteNonQuery() myCon.Close() Return True

121

Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False End Try End Function Private Sub lvQuotation_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lvQuotation.SelectedIndexChanged End Sub Private Sub cmdCheckout_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdCheckout.Click frmCheckOut.Show() End Sub Private Sub btNewPre_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btNewPre.Click GeneratePrescriptonNo() prenum = prenum + 1 txtPrescriptionNo.Text = prenum End Sub Function LoadQue() As Boolean Try myCon.Close() strSql = "SELECT * FROM tbPrescriptions WHERE Dispensed = FALSE" ' MsgBox(strSql) myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() Dim DA As New OleDbDataAdapter(strSql, myCon) Dim DS As New DataSet DA.Fill(DS, "tbPrescription") Dim dt As New DataTable dt = DS.Tables(0) Dim dr As DataRow For Each dr In dt.Rows() cmbQue.Items.Add(dr("PatientName")) Next cmbQue.SelectedIndex = -1 myCon.Close() Return True Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False End Try End Function

122

Private Sub cmbQue_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbQue.SelectedIndexChanged myCon.Close() LoadArray() End Sub Function LoadArray() As Boolean ' Dim Drugs() As String myCon.Close() Try myCon.Close() strSql = "SELECT * FROM tbPrescriptions WHERE PatientName = '" & (cmbQue.Text) & "'" myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myDR = myCmd.ExecuteReader myDR.Read() 'Drugs = (myDR("DrugName")) ' myCon.Close() ' MsgBox(Drugs) txtDrugName.Text = (myDR("DrugName")) SearchSalesByName2() myCon.Close() txtDrugName.Clear()

Return True Catch ex As Exception ' MsgBox(ex.Message) myCon.Close() Return False End Try End Function Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) frmReports.Show() End Sub Private Sub btLoadAllStock_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btLoadAllStock.Click LoadStockReport() End Sub

123

Function LoadStockReport() As Boolean Try strSql = "SELECT * FROM tbStock" myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myDR = myCmd.ExecuteReader lvStock.Items.Clear() While (myDR.Read()) With lvStock.Items.Add(myDR("DrugID")) .subitems.add(myDR("DrugName")) .subitems.add(myDR("Quantity")) .subitems.add(myDR("ExpiryDate")) .subitems.add(myDR("CostPrice")) .subitems.add(myDR("SalePrice")) .subitems.add(myDR("DiscountPrice")) .subitems.add(myDR("StorageType")) .subitems.add(myDR("DateOfPurchase")) .subitems.add(myDR("Formulation")) .subitems.add(myDR("DrugBalance")) .subitems.add(myDR("ReOrder")) End With End While myCon.Close() Return True Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False End Try End Function Function TotalDrugs() As Boolean Try strSql = "SELECT SUM(DrugBalance) FROM tbStock" myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myDR = myCmd.ExecuteReader myDR.Read() txtTotalDrugStock.Text = (myDR.GetValue(0)) myCon.Close() Return True Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False End Try End Function Private Sub btLoadAll_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btLoadAll.Click LoadStockReport() TotalDrugs()

124

End Sub Function LoadSalesReport() As Boolean Try myCon.Close() strSql = "SELECT * FROM tbSales" ' MsgBox(strSql) myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myDR = myCmd.ExecuteReader lvSalesReport.Items.Clear() While (myDR.Read()) With lvSalesReport.Items.Add(myDR("InvoiceID")) .subitems.add(myDR("DrugName")) .subitems.add(myDR("Price")) .subitems.add(myDR("Quantity")) .subitems.add(myDR("Total")) .subitems.add(myDR("Dates")) ' .subitems.add(myDR("Dispenser")) End With End While myCon.Close() Return True Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False End Try End Function Function SumTotalSale() As Boolean Try myCon.Close() strSql = "SELECT SUM(Total) FROM tbSales" ' MsgBox(strSql) myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myDR = myCmd.ExecuteReader myDR.Read() txtTotalSales.Text = myDR.GetValue(0) myCon.Close() Return True Catch ex As Exception myCon.Close() Return False End Try End Function

125

Function TotalQuantitySale() As Boolean Try myCon.Close() strSql = "SELECT SUM(Quantity) FROM tbSales" ' MsgBox(strSql) myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myDR = myCmd.ExecuteReader myDR.Read() txtTotalQuantity.Text = myDR.GetValue(0) myCon.Close() Return True Catch ex As Exception myCon.Close() Return False End Try End Function Function CountTotalSale() As Boolean Try myCon.Close() strSql = "SELECT Count(Total) FROM tbSales" ' MsgBox(strSql) myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myDR = myCmd.ExecuteReader myDR.Read() txtTotalTransaction.Text = myDR.GetValue(0) myCon.Close() Return True Catch ex As Exception myCon.Close() Return False End Try End Function Private Sub btLoadAllSales_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btLoadAllSales.Click loadsalesreport() SumTotalSale() CountTotalSale() TotalQuantitySale() End Sub Function LoadSalesByDate() As Boolean Try myCon.Close() strSql = "SELECT * FROM tbSales WHERE Dates BETWEEN " & (String.Concat("#", dtpFrom.Value.ToShortDateString, "#"))

126

& " AND " & (String.Concat("#", dtpTo.Value.ToShortDateString, "#")) & "" ' MsgBox(strSql) myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myDR = myCmd.ExecuteReader lvSalesReport.Items.Clear() While (myDR.Read()) With lvSalesReport.Items.Add(myDR("InvoiceID")) .subitems.add(myDR("DrugName")) .subitems.add(myDR("Price")) .subitems.add(myDR("Quantity")) .subitems.add(myDR("Total")) .subitems.add(myDR("Dates")) ' .subitems.add(myDR("Dispenser")) End With End While myCon.Close() Return True Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False End Try End Function Private Sub btByDate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btByDate.Click LoadSalesByDate() End Sub Function LoadStaffWorkLoad() As Boolean Try strSql = "SELECT * FROM tbStaffWorkload WHERE Dispenser = '" & (String.Concat(Firstname, " ", Surname)) & "'" ' MsgBox(strSql) myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myDR = myCmd.ExecuteReader lvStaff.Items.Clear() While (myDR.Read()) With lvStaff.Items.Add(myDR("Dates")) .subitems.add(myDR("TotalSale")) .subitems.add(myDR("TotalPrescriptions")) .subitems.add(myDR("TotalPrescriptionItems")) .subitems.add(myDR("TotalPatients"))

127

End With End While myCon.Close() Return True

Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False End Try End Function Private Sub btSTaffWorkload_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btSTaffWorkload.Click LoadStaffWorkLoad() End Sub Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Try TheListView = lvStock ExportListViewToExcel() ' Return True Catch ex As Exception ' MsgBox(ex.Message) End Try End Sub Private Sub Label29_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) End Sub Private Sub TabPage3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TabPage3.Click End Sub Function SearchVendor() As Boolean Try strSql = "SELECT * FROM tbVendors WHERE VendorName = '" & (txtVendor.Text) & "'" myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myDR = myCmd.ExecuteReader myDR.Read() txtVendor.Text = myDR("VendorName") txtPTelephone.Text = myDR("Telephone") txtPEmail.Text = myDR("Email")

128

txtPContactName.Text = myDR("ContactName") txtVCreditLimit.Text = myDR("CreditLimit") myCon.Close() Return True Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False End Try End Function Private Sub cmdSearchVendor_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdSearchVendor.Click SearchVendor() End Sub Function AddNewPurchase() As Boolean Try strSql = "INSERT INTO tbVendors([VendorName],[Telephone],[Email],[CreditLimit],[Conta ctName]) VALUES('" & (txtVendor.Text) & "','" _ & (txtPTelephone.Text) & "','" _ & (txtPEmail.Text) & "'," _ & (txtVCreditLimit.Text) & ",'" _ & (txtPContactName.Text) & "')" MsgBox(strSql) myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myCmd.ExecuteNonQuery() myCon.Close() Return True Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False End Try End Function Function UpdatePurchase() As Boolean Try strSql = "UPDATE tbVendors SET [CreditLimit] = " & (txtVCreditLimit.Text) & " WHERE [VendorName] = '" & (txtVendor.Text) & "'" 'MsgBox(strSql) myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myCmd.ExecuteNonQuery() myCon.Close()

129

MsgBox("Credit Limit successfully changed to " & txtVCreditLimit.Text) Return True Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False End Try End Function Private Sub btPAddNew_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btPAddNew.Click AddNewPurchase() End Sub Private Sub btPEdit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btPEdit.Click UpdatePurchase() End Sub Function LoadSuppliers() As Boolean Try myCon.Close() strSql = "SELECT * FROM tbVendors" ' MsgBox(strSql) myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() Dim DA As New OleDbDataAdapter(strSql, myCon) Dim DS As New DataSet DA.Fill(DS, "tbVendors") Dim dt As New DataTable dt = DS.Tables(0) Dim dr As DataRow For Each dr In dt.Rows() cmbSupplier.Items.Add(dr("VendorName")) Next cmbSupplier.SelectedIndex = -1 myCon.Close() Return True Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False End Try End Function Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage End Sub

130

Private Sub cmbSupplier_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbSupplier.SelectedIndexChanged PopulateVendorDetails() End Sub Function PopulateVendorDetails() As Boolean Try strSql = "SELECT * FROM tbVendors WHERE VendorName = '" & (cmbSupplier.Text) & "'" myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myDR = myCmd.ExecuteReader myDR.Read() txtCreditLimit.Text = myDR("CreditLimit") txtPDiscount.Text = myDR("Discount") myCon.Close() Return True Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False End Try End Function Function SearchUnit() As Boolean Try strSql = "SELECT * FROM tbStock WHERE DrugName = '" & (txtPUnit.Text) & "'" myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myDR = myCmd.ExecuteReader myDR.Read() txtPAmount.Text = myDR("CostPrice") myCon.Close() Return True Catch ex As Exception ' MsgBox(ex.Message) myCon.Close() Return False End Try End Function Private Sub txtPUnit_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtPUnit.TextChanged If txtPUnit.TextLength > 2 Then SearchUnit() End If End Sub

131

Private Sub TabPage2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TabPage2.Click End Sub Private Sub tpAdmin_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tpAdmin.Click End Sub End Class

B.8

Purchase Invoice Code

The following is the code that will implement the Pharmacy Purchase Invoice Module using the following code as shown below.
Function CreatInvoiceID() As Boolean Try Dim Datedstr As String Datedstr = Date.Now ' Datedstr.Remove(Char "/") 'Dim str As String = "to## remove' all"" special^& characters from string" Dim sb As New System.Text.StringBuilder For Each ch As Char In Datedstr If Char.IsLetterOrDigit(ch) Then sb.Append(ch) End If Next ' MsgBox(sb.ToString) InvoiceID = sb.ToString Catch ex As Exception End Try End Function Public Function AddSaletoDB() As Boolean ' Dim var1 As String = lv ' Dim var2 As Integer ' Dim var3 As Integer ' Dim var4 As Integer

Try strSql = "INSERT INTO tbSales([InvoiceID],[DrugName],[Price],[Quantity],[Total],[Date s]) VALUES('" _ & (InvoiceID) & "','" _ & (lvQuotation.Items(theCount).SubItems(0).Text) & "','" _ & (lvQuotation.Items(theCount).SubItems(1).Text) & "','" _ & (lvQuotation.Items(TheCount).SubItems(2).Text) & "','" _

132

& (lvQuotation.Items(theCount).SubItems(3).Text) & "'," _ & (String.Concat("#", Date.Now.ToShortDateString, "#")) & ")" ' MsgBox(strSql) myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myCmd.ExecuteNonQuery() myCon.Close() Return True Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False End Try End Function Private Sub btRemoveItems_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btRemoveItems.Click DrugBalanceAdd() RemovefromTable() RemoveItem()

End Sub Function Deduct() As Boolean Dim startingBalance As Integer Dim EndBalance As Integer Dim DeductBalance As Integer Try DeductBalance = lvQuotation.SelectedItems(0).SubItems(3).Text startingBalance = txtGrandTotal.Text EndBalance = startingBalance - DeductBalance txtGrandTotal.Text = EndBalance Catch ex As Exception End Try End Function Function RemoveItem() As Boolean Deduct() lvQuotation.SelectedItems(0).Remove()

End Function

133

Private Sub btBegin_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btBegin.Click CreatInvoiceID() lvSales.Enabled = True End Sub Function RemovefromTable() As Boolean Try strSql = "DELETE * FROM tbSales WHERE InvoiceID = '" & (InvoiceID) & "' AND DrugName = '" & (lvQuotation.SelectedItems(0).SubItems(0).Text) & "'" ' MsgBox(strSql) myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myCmd.ExecuteNonQuery() myCon.Close() Return True Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False End Try End Function Private Sub lvQuotation_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lvQuotation.SelectedIndexChanged End Sub Private Sub cmdCheckout_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdCheckout.Click frmCheckOut.Show() End Sub Private Sub btNewPre_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btNewPre.Click GeneratePrescriptonNo() prenum = prenum + 1 txtPrescriptionNo.Text = prenum End Sub Function LoadQue() As Boolean Try myCon.Close() strSql = "SELECT * FROM tbPrescriptions WHERE Dispensed = FALSE" ' MsgBox(strSql) myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon

134

myCon.Open() Dim DA As New OleDbDataAdapter(strSql, myCon) Dim DS As New DataSet DA.Fill(DS, "tbPrescription") Dim dt As New DataTable dt = DS.Tables(0) Dim dr As DataRow For Each dr In dt.Rows() cmbQue.Items.Add(dr("PatientName")) Next cmbQue.SelectedIndex = -1 myCon.Close() Return True Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False End Try End Function Private Sub cmbQue_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbQue.SelectedIndexChanged myCon.Close() LoadArray() End Sub Function LoadArray() As Boolean ' Dim Drugs() As String myCon.Close() Try myCon.Close() strSql = "SELECT * FROM tbPrescriptions WHERE PatientName = '" & (cmbQue.Text) & "'" myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myDR = myCmd.ExecuteReader myDR.Read() 'Drugs = (myDR("DrugName")) ' myCon.Close() ' MsgBox(Drugs) txtDrugName.Text = (myDR("DrugName"))

SearchSalesByName2() myCon.Close() txtDrugName.Clear()

135

Return True Catch ex As Exception ' MsgBox(ex.Message) myCon.Close() Return False End Try End Function Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) frmReports.Show() End Sub Private Sub btLoadAllStock_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btLoadAllStock.Click LoadStockReport() End Sub Function LoadStockReport() As Boolean Try strSql = "SELECT * FROM tbStock" myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myDR = myCmd.ExecuteReader lvStock.Items.Clear() While (myDR.Read()) With lvStock.Items.Add(myDR("DrugID")) .subitems.add(myDR("DrugName")) .subitems.add(myDR("Quantity")) .subitems.add(myDR("ExpiryDate")) .subitems.add(myDR("CostPrice")) .subitems.add(myDR("SalePrice")) .subitems.add(myDR("DiscountPrice")) .subitems.add(myDR("StorageType")) .subitems.add(myDR("DateOfPurchase")) .subitems.add(myDR("Formulation")) .subitems.add(myDR("DrugBalance")) .subitems.add(myDR("ReOrder")) End With End While myCon.Close() Return True Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False End Try End Function

136

Function TotalDrugs() As Boolean Try strSql = "SELECT SUM(DrugBalance) FROM tbStock" myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myDR = myCmd.ExecuteReader myDR.Read() txtTotalDrugStock.Text = (myDR.GetValue(0)) myCon.Close() Return True Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False End Try End Function Private Sub btLoadAll_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btLoadAll.Click LoadStockReport() TotalDrugs() End Sub Function LoadSalesReport() As Boolean Try myCon.Close() strSql = "SELECT * FROM tbSales" ' MsgBox(strSql) myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myDR = myCmd.ExecuteReader lvSalesReport.Items.Clear() While (myDR.Read()) With lvSalesReport.Items.Add(myDR("InvoiceID")) .subitems.add(myDR("DrugName")) .subitems.add(myDR("Price")) .subitems.add(myDR("Quantity")) .subitems.add(myDR("Total")) .subitems.add(myDR("Dates")) ' .subitems.add(myDR("Dispenser")) End With End While myCon.Close() Return True Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False

137

End Try End Function Function SumTotalSale() As Boolean Try myCon.Close() strSql = "SELECT SUM(Total) FROM tbSales" ' MsgBox(strSql) myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myDR = myCmd.ExecuteReader myDR.Read() txtTotalSales.Text = myDR.GetValue(0) myCon.Close() Return True Catch ex As Exception myCon.Close() Return False End Try End Function Function TotalQuantitySale() As Boolean Try myCon.Close() strSql = "SELECT SUM(Quantity) FROM tbSales" ' MsgBox(strSql) myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myDR = myCmd.ExecuteReader myDR.Read() txtTotalQuantity.Text = myDR.GetValue(0) myCon.Close() Return True Catch ex As Exception myCon.Close() Return False End Try End Function Function CountTotalSale() As Boolean Try myCon.Close() strSql = "SELECT Count(Total) FROM tbSales" ' MsgBox(strSql) myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myDR = myCmd.ExecuteReader

138

myDR.Read() txtTotalTransaction.Text = myDR.GetValue(0) myCon.Close() Return True Catch ex As Exception myCon.Close() Return False End Try End Function Private Sub btLoadAllSales_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btLoadAllSales.Click loadsalesreport() SumTotalSale() CountTotalSale() TotalQuantitySale() End Sub Function LoadSalesByDate() As Boolean Try myCon.Close() strSql = "SELECT * FROM tbSales WHERE Dates BETWEEN " & (String.Concat("#", dtpFrom.Value.ToShortDateString, "#")) & " AND " & (String.Concat("#", dtpTo.Value.ToShortDateString, "#")) & "" ' MsgBox(strSql) myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myDR = myCmd.ExecuteReader lvSalesReport.Items.Clear() While (myDR.Read()) With lvSalesReport.Items.Add(myDR("InvoiceID")) .subitems.add(myDR("DrugName")) .subitems.add(myDR("Price")) .subitems.add(myDR("Quantity")) .subitems.add(myDR("Total")) .subitems.add(myDR("Dates")) ' .subitems.add(myDR("Dispenser")) End With End While myCon.Close() Return True Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False End Try End Function

139

Private Sub btByDate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btByDate.Click LoadSalesByDate() End Sub Function LoadStaffWorkLoad() As Boolean Try strSql = "SELECT * FROM tbStaffWorkload WHERE Dispenser = '" & (String.Concat(Firstname, " ", Surname)) & "'" ' MsgBox(strSql) myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myDR = myCmd.ExecuteReader lvStaff.Items.Clear() While (myDR.Read()) With lvStaff.Items.Add(myDR("Dates")) .subitems.add(myDR("TotalSale")) .subitems.add(myDR("TotalPrescriptions")) .subitems.add(myDR("TotalPrescriptionItems")) .subitems.add(myDR("TotalPatients")) End With End While myCon.Close() Return True

Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False End Try End Function Private Sub btSTaffWorkload_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btSTaffWorkload.Click LoadStaffWorkLoad() End Sub Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Try TheListView = lvStock ExportListViewToExcel() ' Return True Catch ex As Exception ' MsgBox(ex.Message)

140

End Try End Sub Private Sub Label29_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) End Sub Private Sub TabPage3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TabPage3.Click End Sub Function SearchVendor() As Boolean Try strSql = "SELECT * FROM tbVendors WHERE VendorName = '" & (txtVendor.Text) & "'" myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myDR = myCmd.ExecuteReader myDR.Read() txtVendor.Text = myDR("VendorName") txtPTelephone.Text = myDR("Telephone") txtPEmail.Text = myDR("Email") txtPContactName.Text = myDR("ContactName") txtVCreditLimit.Text = myDR("CreditLimit") myCon.Close() Return True Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False End Try End Function Private Sub cmdSearchVendor_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdSearchVendor.Click SearchVendor() End Sub Function AddNewPurchase() As Boolean Try strSql = "INSERT INTO tbVendors([VendorName],[Telephone],[Email],[CreditLimit],[Conta ctName]) VALUES('" & (txtVendor.Text) & "','" _ & (txtPTelephone.Text) & "','" _ & (txtPEmail.Text) & "'," _ & (txtVCreditLimit.Text) & ",'" _ & (txtPContactName.Text) & "')" MsgBox(strSql)

141

myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myCmd.ExecuteNonQuery() myCon.Close() Return True Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False End Try End Function Function UpdatePurchase() As Boolean Try strSql = "UPDATE tbVendors SET [CreditLimit] = " & (txtVCreditLimit.Text) & " WHERE [VendorName] = '" & (txtVendor.Text) & "'" 'MsgBox(strSql) myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myCmd.ExecuteNonQuery() myCon.Close() MsgBox("Credit Limit successfully changed to " & txtVCreditLimit.Text) Return True Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False End Try End Function Private Sub btPAddNew_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btPAddNew.Click AddNewPurchase() End Sub Private Sub btPEdit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btPEdit.Click UpdatePurchase() End Sub Function LoadSuppliers() As Boolean Try myCon.Close() strSql = "SELECT * FROM tbVendors" ' MsgBox(strSql) myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open()

142

Dim DA As New OleDbDataAdapter(strSql, myCon) Dim DS As New DataSet DA.Fill(DS, "tbVendors") Dim dt As New DataTable dt = DS.Tables(0) Dim dr As DataRow For Each dr In dt.Rows() cmbSupplier.Items.Add(dr("VendorName")) Next cmbSupplier.SelectedIndex = -1 myCon.Close() Return True Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False End Try End Function Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage End Sub Private Sub cmbSupplier_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbSupplier.SelectedIndexChanged PopulateVendorDetails() End Sub Function PopulateVendorDetails() As Boolean Try strSql = "SELECT * FROM tbVendors WHERE VendorName = '" & (cmbSupplier.Text) & "'" myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myDR = myCmd.ExecuteReader myDR.Read() txtCreditLimit.Text = myDR("CreditLimit") txtPDiscount.Text = myDR("Discount") myCon.Close() Return True Catch ex As Exception MsgBox(ex.Message) myCon.Close() Return False End Try End Function Function SearchUnit() As Boolean Try strSql = "SELECT * FROM tbStock WHERE DrugName = '" & (txtPUnit.Text) & "'"

143

myCmd = New OleDbCommand myCmd.CommandText = strSql myCmd.Connection = myCon myCon.Open() myDR = myCmd.ExecuteReader myDR.Read() txtPAmount.Text = myDR("CostPrice") myCon.Close() Return True Catch ex As Exception ' MsgBox(ex.Message) myCon.Close() Return False End Try End Function Private Sub txtPUnit_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtPUnit.TextChanged If txtPUnit.TextLength > 2 Then SearchUnit() End If End Sub Private Sub TabPage2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TabPage2.Click End Sub Private Sub tpAdmin_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tpAdmin.Click End Sub Private Sub TabPage4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TabPage4.Click End Sub End Class

144

APPENDICES C C.1 User Acceptance Test Form

USER ACCEPTANCE TEST SCRIPT


MEWA PHARMACY SOFTWARE SYSTEM MAIN DASH BOARD VERSION NO 1.0
1. Test Scenario Description No. Test Script No.

1.

Main Menu 1.0

Successful login opens main menu Main menu should consists of 5 tabs Sales, Report,

2.

Main Menu 1.1 Administration, Price and Purchase Main Menu 1.2 Main Menu 1.3 Main Menu 1.4 Main Menu 1.5 Main Menu 1.6 Sales Report Administration Price Purchase

3. 4. 5. 6. 7.

Test Script No: Login 1.0 Start Date: 9/27/2012

145

Scenario: Logging in to access the main menu

Test Data No. Step (Input Data) Username and Password

Test Condition Verify the username and password

Expected Results To access the main menu Access denial to

Login 1. 1

2.

Login

Username and Password

Given wrong username or password

the main menu The program log

3.

Login

Username and Password

Given wrong username or password for 3 times

off and exit

146

C.2

Letter to Organization

147

C.3

Questionnaire

QUESTIONNAIRE
MEWA PHARMACY SOFTWARE SYSTEM
This questionnaire is presented to you with the objective of understanding the current MEWA Pharmacy System and also get your recommendation and input for the proposed MEWA Pharmacy Software System. In this regard, a request is made to you to give a feedback by answering the questions below. You are required to check the appropriate box with an option best fit your recommendation. The information generated by this questionnaire will be treated confidentially and only be used for the intended purpose and will not in any way be used against you, the respondent.

Section A: Personal Information (Please Tick or Cross on appropriate check box of your choice) Name (Optional) Gender

Male

Female

Section of Work Outpatient Ph Inpatient Ph

HTC Ph

Theatre Ph Surgical

Drug Store

Procurement

Administration

148

Work Duration in MEWA

1 yrs & below

2 yrs & below

3 yrs & below

4 yrs & above

Position or Post Held Administrator Departmental Head Sectional Head Dispenser

Section B: Current Pharmacy System (On a scale of 1 to 5, 1 being the Lowest and 5 the Highest, please tick or cross on an appropriate check box of your choice) 1 The current system is effective 2 3 4 5 (Scale)

My workload is manageable

Patient service satisfaction

Ease of retrieval of patient record

Ease of retrieval of drug prices

149

Ease of retrieval of reorder level

There are no queues

Section C: Proposed Pharmacy System (On a scale of 1 to 5, 1 being the Lowest and 5 the Highest, please tick or cross on an appropriate check box of your choice) 1 There is a need for automation Be able to manage inventory easily There will be queue reduction 2 3 4 5 (Scale)

There will be workload reduction Be able to manage inventory easily

Be able to use updated drug prices Kindly give any recommendation not capture by the questionnaire, which you think will help to bring satisfaction for both patients and employees here

Thank you for taking time to complete this questionnaire MEWA Hospital Pharmacy Department mewahospital95@gmail.com

150