software engineering exercises

55
7/24/2019 Software Engineering Exercises http://slidepdf.com/reader/full/software-engineering-exercises 1/55 Bài tập thực hành Nhập Môn Công Nghệ Phần Mềm 1 NỘI DUNG THỰC HÀNH Ngôn ngữ : C#.NET Môi trường lập trình: Visual studio .NET Hệ quản trị CSDL: SQL Server. Đánh giá:  Hình thức:  Nộp đồ án (báo cáo + source code của phần mềm) + thi vấn đáp trực tiếp trên máy dựa trên các đề tài mà giáo viên lý thuyết đề nghị hoặc các em tự đề xuất.  Tiêu chí: Phần mềm của các bạn phải thoả các tính chất sau:  1. Tính đúng đắn 2. Tính tiện dụng 3. Tính hiệu quả 4.  Tính tiến hóa 5. Tính bảo mật Ni dung: 1. Thiết kế dữ liệu: Tạo bảng, khóa, quan hệ.  2. Thiết kế giao diện a. Màn hình chính + thực đơn  b. Màn hình đăng nhập, thay đổi qui định c.  Màn hình nhập (Danh mục, 1 -  Nhiều và Nhiều - nhiều)  d. Màn hình tra cứu 3. Kết nối CSDL 4. Debug Chương trình. 5. Cài đặt các hàm xử lý a. Thêm, Xóa, Cập nhật và Lấy dữ liệu.   b. Tính toán theo nghiệp vụ bài toán. 6.  Tạo report (Cr ystal report) 7. Tạo help 8. Đóng gói chương trình. Thời gian thực hành: - Trong 2 tuần đầu giáo viên hướng dẫn sinh viên làm bài tập phần căn bản.  - Trong 7 tuần tiếp theo giáo viên hướng dẫn sinh viên xây dựng phần mềm quản lý thư viện (các phần tương tự sinh viên tự thực hiện). -  Tuần cuối cùng sinh viên nạp bài và giáo viên hỏi vấn đáp trực tiếp.  

Upload: zig1h10lo

Post on 20-Feb-2018

217 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Software Engineering Exercises

7/24/2019 Software Engineering Exercises

http://slidepdf.com/reader/full/software-engineering-exercises 1/55

Bài tập thực hành Nhập Môn Công Nghệ Phần Mềm 

1

NỘI DUNG THỰC HÀNH 

Ngôn ngữ : C#.NET

Môi trường lập trình: Visual studio .NET

Hệ quản trị CSDL: SQL Server.

Đánh giá:

 Hình thức:  Nộp đồ án (báo cáo + source code của phần mềm) + thi vấn đáp trực tiếp trên máy

dựa trên các đề tài mà giáo viên lý thuyết đề nghị hoặc các em tự đề xuất. 

Tiêu chí: Phần mềm của các bạn phải thoả các tính chất sau: 

1.  Tính đúng đắn

2.  Tính tiện dụng

3.  Tính hiệu quả

4. 

Tính tiến hóa

5.  Tính bảo mật

Nội dung:

1.  Thiết kế dữ liệu: Tạo bảng, khóa, quan hệ. 

2.  Thiết kế giao diện 

a.  Màn hình chính + thực đơn 

 b. 

Màn hình đăng nhập, thay đổi qui định

c. 

Màn hình nhập (Danh mục, 1- Nhiều và Nhiều - nhiều) 

d.  Màn hình tra cứu 

3.  Kết nối CSDL 

4.  Debug Chương trình. 

5.  Cài đặt các hàm xử lý

a. 

Thêm, Xóa, Cập nhật và Lấy dữ liệu. 

 b.  Tính toán theo nghiệp vụ bài toán. 

6. 

Tạo report (Cr ystal report)

7.  Tạo help 

8.  Đóng gói chương trình. 

Thời gian thực hành: 

Trong 2 tuần đầu giáo viên hướng dẫn sinh viên làm bài tập phần căn bản. 

-  Trong 7 tuần tiếp theo giáo viên hướng dẫn sinh viên xây dựng phần mềm quản lý thư viện

(các phần tương tự sinh viên tự thực hiện). 

Tuần cuối cùng sinh viên nạp bài và giáo viên hỏi vấn đáp trực tiếp. 

Page 2: Software Engineering Exercises

7/24/2019 Software Engineering Exercises

http://slidepdf.com/reader/full/software-engineering-exercises 2/55

Bài tập thực hành Nhập Môn Công Nghệ Phần Mềm 

2

Phần 1. bài tập căn bản  Bài 1. Viết chương trình theo yêu cầu sau: 

Thực hiện các yêu cầu sau: - Khi nhấn nút “Tính”, chương trình sẽ giải phương trình bậc 2, và hiển thị kết qủa trong textboxkết quả X1 hoặc X2. - Khi nhấn nút “Bỏ qua” các textbox sẽ được xóa trắng, con trỏ sẽ chuyển về textbox A. - Khi nhấn nút “Thoát” chương trình sẽ kết thúc. 

 Bài 2. Xây dựng chương trình thao tác với Listbox như sau :

Yêu cầu:-  Chỉ cho nhập số vào textbox Nhập số 

-  Khi nhập dữ liệu vào textbox Nhập số và nhấn Enter(hoặc click vào Cập Nhật) thìsố mới nhập này được thêm vào Listbox đồng thời dữ liệu trong textbox bị xóa vàfocus được chuyển về textbox 

Khi nhấn vào các phím chức năng, yêu cầu sẽ được thực hiện trên listbox 

Page 3: Software Engineering Exercises

7/24/2019 Software Engineering Exercises

http://slidepdf.com/reader/full/software-engineering-exercises 3/55

Bài tập thực hành Nhập Môn Công Nghệ Phần Mềm 

3

*  Bài 3 (Bài tập làm thêm) :  Xây dựng chương trình nhập danh sách sinh viên theo yêu cầu: 

Yêu cầu:-   Nút > dùng để di chuyển các mục(còn gọi là item) được chọn từ listbox trái qua

listbox phải và ngược lại cho < 

-   Nút >> dùng để di chuyển tất cả các mục(kể cả không được chọn) từ listbox tráiqua listbox phải và ngược lại cho << 

-   Nút Xóa dùng để xóa nhưng item được chọn trên textbox trái 

 Bài 4  . Xây dựng chương trình thao tác với mảng  

Yêu cầu: -  2 textbox để hiển thị mảng và kết quả, ko được nhập giá trị trực tiếp  

Page 4: Software Engineering Exercises

7/24/2019 Software Engineering Exercises

http://slidepdf.com/reader/full/software-engineering-exercises 4/55

Bài tập thực hành Nhập Môn Công Nghệ Phần Mềm 

4

*  Bài 5 (Bài tập làm thêm). Xây dựng chương trình xử lý chuỗi sau: 

Yêu cầu:-  Khi vừa mở form chỉ có nút Thoát là sử dụng được, textbox nhập dữ liệu nhận

focus

-  Khi textbox nhập dữ liệu vừa được nhập thì các nút sáng lên, đồng thời nếu xóa hếtdữ liệu trong textbox nhập thì các nút cũng mờ đi ngoại trừ nút Thoát=> viết trongsự kiện change của text box 

-  Khi các nút chức năng được nhấn thì kết quả sẽ hiển thị bên textbox Kết quả 

Hướng dẫn: Tìm kiếm : Instr(vị trí bắt đầu tìm, chuỗi chứa, chuỗi cần tìm, phân biệt hoa thường hay ko) Thay thế : Replace(chuỗi chứa, chuỗi tìm, chuỗi thay thế, vị trí bắt đầu, số lần tìm và thay thế,

 phân biệt hoa thường) : Trả về chuổi mới đã được thay thế  

Page 5: Software Engineering Exercises

7/24/2019 Software Engineering Exercises

http://slidepdf.com/reader/full/software-engineering-exercises 5/55

Bài tập thực hành Nhập Môn Công Nghệ Phần Mềm 

5

 Bài 6  : Thao tác với listview

STT Tên Control Loại Tên hàm xử lý 

1 lsvNhanVien ListView lsvNhanVien_SelectedIndexChanged

2 txtHoTen TextBox

3 dtpNgaySinh DateTimePicker

4 txtDiaChi TextBox

5 txtDienThoai TextBox

7 btnThem Button btnThem_Click

8 btnXoa Button btnXoa_Click

9 btnLuu Button btnLuu_Click

10 btnSua Button btnSua_Click

11 btnHuy Button btnHuy_Click

12 btnThoat Form btnThoat_Click

13 frmNhanVien Form frmNhanVien_Load

Yêu cầu : Nhập thông tin vào phần “thông tin chi tiết”, khi nhấn các nút lệnh sẽ thực hiện như sau: 

Page 6: Software Engineering Exercises

7/24/2019 Software Engineering Exercises

http://slidepdf.com/reader/full/software-engineering-exercises 6/55

Bài tập thực hành Nhập Môn Công Nghệ Phần Mềm 

6

1.   Nút Thêm : Thêm các thông tin vào listview 

Chú ý : kiểm tra thông tin họ tên nhân viên không được rỗng, nếu rỗng thì không cho thêm 

2.   Nút Xóa : Xóa 1 dòng trên listview (chú ý nếu người dùng chưa chọn 1 dòng trênlistview thì yêu cầu người dùng phải chọn rồi mới xóa) 

3. 

 Nút Sửa : Sửa 1 dòng trên listview 

4.  Thoát : thoát khỏi chương trình 

Khi chọn 1 dòng trên listview thì nội dung của dòng được chọn sẽ được thể hiện trên các ô

