Đồ án Quản lý thư viện

Khái niệm về phụ thuộc hàm trong một quan hệ là một quan niệm có tầm quan trọng rất lớn đối với việc thiết kế mô hình dữ liệu. Định nghĩa: Cho R(U) là một lược đồ quan hệ với U = { A1, .,An } là tập hợp thuộc tính.X và Y là tập con của U. Nói rằng X->Y (đọc là X xác định Y hoặc Y phụ thuộc vào hàm X),nếu r là một quan hệ xác định trên R(U) sao cho bất kỳ hai bộ t1, t2 thuộc r mà t1 [X] = t2 [ X] th× t1[Y] = t2 [ Y ]. *Hệ tiêu đề Armstrong trong phụ thuộc hàm : Gọi F là tất cả các phụ thuộc hàm với lược đồ quan hệ R (U) và X->Y là một phụ thuộc hàm,trong đó X,Y  U. Khi đó ta có F+ là tập hợp tất cả các phụ thuộc hàm được sinh ra từ F khi sử dụng tiêu đề Armstrong được gọi là bao đóng của F.

doc100 trang | Chia sẻ: Dung Lona | Lượt xem: 1457 | Lượt tải: 1download
Bạn đang xem trước 20 trang tài liệu Đồ án Quản lý thư viện, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
ý các Structure Members (như FullName, Age ) cần phải được Declared với keyword Dim, Public, Private hay Friend, nhưng không thể dùng Protected vì Structure không thể Inherit từ một Structure khác. Sở dĩ, có dùng Private là vì bên trong Structure có thể có Property, Sub/Function. v. v.. Thay đổi trong Collections VB6 hổ trợ Collection và sau nầy Windows Scripting Host Library cho ta collection kiểu Dictionary. VB.NET cho ta một thành phần collection rất hùng hậu trong Namespace System.Collections. Vì Collection là một trong những công cụ rất thông dụng và hiệu năng trong VB.NET nên ta sẽ có một bài dành riêng cho collection sau này. Dưới đây là danh sách các collections ta sẽ dùng thường xuyên: Collection Chức năng ArrayList Dynamic Array tự động lớn lên khi elements được bỏ vào. BitArray Array chứa trị số Boolean (True/False). HashTable Collection chứa những cặp key-value data, cho ta dùng làm tự điển. Queue Chứa một FIFO (First In, First Out) structure.Element có thể là bất cứ Object loại nào. Stack Chứa một LIFO (Last In, First Out) structure. SortedList Chứa một danh sách những cặp key-value data được sắp theo thứ tự. Arithmetic Operators mới VB.NET cho ta thêm cách viết Arithmetic Operator mới mà C programmers quen từ lâu nay. X += 4 tương đương với X = X + 4 Mess &= " text" tương đương với Mess = Mess & " text" Arithmetic Operation Trong VB6 Cách viết tắc mới Cộng X = X +5 X += 5 Trừ X = X - 10 X -= 10 Nhân X = X * 7 X *= 7 Chia X = X / 19 X /= 19 Chia Integer X = X \ 13 X \= 13 Lũy thừa X = X ^ 3 X ^= 3 Ghép Strings X = X & "more text" X &= "more text" Ta vẫn có thể tiếp tục dùng cách viết trong VB6, nhưng bây giờ có thêm một cách viết gọn hơn. Short Circuit trong IF.. THEN Statement Trong VB6, nếu ta viết: Dim myInt as Integer myInt = 0 If (myInt 0) And (17 \ myInt < 5 ) Then Thì sẽ bị Division by Zero error, vì mặc dầu phần (myInt 0) là False, nhưng VB6 vẫn tiếp tục tính phần (17 \ myInt < 5 ), và tạo ra error vì 17 chia cho một số 0. Trong vài ngôn ngữ lập trình khác, khi (myInt 0) là False thì nó không tính thêm nữa, tức là nó nói rằng khi một phần của AND là False thì nhất định kết quả của Logical Statement trong IF phải là False. Ðặc tính nầy gọi là Short-Circuit (đi tắt). Nếu ta dùng code nói trên trong VB.NET, nó vẫn cho Division by Zero error giống như VB6. Tuy nhiên, nếu ta muốn dùng đặc tính Short-Circuit thì ta chỉ cần thay thế chữ And bằng AndAlso như sau: Dim myInt as Integer myInt = 0 If (myInt 0) AndAlso (17 \ myInt < 5 ) Then Short-Circuit cũng áp dụng cho Logical OR khi ta thay thế chữ Or bằng OrElse để nói rằng khi phần đầu của OR là True thì nhất định kết quả của Logical Statement trong IF phải là True. Không còn Set statement cho Object Trong VB6 ta có thể viết: Set x = New Product Set w = x Trong VB.NET sẽ được viết lại như sau: x = New Product() w = x Bây giờ ta không cần phải nhớ dùng chữ Set khi nói đến Object. Thay đổi trong cách viết Property routines Dùng một Property duy nhất Nếu trong VB6 ta viết: Private mdescription as String Public Property Let Description (Value As String) mdescription = Value End Property Public Property Get Description() As String Description = mdescription End Property Trong VB.NET Let và Get đuợc hợp lại trong một Property routine duy nhất và ta lại dùng chữ Set thay cho chữ Let (mặc dầu chữ Set không còn dùng cho Object như mới nói ở trên) như sau: Private mdescription As String Public Property Description() As String Set (ByVal Value As String) mdescription = Value End Set Get Description = mdescription End Get End Property ReadOnly và WriteOnly property Bây giờ nếu Property là ReadOnly ta sẽ viết: Public ReadOnly Property Age() As Integer Get Age = 3 End Get End Property hay WriteOnly ta sẽ viết: Private _data As Integer Public WriteOnly Property Data() As Integer Set (ByVal Value As String) _data = Value End Set End Property Default Properties Ta dùng Default keyword để tạo ra Default Property như sau: Default Public Property Item(ByVal Index As Integer) as String VB.NET bắt buộc ta phải ít nhất một parameter cho Default Property. Dùng Reserved Word làm Procedure Name Trong VB.NET ta có thể dùng Reserved Word làm Procedure Name bằng cách để nó giữa ngoặc vuông. Giả tỉ ta muốn dùng chữ Compare làm tên một Function, ta sẽ viết như sau: Public Function [Compare] (ByVal v1 As Integer, ByVal v2 As Integer) As Boolean Structured Error Handling TRY... CATCH... FINALLY VB.NET cho ta Structure TRY... CATCH... FINALLY... END TRY để xử lý error. Thí dụ như trong bài toán chia dưới đây, nếu bị Division by 0 error thì ta sẽ cho kết quả bằng 0. Dù có error hay không, program vẫn hiển thị kết quả trong Output Window qua statement Console. WriteLine( result) trong phần Finally: Try result = a / b ' if this section has error jump to Catch section Catch ' only get here if an error occurs between Try and Catch result = 0 Finally ' This section is optional, but is always executed whether there is an error or not Console. WriteLine( result) End Try Nếu ta không code gì ở phần Catch thì có nghĩa là chúng ta có Handle Error nhưng lại không làm gì hết, do đó Program sẽ không bị lỗi. Ngược lại, nếu ta không dùng Try.. Catch, thì program sẽ báo lỗi. Nếu muốn nhảy ra khỏi Try Structure bất cứ lúc nào ta có thể dùng Exit Try, Những cách CATCH error Ta có thể dùng Catch giống như Select Case để có một cách xử lý cho mỗi error: Try ' Main code goes here Catch When Err.Number=5 ' handle Error 5 Catch ' handle other errors End Try Ta có thể Catch Error Exception data trong một variable để dùng nó như sau: Catch e as Exception MessageBox.Show (e.ToString) Hai cách code ở trên có thể được gợp lại thành: Catch e As Exception When Err.Number = 5 Thay đổi trong cách viết Sub/Function Dùng dấu ngoặc khi gọi Procedure Trong VB6, nếu không dùng keyword Call ta không dùng dấu ngoặc khi gọi Sub. Trong VB.NET ta luôn luôn dùng cặp dấu ngoặc, ngay cả khi không có parameter. Thí dụ: ProcessData() x = New Customer() ByVal là Default cho mọi Parameters Trong VB6, ByRef là default cho các parameters passed vô Sub/Function. Tức là, Sub/Function có thể vô tình làm thay thổi trị số nguyên thủy của parameter variables. Trong VB.NET, ByVal là default cho các parameters passed vô Sub/Function. Do đó, nó sẽ tránh lỗi lầm nói trên. Optional Parameter cần có trị số Default Trong VB6 ta có thể dùng IsMissing để biết xem Optional parameter có hiện diện không. VB.NET đã bỏ IsMissing và bắt buộc ta phải cung cấp trị số Default cho Optional parameter trong phần procedure declaration giống như sau đây: Public Sub VerifyInput (Optional ByVal InputData as String="") trong thí dụ nầy ta cho Default value của Optional parameter InputData là Empty string. Return Statement Hãy xem một thí dụ dùng Function để return một Customer Object trong VB6: Public Function GetCustomer (ByVal CustID As Long) As Customer Dim objCust As Customer Set objCust = New Customer objCust.Load CustID Set GetCustomer = objCust End Function Trong VB.NET ta có thể dùng Return Statement để Return kết quả của một Function thay vì dùng chính tên của Function. Public Function GetCustomer (ByVal CustID As Long) As Customer Dim objCust As New Customer(CustID) Return objCust End Function Những chức năng Đối Tượng mới của VB.NET VB.NET khắc phục những giới hạn về Đối Tượng (Object-Oriented) của VB6 và mang đến cho ta một ngôn ngữ lập trình hoàn toàn Object-Oriented (OO). Gần như mọi thứ trong VB.NET đều liên hệ với Object. Classes và Objects, nguyên tắc Abstraction Theo phương pháp đối tượng, program được thiết kế để một phần code đại diện cho một vật tương đương ngoài đời. Nó được gọi là Class. Khi lập trình VB6 ta đã dùng những controls từ Toolbox như Textbox, Label, Listbox.. v. v.. Textbox là Class của các Objects Text1, Text2. Cũng như Label1, Label2 là những Objects tạo ra từ Class Label. Ta hay dùng hai từ Class và Object lẫn lộn nhau. Điều đó không quan trọng, miễn là ta biết rằng Class là một ý niệm Trừu tượng (Abstraction), còn Object là một vật thực hữu. Thường thường khi ta phân tích một vấn đề để thiết kế chương trình thì các Danh từ (Nouns) là những Classes. Giả dụ ta phân tích hoạt động của một Nhà Kho (warehouse). Ta có phòng chứa, ngăn tủ, bãi nhận hàng, xe nâng hàng, nhân viên.. v. v. , mỗi thứ đều có thể là một Object nên ta sẽ thiết kế một Class cho nó. Fields, Properties, Methods và Events, nguyên tắc Encapsulation Class CaSĩ diễn tả CaSĩ là người như thế nào. Như SốBàiHát là một Public Variable của Class, được gọi là Field có thể được đọc/viết trực tiếp. Còn Kiểu tóc (dài, ngắn, màu đen, có sọc nâu... ), Giọng hát (cao, trầm,.. ). là những Properties. Chúng cũng giống như Field nhưng được implemented (thi hành) bằng cách dùng procedures Property Get và Property Set. Property Set có thể được coded để kiểm soát nếu "Kiểu tóc" không thích hợp thì sẽ bị loại bỏ. Ngược lại, nếu "Kiểu tóc" thích hợp và được áp dụng thì ta sẽ thấy kết quả ngay là CaSĩ lại đẹp thêm ra. Thường thường Fields và Properties là các Danh từ (Nouns). Inheritance (Thừa Kế) Nguyên tắc Encapsulation nói trên cho phép ta dùng nhiều Objects của một hay nhiều Classes một cách an toàn, tức là không sợ Methods của các Objects giẫm chân lên nhau. Polymorphism (Đa dạng) Polymorphism là khả năng dùng Class Members trùng tên của Objects thuộc về các Classes khác nhau. Polymorphism thể hiện dưới nhiều hình thức: Dùng OO trong VB.NET Tạo một Class mới Để một Class mới trong VB.NET IDE bằng cách dùng Menu Command Project | Add Class.Dialog Add New Item sẽ hiện ra, chọn Class trong số hình các Icons nằm trong khung bên phải của Dialog. Source code của Class mới nầy sẽ được chứa trong một VB source file với extension vb. Trong VB.NET tất cả mọi VB source files đều có extension.vb. System sẽ nhận diện ra loại VB file (form, class, module,. v. v.. ) nhờ đọc content của file, chớ không dựa vào file extension. Nếu bạn muốn đặt tên cho Class mới nầy là TheClass chẳng hạn, thì bạn có thể sửa tên nó trong Dialog. Khi bạn click button Open một file mới sẽ được cho thêm vào trong Project và nó chứa hai hàng code sau: Public Class TheClass End Class 2.7 Tạo một Class mới Class Keyword Trong một.vb file ta có thể viết nhiều Classes, code của mỗi Class nằm trong một Class... End Class block. Thí dụ: Public Class TheClass Public Sub Greeting() MessageBox.Show("Hello world", MsgBoxStyle.Information, "TheClass") End Sub End Class MessageBox.Show và MsgBoxStyle.Information trong VB.NET thay thế MsgBox và vbInformation trong VB6. Classes và Namespaces Nhắc lại là.NET dùng Namespace để sắp đặt các Classes cho thứ tự theo nhóm, loại. Namespaces được declared với một Block Structure giống như sau: Namespace Vovisoft Public Class TheClass Public Sub Greeting() MessageBox.Show("Hello world", MsgBoxStyle.Information, "TheClass") End Sub End Class End Namespace Muốn nói đến bất cứ Class, Structure, hay thứ gì được declared bên trong một Namespace... End Namespace block ta phải dùng tên Namespace trước. Thí dụ: Private myObject As Vovisoft.TheClass Một source file có thể chứa nhiều Namespaces, và bên trong mỗi Namespace lại có thể có nhiều Classes. Ngoài ra, Classes thuộc về cùng một Namespace có thể nằm trong nhiều files khác nhau trong một VB.NET project. Thí dụ ta có một source file với code như sau: Namespace Vovisoft Public Class TheClass ' Code End Class End Namespace Và một source file khác trong cùng project với code: Namespace Vovisoft Public Class TheOtherClass ' Code End Class End Namespace Vậy thì trong Namespace Vovisoft ta có hai Classes TheClass và TheOtherClass. Nhớ là, by default, Root Namespace của một VB.NET project là tên của project ấy. Khi ta dùng Namespace block structure là chúng ta đang thêm một tầng tên vào Root Namespace. Do đó, trong thí dụ trên nếu tên project là MyProject thì, từ bên ngoài project ấy, ta có thể declare một variable như sau: Private myObject As MyProject.Vovisoft.TheClass Tạo ra Methods Methods trong VB.NET có hai thứ: Sub và Function. Function thì phải return một kết quả. By default, parameters của Method là ByVal chớ không phải ByRef. Tức là nếu muốn parameter nào ByRef thì phải nhớ khai ra rõ ràng. Nhắc lại là khi một variable được passed vào trong một method bằng ByVal thì system cho method đó một copy (bản sao) của variable, do đó, trị số của variable không bị thay đổi bởi công tác của method. Ngược lại, nếu một variable được passed vào trong một method bằng ByRef thì method dùng chính variable đó, do đó, trị số của variable có thể bị thay đổi bởi công tác của method. Ta có thể giới hạn việc sử dụng một method bằng cách áp đặt một Access Modifier (sửa đổi quyền truy nhập) hay còn gọi là Scoping keyword (phạm vi hoạt động): Private - chỉ cho phép code trong cùng Class được gọi. Friend - chỉ cho phép code trong cùng project/component được gọi. Public - cho phép ai gọi cũng được. Protected - cho phép code trong subclasses (classes con, cháu) được gọi. Protected Friend - cho phép code trong cùng project/component hay code trong subclasses được gọi. Tạo ra Properties Trong VB.NET ta chỉ dùng một routine duy nhất cho mỗi Property, với hai chữ Get và Set như sau (không còn dùng chữ Let của VB6 nữa): Private mdescription As String Public Property Description() As String Set (ByVal Value As String) mdescription = Value End Set Get Description = mdescription End Get End Property ReadOnly và WriteOnly property Bây giờ nếu Property là ReadOnly ta sẽ lấy phần Set ra và viết: Public ReadOnly Property Age() As Integer Get Age = 3 End Get End Property hay WriteOnly ta sẽ ấy phần Get ra và viết: Private _data As Integer Public WriteOnly Property Data() As Integer Set (ByVal Value As Integer) _data = Value End Set End Property Default Properties Default Property là property của Object mà program dùng khi ta chỉ cho tên của Object và không nói rõ property nào. Thí dụ trong VB6 khi ta code: TextBox1 = "The house of rising sun" VB6 hiểu rằng ta muốn dùng Default Property text của Textbox1 nên code ấy tương đương với: TextBox1.text = "The house of rising sun" Trong VB6 khi ta dùng keyword Set với tên của Object, thí dụ như: Dim myTextBox As Textbox Set myTextBox = TextBox1 program sẽ hiểu là ta muốn nói đến chính Object myTextBox. Nếu không thì nó biết ta muốn nói đến Object Default Property mà làm biếng code cho rõ ra. Trong VB.NET Default Property phải là một Property array. Một Property array là một property được Indexed (nói đến từng Item bằng con số Index) giống như một array. Lý do chính của sự bắt buộc nầy là để khỏi lẫn lộn giữa hai trường hợp ta nói đến Default property của một Object hay chính Object ấy, vì trong VB.NET ta không còn dùng Set keyword cho Object assignment nữa (ta chỉ còn dùng keyword Set trong Property mà thôi). Bây giờ hể muốn nói đến Default Property của Object thì phải dùng Index. Thí dụ để nói đến chính Object, ta code: myValue = myObject để nói đến Default Property Item 3 của Object, ta code: myValue = myObject(3) Sự thay đổi từ VB6 nầy có nghĩa là một property array procedure phải nhận một parameter. Thí dụ: Private theData(100) As String Default Public Property Data(ByVal Index As Integer) As String Get Data = theData(Index) End Get Set(ByVal Value As String) theData(Index) = Value End Set End Property Ta không thể viết: TextBox1 = "Good morning!" như trong VB6 được nữa, mà phải viết: TextBox1.text = "Good morning!" Vì Property Text không còn là Default Property của TextBox. Overloading methods Một trong những chức năng đa diện (Polymorphism) hùng mạnh nhất của VB.NET là overload (quá tải, có rồi mà còn cho thêm) một method. Overloading có nghĩa là ta có thể dùng cùng một tên cho nhiều methods - miễn là chúng có danh sách các parameters khác nhau, hoặc là parameter dùng data type khác nhau (td: method nầy dùng Integer, method kia dùng String), hoặc là số parameters khác nhau (td: method nầy có 2 parameters, method kia có 3 parameters). Overloading không thể được thực hiện chỉ bằng cách thay đổi data type của Return value của Function. Phải có parameter list khác nhau mới được. Dưới đây là thí dụ ta dùng Overloading để code hai Functions tìm data, một cái cho String, một cái cho Integer: Public Function FindData(ByVal Name As String) As ArrayList ' find data and return result End Function Friend Function FindData(ByVal Age As Integer) As ArrayList ' find data and return result End Function Để ý là ta có thể cho mỗi overloading Function một phạm vi hoạt động (Scope on implementation) khác nhau. Trong thí dụ trên ta dùng Access Modifier Public cho Function đầu và Friend cho Function sau. Object Lifecycle Object Lifecycle (cuộc đời của Object) được dùng để nói đến khi nào Object bắt đầu hiện hữu và khi nào nó không còn nữa. Sở dĩ ta cần biết rõ cuộc đời của một Object bắt đầu và chấm dứt lúc nào là để tránh dùng nó khi nó không hiện hữu, tức là chưa ra đời hay đã khuất bóng rồi. New method Trong VB6, khi một Object thành hình thì Sub Class_Initialize được executed. Tương đương như vậy, trong VB.NET ta có Sub New(), gọi là Constructor. VB.NET bảo đảm Sub New() sẽ được CLR gọi khi Object được instantiated và nó chạy trước bất cứ code nào trong Object. Nếu Sub Class_Initialize của một Class Object trong VB6 không nhận parameter thì Sub New() trong VB.NET chẳng những có nhận parameters mà còn cho phép ta nhiều cách để gọi nó. Sự khác biệt trong Constructors của VB6 và VB.NET rất quan trọng. Phần 2: XÂY DỰNG CHƯƠNG TRÌNH Chương 1: Khảo sát hệ thống Lý do phát triển Xuất phát từ yêu cầu cấp thiết của thực tiễn , tại hầu hết các đơn vị Thư viện ở nước ta hiện nay vẫn còn quản lý theo phương thức truyền thống. Đó là cách quản lý và lưu trữ trên giấy tờ, sổ sách. Phương thức này có rất nhiều hạn chế. Để quản lý được đầy đủ, chi tiết, và chính xác, hàng năm, Thư viện phải mất một khoản chi phí khá lớn cho việc mua nguyên liệu (giấy tờ, sổ sách, tư liệu). Hơn nữa, do đặc điểm chất liệu giấy rất nhanh hỏng, phải thường xuyên thay thế, nâng cấp, mỗi lần thay đổi là một lần phải sao chép sổ sách, bảo quản tư liệu.. tốn kém cả về chi phí đầu tư, vừa mất nhiều thời gian và sức lực. Hoạt động quản lý, tra cứu theo cách trên cũng chiếm rất nhiều thời gian, công sức của cả người thủ thư lẫn bạn đọc mà hiệu quả đạt được lại không cao. Trong điều kiện trình độ khoa học công nghệ còn kém, những thành tựu của nó chưa đủ để đáp ứng cho nhu cầu ứng dụng, phương thức quản lý truyền thống xét ở phương diện nào đó cũng đã phát huy tác dụng và giữ một vai trò quan trọng. Ngày nay , cuộc cách mạng khoa học - công nghệ và những thành tựu của nó đang góp phần làm biến đổi nhanh chóng và sâu sắc mọi mặt của đời sống xã hội, trở thành công cụ không thể thiếu trong nhiều lĩnh vực hoạt động như: ứng dụng trong công tác quản lý, nghiên cứu, hỗ trợ công tác chuyên môn và trao đổi thông tin. Đặc biệt, nó càng trở nên quan trọng đối với các ngành liên quan tới tri thức, thông tin, tư liệu... như hoạt động thư viện. Khảo sát hiện trạng Một thư viện cần quản lý việc đăng ký, mượn và tra sách của các bạn đọc thư viện. Sau đây là phần mô tả theo các nghiệp vự hàng ngày của thư viện: Nhân viên trong thư viện sẽ gọi mỗi một quyển sách là một đầu sách. Chúng được phân biệt với nhau bởi ID. Các đầu sách đó sẽ được viết bằng nhiều ngôn ngữ khác nhau. Sách được sắp xếp theo thể loại sách trong thư viện. Mỗi một thể loại thì được để ở một khu khác nhau. Các quyển sách thì sẽ có tác giả và nhà xuất bản cũng như nội dung tóm tắt khi độc giả yêu cầu muốn biết về cuốn sách đó. Khi bạn đọc muốn biết về nội dung của một cuốn nào đó nhân viên sẽ xem phần tóm tắt của quyển sách đó và trả lời bạn đọc. Để trở thành độc giả của thư viện thì mỗi bạn đọc phải đăng ký và cung cấp thông tin cá nhân như là địa chỉ, số điện thoại của mình. Bạn sẽ được cấp một thẻ với mã số bạn đọc để phân biệt. Thẻ này có giá trị là 6 tháng kể từ ngày đăng ký. Một tuần trước ngày hết hạn thì nhân viên thư viện sẽ thông báo cho độc giả biết để đăng ký gia hạn thêm. a) Đăng ký chờ mượn sách: Nếu bạn đọc muốn mượn một cuốn sách, nhưng cuốn này bạn đọc khác đang mượn, thì người này có thể đăng ký và chờ. Khi cuốn sách đó được trả về, thì thủ thư phải thông báo đến bạn đọc đăng ký trước nhất trong danh sách những bạn đọc đang chờ mượn sách đó. b)Mượn sách: Một cuốn sách có thể được mượn tối đa 14 ngày mỗi một độc giả sẽ được mượn tối đa 3 quyển sách. Nếu quá hạn, thì một tuần sau kể từ ngày đến hạn trả sách (ngay_hethan) mà sách vẫn chưa được trả, thủ thư sẽ gởi thông báo nhắc nhở bạn đọc đó trả sách. Khi mượn sách, bạn đọc đem sách đến quầy để gặp trực tiếp thủ thư. Thủ thư sử dụng máy để đọc thẻ từ và chương trình hiển thị thông tin về bạn đọc mang thẻ đó như: tên, địa chỉ, điện thoại, và ngày hết hạn thẻ. Nếu thẻ nào gần sắp hết hạn hay đã hết hạn thì chương trình cũng sẽ cảnh báo thẻ đó. Ngoài ra, chương trình còn hiển thị thông tin về việc mượn trả sách của bạn đọc bao gồm: mã sách (masach), ngày mượn (ngay_muon), ngày đến hạn phải trả sách (ngay_tra) theo thứ tự sách nào mượn lâu nhất trước. Những sách nào quá hạn mượn hay gần sắp đến hạn sẽ được đánh dấu để làm nổi bật thông tin cho thủ thư biết. Nếu tất cả thông tin về tài khoản của bạn đọc hợp lệ, thì thủ thư sẽ cho mượn sách. c)Trả sách: Khi sách được trả, thủ thư kiểm tìm kiếm mã độc giả và kiểm tra xem có đúng những quyển sách đã mượn hay không? Thông tin về tác giả, mã số bạn đọc, tên và ngày đến hạn trả sách xuất hiện trên màn hình. Sau khi độc giả trả sách thì cập nhật lại trạng thái của đầu sách và cuốn sách. d)Phát sinh báo cáo thống kê: Thủ thư thường muốn biết các thông tin như: Có bao nhiêu phiếu mượn sách thư viện trong năm qua? Những cuốn sách nào hay được mượn? Những cuốn sách nào ít được mượn ? (số lần mượn bao nhiêu là nhiều hay ít do thủ thư quy định.) Danh sách những độc giả hay mượn sách? Tỷ lệ những phiếu mượn trả sách quá hạn? 3.Mẫubiểu liên quan a.Thẻ độc giả BM2: Thẻ Độc Giả Họ và tên: Loại độc giả: Ngày sinh: Địa chỉ: Email: Ngày lập thẻ: Người lập: b.Thông tin sách BM3: Thông Tin Sách Tên sách: Thể loại: Tác giả: Năm xuất bản: Nhà xuất bản: Ngày nhập: Trị giá: Người Tiếp Nhận: c.Danh sách của sách BM4: Danh Sách Sách STT Mã Sách Tên Sách Tác Giả Số Lượt Mượn Tình Trạng 1 d. Phiếu mượn sách BM5: Phiếu Mượn Sách Họ tên độc giả: Ngày mượn: Ngày trả: Trạng thái: STT Mã Sách Tên Sách Thể Loại Tác Giả 1 2 Chương 2- PHÂN TÍCH THIẾT KẾ HỆ THỐNG I-NHÓM CHỨC NĂNG THEO MẠCH CÔNG VIỆC A. Nhóm quản lý 1. Quản lý đầu sách - Quản lý thông tin đầu sách, các thông tin liên quan đến đầu sách, nội dung mô tả chi tiết về đầu sách, loại sách, trạng thái sách, tên sách, tựa đề sách, các ký hiệu phân loại sách, tác giá sách, năm xuất bản, số lần tái bản. - Hỗ trợ tối đa việc tra cứu đầu sách theo tất cả các thông tin liên quan đên sách, kể cả phẩn mô tả và ghi chú của đầu sách. 2.Quản lý phân loại sách - Quản lý cả các loại thông tin của một số dạng dữ liệu khác (tạp chí, bao chí, phim tư liệu, các dạng tài liệu khác,..). 3. Quản lý nhà xuất bản - Quản lý thông tin nhà xuất bản, lưu trữ thông tin nhà xuất bản như phần quan trọng trong việc hỗ trợ tìm kiếm các loại tài liệu và đầu sách liên quan 4. Quản lý tình trạng sách - Quản lý trạng thái sách, sách đang trong tình trạng phục vụ hay bảo dưỡng, đầu sách trong kho còn hay hết, có thể phục vụ nhu cầu muợn của đọc giả hay không? 5. Quản lý tác giả sách - Quản lý thông tin tác giả sách, lưu trữ các thông tin liên quan đến tác giả nhằm tạo thuận lợi cho việc tìm kiếm các thông tin đầu sách dễ dàng và nhanh chóng. 6. Quản lý độc giả - Quản lý thông tin đọc giả thông qua mã số, lập hệ thống thẻ mượn, thẻ thẻ đọc sách, các loại thẻ khác dành cho nhiều đối tượng bạn đọc trong thư viện. Quản lý hình ảnh độc giả. 7. Quản lý nhân viên - Quản lý nhân viên (thủ thư) của thư viên, nhân viên trực ban, nhân viên chịu trách nhiệm trong từng vị trí đặc trưng, quản lý các đối tượng liên quan khác. - Lập thời gian biểu, phân công công tác, phân ca làm việc. 8. Quản lý quyền và phân quyền - Chế độ phân quyền hoàn chỉnh, nhằm phục vụ cho môi trường cộng tác và đa người dùng, phần quyền phân cấp do chính ban quản trị thư viên thực hiện. B. Nhóm thống kê, báo cáo 1.Hệ thống báo cáo      - Báo cáo nhà sách      - Báo cáo nhà xuất bản      - Báo cáo tác giả sách      - Báo cáo bạn đọc      - Báo cáo phiếu mượn sách 2. Hệ thống thống kê     - Thống kê sách     - Thống kê nhà xuất bản     - Thống kê tác giả sách    - Các thống kê khách liên quan II- BIỂU ĐỒ LUỒNG DỮ LIỆU 1.Biểu đồ mức ngữ cảnh Sơ đồ phân cấp chức năng của hệ thống 1.2 Biểu đồ luồng dữ liệu mức 0 1.3 Biểu đồ luồng dữ liệu mức 1.0 1.4 Biểu đồ luồng dữ liệu mức 2.0 1.5 Biểu đồ luồng dữ liệu mức 3.0 1.6 Biểu đồ luồng dữ liệu mức 4.0 1.6 Biểu đồ luồng dữ liệu mức 5.0 III- PHÂN TÍCH THIẾT KẾ CƠ SỞ DỮ LIỆU 1.Các thực thể - Sách - Nhà quản lý - Nhà xuất bản - Tác giả - Độc giả - Nhân viên - Phiếu mượn 2.Chuẩn hóa dữ liệu Docgia(maDG,tenDG, gioitinh, namsinh, diachi, soDT, ngaycapthe, ngayhethan, trangthai) Nhanvien(maNV, tenNV,gioitinh,diachi, soDT, matkhau, pass) Nhaxuatban(manxb,tenNXB,diachi, Dienthoai,Email) Tacgia(maTG,tenTG,Diachi,Dienthoai,Email) Sach(masach,tensach,noidung,ngonngu,sotrang,soluong,maTG,maNXB , maTL) Theloaisach(maTL,tenTL) Phieumuon(maNV, masach,madocgia,ngaytra,ngaymuon) 3.Sơ đồ quan hệ E-R 4.Sơ đồ vật lý Độc giả Nhân viên Phiếu mượn Nhà xuất bản Sách Thể loại Tác giả 5. Giao diện người dùng 5.1 Kết Nối 5.2 Độc giả Imports System.Data.SqlClient Public Class FrmDocgia Private Sub FrmDocgia_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim conn As New SqlConnection(str) conn.Open() Dim str1 As String = "select * from Docgia" Dim da As New SqlDataAdapter(str1, conn) Dim tbl As New DataTable da.Fill(tbl) Me.DataGridView1.DataSource = tbl End Sub Private Sub btnThem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnThem.Click If radioNam.Checked Then gt = "Nam" Else gt = "Nữ" End If Dim sqlstr As String sqlstr = "Insert into Docgia values ('" + txtMaDG.Text + "',N'" + txtTenDG.Text + "',N'" + gt + "','" + CDate(dtpNgaysinh.Text) + "',N'" + txtDiachi.Text + "','" + txtSoDT.Text + "','" + CDate(dtpNgaycap.Text) + "','" + CDate(dtpNgayhan.Text) + "','0')" Dim conn As New SqlConnection(str) conn.Open() Dim mycmd As New SqlCommand(sqlstr, conn) Try mycmd.ExecuteNonQuery() FrmDocgia_Load(sender, e) MsgBox("Thêm độc giả thành công") txtMaDG.Text = "" txtTenDG.Text = "" txtDiachi.Text = "" dtpNgaysinh.Text = "" dtpNgaycap.Text = "" dtpNgayhan.Text = "" txtSoDT.Text = "" radioNam.Checked = False radioNu.Checked = False conn.Close() Catch ex As Exception MsgBox("Lỗi") End Try End Sub Private Sub Xoa_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Xoa.Click If MsgBox("Bạn có chắc muốn xóa không? ", MsgBoxStyle.YesNo, "Xóa độc giả") = MsgBoxResult.Yes Then Dim sqlstr As String sqlstr = "Delete from Docgia where MaDG='" + txtMaDG.Text + "'" Dim conn As New SqlConnection(str) conn.Open() Dim mycmd As New SqlCommand(sqlstr, conn) Try mycmd.ExecuteNonQuery() FrmDocgia_Load(sender, e) txtMaDG.Text = "" txtTenDG.Text = "" txtDiachi.Text = "" dtpNgaysinh.Text = "" dtpNgaycap.Text = "" dtpNgayhan.Text = "" txtSoDT.Text = "" radioNam.Checked = False radioNu.Checked = False conn.Close() Catch ex As Exception MsgBox("Lỗi") End Try End If End Sub Private Sub btnSua_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSua.Click If radioNam.Checked Then gt = "Nam" Else gt = "Nữ" End If Dim conn As New SqlConnection(str) conn.Open() Dim sqlstr As String sqlstr = "Update Docgia set TenDG=N'" + txtTenDG.Text + "',Gioitinh=N'" + gt + "',Namsinh='" + CDate(dtpNgaysinh.Text) + "',Ngaycapthe='" + CDate(dtpNgaycap.Text) + "',Ngayhethan='" + CDate(dtpNgayhan.Text) + "',Diachi=N'" + txtDiachi.Text + "',SoDT='" + txtSoDT.Text + "' where MaDg='" + txtMaDG.Text + "'" Dim mycmd As New SqlCommand(sqlstr, conn) Try mycmd.ExecuteNonQuery() FrmDocgia_Load(sender, e) MsgBox("Cập nhật thành công!") txtMaDG.Text = "" txtTenDG.Text = "" txtDiachi.Text = "" dtpNgaysinh.Text = "" dtpNgaycap.Text = "" dtpNgayhan.Text = "" txtSoDT.Text = "" radioNam.Checked = False radioNu.Checked = False conn.Close() Catch ex As Exception End Try End Sub Private Sub DataGridView1_CellClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellClick Try txtMaDG.Text = DataGridView1.Rows(e.RowIndex).Cells(0).Value.ToString txtTenDG.Text = DataGridView1.Rows(e.RowIndex).Cells(1).Value.ToString If DataGridView1.Rows(e.RowIndex).Cells(2).Value.ToString = "Nam" Then radioNam.Select() Else radioNu.Select() End If dtpNgaysinh.Text = DateValue(DataGridView1.Rows(e.RowIndex).Cells(3).Value.ToString) txtDiachi.Text = DataGridView1.Rows(e.RowIndex).Cells(4).Value.ToString txtSoDT.Text = DataGridView1.Rows(e.RowIndex).Cells(5).Value.ToString dtpNgaycap.Text = DateValue(DataGridView1.Rows(e.RowIndex).Cells(6).Value.ToString) dtpNgayhan.Text = DateValue(DataGridView1.Rows(e.RowIndex).Cells(7).Value.ToString) If DataGridView1.Rows(e.RowIndex).Cells(8).Value.ToString = True Then txtTrangthai.Text = "Đang mượn sách" Else txtTrangthai.Text = "Chưa mượn sách" End If Catch ex As Exception End Try End Sub Private Sub btnMenu_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnMenu.Click Me.Close() End Sub End Class 5.3 Sách Imports System.Data.SqlClient Public Class FrmSach Private Sub FrmSach_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim conn As New SqlConnection(str) conn.Open() Dim str1 As String = "Select Masach as 'Mã sách',Tensach as 'Tên sách',Noidung as 'Nội dung',Ngonngu as 'Ngôn ngữ',Sotrang as 'Số trang',Soluong as 'Số lượng',MaTG as 'Mã TG',MaNXB as 'Mã NXB',MaTL as 'Mã TL' from Sach" Dim da As New SqlDataAdapter(str1, conn) Dim tbl As New DataTable da.Fill(tbl) Me.DataGridView1.DataSource = tbl Dim dap1 As New SqlDataAdapter("select MaTG from Tacgia", conn) Dim dt1 As New DataTable dap1.Fill(dt1) cmbMaTG.DataSource = dt1 cmbMaTG.DisplayMember = dt1.Columns(0).ToString cmbMaTG.ValueMember = dt1.Columns(0).ToString Dim dap2 As New SqlDataAdapter("select MaNXB from NXB", conn) Dim dt2 As New DataTable dap2.Fill(dt2) cmbMaNXB.DataSource = dt2 cmbMaNXB.DisplayMember = dt2.Columns(0).ToString cmbMaNXB.ValueMember = dt2.Columns(0).ToString Dim dap3 As New SqlDataAdapter("select MaTL from Theloai", conn) Dim dt3 As New DataTable dap3.Fill(dt3) cmbMaTL.DataSource = dt3 cmbMaTL.DisplayMember = dt3.Columns(0).ToString cmbMaTL.ValueMember = dt3.Columns(0).ToString cmbMaTG.Text = "" cmbMaNXB.Text = "" cmbMaTL.Text = "" txtTacgia.Text = "" txtNXB.Text = "" txtTheloai.Text = "" End Sub Private Sub btnMenu_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnMenu.Click Me.Close() FrmMenu.Show() End Sub Private Sub btnThem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnThem.Click Dim conn As New SqlConnection(str) conn.Open() Dim sqlstr As String sqlstr = "Insert into Sach values ('" + txtMaSach.Text + "',N'" + txtTensach.Text + "',N'" + txtNoidung.Text + "',N'" + txtNgonngu.Text + "','" + txtSotrang.Text + "','" + txtSoluong.Text + "','" + cmbMaTG.Text + "','" + cmbMaNXB.Text + "','" + cmbMaTL.Text + "')" Dim mycmd As New SqlCommand(sqlstr, conn) Try mycmd.ExecuteNonQuery() FrmSach_Load(sender, e) MsgBox("Thêm sách thành công") txtMaSach.Text = "" txtTensach.Text = "" txtNoidung.Text = "" txtNgonngu.Text = "" txtSotrang.Text = "" cmbMaTG.Text = "" cmbMaNXB.Text = "" cmbMaTL.Text = "" txtTacgia.Text = "" txtNXB.Text = "" txtTheloai.Text = "" txtSoluong.Text = "" conn.Close() Catch ex As Exception MsgBox("Lỗi, thực hiện lại!") End Try End Sub Private Sub DataGridView1_CellClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellClick Try txtMaSach.Text = DataGridView1.Rows(e.RowIndex).Cells(0).Value.ToString txtTensach.Text = DataGridView1.Rows(e.RowIndex).Cells(1).Value.ToString txtNoidung.Text = DataGridView1.Rows(e.RowIndex).Cells(2).Value.ToString txtNgonngu.Text = DataGridView1.Rows(e.RowIndex).Cells(3).Value.ToString txtSotrang.Text = DataGridView1.Rows(e.RowIndex).Cells(4).Value.ToString txtSoluong.Text = DataGridView1.Rows(e.RowIndex).Cells(5).Value.ToString cmbMaTG.Text = DataGridView1.Rows(e.RowIndex).Cells(6).Value.ToString cmbMaNXB.Text = DataGridView1.Rows(e.RowIndex).Cells(7).Value.ToString cmbMaTL.Text = DataGridView1.Rows(e.RowIndex).Cells(8).Value.ToString Catch ex As Exception End Try End Sub Private Sub Xoa_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Xoa.Click If MsgBox("Bạn có chắc chắn muốn xóa? ", MsgBoxStyle.YesNo, "Xóa sách") = MsgBoxResult.Yes Then Dim sqlstr As String sqlstr = "Delete from Sach where Masach='" + txtMaSach.Text + "'" Dim conn As New SqlConnection(str) conn.Open() Dim mycmd As New SqlCommand(sqlstr, conn) Try mycmd.ExecuteNonQuery() FrmSach_Load(sender, e) txtMaSach.Text = "" txtTensach.Text = "" txtNoidung.Text = "" txtNgonngu.Text = "" txtSotrang.Text = "" cmbMaTG.Text = "" cmbMaNXB.Text = "" cmbMaTL.Text = "" txtTacgia.Text = "" txtNXB.Text = "" txtTheloai.Text = "" txtSoluong.Text = "" conn.Close() Catch ex As Exception MsgBox("Lỗi!") End Try End If End Sub Private Sub btnSua_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSua.Click Dim conn As New SqlConnection(str) conn.Open() Dim sqlstr As String sqlstr = "Update Sach set Tensach=N'" + txtTensach.Text + "',Noidung=N'" + txtNoidung.Text + "',Ngonngu=N'" + txtNgonngu.Text + "',Sotrang='" + txtSotrang.Text + "',Soluong='" + txtSoluong.Text + "',MaTG='" + cmbMaTG.Text + "',MaNXB='" + cmbMaNXB.Text + "',MaTL='" + cmbMaTL.Text + "' where Masach='" + txtMaSach.Text + "'" Dim mycmd As New SqlCommand(sqlstr, conn) Try mycmd.ExecuteNonQuery() FrmSach_Load(sender, e) MsgBox("Cập nhật thành công!") txtMaSach.Text = "" txtTensach.Text = "" txtNoidung.Text = "" txtNgonngu.Text = "" txtSotrang.Text = "" txtSoluong.Text = "" cmbMaTG.Text = "" cmbMaNXB.Text = "" cmbMaTL.Text = "" txtTacgia.Text = "" txtNXB.Text = "" txtTheloai.Text = "" conn.Close() Catch ex As Exception MsgBox("Lỗi!") End Try End Sub Private Sub cmbMaNXB_SelectedValueChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles cmbMaNXB.SelectedValueChanged Dim myconn As New SqlConnection(str) myconn.Open() Dim mysql As String = "select TenNXB from NXB where MaNXB='" + cmbMaNXB.Text + "'" Dim mycomm As SqlCommand = New SqlCommand(mysql, myconn) Dim mydr As SqlDataReader = mycomm.ExecuteReader While mydr.Read() txtNXB.Text = mydr("TenNXB") End While myconn.Close() End Sub Private Sub cmbMaTG_SelectedValueChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles cmbMaTG.SelectedValueChanged Dim myconn As New SqlConnection(str) myconn.Open() Dim mysql As String = "select Tentacgia from Tacgia where MaTG='" + cmbMaTG.Text + "'" Dim mycomm As SqlCommand = New SqlCommand(mysql, myconn) Dim mydr As SqlDataReader = mycomm.ExecuteReader While mydr.Read() txtTacgia.Text = mydr("Tentacgia") End While myconn.Close() End Sub Private Sub cmbMaTL_SelectedValueChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles cmbMaTL.SelectedValueChanged Dim myconn As New SqlConnection(str) myconn.Open() Dim mysql As String = "select TenTL from Theloai where MaTL='" + cmbMaTL.Text + "'" Dim mycomm As SqlCommand = New SqlCommand(mysql, myconn) Dim mydr As SqlDataReader = mycomm.ExecuteReader While mydr.Read() txtTheloai.Text = mydr("TenTL") End While myconn.Close() End Sub End Class 5.4 Phiếu mượn Imports System.Data.SqlClient Public Class FrmMuonsach Private Sub FrmMuonsach_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load txtMaDG.Text = MaDGmuon txtTenDG.Text = TenDGmuon txtMaNV.Text = MaNV txtTenNV.Text = TenNV txtMaDG.Enabled = False txtTenDG.Enabled = False txtMaNV.Enabled = False txtTenNV.Enabled = False Dim conn As New SqlConnection(str) conn.Open() Dim str1 As String = "select * from Phieumuon where MaNV='" + MaNV + "' and MaDG='" + MaDGmuon + "'" Dim da As New SqlDataAdapter(str1, conn) Dim tbl As New DataTable da.Fill(tbl) Me.DataGridView1.DataSource = tbl Dim dap1 As New SqlDataAdapter("select Masach from Sach", conn) Dim dt1 As New DataTable dap1.Fill(dt1) cmbMasach.DataSource = dt1 cmbMasach.DisplayMember = dt1.Columns(0).ToString cmbMasach.ValueMember = dt1.Columns(0).ToString End Sub Private Sub btnMenu_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnMenu.Click Me.Close() FrmMenu.Show() End Sub Private Sub cmbMasach_SelectedValueChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles cmbMasach.SelectedValueChanged Dim myconn As New SqlConnection(str) myconn.Open() Dim mysql As String = "select Tensach,Noidung,Soluong from Sach where Masach='" + cmbMasach.Text + "'" Dim mycomm As SqlCommand = New SqlCommand(mysql, myconn) Dim mydr As SqlDataReader = mycomm.ExecuteReader While mydr.Read() txtTensach.Text = mydr("Tensach") txtNoidung.Text = mydr("Noidung") Soluong = mydr("Soluong") txtSoluong.Text = Soluong End While myconn.Close() End Sub Private Sub btnChonsach_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnChonsach.Click Try Dim conn As New SqlConnection(str) conn.Open() Dim sqlstrPM As String sqlstrPM = "Insert into Phieumuon values ('" + txtMaNV.Text + "','" + txtMaDG.Text + "','" + cmbMasach.Text + "','" + CDate(dtpNgaymuon.Text) + "','" + CDate(dtpNgaytra.Text) + "')" Dim mycmdPM As New SqlCommand(sqlstrPM, conn) mycmdPM.ExecuteNonQuery() conn.Close() Soluong = Soluong - 1 conn.Open() Dim sqlstr1 As String sqlstr1 = "update Sach set Soluong='" + Soluong + "' where Masach='" + cmbMasach.Text + "'" Dim mycmd1 As New SqlCommand(sqlstr1, conn) mycmd1.ExecuteNonQuery() Dim sqlstr2 As String sqlstr2 = "update Docgia set Trangthai='1' where MaDG='" + txtMaDG.Text + "'" Dim mycmd2 As New SqlCommand(sqlstr2, conn) mycmd2.ExecuteNonQuery() FrmMuonsach_Load(sender, e) MsgBox("Thêm sách thành công") cmbMasach.Text = "" txtTensach.Text = "" txtNoidung.Text = "" txtSoluong.Text = "" conn.Close() Catch ex As Exception MsgBox("Lỗi, kiểm tra lại") End Try End Sub Private Sub btnChonDG_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnChonDG.Click Me.Close() FrmDocgiamuon.Show() End Sub End Class 5.5 Menu Imports System.Data.SqlClient Public Class FrmTrasach Private Sub FrmTrasach_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load txtMaDG.Text = MaDGmuon txtTenDG.Text = TenDGmuon txtMaNV.Text = MaNV txtTenNV.Text = TenNV txtMaDG.Enabled = False txtTenDG.Enabled = False txtMaNV.Enabled = False txtTenNV.Enabled = False Dim conn As New SqlConnection(str) conn.Open() Dim str1 As String = "select * from Phieumuon where MaNV='" + MaNV + "' and MaDG='" + MaDGmuon + "'" Dim da As New SqlDataAdapter(str1, conn) Dim tbl As New DataTable da.Fill(tbl) Me.DataGridView1.DataSource = tbl End Sub Private Sub btnMenu_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnMenu.Click Me.Close() FrmMenu.Show() End Sub Private Sub btnTra_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnTra.Click Try Dim conn As New SqlConnection(str) conn.Open() Dim sqlstrPM As String sqlstrPM = "Delete Phieumuon where MaNV='" + MaNV + "' and MaDG='" + MaDGmuon + "'" Dim mycmdPM As New SqlCommand(sqlstrPM, conn) mycmdPM.ExecuteNonQuery() conn.Close() Soluong = Soluong + 1 conn.Open() Dim sqlstr1 As String sqlstr1 = "update Sach set Soluong='" + Soluong + "' where Masach='" + txtMasach.Text + "'" Dim mycmd1 As New SqlCommand(sqlstr1, conn) mycmd1.ExecuteNonQuery() Dim sqlstr2 As String sqlstr2 = "update Docgia set Trangthai='0' where MaDG='" + txtMaDG.Text + "'" Dim mycmd2 As New SqlCommand(sqlstr2, conn) mycmd2.ExecuteNonQuery() FrmTrasach_Load(sender, e) MsgBox("Đã trả sách!") txtMasach.Text = "" txtTensach.Text = "" txtNoidung.Text = "" txtSoluong.Text = "" conn.Close() Catch ex As Exception MsgBox("Lỗi, kiểm tra lại") End Try End Sub Private Sub btnChonDG_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnChonDG.Click Me.Close() FrmDocgiamuon.Show() End Sub Private Sub DataGridView1_CellClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellClick Try txtMasach.Text = DataGridView1.Rows(e.RowIndex).Cells(2).Value.ToString Dim myconn As New SqlConnection(str) myconn.Open() Dim mysql As String = "select Tensach,Noidung,Soluong from Sach where Masach='" + txtMasach.Text + "'" Dim mycomm As SqlCommand = New SqlCommand(mysql, myconn) Dim mydr As SqlDataReader = mycomm.ExecuteReader While mydr.Read() txtTensach.Text = mydr("Tensach") txtNoidung.Text = mydr("Noidung") Soluong = mydr("Soluong") txtSoluong.Text = Soluong End While myconn.Close() Catch ex As Exception End Try End Sub End Class 5.6 Gia hạn thẻ Imports System.Data.SqlClient Public Class FrmGiahanthe Private Sub FrmGiahanthe_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim conn As New SqlConnection(str) conn.Open() Dim str1 As String = "select MaDG,TenDG,NgayCapThe,NgayHetHan,TrangThai from Docgia" Dim da As New SqlDataAdapter(str1, conn) Dim tbl As New DataTable da.Fill(tbl) Me.DataGridView1.DataSource = tbl End Sub Private Sub btnSua_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSua.Click Dim conn As New SqlConnection(str) conn.Open() Dim sqlstr As String sqlstr = "Update Docgia set Ngayhethan='" + CDate(dtpNgayHetHan.Text) + "' where MaDG='" + txtMaDG.Text + "'" Dim mycmd As New SqlCommand(sqlstr, conn) Try mycmd.ExecuteNonQuery() FrmGiahanthe_Load(sender, e) MsgBox("Đã gia hạn thẻ!") MaDG = txtMaDG.Text txtMaDG.Text = "" txtDG.Text = "" txtTrangthai.Text = "" conn.Close() Catch ex As Exception MsgBox("Lỗi, thực hiện lại!") End Try End Sub Private Sub DataGridView1_CellClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellClick Try txtMaDG.Text = DataGridView1.Rows(e.RowIndex).Cells(0).Value.ToString txtDG.Text = DataGridView1.Rows(e.RowIndex).Cells(1).Value.ToString dtpNgayCap.Text = DateValue(DataGridView1.Rows(e.RowIndex).Cells(2).Value.ToString) dtpNgayHetHan.Text = DateValue(DataGridView1.Rows(e.RowIndex).Cells(3).Value.ToString) If DataGridView1.Rows(e.RowIndex).Cells(4).Value.ToString = True Then txtTrangthai.Text = "Đang mượn sách" Else txtTrangthai.Text = "Chưa mượn sách" End If Catch ex As Exception End Try End Sub Private Sub btnMenu_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnMenu.Click Me.Close() End Sub End Class 5.7 Tìm kiếm Imports System.Data.SqlClient Public Class FrmTimkiem Private Sub FrmTimkiem_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load End Sub Private Sub btnTensach_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnTensach.Click Dim sqlstr As String sqlstr = "Select * from Sach where Tensach like '%" + txtTensach.Text + "%'" Dim conn As New SqlConnection(str) conn.Open() Try Dim da As New SqlDataAdapter(sqlstr, conn) Dim tbl As New DataTable da.Fill(tbl) Me.DataGridView1.DataSource = tbl FrmTimkiem_Load(sender, e) txtTensach.Text = "" conn.Close() Catch ex As Exception MsgBox("Lỗi, thực hiện lại!") txtTensach.Text = "" End Try End Sub Private Sub btnTentacgia_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnTentacgia.Click Dim sqlstr As String sqlstr = "Select * from Tacgia where Tentacgia like '%" + txtTacgia.Text + "%'" Dim conn As New SqlConnection(str) conn.Open() Try Dim da As New SqlDataAdapter(sqlstr, conn) Dim tbl As New DataTable da.Fill(tbl) Me.DataGridView2.DataSource = tbl FrmTimkiem_Load(sender, e) txtTensach.Text = "" conn.Close() Catch ex As Exception MsgBox("Lỗi, thực hiện lại!") txtTensach.Text = "" End Try End Sub Private Sub btnNhaxuatban_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnNhaxuatban.Click Dim sqlstr As String sqlstr = "Select * from NXB where TenNXB like '%" + txtNhaxuatban.Text + "%'" Dim conn As New SqlConnection(str) conn.Open() Try Dim da As New SqlDataAdapter(sqlstr, conn) Dim tbl As New DataTable da.Fill(tbl) Me.DataGridView3.DataSource = tbl FrmTimkiem_Load(sender, e) txtTensach.Text = "" conn.Close() Catch ex As Exception MsgBox("Lỗi, thực hiện lại!") txtTensach.Text = "" End Try End Sub Private Sub btnDocgia_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDocgia.Click Dim sqlstr As String sqlstr = "Select * from Docgia where TenDG like '%" + txtDocgia.Text + "%'" Dim conn As New SqlConnection(str) conn.Open() Try Dim da As New SqlDataAdapter(sqlstr, conn) Dim tbl As New DataTable da.Fill(tbl) Me.DataGridView4.DataSource = tbl FrmTimkiem_Load(sender, e) txtTensach.Text = "" conn.Close() Catch ex As Exception MsgBox("Lỗi, thực hiện lại!") txtTensach.Text = "" End Try End Sub Private Sub btnMenu_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnMenu.Click FrmMenu.Show() Me.Close() End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click FrmMenu.Show() Me.Close() End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click FrmMenu.Show() Me.Close() End Sub Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click FrmMenu.Show() Me.Close() End Sub End Class 5.8 Quản trị người sử dụng: KẾT LUẬN Chương trình Quản lý thư viện sẽ giúp cho việc tin học hóa trong thư viện cũng như công tác hành chính, cán bộ được tốt hơn, chính xác và khóa học hơn, làm tăng năng suất và hiệu quả công việc. Trên cơ sở đó giúp cho Lãnh đạo quản lý thư viện một cách tự động hóa, tránh được những sai sót, những hạn chế mà cách quản lý thủ công gây ra, đáp ứng được yêu cầu lãnh đạo, chỉ đạo của cấp trên trong mọi tình huống kịp thời nhất. Chương trình Quản thư viện hoàn thành tương đối tốt đáp ứng được nhu cầu cập nhật, truy vấn thông tin nhanh chóng và giải quyết được việc tổ chức nhất quán CSDL trong lưu trữ thông tin. Tuy nhiên, chương trình vẫn còn nhược điểm, thiếu sót cần được hoàn thiện trong thời gian tới. Em xin chân thành cảm ơn các thầy cô giáo trong khoa CNTT trường DHDL Phương Đông đã nhiệt tình dạy dỗ, trang bị kiến thức giúp em trong cả khóa học và hoàn thành tốt đồ án này. Đặc biệt, em xin chân thành cảm ơn thầy Trần Văn Lộc, người đã tận tình chỉ bảo, giúp đỡ em hoàn thành tốt đồ án tốt nghiệp này. Hà Nội, ngày 22 tháng 4 năm 2009 Sinh viên Nguyễn Hữu Thắng TÀI LIỆU THAM KHẢO 1. Phân tích và Thiết kế hệ thống – TS Lê Văn Phùng 2. Cơ sở Dữ Liệu – TS Lê Văn Phùng 3. Bài giảng VisualBasic.Net – Nguyễn Bá Tiến 4. Hệ quản trị CSDL SQL Server - Phan Hiền LỜI CAM ĐOAN “Em xin cam đoan đây là công trình nghiên cứu của riêng em. Những tài liệu trong đồ án tốt nghiệp là hoàn toàn trung thực. Các kết quả nghiên cứu do chính em thực hiện dưới sự chỉ đạo của thầygiáo hướng dẫn”. TRƯỜNG ĐẠI HỌC DÂN LẬP PHƯƠNG ĐÔNG KHOA CÔNG NGHỆ THÔNG TIN ******* PHIẾU ĐÁNH GIÁ ĐỒ ÁN TỐT NGHIỆP Kính gửi: Ban chủ nhiệm khoa Công nghệ thông tin Đề nghị đọc, nhận xét, đánh giá đồ án với tiêu đề: “ Tìm hiểu và xây dựng chương trình quản lý thư viện” theo các nội dung cụ thể dưới đây: Ý nghĩa lý luận, thực tiễn của đề tài. Đặt vấn đề: Cơ sở đặt vấn đề (0,5 điểm). Mức độ rõ ràng trong phương pháp trình bày vấn đề (1 điểm). Tính logic và hợp lý (0,5 điểm). Cách giải quyết vấn đề: Cơ sở lý luận và phương pháp luận ( 2 điểm). Độ tin cậy, cập nhập, tính chính xác về nguồn gốc của số liệu, tài liệu (1 điểm). Mức độ phù hợp của phương pháp xử lý thông tin ( 1 điểm). Mức độ hoàn thành mục tiêu, nhiệm vụ ( 1 điểm). Mức độ nắm vững kiến thức và vận dụng (1 điểm). Kết luận và kiến nghị (1 điểm). Bố cục, văn phòng (1 điểm). Xếp loại (xuất sắc, giỏi, khá, trung bình khá, trung bình, kém ), cho điểm( số nguyên). Hà Nội, ngày tháng năm 2009 Ký tên Nguyễn Hữu Thắng

Các file đính kèm theo tài liệu này:

  • doc2527.doc
Tài liệu liên quan