Chương 5 Xây dựng các màn hình quản lý
5.10 Màn hình Thanh lý sách
Xây dựng màn hình theo hình sau:
STT Tên Control Loại Tiêu đề (Caption) 1 toolbar Toolbar
2 group1 Groupbox “Thông tin chung”
3 PhieuThanhLyList ListView
4 lblTongptl Label “Tổng số phiếu thanh lý”
5 lblTong Label Giá trị tổng số phiếu thanh lý 6 btnChiTietThanhLy Button “Chi tiết thanh lý”
7 group2 Groupbox “Thông tin chi tiết”
8 lblNgayThanhLy Label “Ngày thanh lý”
9 dtNgayThanhLy DateTimePicker
10 lblNhanVien Label “Nhân viên”
11 cbNhanVien ComboBox
Chương 5 - Xây dựng các màn hình quản lý
162 Lớp PhieuThanhLy_Form
Thuộc tính
Tên Lớp Ý nghĩa
ptl PhieuThanhLy Biến thành phần đảm nhận
việc xử lý thông tin Các hàm xử lý biến cố
Tên Điều kiện phát sinh Ý nghĩa
PhieuThanhLy_Form_Load Form load Hiển thị danh sách phiếu thanh lý và các thông tin liên quan
PTLList_SelectedIndexChanged Khi người dùng chọn 1 item khác trên listview
Hiển thị thông tin chi tiết của phiếu thanh lý được chọn
ToolBar1_ButtonClick Khi người dùng nhấn nút thêm, xóa, sửa hay soạn lại trên toolbar
Thực hiện các tác vụ tương ứng
btnChiTiet_Click Khi người dùng nhấn nút btnChiTietThanhLy
Hiển thị màn hình chi tiết phiếu thành lý
Phương thức
Tên Ý nghĩa
HienThiDanhSachNhanVien Nạp danh sách nhân viên lên cbNhanVien HienThiDanhSachPhieuThanhLy Hiển thị danh sách phiếu thanh lý lên listview HienThiThongTinChiTiet Hiển thị thông tin chi tiết của phiếu thanh lý KiemTraNhap Kiểm tra dũ liệu nhập có hợp lệ không
Trước hết, khi màn hình hiển thị, ta cần phải hiển thị cho người dùng danh sách các phiếu thanh lý. Do đó, ta sẽ viết biến cố xử lý cho sự kiện form load. Trong hàm xử lý sự kiện này, ta sẽ phải hiển thị 2 thông tin: danh sách nhân viên và danh sách phiếu thanh lý.
Private Sub PhieuThanhLy_Form_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
HienThiDanhSachNhanVien() HienThiDanhSachPhieuThanhLy() End Sub
Việc hiển thị do được thực hiện nhiều lần nên ta cài đặt chúng thành các hàm. Cụ thể các hàm như sau:
Private Sub HienThiDanhSachNhanVien() Dim i As Integer
Dim str As String Dim dt As DataTable
dt = ptl.LayDanhSachNhanVien For i = 0 To dt.Rows.Count - 1
str = CType(dt.Rows(i)("HoTenNhanVien"), String) cbNhanVien.Items.Add(str)
Next
If cbNhanVien.Items.Count > 0 Then cbNhanVien.SelectedIndex = 0
End If
End Sub
Lưu ý là việc đọc dữ liệu được ủy nhiệm cho lớp xử lý là lớp PhieuThanhLy chứ không thực hiện trực tiếp ở đây, vì đây là lớp giao diện, không đảm nhiệm các tác vụ xử lý. Tương tự cho các phương thức còn lại:
Private Sub HienThiDanhSachPhieuThanhLy() PTLList.Items.Clear()
Dim dt As DataTable Dim d As Date
dt = ptl.LayDanhSachPhieuThanhLy Dim i As Integer
Dim str As String
For i = 0 To dt.Rows.Count - 1 Dim lvi As ListViewItem
lvi = PTLList.Items.Add((i + 1).ToString()) 'Số thứ tự của d = dt.Rows(i)("NgayThanhLy")
str = d.Month.ToString + "/" + d.Day.ToString + "/" + d.Year.ToString
lvi.SubItems.Add(str)
str = dt.Rows(i)("HoTenNhanVien").ToString lvi.SubItems.Add(str)
If (i + 1) Mod 2 = 0 Then
PTLList.Items(i).BackColor = MainForm.ListRowColor End If
Next
'Hiển thị tổng số nhân viên
lbPTLNum.Text = dt.Rows.Count.ToString End Sub
Sau khi viết xong mã nguồn cho phần form load, chúng ta bắt đầu quan tâm đến các biến cố.
Khi người dùng click chọn một phiếu thanh lý trong listview, chúng ta sẽ hiển thị thông tin chi tiết của phiếu đó. Để làm được điều này, chúng ta viết hàm xử lý cho sự kiện
SelectedIndexChanged của listview.
Private Sub PTLList_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles PTLList.SelectedIndexChanged
If PTLList.SelectedIndices.Count > 0 Then
HienThiThongTinChiTiet(PTLList.SelectedIndices.Item(0)) End If
End Sub
Trong đó, hàm HienThiThongTinChiTiet sẽ làm công việc là lấy thông tin của phiếu được chọn đưa lên các textbox và combobox tương ứng. Cài đặt như sau:
Private Sub HienThiThongTinChiTiet(ByVal index As Integer) Dim dt As DataTable
dt = ptl.PhieuThanhLyInfo cbNhanVien.SelectedIndex =
cbNhanVien.FindString(dt.Rows(index)("HoTenNhanVien"))
Chương 5 - Xây dựng các màn hình quản lý
164
Dim f As New ChiTietPhieuThanhLy_Form(ptl)
Dim index As Integer = PTLList.SelectedIndices.Item(0) Dim dt As DataTable = ptl.PhieuThanhLyInfo
Dim d As Date = dt.Rows(index)("NgayThanhLy")
f.txtNhanVien.Text = dt.Rows(index)("HoTenNhanVien")
f.txtNgayTra.Text = d.Month.ToString + "/" + d.Day.ToString +
"/" + d.Year.ToString f.MaPhieuThanhLy =
ptl.PhieuThanhLyInfo.Rows(index)("MaPhieuThanhLy") f.ShowDialog()
End If End Sub
Tiếp theo, ta sẽ viết mã nguồn xử lý cho các tác vụ thêm, xóa, sửa phiếu thanh lý. Để làm việc này, ta viết hàm xử lý sự kiện click của các nút trên Toolbar. Trước hết ta viết hàm xử lý cho tác vụ thêm phiếu thanh lý.
Private Sub ToolBar1_ButtonClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ToolBarButtonClickEventArgs) Handles
ToolBar1.ButtonClick
Select Case ToolBar1.Buttons.IndexOf(e.Button) Case 0 'Them
If KiemTraNhap() = True Then
ptl.ThemPhieuThanhLy(dtNgayThanhLy.Value.ToString, cbNhanVien.SelectedIndex)
HienThiDanhSachPhieuThanhLy()
MessageBox.Show("Phiếu thanh lý đã được thêm thành công", "Thông báo", MessageBoxButtons.OK,
MessageBoxIcon.Information) End If
...
Khi thêm một phiếu thanh lý, cần phải kiểm tra thông tin nhập vào có hợp lệ không, việc này được thực hiện thông qua hàm KiemTraNhap. Nếu không tin nhập là không hợp lệ thì sẽ hiện thông báo cho người dùng. Sau khi đảm bào thông tin nhập là hợp lệ, chúng ta tiến hành thêm phiếu thanh lý này vào cơ sở dữ liệu nhờ biến thành phần ptl thuộc lớp PhieuThanhLy. Tiếp đó, do danh sách phiếu thanh lý đã thay đổi, ta tiến hành nạp lại dữ liệu để cập nhật lại danh sách phiếu thanh lý hiển thị trên màn hình. Sau cùng là hiện thị thông báo thêm thành công cho người dùng. Hàm KiemTraNhap được cài đặt như sau:
Private Function KiemTraNhap() As Boolean Return True
End Function
Tại thời điểm này vì chưa có ràng buộc nên hàm KiemTraNhap chỉ đơn giản như trên. Sau này nếu có xuất hiện ràng buộc, chúng ta chỉ việc thay đổi hàm này, phần còn lại của chương trình giữ nguyên.
Sau khi viết xong hàm cho sự kiện thêm, chúng ta tiếp tục viết hàm xử lý cho sự kiện xóa.
...
Case 1 'Xóa
If PTLList.SelectedIndices.Count > 0 Then
If MessageBox.Show("Bạn có chắc chắn là muốn xóa phiếu thanh lý này không ?", "Hỏi lại",
MessageBoxButtons.YesNo, MessageBoxIcon.Question) = DialogResult.Yes Then
ptl.XoaPhieuThanhLy(PTLList.SelectedIndices.Item(0)) 'Xóa phiếu mượn này ra khỏi list
PTLList.Items.Remove(PTLList.SelectedItems(0)) 'Thông báo xóa thành công
MessageBox.Show("Phiếu thanh lý đã được xóa.",
"Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information)
End If Else
MessageBox.Show("Bạn phải chọn 1 dòng trong danh sách trước", "Thông báo", MessageBoxButtons.OK,
MessageBoxIcon.Exclamation) End If
...
Đối với sư kiện xóa, chúng ta phải hỏi lại người dùng cho chắc chắn. Chỉ khi họ xác nhận lại là họ thực sự muốn xóa, chúng ta mới tiến hành xóa. Tương tự như thêm, việc xóa được thực hiện thông qua biến thành phần ptl thuộc lớp PhieuThanhLy, và sau khi xóa cũng hiển thị lại danh sách phiếu thanh lý. Vì ở đây không có ô nhập liệu nên không cần phải có hàm SoanLai như các màn hình khác.
Tiếp đến, chúng ta viết hàm xử lý cho tác vụ cập nhật phiếu thanh lý.
...
Case 2 'Cap Nhat
If PTLList.SelectedIndices.Count > 0 Then If KiemTraNhap() = True Then
ptl.CapNhatPhieuThanhLy(PTLList.SelectedIndices.Item (0), dtNgayThanhLy.Value.ToString,
cbNhanVien.SelectedIndex) HienThiDanhSachPhieuThanhLy() 'Thong bao cap nhat thanh cong
MessageBox.Show("Phiếu thanh lý đã được cập nhật thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information)
End If Else
MessageBox.Show("Bạn phải chọn 1 dòng trong danh sách trước", "Thông báo", MessageBoxButtons.OK,
MessageBoxIcon.Exclamation) End If
Tương tự như thêm phiếu thanh lý, khi tiến hành cập nhật, ta phải kiểm tra xem dữ liệu mới có hợp lệ không bằng hàm KiemTraNhap. Nếu dữ liệu không hợp lệ thì thông báo cho người dùng, còn nếu hợp lệ thì tiến hành cập nhật nhờ biến thành phần ptl, sau đó hiển thị lại danh sách phiếu thanh lý. Sau cùng là thông báo cho người dùng biết là việc cập nhật đã được tiến hành thành công.
Chương 5 - Xây dựng các màn hình quản lý
166 Lớp Phiếu thanh lý
Thuộc tính
Tên Lớp Ý nghĩa
db Database Giao tiếp CSDL
ptl_dt DataTable Danh sách phiếu thanh lý
nv_dt DataTable Danh sách nhân viên
ld_dt DataTable Danh sách lý do thanh lý
Phương thức
Tên Ý nghĩa
New Hàm tạo
LayDanhSachNhanVien Lấy danh sách nhân viên LayDanhSachPhieuThanhLy Lấy danh sách phiếu thanh lý LayDanhSachSach Lấy danh sách sách
LayDanhSachSachThanhLy Lấy danh sách sách thanh lý LayDanhSachLyDoThanhLy Lấy danh sách lý do thanh lý ThemPhieuThanhLy Thêm 1 phiếu thanh lý XoaPhieuThanhLy Xóa 1 phiếu thanh lý CapNhatPhieuThanhLy Cập nhật phiếu thanh lý
ThemSachThanhLy Thêm 1 quyển sách vào danh sách vào danh sách thanh lý XoaSachThanhLy Xóa 1 quyển sách ra khỏi danh sách thanh lý
5.10.3 New
Public Sub New()
db = New Database(MainForm.SvrName, MainForm.DbName, True, "", "") End Sub
5.10.4 LayDanhSachNhanVien
Public Function LayDanhSachNhanVien() As DataTable
'Chúng ta chỉ hiển thị những nhân viên thuộc bộ phận thủ kho
nv_dt = db.Execute("Select MaNhanVien, HoTenNhanVien from NHANVIEN nv, BOPHAN bp" + _
" where nv.MaBoPhan = bp.MaBoPhan and bp.TenBoPhan like N'%thủ%kho%'") Return nv_dt
End Function
5.10.5 LayDanhSachPhieuThanhLy
Public Function LayDanhSachPhieuThanhLy() As DataTable
ptl_dt = db.Execute("Select MaPhieuThanhLy, NgayThanhLy, HoTenNhanVien from PHIEUTHANHLY ptl, NHANVIEN nv where ptl.MaNhanVien =
nv.MaNhanVien") Return ptl_dt End Function
5.10.6 LayDanhSachSach
Public Function LayDanhSachSach() As DataTable
Dim dt As DataTable
'Lấy danh sách các quyển sách CHƯA bị thanh lý, tức là select những quyển sách trong bảng SACH mà không nằm trong bảng CHITIETPHIEUTHANHLY Dim str As String
str = "Select MaSach,TenSach,TenTheLoai,TacGia from SACH s,THELOAISACH tl " + _
"where s.MaTheLoai = tl.MaTheLoai and " + _
"s.MaSach not in (Select MaSach from CHITIETPHIEUTHANHLY) " + _
"order by s.TenSach"
dt = db.Execute(str) Return dt
End Function
5.10.7 LayDanhSachSachThanhLy
Public Function LayDanhSachSachThanhLy(ByVal MaPTL As Integer) As DataTable Dim dt As DataTable
Dim str As String
'Do chúng ta phải hiển thị những quyển sách được mượn nên chúng ta phải truy vấn thông tin chi tiết của chúng
str = "Select s.MaSach,s.TenSach,TenLyDo from CHITIETPHIEUTHANHLY cttl,SACH s,LYDOTHANHLY ld " + _
"where cttl.MaSach = s.MaSach and cttl.MaLyDo = ld.MaLyDo and " + _ "MaPhieuThanhLy = " + MaPTL.ToString
dt = db.Execute(str) Return dt
End Function
5.10.8 LayDanhSachLyDoThanhLy
Public Function LayDanhSachLyDoThanhLy() As DataTable
'Chúng ta chỉ show lên những nhân viên thuộc bộ phận thủ kho ld_dt = db.Execute("Select * from LYDOTHANHLY order by TenLyDo") Return ld_dt
End Function
5.10.9 ThemPhieuThanhLy Tham số:
Tên Kiểu / Lớp Ý nghĩa
ngaythanhly String Ngày thanh lý
index_nv Integer Số thứ tự nhân viên thanh lý Kết quả trả về: True/False
Mã nguồn:
Public Sub ThemPhieuThanhLy(ByVal ngaythanhly As String, ByVal index_nv As
Chương 5 - Xây dựng các màn hình quản lý
168
",'" + ngaythanhly + "'," +
nv_dt.Rows(index_nv)("MaNhanVien").ToString + ")"
db.ExecuteNonQuery(str) 'Cập nhật lại ptl_dt LayDanhSachPhieuThanhLy() End Sub
5.10.10 XoaPhieuThanhLy Tham số:
Tên Kiểu / Lớp Ý nghĩa
index Integer Số thứ tự của phiếu thanh lý cần xóa Mã nguồn:
Public Sub XoaPhieuThanhLy(ByVal index As Integer) Dim str As String
str = "Delete from PHIEUTHANHLY where MaPhieuThanhLy = " + ptl_dt.Rows(index)("MaPhieuThanhLy").ToString
db.ExecuteNonQuery(str) 'Cập nhật lại ptl_dt
ptl_dt.Rows.RemoveAt(index) End Sub
5.10.11 CapNhatPhieuThanhLy Tham số:
Tên Kiểu / Lớp Ý nghĩa
index Integer Số thứ tự của phiếu thanh lý cần cập nhật
ngaythanhly String Ngày thanh lý
index_nv Integer Số thứ tự nhân viên thanh lý Kết quả trả về: True/False
Mã nguồn:
Public Sub CapNhatPhieuThanhLy(ByVal index_ptl As Integer, ByVal ngaythanhly As String, ByVal index_nv As Integer)
Dim str As String
str = "Update PHIEUTHANHLY set NgayThanhLy = '" + ngaythanhly.ToString + _
"',MaNhanVien = " + nv_dt.Rows(index_nv)("MaNhanVien").ToString + _
" where MaPhieuThanhLy = " +
ptl_dt.Rows(index_ptl)("MaPhieuThanhLy").ToString db.ExecuteNonQuery(str)
End Sub
5.10.12 ThemSachThanhLy
Public Sub ThemSachThanhLy(ByVal MaPhieuThanhLy As String, ByVal MaSach As String, ByVal index_ld As Integer)
Dim str As String
str = "Insert into CHITIETPHIEUTHANHLY values(" + MaPhieuThanhLy + _
"," + MaSach + "," + ld_dt.Rows(index_ld)("MaLyDo").ToString + ")"
db.ExecuteNonQuery(str)
End Sub
5.10.13 XoaSachThanhLy
Public Sub XoaSachThanhLy(ByVal MaPhieuThanhLy As String, ByVal MaSach As String)
Dim str As String
str = "Delete from CHITIETPHIEUTHANHLY where MaPhieuThanhLy = " + MaPhieuThanhLy + _
" and MaSach = " + MaSach db.ExecuteNonQuery(str) End Sub