“Thông tin chi tiết” Chú ý : kiểm tra thông tin họ tên nhân viên không được rỗng, nếu rỗng thì không cho thêm 

Hướng dẫn :Bấm vào để hiện ra menu tùy chỉnh của listview, chọn Edit Columns 

Thêm các tiêu đề cột cho listview 

1. 

Thiết lập các tham số cho listview 

a. 

FullRowSelect = true;//cho phép chọn 1 dòng 

 b.  View = View.Details;//cho phép hiển thị thông tin chi tiết, bao gồm cáctiêu đề 

c. 

Columns[“Tên Cột”].AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent); //cho phép tự động resize cột khi nội dung dài 

2.  Thêm vào 1 dòng cho listview : sử dụng ListViewItem

ListViewItem lvi = lsvNhanVien.Items.Add(txtHoten.Text);lvi.SubItems.Add(dtpNgaySinh.Value.ToShortDateString());

Page 7: Software Engineering Exercises

7/24/2019 Software Engineering Exercises

http://slidepdf.com/reader/full/software-engineering-exercises 7/55

Bài tập thực hành Nhập Môn Công Nghệ Phần Mềm 

7

lvi.SubItems.Add(txtDienThoai.Text);lvi.SubItems.Add(txtDiaChi.Text);  

3.  Chọn 1 dòng trên listview : sử dụng sự kiện lsvNhanVien_SelectedIndexChanged  Chú ý : dùng 1 biến index để lưu lại dòng đang chọn 

if (lsvNhanVien.SelectedItems.Count > 0)//kiểm tra listview đã có dòngđược chọn hay chưa? 

