Tên bảng Tên cột Nội dung Kiểu dữ liệu Kíchthước Not null
Khóa chính
Khóa ngoại DOCGIA MaDG Mã độc giả Char 5 X x
HotenDG Họ tên độc giả Varchar 50
Gioitinh Giới tính Varchar 5
Ngaysinh Ngày sinh DateTime 8
CoquanDG Cơ quan độc giả Varchar 50
DCDG Điạ chi độc giả Varchar 50
DTDG Điện thoại độc giả Varchar 15
NHAN VIEN
MaNV Mã nhân viên Char 5 x x
TenNV Tên nhân viên Varchar 50 x
DTNV Điện thoại nhân viên Varchar 15
NXB MaNXB Mã nhà xuất bản char 5 x x
TenNXB Tên nhà xuất bản Varchar 50 x
DCNXB Địa chỉ nhà xuất bản Varchar 50
DTNXB Điện thoại nhà xuấtbản Varchar 15
TACGIA MaTG Mã tác giả Char 5 x x
TenTG Tên tác giả Varchar 50 x
DCTG Địa chỉ tác giả Varchar 50
DTTG Điện thoại tác giả Varchar 15
CoquanTG Cơ quan tác giả Varchar 50
SACH Masach Mã sách Char 5 x x
Tensach Tên sách Varchar 50 x
Theloai Thể loại Varchar 50
Tinhtrang Tình trạng Varchar 50
Soluongco Số lượng có BigInt 8
Dongia Đơn giá Money 8
NamXB Năm xuất bản Int 4
MaTG Mã tác giả Char 5 x TACGIA
MaDG Mã độc giả Char 5 x DOCGIA
Ngaytao Ngày tạo DateTime 8
Ngayhethan Ngày hết hạn trả DateTime 8
PHIEU MUON
Sopmuon Số phiếu mượn Char 5 x x
Mathe Mã thẻ Char 5 x THEDOCGIA
Manv Mã nhân viên Char 5 x NHANVIEN
Ngaymuon Ngày mượn DateTime 8
Songaymuon Số ngày mượn Int 4
PHIEU NHAC TRA
Sopnhactra Số phiếu nhắc trả Char 5 x x
Sopmuon Số phiếu mượn Char 5 x PHIEUMUON
Ngaylap Ngày lập DateTime 8 x
SACH MUON
Masach Mã sách Char 5 x x SACH
Soluong Số lượng BigInt 8
II. Thiết kế cơ sở dữ liệu
1. Thiết kế dữ liệu cho các bảng
1.1 Bảng độc giả
• Lệnh tạo bảng: create table docgia (
madg char(5) not null,
hotendg varchar(50)not null, gioitinh varchar(5),
ngaysinh datetime, coquandg varchar(50), dcdg varchar(50), dtdg varchar(15),
constraint pk_docgia primary key(madg) )
go
• Thiết kế dữ liệu:
1.2 Bảng nhân viên
• Lệnh tạo bảng: create table nhanvien (
manv char(5) not null, tennv varchar(50), dtnv varchar(15),
constraint pk_nhanvien primary key(manv) )
Go
1.3 Tạo bảng nxb
• Lệnh tạo bảng: create table nxb (
manxb char(5)not null, tennxb varchar(50), dcnxb varchar(50), dtnxb varchar(15)
constraint pk_nxb primary key(manxb) )
Go
• Thiết kế dữ liệu:
1.4 Tạo bảng tác giả
• Lệnh tạo bảng: create table tacgia (
matg char(5)not null, tentg varchar(50), dttg varchar(15), dctg varchar(50), coquantg varchar(50),
constraint pk_tacgia primary key(matg) )
1.5 Tạo bảng thẻ độc giả:
• Lệnh tạo bảng: create table thedocgia (
mathe char(5)not null, madg char(5),
ngaytao datetime , ngayhethan datetime,
constraint pk_thedocgia primary key(mathe), Constraint fk_thedocgia_madg
FOREIGN key(madg) REFERENCES DOCGIA (madg) ON DELETE CASCADE
ON UPDATE CASCADE,
constraint kt_ngay check(ngayhethan>ngaytao) )
Go
• Thiết kế dữ liệu:
1.6 Tạo bảng sách:
• Lệnh tạo bảng: create table sach (
masach char(5)not null, tensach varchar(50), theloai varchar(50), tinhtrang varchar(50), soluongco bigint, dongia money, namxb int, matg char(5), manxb char(5),
constraint pk_sach primary key(masach),
constraint chk_namxb check(namxb<=year(getdate())), constraint ck_slco check(soluongco>=0),
Constraint fk_sach_matg
FOREIGN key(matg) REFERENCES TACGIA (matg) ON DELETE CASCADE
ON UPDATE CASCADE, Constraint fk_sach_manxb
FOREIGN key(manxb) REFERENCES NXB(manxb) ON DELETE CASCADE
ON UPDATE CASCADE )
go
• Thiết kế dữ liệu:
1.7 Tạo bảng phiếu mượn:
• Lệnh tạo bảng: create table phieumuon (
sopmuon char(5)not null, mathe char(5),
manv char(5),
ngaymuon datetime default (getdate()), songaymuon int
constraint chk_songaymuon
check(songaymuon>=0 and songaymuon<=30), constraint pk_phieumuon primary key(sopmuon), CONSTRAINT fk_phieumuon_manv
FOREIGN KEY(manv)REFERENCES nhanvien(manv) ON DELETE CASCADE
ON UPDATE CASCADE,
CONSTRAINT fk_phieumuon_MaThe
FOREIGN KEY(mathe)REFERENCES THEDOCGIA(Mathe) ON DELETE CASCADE
ON UPDATE CASCADE )
Go
1.8 Tạo bảng sách mượn:
• Lệnh tạo bảng: create table sachmuon (
sopmuon char(5)not null, masach char(5)not null, soluong int,
constraint chk_soluong check(soluong>=0),
constraint pk_sachmuon primary key(sopmuon,masach), CONSTRAINT fk_sachmuon_masach
FOREIGN KEY(masach)REFERENCES sach(masach) ON DELETE CASCADE
ON UPDATE CASCADE,
CONSTRAINT fk_SACHMUON_sopmuon
FOREIGN KEY(sopmuon)REFERENCES PHIEUMUON(sopmuon) ON DELETE CASCADE
ON UPDATE CASCADE )
Go
1.9 Tạo bảng phiếu nhắc trả:
• Lệnh tạo bảng:
create table phieunhactra (
sopnhactra char(5)not null, sopmuon char(5),
ngaylap datetime default (getdate()),
constraint pk_phieunhactra primary key(sopnhactra), CONSTRAINT fk_sophieunhactra_pmuon
FOREIGN KEY(sopmuon)REFERENCES phieumuon(sopmuon) ON DELETE CASCADE
ON UPDATE CASCADE )
Go
2. Mơ hình quan hệ giữa các bảng
3. Thiết kế các bảng ảo
Để phục vụ cho quá trình xem sửa dễ dàng cũng như làm trung gian giữa các thủ tục, hàm với các bảng dữ liệu chúng ta thiết kế một số khung nhìn cho hệ thống
3.1 Bảng ảo thông tin độc giả
Cho biết thông tin chi tiết về các độc giả như mã thẻ thư viện, họ tên độc giả, phái, ngày tháng năm sinh, lớp nào, địa chỉ nhà, điện thoại liên hệ, ngày làm thẻ, ngày hết hạn thẻ
3.2 Bảng ảo thông tin về sách
Cho biết thông tin chi tiết về các đầu sách như mã, tên sách, thuộc thể loại nào, tình trạng ra sao, số lượng có trong kho, đơn giá của mỗi cuốn, năm xuất bản sách, của nhà xuất bản nào, tác giả nào viết
3.3 Bảng ảo thông tin phiếu mượn
Cho biết một phiếu mượn do ai mượn, nhân viên nào lập phiếu mượn, ngày mượn sách, thời gian mượn sách là bao nhiêu ngày
3.4 Bảng ảo thông tin chi tiết sách mượn
Cho biết thông tin chi tiết về các phiếu mượn đã mượn sách có tên là gì, thuộc thể loại nào, đơn giá sách là bao nhiêu, của tác giả nào, nhà xuất bản nào, số lượng mượn là bao nhiêu
4. Thiết kế các thủ tục lưu trữ
4.1 thủ tục nhập dữ liệu cho các bảng khơng có bảng cha
Đối với thủ tục loại này chỉ cần kiểm tra các khóa chính nhập vào có bị trùng hay khơng. Nếu trùng thì thơng báo bị trùng và khơng cho nhập vào, cịn khơng thì thơng báo thành cơng và nhập vào cơ sơ dữ liệu
CREATE PROCEDURE nhapdocgia ( @ma char(5), @ten varchar(50), @phai bit, @ns datetime, @cq varchar(50), @dc varchar(50), @dt varchar(15) ) AS begin
if exists(select * from docgia where madg=@ma) print ' ma bi trung'
else begin
insert into docgia values(@ma,@ten,@phai,@ns,@cq,@dc,@dt) print ' nhap thanh cong'
end end
------------------------- THỦ TỤC NHẬP CHO BẢNG NHÂN VIÊN -------------
CREATE PROCEDURE nhapnhanvien ( @ma char(5),
@ten varchar(50), @dt varchar(15) )
AS
if exists(select * from nhanvien where manv=@ma) print ' ma bi trung'
else begin
insert into nhanvien values(@ma,@ten,@dt) print ' nhap thanh cong' end
end
----------------------- THỦ TỤC NHẬP CHO BẢNG TÁC GIẢ --------------------
CREATE PROCEDURE nhaptacgia ( @ma char(5), @ten varchar(50), @dt varchar(15), @dc varchar(50), @coquan varchar(50) ) AS
if exists(select * from tacgia where matg=@ma) print ' ma bi trung'
else begin
insert into tacgia
values(@ma,@ten,@dt,@dc,@coquan) print ' nhap thanh cong'
end end
----------------------------THỦ TỤC NHẬP CHO BẢNG NXB ----------------------
CREATE PROCEDURE nhapnxb ( @ma char(5), @ten varchar(50), @dc varchar(15), @dt varchar(50) ) AS
if exists(select * from nxb where manxb=@ma) print ' ma bi trung'
else begin
insert into nxb
values(@ma,@ten,@dc,@dt) print ' nhap thanh cong'
end end
4.2 Thủ tục nhập dữ liệu cho các bảng có bảng cha
Với thủ tục loại này thì yêu cầu các ràng buộc cần chặt trẽ hơn, phức tạp hơn. Ngồi việc kiểm tra khóa chính nhập vào khơng trùng thì cịn phải kiểm tra khóa ngoại tham chiếu tới bảng cha. Nếu kiểm tra khóa ngoại nhập vào khơng có trong bảng cha thì thơng báo lỗi và hủy q trình nhập, nếu thỏa mãn có thì thơng báo thành cơng và thực hiện nhập vào cơ sở dữ liệu
---------- THỦ TỤC NHẬP CHO BẢNG THẺ ĐỘC GIẢ ---------- CREATE PROCEDURE nhapthedocgia
( @mathe char(5), @madg char(5), @ngaytao datetime, @ngayhethan datetime ) as begin
if exists (select * from thedocgia where mathe=@mathe) print 'khoa bi trung'
else
if not exists(select * from docgia where madg=@madg) print 'khong ton tai ma doc gia trong bang doc gia' else begin
if(@ngaytao>@ngayhethan)
print 'nhap lai ngay tao va ngay het han' else
begin
print 'nhap thanh cong' insert into dbo.thedocgia values(@mathe,@madg,@ngaytao,@ngayhethan)
end end
--------- THỦ TỤC NHẬP CHO BẢNG PHIẾU NHẮC TRẢ ------------ CREATE PROCEDURE nhapphieunhactra
( @sopnhactra char(5), @sopmuon char(5), @ngaylap datetime ) as begin
if exists (select * from phieunhactra where sopnhactra=@sopnhactra) print 'khoa bi trung'
else
if not exists(select * from phieumuon where sopmuon=@sopmuon) print 'khong ton tai so phieu muon trong bang phieu muon' else
begin
print'nhap thanh cong' insert into dbo.phieunhactra
values(@sopnhactra,@sopmuon,@ngaylap) end
end
---------- THỦ TỤC NHẬP CHO BẢNG SÁCH ---------------- CREATE PROCEDURE nhapsach
( @ms char(5), @ts varchar(50), @tl varchar(50), @ttrang varchar(50), @solc bigint, @dg money, @namxb int, @matg char(5), @manxb char(5) ) as begin
if exists (select * from sach where masach=@ms) print 'khoa bi trung'
else
if not exists(select * from tacgia where matg=@matg) print'khong ton tai ma tac gia trong bang tac gia' else
if not exists(select * from nxb where manxb=@manxb) print 'khong ton tai manxb trong bang nha xuat ban' else
begin
print'nhap thanh cong' insert into sach
values(@ms,@ts,@tl,@ttrang,@solc,@dg,@namxb,@matg,@manxb) end
end
------------ THỦ TỤC NHẬP CHO BẢNG PHIẾU MƯỢN --------- CREATE PROCEDURE nhapphieumuon
( @sopmuon char(5), @mathe char(5), @manv char(5), @ngaymuon datetime, @songaymuon int ) as begin
if exists (select * from phieumuon where sopmuon=@sopmuon) print 'khoa bi trung'
else
if not exists(select * from nhanvien where manv=@manv) print'khong ton tai ma nhan vien trong bang nhan vien' else
if not exists(select * from thedocgia where mathe=@mathe) print'khong ton tai ma the trong bang the doc gia' else
if(@songaymuon>30)
print'nhap lai so ngay muon lon hon bang 0 va nho hon bang 30' else
begin
print'nhap thanh cong' insert into phieumuon
values(@sopmuon,@mathe,@manv,@ngaymuon,@songaymuon) end
end
------------------------- NHẬP BẢNG SÁCH MƯỢN --------------------------------
CREATE PROCEDURE nhapsachmuon ( @sopmuon char(5), @masach char(5), @sl int ) as begin
if exists(select * from sachmuon where sopmuon=@sopmuon and masach=@masach)
print 'khoa bi trung' else
if not exists(select * from phieumuon where sopmuon=@sopmuon) print ' khong ton tai phieu muon trong bang phieu muon' else
if not exists(select * from sach where masach=@masach) print ' khong ton tai ma sach trong bang sach ' else
begin
declare @slco int
select @slco=soluongco from sach where masach=@masach
if(@sl>@slco)
print ' khong du sach de muon ' else
begin
values(@sopmuon,@masach,@sl) end
end end
4.3 Viết thủ tục nhập dữ liệu cho nhiều bảng
Loại thủ tục này cho phép nhập các thông tin về tài liệu xuất, nhập thực tế và tự động chèn vào các bảng cơ sở dữ liệu có liên quan
----------- THỦ TỤC NHẬP VÀO BẢNG ĐỘC GIẢ VÀ THẺ ĐỘC GIẢ------ CREATE PROC taothedg
( @madg CHAR(5), @mathe CHAR(5), @hoten VARCHAR(50), @phai char(5), @ns DATETIME, @cq VARCHAR(50), @dc VARCHAR(50), @dt VARCHAR(15), @ngaylap DATETIME, @ngayhethan DATETIME ) AS
IF EXISTS(SELECT * FROM docgia WHERE madg=@madg) OR EXISTS(SELECT * FROM THEDOCGIA WHERE mathe=@mathe)
print ' ma bi trung ' ELSE
BEGIN
INSERT INTO docgia VALUES (@madg,@hoten,@phai,@ns,@cq,@dc,@dt)
INSERT INTO thedocgia
VALUES(@mathe,@madg,@ngaylap,@ngayhethan) print ' nhap du lieu thanh cong '
4.4 Thủ tục tạo các thống kê cần thiết cho hệ thống
Thủ tục loại này cho phép đưa ra các thống kê cho chức năng báo cáo thống kê như thống kê số lượt mượn sách, báo cáo sách yêu thích . . .
------------ THỐNG KÊ SỐ LƯỢNG ĐỘC GIẢ MƯỢN SÁCH ----------------- CREATE PROCEDURE SLDOCGIAMUON
AS BEGIN
SELECT THEDOCGIA.Mathe,
DOCGIA.HotenDG,COUNT(PHIEUMUON.Sopmuon) AS SOLANMUON FROM (DOCGIA INNER JOIN THEDOCGIA ON DOCGIA.MaDG = THEDOCGIA.MaDG) INNER JOIN PHIEUMUON ON
THEDOCGIA.Mathe = PHIEUMUON.Mathe
GROUP BY THEDOCGIA.Mathe, DOCGIA.HotenDG; DECLARE @SL INT
SELECT @SL=COUNT (*) FROM PHIEUMUON
PRINT ' SO LUOT DOC GIA MUON SACH LA ' + CAST(@SL AS VARCHAR(5))
END
-------------- TK SỐ LƯỢNG SÁCH MƯỢN -------------------------- CREATE PROCEDURE TKSLSACHMUON AS
BEGIN
SELECT MASACH, SUM(SOLUONG)AS TONGSLMUON FROM SACHMUON GROUP BY MASACH
END
EXECUTE TKSLSACHMUON
--------------- BC SÁCH YÊU THÍCH ---------------------------------- CREATE PROC BCSACHYEUTHICH
AS
SELECT SACH.Masach, SACH.Tensach, Sum(SACHMUON.Soluong) AS tongsoluong
FROM SACH INNER JOIN SACHMUON ON SACH.Masach = SACHMUON.Masach
GROUP BY SACH.Masach, SACH.Tensach ORDER BY Sum(SACHMUON.Soluong) DESC; GO
5. Thiết kế các hàm (function )
5.1 Thiết kế hàm xem thông tin độc giả
Hàm này cho phép người dùng nhập vào một mã thẻ độc giả và hàm trả về bản ghi chứa thơng tin về mã thẻ đó. Hàm này cịn phục vụ cho chức năng kiểm tra thẻ độc giả khi mượn sách
CREATE FUNCTION XEMTHONGTINDG(@MATHE CHAR(5)) RETURNS TABLE AS
RETURN
SELECT * FROM THONGTINTHEDG WHERE MATHE=@MATHE
5.2 Thiết kế hàm xem thông tin phiếu mượn
Hàm này cho phép nhập vào một mã phiếu mượn và trả về các thông tin liên quan đến phiếu mượn đó như người mượn, người lập phiếu, thời gian mượn . . .
CREATE FUNCTION XEMTTPHIEUMUON(@SOPHIEU CHAR(5))
RETURNS TABLE AS RETURN
SELECT * FROM THONGTINPHIEUMUON WHERE SOPMUON=@SOPHIEU
5.3 Thiết kế hàm xem thông tin chi tiết phiếu mượn
Hàm này cho phép nhập vào một số phiếu mượn và trả về các thông tin chi tiết về sách mượn trong phiếu mượn đó
CREATE FUNCTION XEMTTCHITIETPHIEUMUON(@SOPHIEU CHAR(5))
RETURNS TABLE AS RETURN
SELECT * FROM THONGTINCHITIETSACHMUON WHERE SOPMUON=@SOPHIEU
5.4 Thiết kế hàm xem thông tin sách
Hàm này cho phép nhập và một mã sách và trả về các thông tin chi tiết liên quan đến mã sách đó. Hàm này cịn phục vụ cho chức năng tra cứu tài liệu của người dùng là độc giả
RETURN
SELECT * FROM THONGTINSACH WHERE MASACH=@MASACH
6. Tạo trigger hệ thống
Tạo các trigger kiểm tra điều kiện hợp lệ của dữ liệu trong bảng Sách khi mà thêm mới, cập nhật lại, xóa dữ liệu trong bảng Sách mượn.
6.1 Tạo trigger khi cập nhật bản ghi
CREATE TRIGGER trg_sachmuon_update ON SACHMUON FOR UPDATE AS if update(soluong) IF @@ROWCOUNT=1 BEGIN update sach
set sach.soluongco = sach.soluongco - (inserted.soluong - deleted.soluong)
from(deleted inner join inserted on deleted.masach=inserted.masach) inner join sach on sach.masach=deleted.masach
END ELSE BEGIN UPDATE sach SET sach.soluongco=sach.soluongco- (SELECT SUM(inserted.soluong-deleted.soluong) FROM inserted INNER JOIN deleted
ON inserted.masach=deleted.masach WHERE inserted.masach=sach.masach)
WHERE sach.masach IN(SELECT masach FROM inserted) END
6.2 Tạo trigger khi delete bản ghi.
• Trường hợp xóa 1 bản ghi create trigger trg_sachmuon_delete on sachmuon
for delete as
update sach
from deleted inner join sach on deleted.masach=sach.masach
• Trường hợp xóa nhiều bản ghi
CREATE TRIGGER trg_sachmuon_delete ON sachmuon
FOR DELETE AS
BEGIN
DECLARE @masach char(5) DECLARE @soluong int
DECLARE CONTRO CURSOR FOR
SELECT deleted.masach,deleted.soluong FROM deleted
OPEN CONTRO
FETCH NEXT FROM CONTRO INTO @masach,@soluong WHILE @@FETCH_STATUS=0
BEGIN
UPDATE sach
SET soluongco=soluongco+@soluong WHERE masach=@masach
FETCH NEXT FROM CONTRO INTO @masach, @soluong END
CLOSE CONTRO
DEALLOCATE CONTRO END
6.3 Tạo trigger khi insert bản ghi.
CREATE TRIGGER trg_sachmuon_insert ON sachmuon
FOR INSERT AS
BEGIN
DECLARE @masach char(5) DECLARE @soluong int
DECLARE CONTRO CURSOR FOR
SELECT inserted.masach, inserted.soluong FROM inserted
OPEN CONTRO
FETCH NEXT FROM CONTRO INTO @masach, @soluong WHILE @@FETCH_STATUS=0
BEGIN
WHERE masach=@masach
FETCH NEXT FROM CONTRO INTO @masach, @soluong END
CLOSE CONTRO
DEALLOCATE CONTRO END.
CHƯƠNGIV. LẬP TRÌNH CHẠY THỬ
1. Kết nối SQL server2000 với Visual Basic 6.0
Public cnn As New ADODB.Connection Public Sub ketnoi ()
cnn.ConnectionString = "Provider=MSDASQL, driver= {SQL server}, server=(local),uid=sa,pwq=,databases=qltvdhhanoi"
cnn.Open End Sub
2. Thiết kế giải thuật cho từng chức năng
2.2 chức năng quản lý thẻ độc giả
2.5 Chức năng đăng nhập
2.7 Chức năng lập phiếu nhắc trả
2.9 Chức năng tìm kiếm sách
3. Thiết kế giao diện
3.1 Màn hình đăng nhập
3.2 Form main khi đăng nhập quyền thủ thư
3.5 Form quản lý sách
3.7 Form tìm kiếm sách theo mã sách
4. Thiết kế tài liệu xuất
4.1 Tạo thẻ độc giả
4.3 Báo cáo sách yêu thích