Đề tài Quản lí hàng hoá dựa trên đơn đặt hàng

Mô hình cơ sở dữ liệu quan hệ yêu cầu mỗi hàng trong một bảng phải là duy nhất. Để đảm bảo tính duy nhất cho một hàng bằng cách tạo ra một khoá chính (primary key) một cột hay kết hợp nhiều cột để xác định duy nhất một hàng. Một bảng ghi chỉ có một Primary key, mặc dù có thể có một số cột hay tôt hợp các cột khác có thể tạo ra các giá trị duy nhất. Những cột (hay tổ hợp các cột) giá trị duy nhất trong bảng được xem như là khoá dự tuyển của primary key. Cho đến nay không có một nguyên tắc tuyệt đối nào để xác định khoá dự tuyển nào là tốt nhất. Các tính chất đề nghị của khoá dự tuyển tốt nhất là: nhỏ nhất(minimality – chọn một số cột cần thiết ít nhất) ổn định (stability – chọn khoá ít thay đổi nhất) và đơn giản/ thân thiện (simplicity / familiaty- chọn một khoá vừa đơn giản vừa quen thuộc). * Khoá ngoại lai (Foreign key): Mặc dù các primary key là thành phần của các bảng riêng biệt, nếu ta chỉ dùng các bảng độc lập mà không có quan hệ, ta rất ít sử dụng primary key để trở nên thiết yếu khi ta tạo ra các quan hệ để liên kết các bảng trong cơ sở dữ liệu quan hệ.