{txtHoten.Text = lsvNhanVien.SelectedItems[0].SubItems[0].Text;

dtpNgaySinh.Text = lsvNhanVien.SelectedItems[0].SubItems[1].Text;txtDienThoai.Text = lsvNhanVien.SelectedItems[0].SubItems[2].Text;txtDiaChi.Text = lsvNhanVien.SelectedItems[0].SubItems[3].Text;

4.   Nhấn nút xóa : Dùng phương thức remove hoặc removeAt của listview if (lsvNhanVien.SelectedItems.Count > 0)//kiểm tra listview đã có dòng được

chọn hay chưa? {

lsvNhanVien.SelectedItems[0].Remove();} 

5.   Nhấn nút sửa : Cập nhật lại thông tin cho listview if (lsvNhanVien.SelectedItems.Count > 0)

{

lsvNhanVien.SelectedItems[0].SubItems[0].Text = txtHoten.Text;lsvNhanVien.SelectedItems[0].SubItems[1].Text =

dtpNgaySinh.Value.ToShortDateString();lsvNhanVien.SelectedItems[0].SubItems[2].Text = txtDienThoai.Text;lsvNhanVien.SelectedItems[0].SubItems[3].Text = txtDiaChi.Text;

}

Page 8: Software Engineering Exercises

7/24/2019 Software Engineering Exercises

http://slidepdf.com/reader/full/software-engineering-exercises 8/55

Bài tập thực hành Nhập Môn Công Nghệ Phần Mềm 

8

Phần 2. LÀM VIỆC VỚI CƠ SỞ DỮ LIỆU 

 BÀI 1. LÀM VIỆC VỚI MICROSOFT SQL SERVER 2005 (2008)

  Lưu ý:

Để cài đặt SQL Server 2005 chạy tr ên HĐH Window XP các bạn mua version SQLServer 2005 Developer Edition hoặc sử dụng version SQL Server 2005 Express

Edition k èm theo đĩ a cài đặt Visual Studio 2005.

Để có thể đăng nhậ p vào SQL Server bằng 2 cách Windows Authentication và SQL

Server Authentication các bạn phải chọn chế độ Mixed Mode khi cài đặt.

  Các bạn xem file “Sams Teach Yourself Microsoft® SQL Server™ 2005 Express in 24

Hours.chm” để học cách cài đặt cũng như làm việc vớ i SQL Server 2005.

1.  Tạo Database

  Mở “SQL Server Management Studio” & K ết nối SQL Server: Khi cài đặt các bạn chọn

Mixed Mode thì bây giờ các bạn có thể “Connect to Server” bằng 2 cách: WindowsAuthentication và SQL Server Authentication. Trong bài tập, chúng ta sẽ sử dụng chế độ

Windows Authentication để dễ dàng thực hiện, tuy nhiên trong thực tế, các bạn phải luôn

luôn chọn SQL Server Authentication để tăng độ bảo mật cho Phần mềm.

  Database có sơ đồ như sau : 

Page 9: Software Engineering Exercises

7/24/2019 Software Engineering Exercises

http://slidepdf.com/reader/full/software-engineering-exercises 9/55

Bài tập thực hành Nhập Môn Công Nghệ Phần Mềm 

9

Lệnh SQL để tạo Database CREATE DATABASE QLTHUVIENUSE QLTHUVIENGO--Tạo bảng Tham số CREATE TABLE [THAMSO](

[TenThamSo] [nvarchar](40) NOT NULL,[GiaTri] [int] NULL,

CONSTRAINT [PK_THAMSO] PRIMARY KEY (TenThamSo))

--Tạo bảng Bằng cấp CREATE TABLE [BANGCAP](

[MaBangCap] int Identity(1,1),[TenBangCap] [nvarchar](40) NULL,CONSTRAINT [PK_BANGCAP] PRIMARY KEY (MaBangCap))--Tạo bảng Nhân viên CREATE TABLE [NHANVIEN](

[MaNhanVien] int Identity(1,1),[HoTenNhanVien] [nvarchar](50) NULL,[NgaySinh] [datetime] NULL,[DiaChi] [nvarchar](50) NULL,[DienThoai] [nvarchar](15) NULL,[MaBangCap] [int] NULL,

CONSTRAINT [PK_NHANVIEN] PRIMARY KEY (MaNhanVien))--Tạo bảng Độc giả 

Page 10: Software Engineering Exercises

7/24/2019 Software Engineering Exercises

http://slidepdf.com/reader/full/software-engineering-exercises 10/55

Bài tập thực hành Nhập Môn Công Nghệ Phần Mềm 

10

CREATE TABLE [DOCGIA]([MaDocGia] int Identity(1,1),[HoTenDocGia] [nvarchar](40) NULL,[NgaySinh] [datetime] NULL,[DiaChi] [nvarchar](50) NULL,[Email] [nvarchar](30) NULL,[NgayLapThe] [datetime] NULL,[NgayHetHan] [datetime] NULL,[TienNo] [float] NULL,

CONSTRAINT [PK_DOCGIA_1] PRIMARY KEY (MaDocGia)) --Tạo bảng Phiếu thu tiền CREATE TABLE [PHIEUTHUTIEN](

[MaPhieuThuTien] int Identity(1,1),[SoTienNo] [float] NULL,[SoTienThu] [float] NULL,[MaDocGia] [int] NULL,[MaNhanVien] [int] NULL,

CONSTRAINT [PK_PHIEUTHUTIEN] PRIMARY KEY (MaPhieuThuTien))--Tạo bảng Sách CREATE TABLE [SACH](

[MaSach] int Identity(1,1),[TenSach] [nvarchar](40) NULL,[TacGia] [nvarchar](30) NULL,[NamXuatBan] [int] NULL,[NhaXuatBan] [nvarchar](40) NULL,[TriGia] [float] NULL,[NgayNhap] [datetime] NULL,

CONSTRAINT [PK_SACH] PRIMARY KEY (MaSach))--Tạo bảng Phiếu mượn sách CREATE TABLE [PHIEUMUONSACH](

[MaPhieuMuon] int Identity(1,1),[NgayMuon] [datetime] NOT NULL,

[MaDocGia] [int] NULL,CONSTRAINT [PK_PHIEUMUONSACH] PRIMARY KEY (MaPhieuMuon))--Tạo bảng Chi tiết phiếu mượn CREATE TABLE [CHITIETPHIEUMUON](

[MaSach] [int] NOT NULL,[MaPhieuMuon] [int] NOT NULL,

CONSTRAINT [PK_CHITIETPHIEUMUON] PRIMARY KEY (MaSach,MaPhieuMuon))

--Tạo khoá ngoại ALTER TABLE [NHANVIEN] WITH NOCHECK ADD  CONSTRAINT [FK_NHANVIEN_BANGCAP] FOREIGN KEY([MaBangCap])

REFERENCES [BANGCAP] ([MaBangCap])ON UPDATE CASCADEON DELETE CASCADEGOALTER TABLE [NHANVIEN] CHECK CONSTRAINT [FK_NHANVIEN_BANGCAP]GOALTER TABLE [PHIEUTHUTIEN] WITH CHECK ADD  CONSTRAINT [FK_PHIEUTHUTIEN_DOCGIA]FOREIGN KEY([MaDocGia])REFERENCES [DOCGIA] ([MaDocGia])GOALTER TABLE [PHIEUTHUTIEN] CHECK CONSTRAINT [FK_PHIEUTHUTIEN_DOCGIA]GOALTER TABLE [PHIEUTHUTIEN] WITH CHECK ADD  CONSTRAINT [FK_PHIEUTHUTIEN_NHANVIEN]

FOREIGN KEY([MaNhanVien])REFERENCES [NHANVIEN] ([MaNhanVien])

Page 11: Software Engineering Exercises

7/24/2019 Software Engineering Exercises

http://slidepdf.com/reader/full/software-engineering-exercises 11/55

Bài tập thực hành Nhập Môn Công Nghệ Phần Mềm 

11

ON UPDATE CASCADEON DELETE CASCADEGOALTER TABLE [PHIEUTHUTIEN] CHECK CONSTRAINT [FK_PHIEUTHUTIEN_NHANVIEN]GOALTER TABLE [PHIEUMUONSACH] WITH CHECK ADD  CONSTRAINT [FK_PHIEUMUONSACH_DOCGIA]FOREIGN KEY([MaDocGia])REFERENCES [DOCGIA] ([MaDocGia])ON UPDATE CASCADEON DELETE CASCADEGOALTER TABLE [PHIEUMUONSACH] CHECK CONSTRAINT [FK_PHIEUMUONSACH_DOCGIA]GOALTER TABLE [CHITIETPHIEUMUON] WITH CHECK ADD  CONSTRAINT [FK_CHITIETPHIEUMUON_PHIEUMUONSACH] FOREIGN KEY([MaPhieuMuon])REFERENCES [PHIEUMUONSACH] ([MaPhieuMuon])GOALTER TABLE [CHITIETPHIEUMUON] CHECK CONSTRAINT [FK_CHITIETPHIEUMUON_PHIEUMUONSACH]GOALTER TABLE [CHITIETPHIEUMUON] WITH CHECK ADD  CONSTRAINT [FK_CHITIETPHIEUMUON_SACH] FOREIGN KEY([MaSach])REFERENCES [SACH] ([MaSach])ON UPDATE CASCADEON DELETE CASCADEGOALTER TABLE [CHITIETPHIEUMUON] CHECK CONSTRAINT [FK_CHITIETPHIEUMUON_SACH]

2.  Nhập dữ liệu cho các bảng:

a.  Cách 1: Thự c hiện câu lệnh Insert

insert into BANGCAP values(N'TIẾN SĨ')insert into BANGCAP values(N'THẠC SĨ')insert into BANGCAP values(N'ÐẠI HỌC')insert into BANGCAP values(N'CAO ÐẲNG')insert into BANGCAP values(N'TRUNG CẤP')

insert into NHANVIEN values(N'PHẠM ĐÀO MINH VŨ','01/24/1980',N'163/30 ThànhThái F.14 Q.10 TPHCM','0905646162',1)insert into NHANVIEN values(N'NGUYỄN MINH THÀNH','04/05/1983',N'41/4 CALMETTEQ1 TPHCM','0908373612',2)insert into NHANVIEN values(N'NGUYỄN HÀ MY','04/13/1985',N'178 NAM KỲ KHỞINGHĨA Q4 TPHCM','0908783274',3)

insert into DOCGIA values(N'NGUYỄN HOÀNG MINH'

,'02/23/1990',N'41/4 CALMETTEQ1 TPHCM',N'[email protected]','12/30/2000','12/30/2012',0)insert into DOCGIA values(N'TRẦN VÃN CHÂU','08/29/1992',N'TRẦN HÝNG ÐẠO Q1TPHCM',N'[email protected]','11/22/2001','11/22/2013',0)

insert into SACH values(N'NHAP MON CNPM',N'PHẠM ÐÀO MINH VŨ',2007,N'NXB THỐNGKÊ',70000,'12/18/2008')insert into SACH values(N'KỸ THUẬT LẬP TRÌNH',N'TRẦN MINH THÁI',2005,N'NXBGIÁO DỤC',50000,'02/12/2006')insert into SACH values(N'CÔNG NGHỆ WEB',N'PHẠM ÐÀO MINH VŨ',2009,N'NXBTRẺ',90000,'12/01/2009')

  Làm tương tự cho các bảng còn lại dựa theo file QLThuVien.mdb đính kèm. 

Page 12: Software Engineering Exercises

7/24/2019 Software Engineering Exercises

http://slidepdf.com/reader/full/software-engineering-exercises 12/55

Bài tập thực hành Nhập Môn Công Nghệ Phần Mềm 

12

 

Chú ý : Chúng ta luôn luôn sử dụng lệnh để tạo Database và Dữ liệu phòng khi có

vấn đề thì ta sẽ nhanh chóng tạo dựng lại được 

b.  Cách 2:

  Tạo database QLThuVien mới (rỗng). 

 

Right click lên database ThuVien chọn Task\Import Data… 

 

Chọn Data Source, File name và click Next.

  Chọn Destination, Server name (nếu bạn dùng máy local có thể đánh vào dấu „.‟)

Connect bằng Windows hay SQL Server Authentication là tuỳ bạn và click Next.

Page 13: Software Engineering Exercises

7/24/2019 Software Engineering Exercises

http://slidepdf.com/reader/full/software-engineering-exercises 13/55

Bài tập thực hành Nhập Môn Công Nghệ Phần Mềm 

13

 

Chọn Copy data from…click Next.

 

Chọn Select All…và click Next.

  Click Next, Finish.

Page 14: Software Engineering Exercises

7/24/2019 Software Engineering Exercises

http://slidepdf.com/reader/full/software-engineering-exercises 14/55

Bài tập thực hành Nhập Môn Công Nghệ Phần Mềm 

14

 

K ết quả như sau:

3.  Backup & Restore Database:

Việc mang 1 database từ máy này sang máy khác rất thường xuyên xảy ra (ví dụ: chép

 bài từ trường về nhà và chép bài từ nhà lên trường,…). Có 2 cách để làm việc này: 

1.  Attach database:

a.  Chép 2 file :

C:\Program files\Microsoft SQL Server\MSSQL.1\Data\QLThuVien.mdf

C:\Program files\Microsoft SQL Server\MSSQL.1\Data\QLThuVien_log.ldf

 b. 

Attach 2 file trên vào SQL Server khác (máy khác). 

2.  Backup & Restore

  Backup:

o  Right click lên database QLThuVien cần backup, chọn Task\Back Up… 

Page 15: Software Engineering Exercises

7/24/2019 Software Engineering Exercises

http://slidepdf.com/reader/full/software-engineering-exercises 15/55

Bài tập thực hành Nhập Môn Công Nghệ Phần Mềm 

15

o  SQL Server sẽ mặc định backup database thư viện vào file ThuVien.bak theo

đườ ng dẫn mặc định sau: C:\Program files\Microsoft SQL

Server\MSSQL.1\Backup\QLThuVien.bak

 Nhấn Ok để backup, sau đó ché p file ThuVien.bak sang máy mớ i (SQL Server

khác) để Restore.

Trong trườ ng hợ  p muốn back up với 1 đườ ng dẫn khác thì remove đườ ng dẫn

tr ên và Add lại đườ ng dẫn mớ i muốn back up đến.

  Restore:

o  Đầu tiên tạo database QLThuVien trong SQL Management Studio

Right click lên database vừa tạo, chọn Task\Restore\Database

Page 16: Software Engineering Exercises

7/24/2019 Software Engineering Exercises

http://slidepdf.com/reader/full/software-engineering-exercises 16/55

Bài tập thực hành Nhập Môn Công Nghệ Phần Mềm 

16

o  Chọn From device chỉ đến file QLThuVien.bak

Page 17: Software Engineering Exercises

7/24/2019 Software Engineering Exercises

http://slidepdf.com/reader/full/software-engineering-exercises 17/55

Bài tập thực hành Nhập Môn Công Nghệ Phần Mềm 

17

Page 18: Software Engineering Exercises

7/24/2019 Software Engineering Exercises

http://slidepdf.com/reader/full/software-engineering-exercises 18/55

Bài tập thực hành Nhập Môn Công Nghệ Phần Mềm 

18

 Bài 2 . GIAO TIẾP CƠ SỞ DỮ LIỆU  

 Bài 2.1. Giao tiếp CSDL với mô hình 1 lớp 

Để load thông tin của nhân viên từ table NHANVIEN cũng như là thêm, cập nhật, xóa,..thì ta cần thực hiện như sau :

public partial class frmNhanVien : Form

SqlConnection sqlConn;//khai báo biến connection SqlDataAdapter da; //khai báo biến dataAdapter DataSet ds = new DataSet();//khai báo 1 dataset public string srvName = "."; //chỉ định tên serverpublic string dbName = "QLTHUVIEN";//chỉ định tên CSDL 

void KetnoiCSDL()//thực hiện kết nối bằng chuỗi kết nối {

string connStr = "Data source=" + srvName + ";database=" + dbName +";Integrated Security = True";

sqlConn = new SqlConnection(connStr);}

DataTable layDanhSachNhanVien()//lấy danh sách nhân viên {

string sql = "Select * from NhanVien";da = new SqlDataAdapter(sql, sqlConn);da.Fill(ds);return ds.Tables[0];

}

Page 19: Software Engineering Exercises

7/24/2019 Software Engineering Exercises

http://slidepdf.com/reader/full/software-engineering-exercises 19/55

Bài tập thực hành Nhập Môn Công Nghệ Phần Mềm 

19

void LoadListview(){

lsvNhanVien.FullRowSelect = true;//cho phép chọn 1 dòng lsvNhanVien.View = View.Details;//cho phép hiển thị thông tin chi

tiết, bao gồm các tiêu đề DataTable dt = layDanhSachNhanVien();for (int i = 0; i < dt.Rows.Count; i++){

ListViewItem lvi =lsvNhanVien.Items.Add(dt.Rows[i][ "Hotennhanvien"].ToString());//dòng thứ i, têncột là nhân viên

lvi.SubItems.Add(dt.Rows[i][2].ToString()); //dùng chỉ số cột :dòng thứ i,cột thứ 1 

lvi.SubItems.Add(dt.Rows[i][4].ToString());lvi.SubItems.Add(dt.Rows[i][3].ToString());

}

}

