Click here to Skip to main content
13,256,415 members (53,393 online)
Click here to Skip to main content
Add your own
alternative version

Tagged as

Stats

5.3K views
299 downloads
4 bookmarked
Posted 4 Dec 2013

Pharmacological office management using products barcode

, 4 Dec 2013
Rate this:
Please Sign up or sign in to vote.
This C# code show how to use a barcode reader to manage pharmaceutical sales. It could be adapted to any store or service based on barcode reading.

Introduction

This C# code show how to use a barcode reader to manage pharmaceutical sales. It could be adapted to any store or service based on barcode reading. To achieve our goal, I used a SQL Server database to store all the entries. Every time we need to get a product out of stock our script searches in the database to see if it exists and how many product have the same barcode in the table. Products are sorted in a ListView, and we have to select the appropriate product. This is strongly recommended in pharmaceutical sales to avoid mistakes that may be considered dangerous for the patient or buyer. I have kept in the attached source code project only some interesting Windows Forms, such as Form to register a product, Bloc Notes, Inventory, prescriptions form, etc. We need some functions to validate data. For this I,

1. Add a class named validation.cs

It contains all classes to control if TexBox(s) entries are valid. I added an EventControl everywhere I wanted use validation functions.

Must Be Numeric

Some entries must be numeric, same if we have to tape the barcode manually.

public void Number_Validating(object sender, KeyPressEventArgs e)
{
    char ch = e.KeyChar;
    TextBox tb = sender as TextBox;
    if (!Char.IsDigit(ch))
    {
        MessageBox.Show(tb.Tag + " La valeur doit être numérique");
        e.Handled= true;
    }
}

Should Not Be Empty

public void empty_Validating(object sender, EventArgs e)
{
    TextBox tb = sender as TextBox;
    if (tb.Text == "" )
    {
        MessageBox.Show(tb.Tag + " Non valide ");
        tb.Focus();
        tb.BackColor = System.Drawing.Color.Beige;
    }
}

Must Be Decimal

public void decimal_Validating(object sender, KeyPressEventArgs e)
{
    char ch = e.KeyChar;
    TextBox tb = sender as TextBox;
    if (ch == 46 && tb.Text.IndexOf('.') != -1)
    {
        e.Handled =true;
        return;
    }
    if (!Char.IsDigit(ch) && ch != 46 && ch != 8)
    {
        MessageBox.Show(tb.Tag + " La valeur doit être décimal");
        e.Handled = true;
    }
}

CR TEXBOX