doc95 trang | Chia sẻ: Dung Lona | Lượt xem: 1334 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Đề tài Quản lí hàng hoá dựa trên đơn đặt hàng, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
essing ta sẽ code như sau để viết hàng chữ "Chào thế giới": System.Console.WriteLine ("Hello world!") Nếu ta dùng Import keyword bằng cách nhét vào câu Imports System.Console ở đầu code module, ta có thể code gọn hơn: WriteLine ("Hello world!") Dưới đây là một số namespaces thông dụng: Namespace Chức năng Classes điển hình System.IO Đọc/Viết files và các data streams khác FileStream, Path, StreamReader, StreamWriter System.Drawing Đồ họa Bitmap, Brush, Pen Color, Font, Graphics System.Data Quản lý data DataSet, DataTable, DataRow, SQLConnection, ADOConnection System.Collection Tạo và quản lý các loại collections ArrayList, BitArray, Queue, Stack, HashTable System.Math Tính toán Sqrt, Cos, Log, Min System.Diagnostics Debug Debug, Trace System.XML Làm việc với XML, Document Object Model XMLDocument, XMLElement, XMLReader, XMLWriter System.Security Cho phép kiểm soát an ninh Cryptography, Permission, Policy Aliasing Namespaces (dùng bí danh) Khi hai namespaces trùng tên, ta phải dùng nguyên tên (kể cả gốc tích) để phân biệt chúng. Điển hình là khi ta dùng những namespaces liên hệ đến VB6 như Microsoft.Visualbasic. Thay vì code: Microsoft.Visualbasic.Left ( InputString, 6) ta viết: Imports VB6= Microsoft.Visualbasic Sau đó ta có thể code: VB6.Left ( InputString, 6) Dùng Namespaces keyword Trong thí dụ về program có Root Namespace là NhàSảnXuất như nói trên, nếu ta muốn đặt ra một namespace con là TồnKho, ta phải dùng NameSpace keyword trong code như sau: ' Root Namespace là NhàSảnXuất Namespace TồnKho Class PhòngLạnh ' Code cho Phòng Lạnh End Class End Namespace Một thay đổi lớn cho Data Type của VB.NET, là những variables dùng Data Type địa phương như Integer, Single, Boolean,.v.v.. đều là những Objects. Chúng đều được derived (xuất phát) từ Class căn bản nhất tên Object trong VB.NET. Trong.NET, Integer có bốn loại: Byte (8 bits, không có dấu, tức là từ 0 đến 255), Short (16 bits, có dấu cộng trừ, tức là từ -32768 đến 32767), Integer (32 bits, có dấu) và Long (64 bits, có dấu). Như vậy Integer bây giờ tương đương với Long trong VB6, và Long bây giờ lớn gấp đôi trong VB6. Floating-Point Division (Chia số dấu phảy động) Việc chia số dấu phảy động (Single, Double) trong VB.NET được làm theo đúng tiêu chuẩn của IEEE. Do đó nếu ta viết code như sau: Dim dValueA As Double Dim dValueB As Double dValueA = 1 dValueB = 0 Console.WriteLine(dValueA / dValueB) Trong VB6 ta biết mình sẽ gặp Division by Zero error, nhưng ở đây program sẽ viết trong Output Window chữ Infinity (vô cực). Tương tự như vậy, nếu ta viết code: Dim dValueA As Double Dim dValueB As Double dValueA = 0 dValueB = 0 Console.WriteLine(dValueA / dValueB) Kết quả sẽ là chữ NaN (Not a Number) hiển thị trong Output Window. Thay thế Currency bằng Decimal VB.NET dùng Decimal data type với 128 bits để thay thế Currency data type trong VB6. Nó có thể biểu diễn một số tới 28 digits nằm bên phải dấu chấm để cho thật chính xác. Hể càng nhiều digits nằm bên phải dấu chấm thì tầm trị số của Decimal càng nhỏ hơn. Char Type VB.NET có cả Byte lẫn Char data type. Byte được dùng cho một số nhỏ 0-255, có thể chứa một ASCII character trong dạng con số. Char được dùng để chứa một Unicode (16 bit) character. Char là một character của String. String Type Nhìn lướt qua, String trong VB.NET không có vẻ khác VB6 bao nhiêu. Nhưng trừ khi ta muốn tiếp tục dùng các Functions như InStr, Left, Mid and Right trong VB6, ta nên xem String là một object và dùng những Properties/Functions của nó trong VB.NET cho tiện hơn. Sau nầy ta sẽ học thêm về String của VB.NET trong một bài riêng. ý niệm fixed-length (có chiều dài nhất định) String trong VB6 không còn dùng nữa. Do đó ta không thể declare: Dim myString as String * 25 Object thay thế Variant Một trong những data types linh động, hiệu năng và nguy hiểm trong VB6 là Variant. Một variable thuộc data type Variant có thể chứa gần như thứ gì cũng được (trừ fixed-length string), nó tự động thích nghi bên trong để chứa trị số mới. Cái giá phải trả cho sự linh động ấy là program chạy chậm và dễ có bugs tạo ra bởi sự biến đổi từ data loại nầy qua loại khác không theo dự tính của ta. VB.NET thay thế Variant bằng Object. Vì trên phương diện kỹ thuật tất cả data types trong.NET đều là Object nên, giống như Variant, Object có thể chứa đủ thứ. Nói chung, dầu Object giống như Variant, nhưng trong.NET ta phải nói rõ ra (explicitly) mình muốn làm gì. Ta thử xem một thí dụ code trong VB6 như sau: Private Sub Button1_Click() Dim X1 As Variant Dim X2 As Variant X1 = "24.7" X2 = 5 Debug.Print X1 + X2 ' Cộng hai số với operator + Debug.Print X1 & X2 ' Ghép hai strings lại với operator & End Sub Kết quả hiển thị trong Immediate Window là: 29.7 24.75 Trong VB.NET, ta phải code cho rõ ràng hơn như sau để có cùng kết quả như trên hiển thị trong Output Window: Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim X1 As Object Dim X2 As Object X1 = "24.7" X2 = 5 Console.WriteLine(CSng(X1) + CInt(X2)) Console.WriteLine(CStr(X1) & CStr(X2)) End Sub CType Statement Trong VB.NET có Option Strict by default. Nó bắt ta phải thận trọng trong cách dùng data types. Vì Object có thể chứa bất cứ thứ gì, khi ta muốn dùng nó như một loại data type hay class nào, ta phải đổi Object ra thứ ấy bằng CType, thí dụ: Class Product Public Description As String End Class Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim X As Object X = New Product() ' Treat X like an actual product CType(X, Product).Description = "Soft Drink" Console.WriteLine(CType(X, Product).Description) End Sub Mặc dù X được instantiated như một Product, nó vẫn được xem như một Object variable. Do đó mỗi khi muốn dùng nó như một Product ta phải nhờ đến CType. Từ chuyên môn trong programming gọi đó là Type Casting. Thay đổi trong cách khai báo Variables Khai báo nhiều Variables Trong VB6 ta có thể Declare nhiều variables trên cùng một hàng như: Dim i, j, k as Integer Kết quả là chỉ có k là Integer, còn i và j là Variant (có thể đó là điều bạn không ngờ). Trong VB.NET thì cả ba i, j và k đều là Integer, và như thế hợp lý hơn. Khai báo trị số khởi đầu Trong VB6, sau khi declare variable ta thường cho nó một trị số khởi đầu như: Dim X as Integer X = 12 Bây giờ trong VB.NET ta có thể gọp chung hai statements trên lại như sau: Dim X as Integer = 12 Khai báo Constants Khi khai báo Constants trong VB.NET ta phải khai rõ Data type của nó là String, Integer, Boolean..v. v.: Public Const myConstantString as String = "happy" Public Const maxStudent as Integer = 30 Dim As New Trong VB6 ta được khuyên không nên code: Dim X as New Customer Vì VB6 không instantiate một Object Customer cho đến khi X được dùng đến - chuyện nầy rất nguy hiểm vì có thể tạo ra bug mà ta không ngờ. Trong VB.NET ta có thể yên tâm code: Dim X as New Customer() vì statement nói trên lập tức tạo ra một Object Customer. Khai báo Variable trong Scope của Block Trong thí dụ dưới đây, variable X được declared trong một IF.. THEN... END IF block. Khi execution ra khỏi IF block ấy, X sẽ bị hủy diệt. Do đó, VB.NET sẽ than phiền là X undefined vì nó không thấy X bên ngoài IF block. Luật nầy cũng áp dụng cho những Blocks khác như DO... LOOP, WHILE... END WHILE, FOR... NEXT,. v. v.. Private Sub Button1_Click(ByVal sender As System. Object, ByVal e As System.EventArgs) Handles Button1.Click Dim A As Integer = 5 Dim B As Integer = 5 If A = B Then Dim X As Integer ' X is declared in this IF block X = 12 End If A = X ' X has been destroyed, so it is undefined here End Sub Có lẽ bạn hỏi Declare Variable trong FOR... LOOP có lợi gì, tại sao ta không Declare một lần duy nhất ở đầu? Thứ nhất là Block giới hạn scope (phạm vi hoạt động) của một variable để nó không đụng chạm ai dễ gây nên bug, thứ hai là trường hợp điển hình ta sẽ cần feature nầy là trong một FOR... LOOP, cứ mỗi iteration ta muốn instantiate một Object mới. Khi ấy ta cần Declare một Object variable, instantiate Object, rồi chứa nó vào một collection chẳng hạn. Loại truy cập Thí dụ Chú thích Public Public Class ClassForEverybody Cho phép ở đâu cũng dùng nó được. Ta chỉ có thể dùng Public ở mức độ Module, Namespace hay File. Tức là ta không thể dùng Public trong một Sub/Function. Protected Protected Class ClassForMyHeirs Cho phép các classes con, cháu được dùng. Ta chỉ có thể dùng Protected ở mức độ Class. Friend Friend StringForThisProject As String Cho phép code trong cùng một Project được dùng. Private Private NumberForMeOnly As Integer Cho phép code trong cùng module, class, hay structure được dùng. Lưu ý là Dim coi như tương đương với Private, do đó ta nên dùng Private cho dễ đọc. 6. Truy cập Variable/Class/Structure Trong VB.NET ta có thể quyết định giới hạn việc truy cập một Variable, Class, Structure. v. v. bằng cách dùng các keywords sau: Ngoài ra, nhớ là nếu container (Object chứa) của một Variable/Class/Structure là Private thì dù ta có khai báo một Variable/Class/Structure nằm bên trong container là Public ta cũng không thấy nó từ bên ngoài. Thay đổi trong Array Array index từ 0 Trong VB.NET không có Option Base và mọi Array đều có index bắt đầu từ 0. Khi bạn khai báo một array như: Dim myArray(10) as integer Kết quả là một array có 11 elements và index từ 0 đến 10. UBound của array nầy là 10 và LBound của tất cả arrays trong VB.NET đều là 0. Khai báo Array với những trị số khởi đầu Bạn có thể khai báo Array với những trị số khởi đầu như sau: Dim myArray() as Integer = { 1, 5, 8, 16 } ' Note the curly brackets Statement làm hai chuyện: quyết định size của array và cho các elements trị số khởi đầu. Để dùng feature nầy, bạn không được nói rõ size của array, mà để cho program tự tính. ReDim Preserve Trong VB.NET bạn cũng có thể tiếp tục dùng Preserve keyword để giữ nguyên trị số của các elements trong một array khi bạn ReDim nó. Tuy nhiên có một giới hạn cho array với hơn một dimension - bạn chỉ có thể resize dimention cuối (bên phải), nên những hàng code sau đây hợp lệ: Dim myArray(, ) As String ReDim myArray(5, 5) ReDim Preserve myArray(5, 8) Thay đổi trong User-Defined Type ý niệm User-Defined Type (UDT) rất tiện cho ta gom các mảnh data liên hệ lại thành một data type có cấu trúc. Trong VB6 ta dùng nó như sau: Public Type UStudent FullName as String Age as Integer End Type VB.NET cũng giữ y đặc tính của UDT nhưng thay đổi chữ Type thành Structure: Public Structure UStudent Public FullName as String Public Age as Integer End Structure Lưu ý 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ẽ té. 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 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 1.Khái niệm hệ thống tin quản lý(MIS) Thông tin quản lý là thông tin mà nhà quản lý cần sử dụng để thực hiện tốt chức năng của họ. Hệ thống thông tin quản lý là một hệ thống tập hợp các thông tin hữu ích hay vô ích, có cấu trúc hoặc không có cấu trúc, hình thức hoặc phi hình thức, luân chuyển trong doanh nghiệp. Là một tập hợp các phương tiện xử lý thông tin thông qua mối liên hệ giữa chúng. Một hệ thông tin quản lý bao gồm ba hệ con: hệ quyết định, hệ tác nghiệp và hệ thông tin. + Hệ quyết định: thực hiện các tác vụ quản lý, đưa ra những quyết định chiến lược trong một thời gian ngắn hay dài hạn. + Hệ tác nghiệp: gồm các hoạt động thực hiện những công việc có tính cạnh tranh để đạt được mục tiêu đã xác định bởi hệ quyết định. + Hệ thông tin: thực hiện việc liên hệ giữa hệ quyết định với hệ tác nghiệp, bảo đảm hệ thống vận hành đạt mục tiêu. MIS cung cấp cho hệ ra quyết định những thông tin cần thiết trong quá trình ra quyết định( là các thông tin từ môi trường xung quanh hay từ hệ tác nghiệp). Chuyển các thông tin từ hệ ra quyết định cho hệ tác nghiệp và môi trường bên ngoài hoạt động hệ thống được đánh giá tốt hay xấu tùy thuộc vào chất lượng xử lý, tính phù hợp của thông tin. 2.Mục đích, ý nghĩa. Mục đích của dự án phát triển một hệ thống thông tin là có được một sản phẩm đáp ứng được nhu cầu của người sử dụng mà nó được hòa hợp trong các hoạt động của tổ chức, chính xác về mặt kỹ thuật, tuân thủ các giới hạn về tài chính và thời gian định trước. Vì vậy, ngoài những yêu cầu trên, mục đích của dự án xây dựng phần mền quản lý hàng hoá dựa trên đơn đặt hàng phải úng dụng được tin học hóa vào việc quản lý hàng hoá Phải trang bị được hệ thống CSDL của phần mền quản lý hộ đơn hàng sẽ bao gồm các vấn đề sau: Quản lý nhà cung cấp: Cập nhật, thêm, sửa , xóa, tra cứu thông tin nhà cung cấp Quản lý hàng hoá: Cập nhật, thêm, sửa , xóa, tra cứu thông tin các mặt hàng Quản lý thông tin liên quan: Thêm, cập nhật Lập báo cáo Đây là một đề tài mang tính thực tế vì vậy mà trong quá trình thực hiện em luôn tìm hiểu, phân tích phương hướng về mọi mặt của đề tài. Để đáp ứng nhu cầu tin học hóa, vấn đề quản lý đơn hàng là một vấn đề quan trọng , đề tài “Quản lý hàng hoá dựa trên đơn đặt hàng” nhằm trợ giúp các công tác quản lý hàng hoá trong bất kỳ một củă hàng nào nhằm đạt hiệu quả cao nhất. Chương 2: KHảO SáT Hệ THốNG I. Mô tả hệ thống 1. Nhiệm vụ cơ bản Đơn vị chung ABC kinh doanh mặt hàng linh kiện máy tính. Để nhập hàng, Công ty lập đơn đặt hàng và gởi đến nhà cung cấp. Sau đó, nhà cung cấp lập các hóa đơn xuất hàng cho đơn vị đặt hàng ( có thể có nhiều hóa đơn). Với mỗi hóa đơn, nhà cung cấp sẽ xuất làm nhiều lần và được ghi nhận qua các phiếu nhập hàng gồm các thông tin chính như: số phiếu nhập hàng, ngày lập phiếu, đơn vị, mặt hàng, số lượng, đơn giá, thành tiền, đơn vị tính,, số hóa đơn Cuối mỗi kỳ(tháng), nếu lượng đặt hàng trong kỳ chưa nhập thì sẽ được chuyển nhập ở kỳ sau. Trong trường hợp lượng hàng đặt hàng chưa được nhập hết hàng mà NCC không còn hàng xuất thì sẽ được ghi nhận qua cột ghi chú. 2.Phạm vi đề tài Chương trình xây dựng nhằm mục đích phục vụ công việc quản lý kinh doanh tại một cửa hàng kinh doanh linh kien máy tính, bao gồm những nghiệp vụ chính sau: - Quản lý đặt hàng. - Quản lý việc nhập theo đơn đặt hàng. - Quản lý xuất hàng. - Quản lý những khoản thanh toán giữa cửa hàng với các khách hàng và nhà cung cấp. - Quản lý tồn kho hàng hóa. - Quản lý doanh thu bán hàng, cho biết kết quả kinh doanh hàng tháng. Đây là một chương trình có tính cách xây dựng một hệ thống thông tin để tin học hóa các nghiệp vụ cho đơn vị ABC bao gồm từ các nghiệp vụ trong từng bộ phận của đơn vị. 3. Nghiên cứu hiện trạng giải quyết vấn đề Trong cửa hàng kinh doanh máy tính hệ thống tổ chức các bộ phận có sự hỗ trợ lẫn nhau bao gồm: Ban điều hành, bộ phận bán hàng, bộ phận kế toán, bộ phận kho, bộ phận tài chính 3.1. Ban điều hành - Quản lý và phân phối hoạt động của cửa hàng - Quản lý và điều hành hoạt động của nhân viên. - Phân loại khách hàng - Quyết định giá chính thức cho từng loại mặt hàng. Tuy nhiên giá được chi theo từng loại tùy vào khách hàng( Khách hàng thường xuyên, khách hàng mua số lượng nhiều) - Nhận báo cáo từ các bộ phận khác như: kế toán,bán hàng, kho 3.2. Phân loại khách hàng - Quyết định giá chính thức cho từng loại mặt hàng. Tuy nhiên giá được chi theo từng loại tùy vào khách hàng( Khách hàng thường xuyên, khách hàng mua số lượng nhiều) - Nhận báo cáo từ các bộ phận khác như: kế toán,bán hàng, kho 3.3. Bộ phân bán hàng - Lập đơn đặt hàng của khách. Khách hàng phải đăng ký ở bộ phận bán hàng các thông tin cần thiết để dễ dàng liên lạc, ví dụ như là: tên khách hàng, địa chỉ liên lạc, số điện thoại. và mỗi khách hàng được quản lý bằng mã số riếng và khách dùng mã đó để mua hàng. - Linh kiện được trưng bày tại cửa hàng, khách hàng có thể chọn những linh kiện bằng cách tự chọn từ quầy hay thông qua tờ bảng giá. Hàng sẽ được lấy từ trong kho ra. 3.4. Bộ phận kho Chức năng chính của bộ phận kho là nhập hàng, xuất hàng cho bộ phận bán hàng, theo dõi số lượng hàng tồn kho. Nhân viên phải thường xuyên kiểm tra để biết được số lượng hàng hóa bị hư hỏng, sắp hết hạn hay quá hạn, khi đó phải đề xuất ban điều hành có kế hoạch xử lý. 3.4.1. Quản lý hàng hoá Linh kiện được lấy các công ty buôn bán linh kiện khác, những nhà cung cấp tư nhân, các công ty trong hay ngoài nước Các mặt hàng kinh doanh đều phải có một loại mã số riêng để phân biệt với hàng hóa khác. Các mặt hàng đều phải đầy đủ thông tin như trên: tên hàng, chi tiết hàng hóa, giá cả 3.4.2.Quá trình nhập hàng Nhập theo nhiều cách khác nhau: - Mua từ bên ngoài(công ty khác, đại lý) - Do bị trả lại hàng - Sau khi nhận yêu cầu đặt hàng qua điện thoại hay fax, NCC sẽ giao hàng cho công ty có kèm hóa đơn hay bảng kê chi tiết các loại mặt hàng của từng loại. Thủ kho sẽ kiểm tra lô hàng đó đúng yêu cầu đặt hàng hay không, nếu không đúng thì trả lại NCC và yêu cầu giao lại những mặt hàng bị trả đó. 3.4.3. Quá trình xuất hàng Quá trình xuất hàng có nhiều hình thức sau: - Xuất hàng theo yêu cầu đơn đặt của khách hàng - Trả lại cho nhà cung cấp trong trường hợp hàng không đạt yêu cầu, kém chất lượngkèm theo giấy tờ liên quan. - Xuất hàng để thanh lý vì quá hạn hay hư hỏng nặng. - Đưa ra các hình thức khuyến mại do tình hình thị trường, hay quảng cáo thông qua các báo biểu, banner 3.5. Bộ phận thống kê - Thống kê đơn bán hàng, các phiếu nhập kho, các đơn đặt hàng và doanh thu chi của cửa hàng vào cuối mỗi kỳ. - Báo cáo giá trị thành tiền của toàn bộ hàng hóa 4.Các biểu mẫu liên quan 4.1. Biên bản kiểm tra BIÊN BảN KIểM NGHIệM HàNG HOá Số:.. Ngàytháng.năm. Người kiểm nghiệm:. Đã kiểm nghiệm: STT Tên hàng Cách KN Đơn vị tính Số theo giấy tờ Số đạt Số không đạt Ghi chú Chữ kí Thủ kho 4.2. Phiếu nhập kho PHIếU NHậP KHO Số PN:.. Ngày.tháng.năm Mã nhà cung cấp:. Mã hàng hoá Địa chỉ:.. STT Tên hàng Đơn vị tính Đơn giá Thành tiền Ghi chú Thủ kho 4.3. Phiếu xuất kho PHIếU xuất KHO Số PX:.. Ngày.tháng.năm Mã khách hàng:. Mã hàng hoá Địa chỉ:.. STT Tên hàng Đơn vị tính Đơn giá Thành tiền Ghi chú Thủ kho 4.4.Đơn đặt hàng nhà cung cấp Đơn đặt nhà cung cấp Số đơn NCC:.. Ngày.tháng.năm Mã nhà cung cấp:. Địa chỉ:.. STT Mã Hàng Tên, nhãn hiệu,quy cách, phẩm chất vật tư(sp,hàng hoá) Đơn vị tính Số lượng Đơn giá Thành tiền Yêu cầu Thực nhập 4.5.Đơn đặt hàng của khách Đơn đặt nhà hàng của khách Số đơn khách:.. Ngày.tháng.năm Mã khách hàng:. Địa chỉ:.. STT Mã Hàng Tên, nhãn hiệu,quy cách, phẩm chất vật tư(sp,hàng hoá) Đơn vị tính Số lượng Đơn giá Thành tiền Yêu cầu Thực xuất II . Mô hình tiến trình nghiệp vụ Chương 3: PHÂN TíCH Hệ THốNG Về Dữ LIệU I.Sơ đồ phân rã chức năng Các bước xây dựng Có thể sử dụng 2 phương pháp để xác định các chức năng nghiệp vụ: - Bottom up: phân rã các chức năng lớn thành các chức năng nhỏ hơn chi chi tiết hơn. - Top down: xuất phát từ những chức năng chi tiết gom nhóm lại thành các chức năng ở mức cao hơn. Các bước tiến hành xây dựng sơ đồ phân rã chức năng: - Sử dụng phương pháp Bottom up, gồm 5 bước: Bước 1: Trong bảng khảo sát chi tiết hệ thống hiện tại, trong phần quy trình xử lý gạch chân tất cả các động từ + bổ ngữ liên quan đến công việc của hệ thống. Bước2: Trong danh sách các chức năng được chọn ở bước 1, tìm và loại bỏ những chức năng trùng lặp. Bước3: Trong danh sách các chức được chọn ở bước 2, gom nhóm những chức năng đơn giản do 1 người thực hiện lại. Bước4: Trong danh sách các chức năng được chọn ở bước 3, loại bỏ những chức năng không có ý nghĩa đối với hệ thống. Bước5: Chỉnh sửa lại tên các chức năng ở bước 4 cho hợp lý. Sử dụng phương pháp Top down:ở mức cáo nhất của nghiệp vụ, một chức năng chính sẽ làm được 1 trong 3 điều: Cung cấp sản phẩm Cung cấp dịch vụ Quản lý tài nguyên 2. Kí hiệu sử dụng Biểu diễn: - Hình chữ nhật: Tên chức năng - Mỗi chức năng được phân rã thành các chức năng con. Các chức năng con có quan hệ phân cấp với chức năng cha và được thể hiện như sau: 3.Mô hình phân cấp chức năng II. Sơ đồ luồng dữ liệu Các bước xây dựng Ta xác định các luồng thông tin nghiệp vụ bằng phương pháp phân tích Top down dựa trên mô hình tiến trình nghiệp vụ của hệ thống. Quá trình phân tích chia thành 3 bước. - Xây dựng biểu đồ luồng dữ liệu (DFD) mức ngữ cảnh để ta xác định giới hạn của hệ thống. Nó có chức năng biểu thị toàn bộ hệ thống ta đang nghiên cứu, chức năng này được nối với mọi tác nhân ngoài của hệ thống. Các luồng dữ liệu giữa các chức năng và tác nhân ngoài chỉ thông tin vào ra của hệ thống. - Xây dựng biểu đồ luồng dữ liệu mức đỉnh, với mức đỉnh các tác nhân ngoài của hệ thống ở mức khung cảnh được giữ nguyên với các luồng thông tin vào ra. Trong hệ thống được phân ra thành các tiến trình với mức đỉnh là các chức năng chính bên trong hệ thống theo biểu đồ phân cấp chức năng ở mức 1. - Xây dựng biểu đồ luồng dữ liệu mức dưới đỉnh, ta thực hiện phân rã đối với mỗi tiến trình của mức đỉnh dựa trên biểu đồ phân cấp chức năng. Ký hiệu sử dụng Sau đây là một số kí hiệu quy định trong sơ đồ: Biểu diễn: - Hình chữ nhật: Tên tác nhân ngoài - Hình tròn,elip:Tên chức năng Tên chức năng - Hướng luồng dữ liệu: - Kho thông tin, dữ liệu: Bước 1: Xây dựng biểu đồ luồng dữ liệu mức ngữ cảnh (mức 0) của hệ thống quản lý đơn hàng: Bước 2: Xây dựng biểu đồ luồng dữ liệu mức đỉnh của hệ thống quản lý đơn hàng: Bước 3: Xây dựng sơ đồ luồng dữ liệu mức dưới đỉnh của hệ thống quản lý đơn hàng a. Biểu đồ luồng dữ liệu mức 1.0 b.Biểu đồ luồng dữ liệu mức 2.0 c. Biểu đồ luồng dữ liệu mức 3.0 d. Biểu đồ luồng dữ liệu mức 4.0 Biểu đồ luồng dữ liệu mức 5.0 Biểu đồ luồng dữ liệu mức 6.0 Biểu đồ luồng dữ liệu mức 7.0 Biểu đồ luồng dữ liệu mức 8.0 3.Mô hình quan hệ Từ các hồ sơ liên quan trên ta xác định được các thực thể sau: - Kho - Phiếu nhập - Phiếu xuất - Khách hàng - Hàng hóa - Phiếu chi - Phiếu thu - Nhà cung cấp Thuộc tính của các thực thể đã nêu trên dã được chuẩn hóa. - NCC(maNCC,tenNCC,diachi,dienthoai, email, ghichu) - PhieuNhap(MaPhieuNhap, maNCC,Ngaynhap) - CTPhieuNhap(Maphieunhap,maNCC,Mahanghoa,dongianhap, soluongnhap,trangthai) - HangHoa(Mahanghoa, tenhanghoa, mota, donvitinh, dongia, soluong) - PhieuChi(MaPhieuchi,maphieunhap,ngaychi,tongtien, ghichu) - PhieuThu(MaPhieuthu, maphieuxuat,ngaythu, tongtien, ghichu) - DatHangNCC(sodonNCC, maNCC,mahanghoa, soluong, ngaydat, trangthai) - DatHangKhach(Sodonkhach,makhachhang, mahanghoa, soluong, ngaydat, trangthai) - KhachHang(makhachhang, tenkhachhang, diachi, dienthoai, email, ghichu) - CTPhieuXuat(maphieuxuat, makhachhang, mahanghoa, dongiaban, soluong, trangthai) - Phieuxuat(maphieuxuat, makhachhang,ngayban) Chương 4 :PHÂN TíCH THIÊT Kế Hệ THốNG I. Thiết kế cơ sở dữ liệu 1. Cơ sở dữ liệu :Bảng “Phiếu xuất” 2. Cơ sở dữ liệu :Bảng “Chi tiết phiếu xuất” 3.Cơ sở dữ liệu:Bảng “Hàng hoá” 4.Cơ sở dữ liệu :Bảng “Khách hàng” 5.Cơ sở dữ liệu :Bảng “Nhà cung cấp” 6.Cơ sở dữ liệu :Bảng “Đặt hàng nhà cung cấp” 7.Cơ sở dữ liệu :Bảng “Đặt hàng khách” 8.Cơ sở dữ liệu:Bảng “Phiếu chi” 9.Cơ sở dữ liệu:Bảng “Phiếu nhập” 10.Cơ sở dữ liệu:Bảng ”Phiếu thu” 11.Cơ sở dữ liệu:Bảng “Chi tiết phiếu nhập” II.Mô hình thực thể và quan hệ Các modul xử lý Sơ đồ khối quá trình đăng nhập Không hợp lệ Bắt đầu Nhâp Username và Password Kiểm tra tính hợp lệ Hạn chế quyền hạn Kết thúc Hợp lệ b. Sơ đồ khối quá trình nhập mới một NCC. Bắt đầu Nhập thông tin về nhà cung cấp Kiểm tra tính hợp lệ của thông tin Cập nhật Cơ sở dữ liệu Kết thúc Cập nhật Đúng Có Khôngg Sai III.Các form chính của chương trinh 1. Giao diện Login 2. Giao diện đăng nhập 3. Giao diện Menu chính 4. Giao diện cập nhật nhà cung cấp 5. Giao diện chi tiết phiếu nhập hàng IV Một số đoạn mã lệnh chính của chương trình Phần modul Imports System.Data.SqlClient Module Module1 Public str As String Public bien As String Public user, pass, group, test, SQLstr As String Public Sub truyvan(ByVal SQL As String) Dim cnn As New SqlConnection(str) Try cnn.Open() Dim comm As New SqlCommand(SQL, cnn) comm.ExecuteNonQuery() Catch ex As Exception MsgBox(ex.Message.ToString) Finally If cnn.State = ConnectionState.Closed Then cnn.Open() cnn.Close() cnn.Dispose() End If End Try End Sub End Module Code của Form Kết Nối Private Sub btnKetNoi_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnKetNoi.Click Dim myconnection As SqlConnection str = "server=" & TextBox1.Text & ";database=" & TextBox2.Text If RadioButton1.Checked And TextBox1.Text "" And TextBox2.Text "" Then str += ";integrated security=true" ElseIf (RadioButton2.Checked) And TextBox1.Text "" Or TextBox2.Text "" Or TextBox3.Text "" Or TextBox4.Text "" Then str += ";uid=" & TextBox3.Text & ";password=" & TextBox4.Text() Else MsgBox("Lỗi kết nối") End If myconnection = New SqlConnection(str) Try If myconnection.State = ConnectionState.Closed Then myconnection.Open() 'MsgBox("Kết nối thành công") dangnhap.Show() Me.Hide() Else MsgBox("thong so sai" & TextBox1.Text & vbCrLf & TextBox2.Text & vbCrLf & TextBox3.Text & vbCrLf & TextBox4.Text) End If Catch ex As Exception MsgBox(ex.ToString) End Try End Sub Code cua form chi tiết phiếu nhập Public Class ChiTietPhieuNhap Dim MaPhieuNhap As String Dim Soluong, DonGia As Integer Dim Lenh As Boolean = False Private Sub PhieuNhap_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim conn As New SqlConnection(str) conn.Open() Dim dap As New SqlDataAdapter("Select SoDonNCC as 'Số phiếu đặt', MaNCC as 'Mó NCC', MaHangHoa as 'Mó hàng húa', Soluong as 'Số lượng' from DatHangNCC where SoDonNCC='" + MaDatNCC + "' and TrangThai = 0 ", conn) Dim tbl As New DataTable dap.Fill(tbl) DataGridView1.DataSource = tbl Dim dap1 As New SqlDataAdapter("Select MaPhieuNhap as 'Phiếu nhập', MaNCC as 'Mó NCC', MaHangHoa as 'Mó hàng húa', DonGiaNhap as 'Đơn giỏ nhập', SoluongNhap as 'Số lượng nhập' from CTPhieuNhap where MaPhieuNhap='" + txtMaPhieuNhap.Text + "'", conn) Dim tbl1 As New DataTable dap1.Fill(tbl1) DataGridView2.DataSource = tbl1 txtMaPhieuNhap.Text = MaPN txtMaNCC.Text = MaNCC txtTenNCC.Text = TenNCC txtMaHH.Text = "" txtTenHH.Text = "" txtDonGia.Text = "" txtSoluong.Text = "" txtMaPhieuNhap.Enabled = False txtMaNCC.Enabled = False txtTenNCC.Enabled = False dtpNgaythang.Enabled = False Button1.Visible = True Button3.Enabled = False btnPhieuChi.Visible = False End Sub Private Sub DataGridView1_CellClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellClick Try txtMaHH.Text = DataGridView1.Rows(e.RowIndex).Cells(2).Value.ToString txtSoluong.Text = DataGridView1.Rows(e.RowIndex).Cells(3).Value.ToString Catch ex As Exception End Try End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click If txtSoluong.Text "" And txtDonGia.Text "" Then Soluong = Soluong + Val(txtSoluong.Text) Dim conn As New SqlConnection(str) conn.Open() Try Dim strSQL As String strSQL = "Insert into CTPhieuNhap values('" + txtMaPhieuNhap.Text + "','" + txtMaNCC.Text + "','" + txtMaHH.Text + "','" + txtDonGia.Text + "','" + txtSoluong.Text + "','0')" Dim mycommand As SqlCommand mycommand = New SqlCommand(strSQL, conn) mycommand.ExecuteNonQuery() If DonGia txtDonGia.Text Then If MsgBox("Đơn giỏ đó thay đổi '" + DonGia + "' thành '" + txtDonGia.Text + "', Bạn cú muốn thay đổi giỏ?", MsgBoxStyle.YesNo, "Cập nhật giỏ") = MsgBoxResult.Yes Then Dim strDonGia As String strDonGia = "Update HangHoa set DonGia='" + txtDonGia.Text + "' where MaHangHoa='" + txtMaHH.Text + "'" Dim mycmd1 As New SqlCommand(strDonGia, conn) mycmd1.ExecuteNonQuery() End If End If Dim strSoLuong As String strSoLuong = "Update HangHoa set SoLuong='" + CStr(Soluong) + "' where MaHangHoa='" + txtMaHH.Text + "'" Dim mycmd As New SqlCommand(strSoLuong, conn) mycmd.ExecuteNonQuery() Dim strTT As String strTT = "Update DatHangNCC set TrangThai = 1 where SoDonNCC='" + MaDatNCC + "' and MaHangHoa='" + txtMaHH.Text + "'" Dim mycmdTT As New SqlCommand(strTT, conn) mycmdTT.ExecuteNonQuery() PhieuNhap_Load(sender, e) conn.Close() txtMaHH.Text = "" txtTenHH.Text = "" txtSoluong.Text = "" Lenh = False Button3.Enabled = True Catch ex As Exception MsgBox("Lỗi!") End Try Else MsgBox("Hóy nhập số lượng nhập!") End If End Sub Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click Lenh = True Button1.Visible = False btnPhieuChi.Visible = True Button3.Enabled = False End Sub Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click If Lenh = False Then If MsgBox("Bạn muốn hủy phiếu nhập này?", MsgBoxStyle.YesNo, "Hủy phiếu nhập") = MsgBoxResult.Yes Then Dim conn As New SqlConnection(str) conn.Open() Try Dim strPN As String strPN = "Delete PhieuNhap where MaPhieuNhap='" + txtMaPhieuNhap.Text + "'" Dim mycmd1 As New SqlCommand(strPN, conn) mycmd1.ExecuteNonQuery() Dim strTT As String strTT = "Update DatHangNCC set TrangThai = 0 where SoDonNCC='" + MaDatNCC + "'" Dim mycmdTT As New SqlCommand(strTT, conn) mycmdTT.ExecuteNonQuery() conn.Close() Me.Close() Catch ex As Exception MsgBox("Lỗi!") End Try End If Else Me.Close() End If End Sub Private Sub btnPhieuChi_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPhieuChi.Click If txtMaPhieuNhap.Text "" And txtMaNCC.Text "" And Lenh = True Then Me.Close() PhieuChi.Show() Else MsgBox("Chưa cú Mó phiếu nhập") txtMaPhieuNhap.Enabled = True txtMaPhieuNhap.Focus() End If End Sub Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click HangHoa.Show() End Sub Private Sub txtMaHH_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtMaHH.TextChanged Dim myconn As New SqlConnection(str) myconn.Open() Dim mysql As String = "select TenHangHoa,DonGia,SoLuong from HangHoa where MaHangHoa='" + txtMaHH.Text + "'" Dim mycomm As SqlCommand = New SqlCommand(mysql, myconn) Dim mydr As SqlDataReader = mycomm.ExecuteReader While mydr.Read() txtTenHH.Text = mydr("TenHangHoa") txtDonGia.Text = mydr("DonGia") DonGia = mydr("DonGia") Soluong = mydr("Soluong") End While myconn.Close() End Sub End Class KếT LUậN Chương trình Quản lý dơn hàng sẽ giúp cho việc tin học hóa trong cửa hàng cũng như việc nhập xuất hàng hoá được tốt hơn, chính xác và khoa 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ý hàng hoá, 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 lý đơn hàng 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 Cao Kim ánh, 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 30 tháng 4 năm 2009 Sinh viên Vũ Minh Quang 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 5.Hồ Hoàng Triết, Các chương trình mẫu .NET, nhà xuất bản thống kê. 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ầy giáo hướng dẫn”.

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

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