private void btnThem_Click(object sender, EventArgs e){

string sql = string.Format("insert into NhanVienvalues({0},{1},{2},{3},{4},{5})" , txtHoten.Text,dtpNgaySinh.Value.ToShortDateString, txtDiaChi.Text, txtDienThoai.Text, 1);

SqlCommand cmd = new SqlCommand(sql, sqlConn);cmd.ExecuteNonQuery();

…. 

Qua đây, chúng ta thấy rằng khi dùng mô hình 1 lớp kết nối CSDL thì không có sự phân 

loại trong khi cài đặt. Code xử lý lưu trữ sql, code xử lý nghiệp vụ và code xử lý thểhiện nằm chung với nhau, làm chương trình rất khó quản lý. 

Để khắc phục các nhược điểm trên, chúng ta chuyển sang mô hình 3 lớp. Chúng ta sẽthực hiện ở phần kế tiếp. 

Page 20: Software Engineering Exercises

7/24/2019 Software Engineering Exercises

http://slidepdf.com/reader/full/software-engineering-exercises 20/55

Bài tập thực hành Nhập Môn Công Nghệ Phần Mềm 

20

 Bài 3.1. Tạo Form MDI (màn hình quản lý chính) 

1.  Tạo màn hình chính: 

  Có thể thực hiện theo 2 cách sau:  

o  Từ menu, chọn project  Add Windows Form… 

Right-Click project thư viện (trong Solution Explorer), chọn Add  Windows Form.

  Chọn Templates: MDIParent và đặt tên form là frmMDI.cs 

2.  Thiết ế giao diện cho màn hình chính: 

 

Kéo thả control Panel vào frmMDI. 

Page 21: Software Engineering Exercises

7/24/2019 Software Engineering Exercises

http://slidepdf.com/reader/full/software-engineering-exercises 21/55

Bài tập thực hành Nhập Môn Công Nghệ Phần Mềm 

21

  Kéo thả control Panel vào frmMDI và đặt tên là panelMenu  

  Chọn Left cho thuộc tính Dock của panelMenu. 

  Kết quả 

  Kéo thả control GroupBox vào frmMDI và đặt tên (Name) là groupBoxDanhMuc và text là

Danh mục. 

Page 22: Software Engineering Exercises

7/24/2019 Software Engineering Exercises

http://slidepdf.com/reader/full/software-engineering-exercises 22/55

Bài tập thực hành Nhập Môn Công Nghệ Phần Mềm 

22

  Kéo thả control Button vào groupBoxDanhMuc và đặt tên (Name) là btnBangCap và text

là Bằng cấp. 

  Tùy chỉnh cho Menu: 

Chỉ cần double click lên các menu để thay đổi thông tin, hoặc gở bỏ menustrip củ , kéo thả

vào 1 menuStrip mới là được.

 

Về thanh công cụ nằm phía dưới thì tự chọn 

  Làm tương tự cho các groupbox và các button còn lại như sau: 

Page 23: Software Engineering Exercises

7/24/2019 Software Engineering Exercises

http://slidepdf.com/reader/full/software-engineering-exercises 23/55

Bài tập thực hành Nhập Môn Công Nghệ Phần Mềm 

23

   Như vậy ta đã có được phần thiết cho màn hình chính. Bước tiếp theo, ta sẽ viết hàm xử lý

sự kiện cho các nút chức năng. Để viết hàm xử lý cho sự kiện click của Button, ta chỉ cần

double click lên button, hay chọn sự kiện trong danh sách sự kiện: 

  Thêm oạn code sau vào phần hai báo thuộc tính ca frmMDI: 

public partial class frmMDI : Form{

public static string svrName = ".";//Khai báo tên sqlserver public static string dbName = "QLThuVien"; // khai báo tên database public static bool intergratedMode = true; // chế độ bảo mật 

public static string userName = ""; //khai báo khi intergratedMode=false public static string passWord = "";

... 

 

Từ frmMDI (form chính), muốn gọi đến các form con, ta dùng phương thức Show(). Ví dụ

khi ta muốn gọi đến Form frmNhanVien để hiển thị: 

private void btnTiepNhanNV_Click(object sender, EventArgs e){

frmNhanVien frm = new frmNhanVien();frm.MdiParent = this;frm.Show();

}

Page 24: Software Engineering Exercises

7/24/2019 Software Engineering Exercises

http://slidepdf.com/reader/full/software-engineering-exercises 24/55

Bài tập thực hành Nhập Môn Công Nghệ Phần Mềm 

24

 Bài 3.2. XÂY DỰNG MÔ HÌNH 3 LỚP GIAO TIẾP CSDL 

Ta xây dựng 3 lớp như sau cho NHANVIEN:

1.  Lớp chuyên xử lý thao tác trên CSDL : Database.cs

2. 

Lớp xử lý nghiệp vụ : NhanVien.cs 

3. 

Lớp xử lý giao diện : frmNhanVien.cs 

 Bước 1: Xây dựng lớp giao tiếp CSDL Database.cs

3.  Chức năng 

Lớp Database đảm nhiệm việc giao tiếp với cơ sở dữ liệu cho toàn ứng dụng. Tất cả việc

tương tác với CSDL dữ liệu diễn ra ở bất cứ nơi nào trong ứng dụng đều được thực hiện

thông qua lớp này. 

4. 

Mục ích 

Sỡ dĩ chúng ta phải xây dựng lớp này là nhằm mang lại tính dễ bảo trì cũng như tính tiến

hóa cho hệ thống. Nếu sau này cần thay đổi môi trường ứng dụng (sang Oracle, Access,

Db2 ...) thì chúng ta chỉ việc chỉnh sửa lớp Database này mà không cần quan tâm đến phần

còn lại của ứng dụng. 

  Lớp Database gồm có các thành phần sau: 

Thuộc tính  nghĩa 

sqlconn Thuộc lớp SqlConnection 

Phương thức  nghĩa 

Database Hàm khởi tạo (Constructor) 

Execute Thực thi một câu lệnh truy vấn và

trả về kết quả là một DataTable.

Dùng cho các câu lệnh Select *

From ...

ExecuteNonQuery Thực thi một câu lệnh truy vấn

không quan tâm đến kết quả 

trả về. Dùng cho các câu lệnh

Insert, Delete, Update ...

Page 25: Software Engineering Exercises

7/24/2019 Software Engineering Exercises

http://slidepdf.com/reader/full/software-engineering-exercises 25/55

Bài tập thực hành Nhập Môn Công Nghệ Phần Mềm 

25

  Right-Click project ThuVien, chọn Add  Class… 

   Nhập vào tên lớp là Database.cs và click Add. 

  Viết code cho Database.cs như sau: 

using System;using System.Collections.Generic;

using System.Text;using System.Data.SqlClient; //SqlConnection,...

Page 26: Software Engineering Exercises

7/24/2019 Software Engineering Exercises

http://slidepdf.com/reader/full/software-engineering-exercises 26/55

Bài tập thực hành Nhập Môn Công Nghệ Phần Mềm 

26

using System.Data;//DataSet, DataTable,...

namespace ThuVien{

class Database{

//Thuộc tnhSqlConnection sqlconn;

SqlDataAdapter da; //Contructor khi tạo public Database(string svrName, string dbName, bool intergratedMode, string 

usrName, string pwd){

string connStr;if (intergratedMode == true){

//Đng nhập SQL Server s dụng Windows Authentication Mode. connStr = "server=" + svrName + "; database=" + dbName + "; Integrated

Security = True";}else{

//Đng nhập SQL Server s dụng SQL Server Authentication Mode. connStr = "server=" + svrName + "; uid=" + usrName + "; pwd=" + pwd +

" ;database=" + dbName;}//Câu lệnh dùng để thiết lập kết nối đến SQL Server là:server=tên_svr;

database = tên_db;Integrated Security = True hay server=tên_svr; database = tên_db;uid = tên_đăng_nhập;pwd = mật_khẩu;

sqlconn = new SqlConnection(connStr);}

public DataTable Execute(string strQuery){

//Câu lệnh này tạo mới một đối tượng SqlDataAdapter và//cung cấp cho nó câu truy vấn cùng với kết nối hiện hành da = new SqlDataAdapter(strQuery, sqlconn);

//DataTable đại diện cho một bảng dữ liệu 

DataTable dt = new DataTable(); //Dùng SqlDataAdapter đã tạo ra trên thực thi câu lệnh truy vấn đã cung cấp,

//và đưa kết quả trả về là dt da.Fill(dt);//trả dữ liệu đã lấy về cho phương thức return dt;

}

public void ExecuteNonQuery(string strquery){

//SqlCommand là đối tượng chuyên đảm nhận việc thực hiện các câu lệnh truy vấn SqlCommand sqlcom = new SqlCommand(strquery, sqlconn);

sqlconn.Open(); //M kết nối 

sqlcom.ExecuteNonQuery(); //Thực hiện câu lệnh truy vấn đã cung cấp  trên sqlconn.Close(); //Đóng kết nối 

}

public void Update(string strQuery, DataTable table){

//Cập nhật 1 Datatable xuống CSDL 

da = new SqlDataAdapter(strQuery, sqlconn);SqlCommandBuilder sqlcb = new SqlCommandBuilder(da);da.Update(table);

} }

Page 27: Software Engineering Exercises

7/24/2019 Software Engineering Exercises

http://slidepdf.com/reader/full/software-engineering-exercises 27/55

Bài tập thực hành Nhập Môn Công Nghệ Phần Mềm 

27

 Bước 2 : Xây dựng các màn hình danh mục 

   Bước 2.1: Viết lớp xử lý nghiệp vụ cho Nhân viên : Nhanvien.cs

NhanVien.cs 

namespace QLThuVien{

class NhanVien{

Database db;

public NhanVien(){

db = new Database(frmMDI.srvName, frmMDI.dbName,frmMDI.IntergratedMode, frmMDI.userName, frmMDI.passWord);

}//Lấy danh sách tất cả nhân viên public DataTable LayDSNhanVien(){//Trả về thông tin nhân viên và tên bằng cấp của nhân viên đó 

return db.Execute("SelectManhanvien,Hotennhanvien,ngaysinh,diachi,dienthoai, tenbangcap from NhanVienn,bangcap b where n.MaBangCap=b.MaBangCap");

}

//Lấy danh sách bằng cấp->nạp vào combobox public DataTable LayDSBangCap(){

return db.Execute("select * from BangCap");}

//Thêm 1 nhân viên mới public void ThemNhanVien(string ten, string ngaysinh, string diachi, string 

dienthoai, string index_bc){

string sql = string.Format("Insert Into NhanVienValues(N'{0}','{1}',N'{2}','{3}',{4})" ,ten,ngaysinh,diachi,dienthoai,index_bc);

db.ExecuteNonQuery(sql);}

//Xóa 1 nhân viên public void XoaNhanVien(string index_nv){

string sql = "Delete from NhanVien where MaNhanVien = " + index_nv;

db.ExecuteNonQuery(sql);}