public void ClearTextBoxes(Control control, String txtbx)
{
    // Fonction pour effacer tout les textboxes
    foreach (Control c in control.Controls)
    {
        if (c is TextBox)
        {
            if (c.Name != txtbx)
            {
    }

Clear TextBox

public void ClearTextBoxes(Control control, String txtbx)

Add a SQL database

manipBaseDonnees.cs has code to connect to a database, test if a product exists, if so get all stored data for this product. This class makes it easy to get all the information for a product every time we sell or buy a product. It prevents all mistakes if two products exist with the same barcode. My database is named “product.mdf” and contain tables such as “medicament.mdf” for meds, “vendeur.mdf” for professionals, “notes.mdf” for bloc notes etc. For recall, to connect to a database we use a connection string as below:

namespace officinelCommand cmd = new SqlCommand();
        SqlDataReader dr;
    }

Then:

private void FormMenu_Load(object sender, EventArgs e)
{
    cmd.Connection = cn; // sqlconn
}

This function gets stored data about a product to a list.

public List<string> getFromTable(Double codebar)
{
    List<string> donnees = new List<string>();
    cmd.Connection = cn; // sqlconn
    cn.Open();
    var selectString = "SELECT * FROM medicaments WHERE code_bare = @codebar";
    var myCommand = new SqlCommand(selectString, cn);
    myCommand.Parameters.AddWithValue("@codebar", codebar);
    rd = myCommand.ExecuteReader();
    if (rd.HasRows)
    while (rd.Read())
    {
        t0 = rd[0].ToString(); // valeur id
        t1 = rd[1].ToString(); // valeur nom
        ….
    }
    rd.Close();
    cn.Close();
    donnees.Add(t0);donnees.Add(t1);donnees.Add(t2);donnees.Add(t3);donnees.Add(t4);donnees.Ad
    d(t5);donnees.Add(t6);donnees.Add(t7);
    donnees.Add(t8); donnees.Add(t9); donnees.Add(t10); donnees.Add(t11); donnees.Add(t12);
    return donnees;
}

This function tests if a product exists:

public Boolean checkIfExist(Double codebar) {
    Boolean bol = false;
    cmd.Connection = cn; // sqlconn
    cn.Open();
    var selectString = "SELECT code_bare FROM medicaments WHERE code_bare = @codebar ";
    var myCommand = new SqlCommand(selectString, cn);
    myCommand.Parameters.AddWithValue("@codebar", codebar);
    object result =myCommand.ExecuteScalar();
    if (result != DBNull.Value && result != null)
    {
        bol = true;
    }
    else { bol = false; }
    cn.Close();
    return bol;
}

public List<int> countInTable(Double codebar)
{
    cmd.Connection = cn; // sqlconn
    cn.Open();
    List<int> id = new List<int>();
    String countString = "SELECT * FROM medicaments WHERE code_bare = @codebar
    ";
    var myCommand = new SqlCommand(countString, cn);
    myCommand.Parameters.AddWithValue("@codebar", codebar);
    using (rd = myCommand.ExecuteReader())
    {
        // loop over all rows returned by SqlDataReader
        while (rd.Read())
        {
            // grab the column no. 0 (corresponds to "Role" from your
            // SQL select statement) as a string, and store it into list of roles
            t0 = rd[0].ToString();
            id.Add(int.Parse(t0));
        }
    }
    rd.Close();
    cn.Close();
    return id;
}

To read a barcode we use a timer. If the textbox of the barcode reader changes the new value is transferred to another textbox (or listbox, listview, etc.) to be gathered. Once reading is finished the function

public
Boolean checkIfExist(Double codebar)
tests if the product exists, if so another function public List<string> getFromTable(Double codebar) send us all the stored data to our prescription interface (in my project, I get name, price). A professional user can get all other data as description, posology, manufacturing date, etc.

private void textBox1_TextChanged(object sender, EventArgs e) {
    try
    {
        if (textBox1.Text.Trim().Length == 1)
        {
            tmrDelay.Enabled = true;
            tmrDelay.Start();
            tmrDelay.Tick += new EventHandler(tmrDelay_Tick);
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

void tmrDelay_Tick(object sender, EventArgs e)
{
    try
    {
        tmrDelay.Stop();
        string strCurrentString = textBox1.Text.Trim().ToString();
        if (strCurrentString != "")
        {
            textBox2.Text = strCurrentString;
            textBox1.Text = "";
        }
        textBox1.Focus();
        if (manipBaseDonnees.checkIfExist(double.Parse(textBox2.Text)) == true)
        {
            int nrbOfData = 
              manipBaseDonnees.countInTable(double.Parse(textBox2.Text))[0];
            this.listView2.Items.Clear();
            laodProduct(double.Parse(textBox2.Text));
        }
        else { MessageBox.Show("Ce produit est nouveau"); }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

Share

About the Author

Said Boularouk
United States United States
No Biography provided

You may also be interested in...

Pro
Pro

Comments and Discussions

 
QuestionWich files are necesary? Pin
Alicia Del Carmen Izaguirre Oliveros8-Nov-17 7:57
memberAlicia Del Carmen Izaguirre Oliveros8-Nov-17 7:57 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Terms of Use | Mobile
Web02 | 2.8.171114.1 | Last Updated 4 Dec 2013
Article Copyright 2013 by Said Boularouk
Everything else Copyright © CodeProject, 1999-2017
Layout: fixed | fluid