THIẾT KẾ HỆ THỐNG

Một phần của tài liệu BÀI TẬP LỚN: HỆ QUẢN TRỊ CƠ SỞ DỮ LIỆU ĐỀ TÀI: Quản lý thư viện Đại Học Hà Nội (Trang 28)

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 (adsbygoogle = window.adsbygoogle || []).push({});

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 (adsbygoogle = window.adsbygoogle || []).push({});

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 ) (adsbygoogle = window.adsbygoogle || []).push({});

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), (adsbygoogle = window.adsbygoogle || []).push({});

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 (adsbygoogle = window.adsbygoogle || []).push({});

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 (adsbygoogle = window.adsbygoogle || []).push({});

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 -------------------------------- (adsbygoogle = window.adsbygoogle || []).push({});

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 (adsbygoogle = window.adsbygoogle || []).push({});

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 (adsbygoogle = window.adsbygoogle || []).push({});

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 (adsbygoogle = window.adsbygoogle || []).push({});

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ư (adsbygoogle = window.adsbygoogle || []).push({});

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

Một phần của tài liệu BÀI TẬP LỚN: HỆ QUẢN TRỊ CƠ SỞ DỮ LIỆU ĐỀ TÀI: Quản lý thư viện Đại Học Hà Nội (Trang 28)