//Cập nhật nhân viên public void CapNhatNhanVien(string index_nv, string hoten, string ngaysinh,

string diachi, string dienthoai, string index_bc){

//Chuẩn bị câu lẹnh truy vấn string str = string.Format("Update NHANVIEN set HoTenNhanVien = N'{0}',

NgaySinh ='{1}',diachi = N'{2}', dienthoai = '{3}', MaBangCap = {4} whereMaNhanVien = {5}",hoten,ngaysinh,diachi,dienthoai,index_bc, index_nv);

db.ExecuteNonQuery(str);}

}}

Page 28: Software Engineering Exercises

7/24/2019 Software Engineering Exercises

http://slidepdf.com/reader/full/software-engineering-exercises 28/55

Bài tập thực hành Nhập Môn Công Nghệ Phần Mềm 

28

  Bước 2.2 : Viết lớp xử lý giao diện cho frmNhanVien.cs 

Thiết kế giao diện như sau, đặt tên là frmNhanVien 

Xử lý Code cho frmNhanVien : 

namespace QLThuVien{

public partial class frmNhanVien : Form{

NhanVien nv;//lớp x lý nghiệp vụ nhân viên DataTable dt;bool themmoi = true;//=true là thêm mới, =false là cập nhật 

public frmNhanVien(){

InitializeComponent();nv = new NhanVien();dt = new DataTable();

}

private void frmNhanVien_Load(object sender, EventArgs e){

HienThiDanhSachNV();LoadDSBangCap();setButton(true);

Page 29: Software Engineering Exercises

7/24/2019 Software Engineering Exercises

http://slidepdf.com/reader/full/software-engineering-exercises 29/55

Bài tập thực hành Nhập Môn Công Nghệ Phần Mềm 

29

}

//thiết lập các nút trên form public void setButton(bool value){

btnThem.Enabled = value;btnXoa.Enabled = value;btnSua.Enabled = value;btnLuu.Enabled = !value;btnHuy.Enabled = !value;btnThoat.Enabled = value;

}

//Xóa dữ liệu trên form void clearForm(){

txtHoten.Text = "";txtDiaChi.Text = "";dtpNgaySinh.Value = DateTime.Now;txtDienThoai.Text = "";cboBangCap.SelectedIndex = 0;

}

//Nạp danh sách bằng cấp vào combobox cboBangCap public void LoadDSBangCap(){

DataTable dt_bc = nv.LayDSBangCap();//Việc lấy dữ liệu được ủy nhiệm cho biến thuộc lớp x lý (lớp

NhanVien) chứ không trực tiếp thực hiện đây //Nạp dữ liệu lên combobox cboBangCap.DataSource = dt_bc;cboBangCap.DisplayMember = "TenBangCap";cboBangCap.ValueMember = "MaBangCap";

if (cboBangCap.Items.Count > 0)

cboBangCap.SelectedIndex = 0;

}

//Hiển thị danh sách nhân viên lên Listview public void HienThiDanhSachNV(){

dt = nv.LayDSNhanVien();lsvNhanVien.Items.Clear();lsvNhanVien.View = View.Details;for (int i = 0; i < dt.Rows.Count; i++){

ListViewItem lvi;

lvi = lsvNhanVien.Items.Add(dt.Rows[i]["MaNhanVien"].ToString());lvi.SubItems.Add(dt.Rows[i]["Hotennhanvien"].ToString());lvi.SubItems.Add(dt.Rows[i][2].ToString());lvi.SubItems.Add(dt.Rows[i][3].ToString());lvi.SubItems.Add(dt.Rows[i][4].ToString());lvi.SubItems.Add(dt.Rows[i][5].ToString());

}}

//khi nhấn vào nút thêm private void btnThem_Click(object sender, EventArgs e){

themmoi = true;

setButton(false);txtHoten.Focus();

Page 30: Software Engineering Exercises

7/24/2019 Software Engineering Exercises

http://slidepdf.com/reader/full/software-engineering-exercises 30/55

Bài tập thực hành Nhập Môn Công Nghệ Phần Mềm 

30

}

//Sự kiện khi chọn 1 dòng trên Listview thì nội dung của dòng đó sẽ đượcnạp lên FORM 

private void  lsvNhanVien_SelectedIndexChanged(object sender, EventArgs e){

if (lsvNhanVien.SelectedIndices.Count > 0){

txtHoten.Text = lsvNhanVien.SelectedItems[0].SubItems[1].Text;dtpNgaySinh.Value =

DateTime.Parse(lsvNhanVien.SelectedItems[0].SubItems[2].Text);txtDiaChi.Text = lsvNhanVien.SelectedItems[0].SubItems[3].Text;txtDienThoai.Text = lsvNhanVien.SelectedItems[0].SubItems[4].Text;cboBangCap.SelectedIndex =

cboBangCap.FindString(lsvNhanVien.SelectedItems[0].SubItems[5].Text);}

}

//Xóa 1 dòng trên listview private void btnXoa_Click(object sender, EventArgs e){

if (lsvNhanVien.SelectedIndices.Count > 0)

{DialogResult dr = MessageBox.Show("Bạn có chắc xóa không?", "Xóa

bằng cấp", MessageBoxButtons.YesNo, MessageBoxIcon.Question);if (dr == DialogResult.Yes){

nv.XoaNhanVien(lsvNhanVien.SelectedItems[0].SubItems[0].Text);lsvNhanVien.Items.RemoveAt(lsvNhanVien.SelectedIndices[0]);clearForm();

}}else

MessageBox.Show("Bạn phải chọn mẩu tin cần xóa");}

//Sa 1 dòngprivate void btnSua_Click(object sender, EventArgs e){

if (lsvNhanVien.SelectedIndices.Count > 0){

themmoi = false;setButton(false);

}else

MessageBox.Show("Bạn phải chọn mẫu tin cập nhật", "Sa mẫu tin");}

//Khi thực hiện lưu thông tin xuống CSDL private void btnLuu_Click(object sender, EventArgs e){

string ngay = String.Format("{0:MM/dd/yyyy}", dtpNgaySinh.Value);//Địnhdạng ngày tương ứng với trong CSDL SQLserver 

if (themmoi){

nv.ThemNhanVien(txtHoten.Text, ngay, txtDiaChi.Text,txtDienThoai.Text, cboBangCap.SelectedValue.ToString());

MessageBox.Show("Thêm mới thành công");}else{

nv.CapNhatNhanVien(lsvNhanVien.SelectedItems[0].SubItems[0].Text,txtHoten.Text, ngay, txtDiaChi.Text, txtDienThoai.Text,

Page 31: Software Engineering Exercises

7/24/2019 Software Engineering Exercises

http://slidepdf.com/reader/full/software-engineering-exercises 31/55

Bài tập thực hành Nhập Môn Công Nghệ Phần Mềm 

31

cboBangCap.SelectedValue.ToString());MessageBox.Show("Cập nhật thành công");

}HienThiDanhSachNV();clearForm();

}

//Cancel các thao tác private void btnHuy_Click(object sender, EventArgs e){

setButton(true);}

private void btnThoat_Click(object sender, EventArgs e){

Close();}

Chạy và kiểm tra chương trình. 

Qua đây, ta nhận thấy rằng việc xử lý đã được phân loại rõ ràng các nhiệm vụ xử lý giúp ta dễ

dàng quản lý chương trình hơn. 

Làm tưng tự cho các màn hình danh mục hác :

TÊN DANH MỤC  TÊN LỚP  CHỨC NĂNG  GHI CHÚ 

BẰNG CẤP BangCap.cs Xử lý nghiệp vụ 

frmBangCap.cs Xử lý giao diện 

LẬP THẺ ĐỘC GIẢ Docgia.cs Xử lý nghiệp vụ 

frmDocGia.cs Xử lý giao diện 

TIẾP NHẬN SÁCH Sach.cs Xử lý nghiệp vụ 

frmSach.cs Xử lý giao diện 

… 

  MỘT CÁCH KHÁC ĐỂ NHẬP BẢNG DANH MỤC (CÓ QUAN HỆ 1) 

 Như đã nói ở trên, muốn viết cho 1 form để xử lý thêm, xóa, sửa cho 1 bảng, chúng ta phải

tạo 2 file : file cơ sở và file FORM. Tuy nhiên, có 1 cách dùng khác là sử dụng 1 control có

chức năng liên kết dữ liệu 1 cách tự động với 1 bảng trong Database, đó là DataGrid 

