CHƢƠNG II : THIẾT KẾ ĐẦU ĐỌC THẺ RFID TẦN SỐ 125kHz
3.2. Xây dựng phần mềm trên máy tính PC quản lý CSDL bệnh nhân
3.3.2. Xử lý các yêu cầu và viết chương trình
3.3.2.1. Tạo giao diện cho phần mềm bằng công cụ lập trình C# 2015
Hình 3.15: Khởi tạo Project
Hình 3.16: Mã giao diện cửa sổ chính
C# hỗ trợ một Toolbox khá đầy đủ để phục vụ cho việc tạo giao diện phần mềm
56
Sau khi sử dụng các công cụ trong Toolbox để thiết kế giao diện kết quả thu đƣợc nhƣ sau:
Cửa sổ Quản lý Vào/ra
Hình 3.18: Giao diện cửa sổ Quản lý Vào/ra
Cửa sổ này gồm các thành phần:
1. Bảng hiển thị thông tin của ngƣời vào cửa gồm số lần qua cửa N, Họ tên, Mã thẻ, Giờ vào, Ngày vào
2. Nút xoá thông tin trong bảng 1 3. Nút xuất ra Excel
4. Vùng hiển thị thông tin ngắn gọn của ngƣời qua cửa (gồm cả ảnh) 5. Vùng hiển thị thông tin qua cửa
6. Vùng lựa chọn cổng COM.( Gồm VIRTUAL COM – Lựa chọn COM ảo; REAL COM – Kết nối đầu đọc qua cổng COM1 của máy tính)
Hình 3.19: Giao diện cửa sổ Quản lý Hồ sơ
Bao gồm các thành phần:
1. Vùng hiển thị Thông tin cá nhân
2. Bảng hiện thị thông tin trong Cơ sở dữ liệu 3. Ảnh
4. Các nút công cụ
Bƣớc tiếp theo là phải kết nối chƣơng trình với Cơ sở dữ liệu thông qua các câu lệnh lập trình.
3.3.2.2. Các xử lý với cơ sở dữ liệu
a. Tạo cơ sở dữ liệu lƣu hồ sơ cá nhân
Nhƣđã nói ở trên Cơ sở dữ liệu mẫu đƣợc tạo bằng Microsoft Access 2003(định dạng Access 2000) với tên “Data.mdb”
58
Hình 3.20: Các bảng Cơ sở dữ liệu
Một thành phần của Cơ sở dữ liệu nữa đó là ảnh của các hồ sơ Các ảnh này đƣợc lƣu trong Thƣ mục Pictures
Cả thƣ mục Pictures này và file “Data.mdb” đều đƣợc lƣu trong thƣ mục Debug của Project “HE THONG QUAN LY BENH NHAN”.
b. Liên kết tới cơ sở dữ liệu và hiển thị lên Form
Một trong những nguyên nhân làm cho C# là một ngôn ngữ lập trình mạnh, dễ sử dụng đó là nó nhóm các lớp lệnh có cùng quan hệ vào các không gian tên (namespace) riêng biệt giúp ngƣời sử dụng dễ dàng gọi các câu lệnh trong khi viết chƣơng trình.( ví dụ: namespace System, namespace System.Data…)
Hình 3.21: Namespace trong C#
Đối với mỗi loại Cơ sở dữ liệu thì C# cung cấp cho chúng ta một không gian tên(namespace) riêng biệt để thao tác với chúng. Để kết nối đƣợc đến cơ sở dữ liệu dạng file Access thì cần sử dụng 2 namespace sau:
• using System.Data; //Namespace cho các đối tượng Data
• using System.Data.OleDb; // Đây là namespace mà ta sẽ sử dụng cho Access
Thêm vào đó, để kết nối đƣợc với Cơ sở dữ liệu chúng ta cần có thêm chuỗi kết nối(Connection String)
String Chuoi_ket_noi = "Provider = Microsoft.Jet.OLEDB.4.0 ;" + "Data Source =" + Application.StartupPath +
@"\Data.mdb;";
Ở đây, Provider = Microsoft.Jet.OLEDB.4.0
là phƣơng thức kết nối cơ sở dữ liệu đƣợc tạo từ ứng dụng Microsoft Office.
Application.StartupPath – là đƣờng dẫn tuyệt đối đến thƣ mục Debug. Sau khi đã kết nối đƣợc cơ sở dữ liệu chúng ta có thể hiển thị chúng lên giao diện phần mềm với các lớp đối tƣợng làm việc với cơ sở dữ liệu nhƣ :DataSet, DataReader, DataAdapter…
Ảnh của hồ sơ sẽ đƣợc tìm theo tên ảnh có trong cơ sở dữ liệu và hiển thị lên picturebox qua câu lệnh:
string tenanh = Application.StartupPath + "\\Pictures\\" + txtImage.Text; pictureBox4.Image = Image.FromFile(tenanh);
60
c. Xử lý các yêu cầu thêm mới, xóa, sửa hồ sơ
Phần mềm hỗ trợ việc thao tác với cơ sở dữ liệu thông qua các nút tác vụ nhƣ hình minh hoạ( Hình 16)
C# cung cấp cho chúng ta một lớp các lệnh(Command) để tác động đến cơ sở dữ liệu thông qua đối tƣợng DataTable.
Hình 3.23: Các tác vụ quản lý Hồ sơ
Nút Xoá TextBox
Chức năng của nút này là xoá toàn bộ thông tin trên các TextBox. Câu lệnh sử dụng cho chức năng này rất đơn giản nhƣ sau:
private void Xoadulieu() { txtSTT.Text = ""; txtName.Text = ""; txtMathe.Text = ""; txtBirthDate.Text = ""; txtRoom.Text = ""; txtPosition.Text = ""; txtPhone.Text = ""; txtAddress.Text = ""; txtEmail.Text = ""; txtImage.Text = ""; pictureBox4.Image = null; }
Nút Thêm Hồ sơ mới
Để thực hiện chức năng này C# cung cấp cho chúng ta các câu lệnh(Command) để chèn dữ liệu vào bảng thông qua đối tƣợng DataTable.
DataTable là một bảng ảo đƣợc C# tạo ra để chứa cơ sở dữ liệu khi thao tác.
Hình 3.24: Liên hệ giữa dữ liệu gốc và chƣơng trình
Câu lệnh thực hiện nhƣ sau:
private void subInsertByAdapter() {
//Tạo kết nối tới file Access subCreateConnect();
//Nạp dữ liệu vào DataTable
objDataTable2 = new DataTable("Abc"); //Tạo đối tƣợng Adapter và Fill vào DataTable
OleDbDataAdapter objAdapter = new OleDbDataAdapter("Select * from DanhsachNV", objConnect);
62
objDataTable2.Rows.Add(objRow); //Tạo đối tƣợng Command
OleDbCommand objCommand = new OleDbCommand(); objCommand.Connection = objConnect;
objCommand.CommandType = CommandType.Text;
objCommand.CommandText = "Insert into DanhsachNV values(@STT,@Name,@Mathe,@BirthDate,@Room,@Position,@Phone,@Ad dress,@Email,@Image)"; objCommand.Parameters.Add("@STT", OleDbType.Integer, 30, "STT"); objCommand.Parameters.Add("@Name", OleDbType.VarChar, 100, "Name");
//Insert dữ liệu vào nguồn
objAdapter.InsertCommand = objCommand; objAdapter.Update(objDataTable2);
}
Nút Update Hồ sơ
Cho phép ngƣời quản lý cập nhật thêm hoặc sửa thông tin cá nhân của hồ sơ bất kì.Tƣơng tự nhƣ thêm mới hồ sơ, muốn sửa hồ sơ trƣớc tiên ta sửa trên bảng DataTable, sau đó cập nhật sửa đổi đó vào cơ sở dữ liệu gốc thông qua việc viết command update.
Nút Xoá Hồ sơ
Nhiệm vụ là phải lọc đƣợc ra dữ liệu cần xoá trong DataTable và xoá nó, sau đó cập nhật vào cơ sở dữ liệu gốc.
private void Xoa_du_lieu() {
//Tạo kết nối
subCreateConnect(); //Tạo Adpater
OleDbDataAdapter objAdapter = new OleDbDataAdapter("select * from DanhsachNV", objConnect);
objDataTable2 = new DataTable(); objAdapter.Fill(objDataTable2); //Xây dựng commandBuilder
new OleDbCommandBuilder(objAdapter); //Delete Record cần delete trong datatable
DataRow[] objRow = objDataTable2.Select("STT=" + Convert.ToInt32(txtSTT.Text));
objRow[0].Delete(); //Delete dữ liệu nguồn
objAdapter.Update(objDataTable2); }
Nút Thêm ảnh
Để thêm ảnh cho Hồ sơ. C# cung cấp hai hộp thoại OpenDialog và SaveDialog
Các bƣớc lƣu ảnh hồ sơđƣợc thực hiện nhƣ sau:
Hình 3.25: Các bƣớc lƣu ảnh cho hồ sơ //a. Khởi tạo hàm Mở Dialog tìm ảnh
64
openFileDialog1.ShowDialog();// Hiện cửa sổ if (openFileDialog1.FileName != "")
{
…// Thêm câu lệnh
System.IO.Directory.SetCurrentDirectory(System.Windows.Forms.Application. StartupPath + "/Pictures");//Đƣờng dẫn chứa file ảnh khi lƣu.
} }
//b. Khởi tạo hàm Save ảnh private void SaveImage() { saveFileDialog1.FileName = txtImage.Text; if (saveFileDialog1.FileName != "") { System.IO.FileStreamfs= (System.IO.FileStream)saveFileDialog1.OpenFile(); switch (saveFileDialog1.FilterIndex) { case 1: this.pictureBox4.Image.Save(fs, System.Drawing.Imaging.ImageFormat.Jpeg); break; case 2: this.pictureBox4.Image.Save(fs, System.Drawing.Imaging.ImageFormat.Bmp); break; case 3: this.pictureBox4.Image.Save(fs, System.Drawing.Imaging.ImageFormat.Gif);
break; }
fs.Close(); }
}
Tên ảnh đƣợc chọn sẽ đƣợc cập nhật vào ô “File” và hiển thị lên picturebox thông qua câu lệnh:
txtImage.Text = System.IO.Path.GetFileName(openFileDialog1.FileName);// Hiển thị tên ảnh lên Textbox
pictureBox4.Image= Image.FromFile(openFileDialog1.FileName);//Hiện ảnh lên Picturebox.
Như vậy, sau khi đãđiền thông tin vào các ô và lưu ảnh thì để lưu hồ sơ ta chỉ cần chọn nút “Thêm Hồ sơ mới”.
d. Xử lý dữ liệu gửi lên máy tính từ đầu đọc
Đầu đọc thẻ sau khi đọc thông tin chứa trong thẻ sẽ gửi lên máy tính thông qua cổng COM. Thông tin này là mã thẻ đƣợc quét. Nó là một chuỗi 10 chữ số có dạng “2556296901”. Nhiệm vụ của phần mềm là phải xác minh thông tin mã thẻ này, so sánh với các mã thẻ trong cơ sở dữ liệu và hiển thị thông tin cá nhân của ngƣời có mã thẻ này. Đồng thời gửi lệnh mở cửa cho cơ cấu chấp hành. Để thực hiện đƣợc nhiệm vụ trên chúng ta phải thực hiện các công việc sau:
Tạo kết nối với cổng COM
C# cung cấp cho chúng ta lớp SerialPort để có thể tạo các kết nối và đặt các thông số kết nối tới cổng COM. Để sử dụng lớp này, cần khai báo hai namespace sau:
66
- Tốc độ: “9600”
- Phƣơng thức truyền: “Parity.None” - Số bit dữ liệu mỗi lần truyền: 8 - Số bit dừng: One
Các thông số trên có thể thay đổi tuỳ vào mục đích ngƣời sử dụng. Ngoài ra chúng ta cũng có thể tạo kết nối nhờ Toolbox :
Phần mềm có chức năng lựa chọn cổng COM với mục đích. - Kết nối với cổng COM ảo để chạy thử nghiệm trên máy tính - Kết nối với cổng COM1 của máy tính để nhận dữ liệu từ đầu đọc
Hình 3.26: Chức năng lựa chọn cổng COM
Giao diện Form gửi dữ liệu qua cổng COM ảo đƣợc thiết kế nhƣ sau:
Hình 3.27: Giao diện mô phỏng truyền dữ liệu qua cổng COM ảo
Sau khi tạo đƣợc kết nối vấn đề tiếp theo đó là xử lý sự kiện khi có dữ liệu truyền từ đầu đọc lên cổng COM.
Hình 3.28: Vùng hiển thị thông tin Mã thẻ gửi lên từ đầu đọc
Dữ liệu từ đầu đọc đƣợc gửi lên sẽ đƣợc hiển thị trong Textbox “Mã thẻ”(có tên “docMathe”).
Việc hiển thị này nhờ vào câu lệnh khi có sự kiện thay đổi dữ liệu ở cổng COM nhƣ sau:
docMathe.Text = receive;
private void ComPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
receive = ComPort.ReadLine(); }
Sau đó, dữ liệu ở ô Mã thẻ sẽ đƣợc so sánh với dữ liệu trong Cơ sở dữ liệu và xử lý theo sơđồ sau:
68
{
CurrentDateTime();
for (int i = 0; i < DGView2.Rows.Count; i++) {
if ((string)DGView2.Rows[i].Cells[2].Value == docMathe.Text) {
// Hien thi Ho so theo ma the nhan duoc try
{
Chứa các câu lệnh hiển thị Hồ sơ theo Mã thẻ nhận đƣợc Và lƣu vào file cơ sở dữ liệu “Thongtinvaora.mdb”
}
catch { } } }
Thời gian vào cửa sẽ đƣợc lấy là thời gian của hệ thống máy tính quản lý qua hàmCurrentDateTime().
private void CurrentDateTime() {
DateTime Thoigian = DateTime.Now;
txtTime.Text = Thoigian.ToLongTimeString(); txtDate.Text = Thoigian.ToShortDateString(); }
Hình 3.30: Xử lý Mã thẻ gửi đến có trong Cơ sở dữ liệu
Trƣờng hợp Mã thẻ gửi đến không giống Mã thẻ trong Cơ sở dữ liệu Khi đó phần mềm sẽ đƣa ra cảnh báo:
Hình 3.31: Cửa sổ cảnh báo lựa chọn xử lý mã thẻ mới
Câu lệnh xử lý nhƣ sau:
DialogResult Choice = MessageBox.Show("Mã thẻ không có trong CSDL, Bạn có muốn thêm Hồ sơ cho Mã thẻ này không?", "Xu ly Ma the
70
Cửa sổ Quản lý Hồ sơ sẽ xuất hiện và mã thẻ mới này đƣợc copy sang ô Mã thẻ nhờ câu lệnh: txtMathe.Text = docMathe.Text, cho phép ngƣời quản lý nhập thông tin cho mã thẻ mới này.
e. Các câu lệnh xử lý cho các tác vụ khác
Ngoài các chức năng đã nêu trên, phần mềm còn có một số tác vụ khác nhƣ: in form, xuất thông tin vào/ra ra file Excel.
In form giao diện
C# hỗ trợ các Toolbox giúp cho việc in ấn dễ dàng là printDialog và printDoc
Chức năng in form này cho phép ngƣời quản lý in ra thông tin cá nhân của ngƣời đƣợc lựa chọn trong cơ sở dữ liệu.
Xuất dữ liệu ra Excel
Với mục đích tính toán thời gian làm việc cho từng ngƣời trong ngày hoặc trong tháng. Phần mềm có thêm chức năng xuất dữ liệu vào/ra đã lƣu trong file “Thongtinvaora.mdb” ra file excel.
Các bƣớc thực hiện việc này nhƣ sau:
Bƣớc 1: Thêm các lớp hỗ trợ liên kết với Exel bằng cách Add reference “Microsoft Office 11.0 Object Library” vào chƣơng trình. (Đối với Office 2003)
Bƣớc 2: Tạo ứng dụng với Excel
Excel.ApplicationClassExcelApp= new Excel.ApplicationClass(); Bƣớc 3: Tạo một file Excel mới
// Tạo một WorkBook mới
ExcelApp.Application.Workbooks.Add(Type.Missing);
Bƣớc 4: Sao chép nội dung của bảng chứa thông tin vào ra sang file Excel nhờ các lệnh:
for (int i = 0; i < DGView1.Rows.Count; i++) {
DataGridViewRow row = DGView1.Rows[i]; for (int j = 0; j < row.Cells.Count; j++)
{ ExcelApp.Cells[i + 1, j + 1] = row.Cells[j]; } } Bƣớc 5: Lƣu wookbook ExcelApp.ActiveWorkbook.SaveCopyAs("Thongtinvaora.xls"); ExcelApp.ActiveWorkbook.Saved = true; Bƣớc 6: Giải phóng ứng dụng ExcelApp.Quit();
Kết quả file Thongtinbenhnhan.xls đƣợc xuất ra thƣ mục My Documents
72