o  Dùng DataGrid để nhập trực tiếp (nhập theo dạng bảng)  

o  Sử dụng DataAdapter để update dữ liệu từ bảng xuống CSDL  

o  Thao tác trên bảng Độc Giả : 

o  GIAO DIỆN : frmDocGia.cs 

Page 32: Software Engineering Exercises

7/24/2019 Software Engineering Exercises

http://slidepdf.com/reader/full/software-engineering-exercises 32/55

Bài tập thực hành Nhập Môn Công Nghệ Phần Mềm 

32

VIẾT CODE CHO FORM frmDocGia như sau: 

namespace QLThuVien{

public partial class frmDocGia : Form{

DocGia dg = new DocGia();Database db = new Database(frmMDI.srvName, frmMDI.dbName,

frmMDI.IntergratedMode, "", "");DataTable dt = new DataTable();public frmDocGia(){

InitializeComponent();}private void frmDocGia_Load(object sender, EventArgs e){

dt = dg.LayDSDocGia();dgvDocGia.DataSource = dt; //gán dữ liệu cho datagrid //Thiết lập độ rộng các cột dgvDocGia.Columns[0].Visible= false;dgvDocGia.Columns[1].Width = 180;

dgvDocGia.Columns[3].Width = 200;dgvDocGia.Columns[4].Width = 200;

}private void btnLuu_Click(object sender, EventArgs e){

try{

db.Update("Select * from DocGia", dt);MessageBox.Show("Cập nhật thành công");

}catch (DataException de){

MessageBox.Show("Có lỗi khi cập nhật \n" + de.ToString(), "lỗi",

MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Error);}

}

private void btnThoat_Click(object sender, EventArgs e){

Close();}

}

Các danh mục còn lại làm tưng tự …

Page 33: Software Engineering Exercises

7/24/2019 Software Engineering Exercises

http://slidepdf.com/reader/full/software-engineering-exercises 33/55

Bài tập thực hành Nhập Môn Công Nghệ Phần Mềm 

33

B ài 3   Xây dựng các màn hình quản lý  Trong phần mềm QLTHUVIEN, nghiệp vụ cho mượn sách là 1 dạng nghiệp vụ quản lý,

chúng ta sẽ thực hiện thao tác tạo Phiếu mượn và chi tiết phiếu mượn:

  Mục đích : thao tác viết code cho bảng n-n (được phân tách thành 2 bảng 1-n)

  Để thực hiện, cần thực hiện viết code các file như sau :  

o  Lớp xử lý nghiệp vụ bao gồm:

 

Phieumuon.cs : dùng để xứ lý cho lớp phiếu mượn 

 

Chitietphieumuon.cs : dùng để xứ lý cho lớp chi tiết phiếu mượn 

 

Sach.cs :

 

Docgia.cs

o  Lớp xử lý giao diện FORM

 

frmChoMuonSach.cs (phieumuon)

  frmChiTietPhieuMuon.cs

LỚP CƠ SỞ : 

  phieumuon.cs

class PhieuMuon{

Database db;

DataTable dt_pm;

public PhieuMuon(){

db = new Database(frmMDI.srvName, frmMDI.dbName,frmMDI.IntergratedMode,frmMDI.userName,frmMDI.passWord);

}public DataTable LayDSPhieuMuon(){

dt_pm = db.Execute("Select MaPhieuMuon, PMS.MaDocGia, DG.HoTenDocGia,NgayMuon from PHIEUMUONSACH PMS, DOCGIA DG where PMS.MaDocGia=DG.MaDocGia Order ByMaPhieuMuon");

return dt_pm;}public void ThemPM(string madocgia,string ngaymuon){

string sql = string.Format("INSERT INTO PHIEUMUONSACHVALUES('{0}',{1})",ngaymuon,madocgia);

db.ExecuteNonQuery(sql);

}public void XoaPM(string index){

String sql = "Delete from PHIEUMUONSACH where MaPhieuMuon = " + index;db.ExecuteNonQuery(sql);

}public void CapNhatPM(string index, string ngaymuon, string madocgia)

{

Page 34: Software Engineering Exercises

7/24/2019 Software Engineering Exercises

http://slidepdf.com/reader/full/software-engineering-exercises 34/55

Bài tập thực hành Nhập Môn Công Nghệ Phần Mềm 

34

string sql = string.Format("Update PHIEUMUONSACH setngaymuon='{0}',madocgia={1} where MaPhieuMuon = {2}",ngaymuon,madocgia,index);

db.ExecuteNonQuery(sql);}

 

sach.cs

class Sach{

Database db;

public Sach(){

db = new Database(frmMDI.srvName, frmMDI.dbName,frmMDI.IntergratedMode,frmMDI.userName,frmMDI.passWord);

}

public DataTable LayDSSach(){

return db.Execute("Select * from SACH");}

public DataTable LayDSSachTheoDG(string madg){

return db.Execute("Select * from SACH s, PHIEUMUONSACH pm,CHITIETPHIEUMUON ct where s.masach=ct.masach and ct.maphieumuon=pm.maphieumuon andmadocgia="+madg);

}} 

 

chitietphieumuon.csclass ChiTietPhieuMuon{

Database db;public ChiTietPhieuMuon(){

db = new Database(frmMDI.srvName, frmMDI.dbName,frmMDI.IntergratedMode,frmMDI.userName,frmMDI.passWord);

}

public DataTable LayDSChiTietPhieuMuon(){

return db.Execute("Select * from ChiTietPhieuMuon Order ByMaPhieuMuon");}

public DataTable LayDSChiTietPhieuMuon(int MaPM){

return db.Execute(string.Format("Select * from ChiTietPhieuMuon wheremaphieumuon = {1} Order By MaPhieuMuon",MaPM));

}

public void ThemCTPM(string MaSach, string MaPM){

string sql = string.Format("INSERT INTO CHITIETPHIEUMUONVALUES({0},{1})",MaSach,MaPM);

db.ExecuteNonQuery(sql);

Page 35: Software Engineering Exercises

7/24/2019 Software Engineering Exercises

http://slidepdf.com/reader/full/software-engineering-exercises 35/55

Bài tập thực hành Nhập Môn Công Nghệ Phần Mềm 

35

}

public void XoaCTPM(string MaSach, string MaPM){

String sql = string.Format("Delete from CHITIETPHIEUMUON whereMasach={0} and MaPhieuMuon = {1}",MaSach,MaPM);

db.ExecuteNonQuery(sql);}

}

 

  Docgia.cs 

class DocGia{

Database db;public DocGia(){

db = new Database(frmMDI.srvName, frmMDI.dbName,frmMDI.IntergratedMode,frmMDI.userName,frmMDI.passWord);

}

public DataTable LayDSDocGia(){

return db.Execute("Select * from DOCGIA");}

//Tạo 1 phương thức để lấy danh sách độc giả theo câu lệnh SQL từ bênngoài 

public DataTable LayDSDocGia(string sql){

return db.Execute(sql);}

Page 36: Software Engineering Exercises

7/24/2019 Software Engineering Exercises

http://slidepdf.com/reader/full/software-engineering-exercises 36/55

Bài tập thực hành Nhập Môn Công Nghệ Phần Mềm 

36

Lớp FORM :

  Giao diện FORM cho mượn sách (frmChoMuonSach) :

STT Tên Control Loại Tiêu đề 

1.  gbPhieuMuon Groupbox Phiếu mượn 

2.  lsvPhieuMuon  ListView 

3. 

gbDanhsachdocgia  Groupbox Danh sách độc giả 

4.  cboDocGia Combobox

5.  lblNgayMuon Label    Ngày mượn 

6.  dtNgayMuon DateTimePicker

7.   btnCTPhieuMuon Button Chi tiết phiếu mượn 

8.   btnThem Button Thêm 

9.   btnXoa Button Xoá 

10.   btnCapNhat Button Cập nhật 

11.   btnSua Button Sửa 

Page 37: Software Engineering Exercises

7/24/2019 Software Engineering Exercises

http://slidepdf.com/reader/full/software-engineering-exercises 37/55

Bài tập thực hành Nhập Môn Công Nghệ Phần Mềm 

37

  Viết code cho frmChoMuonSach.cs (phiếu mượn) như sau: nghiệp vụ truyền tham số

giữa các form thông qua phương thức khởi tạo  

public partial class frmChoMuonSach : Form{

PhieuMuon pm;DocGia dg;DataTable dt;//khai báo biến để truyền qua form frmchitietphieumuon string mapm;string madg;string tendg;

bool isAdded = true;

public frmChoMuonSach(){

InitializeComponent();pm = new PhieuMuon();dt = new DataTable();dg = new DocGia();

}

private void frmChoMuonSach_Load(object sender, EventArgs e){

HienThiDanhSach();LayDSDocGia();

}

//thiết lập các nút trên form public void setButton(bool value){

btnThem.Enabled = value;btnXoa.Enabled = value;btnSua.Enabled = value;btnLuu.Enabled = !value;btnHuy.Enabled = !value;btnCTPM.Enabled = value;btnThoat.Enabled = value;

}

public void HienThiDanhSach(){

dt.Rows.Clear();

dt = pm.LayDSPhieuMuon();lsvPhieuMuon.Items.Clear();lsvPhieuMuon.View = View.Details;for (int i = 0; i < dt.Rows.Count; i++){

ListViewItem lvi;lvi = lsvPhieuMuon.Items.Add(dt.Rows[i][0].ToString());lvi.SubItems.Add(dt.Rows[i]["HoTenDocGia"].ToString());

lvi.SubItems.Add(String.Format("{0:MM/dd/yyyy}",dt.Rows[i]["NgayMuon"].ToString()));

}}

public void LayDSDocGia(){

Page 38: Software Engineering Exercises

7/24/2019 Software Engineering Exercises

http://slidepdf.com/reader/full/software-engineering-exercises 38/55

Bài tập thực hành Nhập Môn Công Nghệ Phần Mềm 

38

DataTable dt_dg = dg.LayDSDocGia();cboHoTen.DataSource = dt_dg;cboHoTen.DisplayMember = "HoTenDocGia";cboHoTen.ValueMember = "MaDocGia";

if (cboHoTen.Items.Count > 0)cboHoTen.SelectedIndex = 0;

}

private void btnThem_Click(object sender, EventArgs e){

isAdded = true;setButton(false);

}

private void  lsvPhieuMuon_SelectedIndexChanged(object sender, EventArgs e){

if (lsvPhieuMuon.SelectedIndices.Count > 0){

cboHoTen.SelectedIndex =cboHoTen.FindString(lsvPhieuMuon.SelectedItems[0].SubItems[1].Text);

dtpNgayMuon.Value =DateTime.Parse(lsvPhieuMuon.SelectedItems[0].SubItems[2].Text);

}}

private void btnCTPM_Click(object sender, EventArgs e){

if (lsvPhieuMuon.SelectedIndices.Count > 0){

//Lấy thông tin về Mã độc giả (madg), Mã phiếu mượn (mapm) và tên độc giả (tendg) madg = cboHoTen.SelectedValue.ToString();mapm = lsvPhieuMuon.SelectedItems[0].Text;tendg = lsvPhieuMuon.SelectedItems[0].SubItems[1].Text;

//và truyền qua form ChitietPhieuMuon frmCTPhieuMuon frm = new frmCTPhieuMuon(mapm,madg,tendg);frm.Show();

}else

MessageBox.Show("Bạn phải chọn một phiếu mượn để nhập chi tiết");}

private void btnXoa_Click(object sender, EventArgs e){

if (lsvPhieuMuon.SelectedIndices.Count > 0){

DialogResult dr = MessageBox.Show("Bạn có chắc xóa không?", "Xóa

bằng cấp", MessageBoxButtons.YesNo, MessageBoxIcon.Question);if (dr == DialogResult.Yes){

pm.XoaPM(lsvPhieuMuon.SelectedItems[0].SubItems[0].Text);lsvPhieuMuon.Items.RemoveAt(lsvPhieuMuon.SelectedIndices[0]);

}}else

MessageBox.Show("Bạn phải chọn mẩu tin cần xóa");}

private void btnSua_Click(object sender, EventArgs e){

if (lsvPhieuMuon.SelectedIndices.Count > 0){

Page 39: Software Engineering Exercises

7/24/2019 Software Engineering Exercises

http://slidepdf.com/reader/full/software-engineering-exercises 39/55

Bài tập thực hành Nhập Môn Công Nghệ Phần Mềm 

39

isAdded = false;setButton(false);

}else

MessageBox.Show("Bạn phải chọn mẫu tin cập nhật", "Sa mẫu tin");}

private void btnLuu_Click(object sender, EventArgs e){

if (cboHoTen.SelectedIndex < 0){MessageBox.Show("Bạn hãy nhập thông tin họ tên", "Thiếu thông tin");

cboHoTen.Focus();}else{string ngaymuon = String.Format("{0:MM/dd/yyyy}", dtpNgayMuon.Value);

string madg = cboHoTen.SelectedValue.ToString();

try{

if (isAdded) //là thêm mới pm.ThemPM(cboHoTen.SelectedValue.ToString(), ngaymuon);

else  // là cập nhật {string mapm = lsvPhieuMuon.SelectedItems[0].SubItems[0].Text;

pm.CapNhatPM(mapm, ngaymuon, madg);}HienThiDanhSach();setButton(true);MessageBox.Show("Thành công");

}catch(DataException de){

MessageBox.Show("Có lỗi khi lưu : " + de.ToString());

}}

}

private void btnHuy_Click(object sender, EventArgs e){

setButton(true);}

private void btnThoat_Click(object sender, EventArgs e){

Close();}

private void btnThemDG_Click(object sender, EventArgs e){

frmDocGia frm = new frmDocGia();frm.Show();

}} 

Page 40: Software Engineering Exercises

7/24/2019 Software Engineering Exercises

http://slidepdf.com/reader/full/software-engineering-exercises 40/55

Bài tập thực hành Nhập Môn Công Nghệ Phần Mềm 

40

  Giao diện FORM ChiTietPhieuMuon (frmChiTietPhieuMuon) như sau : 

STT Tên Control Loại Tên hàm xử lý 1 lsvSachNguon ListView

cboSachChon combobox

2 lblMaPM label Hiển thị Mã Phiếu mượn 

3 lblTenDG label Hiển thị tên Độc Giả 

4 btnChon Button btnChon_Click

5 btnTra Button btnTra_Click

6 btnHuyCT Button btnHuyCT_Click

8 frmCTPhieuMuon Form frmCTPhieuMuon_Load

  Ta tiếp tục viết code cho form frmChitietphieumuon.cs như sau: 

namespace QLThuVien{

public partial class frmCTPhieuMuon : Form{

public string mapm;

public string tendg;public string madg;

Page 41: Software Engineering Exercises

7/24/2019 Software Engineering Exercises

http://slidepdf.com/reader/full/software-engineering-exercises 41/55

Bài tập thực hành Nhập Môn Công Nghệ Phần Mềm 

41

DataTable dt_s;DataTable dt_schon;ChiTietPhieuMuon ctpm;Sach sach;

public frmCTPhieuMuon(string MAPM, string MADG, string TENDG){

InitializeComponent();ctpm = new ChiTietPhieuMuon();dt_s = new DataTable();dt_schon = new DataTable();sach = new Sach();mapm = MAPM;madg = MADG;tendg = TENDG;

}

public void HienThiDanhSach_SachNguon(){

dt_s.Rows.Clear();dt_s = sach.LayDSSach();

cboSachNguon.DataSource = dt_s;cboSachNguon.DisplayMember = "Tensach";cboSachNguon.ValueMember = "Masach";

}

public void HienThiDanhSach_SachChon(){

dt_schon.Rows.Clear();

//lấy tất cả sách độc giả đã mượn dt_schon = sach.LayDSSachTheoDG(madg); 

lsvSachChon.Items.Clear();lsvSachChon.View = View.Details;for (int i = 0; i < dt_schon.Rows.Count; i++){

ListViewItem lvi;lvi = lsvSachChon.Items.Add(dt_schon.Rows[i][0].ToString());lvi.SubItems.Add(dt_schon.Rows[i][ "TenSach"].ToString());

}}

private void btnChon_Click(object sender, EventArgs e){

if (lsvSachChon.Items.Count >= 3){

MessageBox.Show("Mỗi Độc giả chỉ được mượn tối đa 3 quyển");return;

}if (isChoosen(cboSachNguon.SelectedText, lsvSachChon)){

ListViewItem lviSachChon =lsvSachChon.Items.Add(cboSachNguon.SelectedValue.ToString());

lviSachChon.SubItems.Add(cboSachNguon.Text);//thêm mới sách vào chi tiết phiếu mượn ctpm.ThemCTPM(cboSachNguon.SelectedValue.ToString(), mapm);

}

else{

Page 42: Software Engineering Exercises

7/24/2019 Software Engineering Exercises

http://slidepdf.com/reader/full/software-engineering-exercises 42/55

Bài tập thực hành Nhập Môn Công Nghệ Phần Mềm 

42

MessageBox.Show("Sách này đã được chọn rồi, vui lòng chọn sáchkhác", "Lỗi chọn sách", MessageBoxButtons.OK, MessageBoxIcon.Error);

return;}

}

private void btnHuyCT_Click(object sender, EventArgs e){

Close();}

//kiem tra mot item co tồn tại trong listview ?? dùng để xem độc giả cómượn trùng sách hay không? 

bool isChoosen(string item, ListView lv){

for (int i = 0; i < lv.Items.Count; i++)if  (item.Equals(lv.Items[i].Text))

return false;return true;

}

//cancel việc mượn sách (trả lại sách) private void btnTra_Click(object sender, EventArgs e){

if (lsvSachChon.SelectedIndices.Count > 0){

for (int i = 0; i < lsvSachChon.SelectedIndices.Count; i++){

ctpm.XoaCTPM(lsvSachChon.SelectedItems[i].SubItems[0].Text,mapm);lsvSachChon.Items.RemoveAt(lsvSachChon.SelectedIndices[i]);

}}

}

private void frmCTPhieuMuon_Load(object sender, EventArgs e){

lblMaPM.Text = mapm;lblTenDG.Text = tendg;

HienThiDanhSach_SachChon();HienThiDanhSach_SachNguon();

}}

  Chạy và kiểm tra chương trình.

Page 43: Software Engineering Exercises

7/24/2019 Software Engineering Exercises

http://slidepdf.com/reader/full/software-engineering-exercises 43/55

Bài tập thực hành Nhập Môn Công Nghệ Phần Mềm 

43

 Bài 4. Màn hình Thống kê tình hình mượn sách theo thể loại  

  Màn hình này giúp người quản lý theo dõi thông tin mượn sách trong một tháng cụ thể.

 Người quản lý sẽ nhập tháng/năm vào và nhấn nút xem, tính hình mượn sách thuộc tất cả

các thể loại sẽ được hiển thị trong listview.

 

Xây dựng màn hình theo hình sau, đặt tên là frmThongKeDocGia:

STT Tên Control Loại Tiêu đề 

1.  rdbTatCa RadioButton  Báo cáo tất cả độc giả 

2.  rdbConNo  RadioButton  Thống kê các độc giả còn nợ  

3.  lvMuonSach  Listview  ListView thống k ê tình hình mượ n

sách theo thể loại 

4.  lblTong Label  Tổng số lượ t mượ n

5. 

 btnXem  Button  Xem6.   btnIn  Button  In báo cáo 

Page 44: Software Engineering Exercises

7/24/2019 Software Engineering Exercises

http://slidepdf.com/reader/full/software-engineering-exercises 44/55

Bài tập thực hành Nhập Môn Công Nghệ Phần Mềm 

44

Viết Code cho FORM frmDocGiaNoTien.cs nhu sau :

namespace QLThuVien{

public partial class frmThongKeDocGia : Form{

DocGia dg;float tong = 0;

DataTable dt = new DataTable();

public frmThongKeDocGia(){

InitializeComponent();dg = new DocGia();

}

private void btnIn_Click(object sender, EventArgs e){

//gọi đến form chứa báo cáo cần hiển thị (sẽ tạo trong phần sau) frmDocGiaNoTien frm = new frmDocGiaNoTien(dt);frm.Show();

}

private void btnXem_Click(object sender, EventArgs e){

lsvDocGia.View = View.Details;lsvDocGia.FullRowSelect = true;lsvDocGia.Items.Clear();tong = 0; //tổng số tiền độc giả nợ dt.Clear();if (rdoTatca.Checked)

dt = dg.LayDSDocGia("select hotendocgia,tienno from DocGia");else

dt = dg.LayDSDocGia("select hotendocgia, tienno from DocGia where

tienno<>0");for (int i = 0; i < dt.Rows.Count; i++){

float tien = float.Parse(dt.Rows[i]["tienno"].ToString());string tienno = String.Format("{0:0,000}", tien);tong += tien;

ListViewItem lvi = lsvDocGia.Items.Add(i.ToString());lvi.SubItems.Add(dt.Rows[i]["hotendocgia"].ToString());lvi.SubItems.Add(tienno);

}lblTong.Text = String.Format("{0:0,000}", tong);

}

}

Page 45: Software Engineering Exercises

7/24/2019 Software Engineering Exercises

http://slidepdf.com/reader/full/software-engineering-exercises 45/55

Bài tập thực hành Nhập Môn Công Nghệ Phần Mềm 

45

 Bài 5. Tạo báo cáo thống kê với Crystal Report  

1.  Tạo báo cáo thông ê tình hình ọc giả nợ tiền phạt. 

Chúng ta sẽ tạo các loại báo cáo và thống kê cho phần mềm. Thực hiện theo các bước sau: 

Bước 1 : Tạo Dataset chứa bảng cần field dữ liệu dùng làm report , đặt tên là dsThuVien.xsd 

Bước 2 : Tạo và trang trí cho báo cáo mà chúng ta cần in , đặt tên crpDocGiaNoTien.rpt 

Bước 3 : Tạo 1 form rỗng để chứa report vừa tạo ra, đặt tên frmDocGiaNoTien.cs 

Bước 4 : Liên kết các file lại với nhau và liên kết với form Thống kê  frmThongKeDocGia ở

trên 

Chi tiết các bước :

BƯỚC 1 : TẠO DATASET CHỨA DỮ LIỆU 

  Mở project ThuVien

  Tạo DataSet chứa các bảng cần lập báo cáo. Ở đây ta sẽ tạo 1 dataset chứa bảng DocGia ,

thực hiện như sau:

o  Tạo Dataset bao gồm các bảng cần thống kê : clic chuột phải -> Add New Item 

Bấm vào Server Explorer  

Page 46: Software Engineering Exercises

7/24/2019 Software Engineering Exercises

http://slidepdf.com/reader/full/software-engineering-exercises 46/55

Bài tập thực hành Nhập Môn Công Nghệ Phần Mềm 

46

o  Connect Database

Chọn Database để kết nối (nhập đúng Server và Tên Database) 

o  Chọn bảng Độc giả , kéo thả vào trong DataSet  

Page 47: Software Engineering Exercises

7/24/2019 Software Engineering Exercises

http://slidepdf.com/reader/full/software-engineering-exercises 47/55

Bài tập thực hành Nhập Môn Công Nghệ Phần Mềm 

47

BƯỚC 2 : TẠO CRYSTAL REPORT CHO ĐỘC GIẢ 

  Thêm vào CrystalReports rptTinhHinhDocGiaNoTienPhat.rpt như sau:

Từ menu Project, chọn Add New Item, đặt tên cho report 

  Sau khi tạo xong dialog sau sẽ xuất hiện 

Page 48: Software Engineering Exercises

7/24/2019 Software Engineering Exercises

http://slidepdf.com/reader/full/software-engineering-exercises 48/55

Bài tập thực hành Nhập Môn Công Nghệ Phần Mềm 

48

  Chúng ta sẽ tạo 1 Blank Report. Click Ok K ết quả như sau:

  Thêm vào dòng tiêu đề của report 

o  Right click lên Section1 chọn Insert\Text object từ popup menu

o   Nhậ p vào nội dung và định dạng như sau.

  Kết nối cơ sở dữ liệu 

  Chọn Database Fields/ Database Expert… 

Page 49: Software Engineering Exercises

7/24/2019 Software Engineering Exercises

http://slidepdf.com/reader/full/software-engineering-exercises 49/55

Bài tập thực hành Nhập Môn Công Nghệ Phần Mềm 

49

  Kết quả: 

  K éo thả các field cần thiết vào report như hình sau:

Page 50: Software Engineering Exercises

7/24/2019 Software Engineering Exercises

http://slidepdf.com/reader/full/software-engineering-exercises 50/55

Bài tập thực hành Nhập Môn Công Nghệ Phần Mềm 

50

 

Định dạng cho Field tiền nợ  và tổng tiền nợ :

Page 51: Software Engineering Exercises

7/24/2019 Software Engineering Exercises

http://slidepdf.com/reader/full/software-engineering-exercises 51/55

Bài tập thực hành Nhập Môn Công Nghệ Phần Mềm 

51

  Tạo Formula Field Tổng tiền nợ :

o  Right click lên Formula Fields chọn New… 

o   Nhậ p vào tên Formula Field: TongTienNo

o   Nhậ p vào công thức tính cho TongTienNo

  Tạo Parameter Fields Ngườ i lậ p thống k ê:

o  Right click lên Parameter Fields chọn New… 

o   Nhậ p vào tên Parameter Field: NguoiLapThongKe

  K éo thả Formula và Parameter + thêm 2 Text Object (TỔ NG SỐ TIỀ N NỢ:, Ngườ i lậ pthống k ê:) vào report như hình sau:

Page 52: Software Engineering Exercises

7/24/2019 Software Engineering Exercises

http://slidepdf.com/reader/full/software-engineering-exercises 52/55

Bài tập thực hành Nhập Môn Công Nghệ Phần Mềm 

52

BƯỚC 3 : TẠO FORM FRMDOCGIANOTIEN ĐỂ HIỂN THỊ REPORT

  Tạo mới 1 form rỗng 

 

K éo thả control CrystalReportViewer , đặt tên là CrystalReportViewer1 vào frmReport.

  Viết code cho form frmDocGiaNoTien :

namespace QLThuVien{

public partial class frmDocGiaNoTien : Form{

public DataTable dt_DG = new DataTable();public frmDocGiaNoTien(DataTable dt){

InitializeComponent();dt_DG = dt;

}

private void frmShowReportDG_Load(object sender, EventArgs e){

crpDocGiaNoTien crp = new crpDocGiaNoTien();crp.SetDataSource(dt_DG); //chỉ định datasource cho report crystalReportViewer1.ReportSource = crp; //hiển thị report lên form 

}}

Page 53: Software Engineering Exercises

7/24/2019 Software Engineering Exercises

http://slidepdf.com/reader/full/software-engineering-exercises 53/55

Bài tập thực hành Nhập Môn Công Nghệ Phần Mềm 

53

  Chạy chương trình và kiểm tra kết quả . 

Tương tự, làm report cho các báo cáo thống kê khác :  

 

Báo cáo nhân viên theo Bằng cấp 

Chú ý :  Report lấy dữ liệu từ 2 bảng CSDL trở lên thì bắt buộc phải tạo VIEW trong

 Database (select các thông tin cần thiết từ các table) và sau đó làm REPORT tương

tự như làm với Table 

Page 54: Software Engineering Exercises

7/24/2019 Software Engineering Exercises

http://slidepdf.com/reader/full/software-engineering-exercises 54/55

Bài tập thực hành Nhập Môn Công Nghệ Phần Mềm 

54

Tham hảo MSDN 2005 

  Sau khi mở MSDN 2005

o  Chọn Filtered by: Visual C# 

o  Look for: Crystal Report Enter

 

Các bạn có thểm tham khảo bằng cách click chọn các mục liên quan về Crystal Reporthoặc tham khảo Sample code. Chọn mục sample codeEnter

Page 55: Software Engineering Exercises

7/24/2019 Software Engineering Exercises

http://slidepdf.com/reader/full/software-engineering-exercises 55/55

Bài tập thực hành Nhập Môn Công Nghệ Phần Mềm 

  Chạy file C:\Program Files\Microsoft Visual Studio 8\Crystal Reports\Samples\en\Code\TutorialSampleCodeProjects.msi sẽ

 phát sinh ra các rất nhiều Sample cho ta tham khảo.  

Để phần mềm đạt được tiêu chuẩn, trong quá trình viết code phải chú ý đến việc bắt lỗi người

dùng (validate dữ liệu), tránh để phần mềm bị interupt.