Đề tài Thiết kế hệ thống nhập điểm tự động

· Hiện tại cơ sở dữ liệu được sử dụng là Microsoft Access 2000 và sau này nếu có nâng cấp lên SQL Server thì cũng dễ dàng thực hiện. · Sau này nếu có điều kiện phát triển thì chúng em sẽ thực hiện việc nhận dạng các thông tin trên tờ bảng điểm sẽ đầy đủ các phần như mã số sinh viên, lớp học, môn thi, kỳ thi, có thể có lần thi, kể cả phần giáo viên cho điểm thi bằng tay, phần này do chương trình nhận dạng điểm thi giải quyết. · Có thể xuất dữ liệu theo yêu cầu của người sử dụng và xuất dữ liệu ra một trang Web hay ra bảng tính Excel để thuận tiện cho việc in ấn và thống kê khi cần thiết. · Có thể xử lý những file ảnh có màu, chế độ 24bits màu, ảnh nén theo các giải thuật khác nhau.

doc76 trang | Chia sẻ: baoanh98 | Lượt xem: 713 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Đề tài Thiết kế hệ thống nhập điểm tự động, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
cture để nạp ảnh lên. Set picChild.Picture = LoadPicture(fileHinh) 5.1.2.4. Giới thiệu về Form trong Visual Basic: Form là một điều khiển được hầu hết các chương trình Visual Basic sử dụng, nó đóng vai trò như một vật chứa của các điều khiển khác để tạo nên phần giao diện của chương trình. Form gồm hai phần: Phần giao diện: chứa các điều khiển khác và là phần người sử dụng có thể thấy được và giao tiếp với nó. Phần mã: chứa mã nguồn của ngôn ngữ Visual Basic đi kèm với Form để điều khiển phần giao diện, phần này người dùng không thể thấy được. Giống như các điều khiển khác Form cũng có các thuộc tính, các phương thức và các sự kiện. Hoạt động của Form từ khi được nạp cho tới khi chấm dứt: _ Sự kiện Initialize: sự kiện này thực hiện ngay khi ta thao khảo đến tên của Form trong mã chương trình, ngay trước khi Visual Basic bắt đầu tạo cửa sổ Form và các điều khiển trên nó. Ta thường dùng sự kiện này để khởi động giá trị các biến ban đầu trên Form. _ Sự kiện Load: lúc này Form được tạo ra cùng với các điều khiển chứa trong nó trong bộ nhớ. Nhưng Form vẫn chưa được trình bày trên màn hình, ta không nên sử dụng phương thức SetFocus để chuyển một Focus đến một điều khiển nào đó. Một Form sẽ thấy được trên màn hình chỉ khi phương thức Show được gọi. _ Sự kiện Resize: tại một thời điểm trước khi Form xuất hiện trên màn hình Visual Basic sẽ thực hiện sự kiện Resize. _ Sự kiện Active: Form đã sẳn sàng nhận dữ liệu nhập vào của người sử dụng. _ Sự kiện Paint: cũng có thể được thực hiện trước khi Form có đầy đủ các chức năng của nó. Sự kiện này không thực hiện nếu thuộc tính AutoRedraw của Form là True. _ Sự kiện DeActivate: được thực hiện khi người sử dụng chuyển Focus sang một Form khác. _ Sự kiện QueryUnload: được thực hiện khi Form chuẩn bị đóng lại. _ Sự kiện Unload: khi ta không thực hiện việc đóng Form bằng mã chương trình mà ta đóng Form bằng cách nhấn lên nút X ở trên bên phải màn hình thì Visual Basic sẽ thực hiện sự kiện Unload. _ Sự kiện Terminate: sau sự kiện Unload, Visual Basic sẽ thực hiện việc hũy tất cả các đối tượng, các điều khiển, đóng Form và giải phóng các tài nguyên mà Form sử dụng. Các thao tác với Form trong mã chương trình: Phát biểu Load: Load form_name Phát biểu này nạp Form vào bộ nhớ nhưng không trình bày nó Phương thức Show: form_name.Show thông_số Nạp Form vào bộ nhơ và trình bày Form lên màn hình Phương thức Hide: form_name.Hide Phương thức này ẩn Form nhưng Form vẫn còn hoạt động Phát biểu Unload: Unloaded form_name Phát biểu này giải phóng bộ nhớ và đóng Form Phương thức Print: Print str_name Dùng để in văn bản trên Form 5.1.2.5. Giới thiệu điều khiển DataCombo: Tương tự như ComboBox nhưng chúng khác nhau là DataCombo có thể gắn 2 ADO Data điều khiển khác nhau cùng một lúc, xác định giá trị được chọn trong ComboBox. Các thuộc tính: Ÿ DataSource: một tham chiếu đến mộg ADO Data control nối với một table trong cơ sở dữ liệu. Ÿ DataField: tên của Field trong bảng được tham chiếu bởi thuộc tính DataSource. Field này được cập nhật khi người dùng chọn một giá trị mới từ danh sách. Ÿ RowSource: một tham chiếu đến Data control thứ hai nối với lookup table. Ÿ ListField: là tên của một Field trong lookup table, phần danh sách của điều khiển sẽ chứa nội dung của Field này. Ÿ BoundColumn: tên của một Field trong lookup table khi người dùng chọn một giá trị trong phần danh sách. Ÿ MatchWithList(Read Only): trả về True nếu giá trị trong phần soạn thảo của điều khiển trùng với một giá trị trong danh sách. Ÿ BoundText: thiết lập hoặc trả về giá trị của Field có tên trong thuộc tính BoundColumn tức là giá trị sẽ gán cho cột DataField trong table. Ÿ SelectedItem: trả về một bookmark của lookup table tương ứng với các phần tử được chọn trong danh sách. Ÿ VisibleCount: trả về số lượng các phần tử xuất hiện trong danh sách. Ÿ VisibleItems: trả về một mảng các bookmarks của lookup table tương ứng với các phần tử xuất hiện trong danh sách. 5.1.2.6. Giới thiệu về hàm Shell trong Visual Basic: Khi thi hành một chương trình EXE (trong DOS – ứng dụng 16bits hay trong WINDOWS – ứng dụng 32bits), nếu thành công nó sẽ trả về giá trị Variant (Double) thể hiện số hiệu ID của tác vụ chương trình trong trường hợp ngược lại nó trả về 0. Cú pháp của hàm Shell có dạng như sau: Shell(pathname[,windowstyle]) Trong đó: pathname (đường dẫn): là tham số cần thiết chỉ ra tên chương trình cũng như các tham số dòng lệnh. [,windowstyle] (kiểu cửa sổ): là tham số tùy chọn. Nếu tham số nàu không được chỉ ra, Visual Basic lấy mặc định là kiểu thu nhỏ. Sau đây là danh sách các hằng nội tại của Visual Basic hổ trợ các kiểu cửa sổ: Hằng Giá trị Mô tả vbHide 0 Cửa sổ bị dấu và focus chứa trong cửa sổ đo.ù vbNormalFocus 1 Cửa sổ có focus và được phục hồi về kích cỡ và vị trí ban đầu. vbMinimizedFocus 2 Cửa sổ là một biểu tượng (icon) có focus. vbMaximizedFocus 3 Cửa sổ được phóng to có focus. vbNormalNoFocus 4 Cửa sổ được phục hồi về vị trí và kích cỡ trước đó. Cửa sổ cửa sổ hiện hành vẫn giữ “active”. vbMinimizedNoFocus 6 Cửa sổ là một biểu tượng. Cửa sổ hiện hành vẫn “active”. Bởi mặc định, hàm Shell thi hành các chương trình EXE không đồng bộ. Điều này có nghĩa là một chương trình là một chương trình khởi động với Shell có thể chưa thi hành xong trước khi dòng lệnh sau hàm Shell được thi hành. 5.1.2.7. Giới thiệu điều khiển DataGrid: Giới thiệu: Cách thông dụng nhất để trình bày dữ liệu của bảng trong cơ sở dữ liệu và từ dữ liệu trên DataGrid ta lưu vào cơ sở dữ liệu là dùng điều khiển lưới. Visual Basic 6 trang bị nhiều kiểu lưới khác nhau nhưng chỉ có điều khiển DataGrid và Hierachical Flex Grid là có khả năng việc làm với điều khiền ADO Data và các ADO DataSource khác. Điều khiển DataGrid không làm việc trong chế độ Unbound nhưng ta có thể liên kết nó với nhiều kiểu DataSource khác nhau như DataSource Class, mảng hai chiều kiểu string, variant, và mảng có kiểu dữ liệu do người dùng định nghĩa. Do điều khiển DataGrid chỉ làm việc như một bound control trên một ADO DataSource, việc đầu tiên ta phải làm là chuẩn bị cho nó một nguồn dữ liệu trong thời gian thiết kế như điều khiển ADO Data, DataEnvironment object hoặc một ADO Recordset hoặc một đối tượng của lớp DataSource trong thời gian thực thi chương trình. Trong thời gian thiết kế ta có thể định nghĩa trước cấu trúc Field và điều chỉnh bề rộng cột và các thuộc tính khác mà không cần viết mã. Lưu ý: chỉ có thể liên kết điều khiển DataGrid và Hierachical FlexGrid với các Recordset object có kiểu con trỏ là Static và Keyset. Sau khi nối điều khiển DataGrid với một điều khiển ADO Data hoặc một DataEnvironment conmand object qua thuộc tính DataSource của nó, click chuột phải lên điều khiển và chọn Retrieve Fields từ menu hiện ra. Công việc này chuẩn bị một định dạng của cột trong thời gian thiết kế, theo đó mỗi cột lấy tiêu đề và bề rộng trực tiếp từ các Field dưới nền của nó. Các thuộc tính của điều khiển DataGrid: Các thuộc tính trong thẻ General: _ Caption: định nghĩa chuỗi văn bản trong phần tiêu đề của điều khiển DataGrid. _ AllowAddNew, AllowDelete, và AllowUpdate(boolean): qui định các hành động thêm mới, xóa, cập nhật dữ liệu trên lưới _ ColumnHeaders(boolean): nếu là False thì tiêu đề các cột được ẩn đi. _ HeadLines: là một số nguyên từ 0-10 xác định số dòng sử dụng trong phần tiêu đề. _ RowHeight: là chiều cao mỗi dòng tính bằng twips, điều khiển DataGrid không hỗ trợ các dòng có chiều cao khác nhau. Các thuộc tính trong thẻ Column: thẻ Column cho phép đặt phần tiêu đề trong thuộc tính Caption và thuộc tính DataField cho mỗi cột trong lưới. Các thuộc tính trong thẻ Layout: cho phép thiết lập các thông số cho từng cột trong điều khiển DataGrid: _ Locked: nội dung trong cột có thể thay đổi hay không? _ AllowSizing: có thể thay đổi bề rộng cột hay không? _ Visible: cột có xuất hiện trong DataGrid hay không? _ WrapText: văn bản trong ô có thể xuống dòng không? _ Alignment: qui định dạng canh lề của nội dung trong mỗi cột gồm các giá trị sau: 0-dbgLeft; 1-dbgRight; 2-dbgCenter; 3-dbgGeneral. _ Width: bề rộng của mỗi cột Các thao tác trong thời gian thực thi: Thuộc tính Row và Col dùng để thiết lập và trả về vị trí của một ô đang nhận Focus trong thời gian thực thi. Dòng đầu tiên và cột đầu tiên của lưới có giá trị 0. Thuộc tính Text thể hiện nội dung của ô hiện hành. Thuộc tính EditActive xác định một ô có đang ở trong chế độ soạn thảo hay không? Mỗi column object sẽ có hai thuộc tính Text và Value: thuộc tính Text dùng để thiết lập và trả về chuỗi văn bản trình bày trong cột tại dòng hiện hành, còn thuộc tính Value trả về giá trị thực sự trong mỗi cột của dòng hiện hành trước khi được định dạng. Phương thức CellText và CellValue trả về nội dung của ô trong cột của một dòng bất kỳ thuộc một Bookmark của nó. VisibleRows và VisibleCols là thuộc tính chỉ đọc trả về số dòng và số cột đang xuất hiện trong DataGrid. Thuộc tính Count trả về số cột trong Column collection. Theo dõi các họat động soạn thảo: hầu hết các biết cố trong điều khiển DataGrid đều có dạng Beforexxx và Afterxxx, khi đó biến cố Beforexxx thông số Cancel = True để hũy bỏ hành động tương ứng. Bất cứ khi nào nội dung của một ô thay đổi điều khiển DataGrid sẽ nhận biến cố Change. Nếu hành động hiệu chỉnh thực sự thay đổi giá trị trong ô tức là nếu ta không nhấn phím ESC để hũy bỏ hành động thì điều khiển DataGrid sẽ nhận biến cố BeforeColUpdate và AfterColUpdate. Thực hiện tác vụ chèn và xóa: - Người sử dụng có thể xóa một hoặc nhiều dòng bằng cách chọn chúng sau đó nhấn phím Delete. Hành động này sẽ kích hoạt bộ thủ tục biến cố BeforeDelete và AfterDelete, sau đó là bộ biến cố BeforeUpdate và AfterUpdate. Nếu tác vụ Delete bị hũy bỏ thì điều khiển DataGrid sẽ trình bày một thông báo lỗi. Để bỏ qua thông báo lỗi này ta gán thông số Response = 0 trong thủ tục biến cố Error của nó. - Nếu thuộc tính AllowAddNew là True, điều khiển DataGrid sẽ trình bày một dòng trống ở hàng cuối cùng, được đánh dấu bằng ký tự * và người sử dụng có thể thêm một mẫu tin bằng cách nhập các ký tự vào một trong các ô của dòng này. Khi điều này xảy ra điều khiển DataGrid sẽ thực hiện bộ biến cố BeforeInsert và AfterInsert tiếp theo là biến cố OnAddNew. Điều khiển DataGrid không xây dựng các chức năng cho phép sắp xếp dữ liệu. Tuy nhiên ta có thể dùng biến cố HeadClick và thuộc tính Sort của ADO Recordset để sắp xếp dữ liệu như đọan mã sau đây: Private Sub DataGrid1_HeadClick(ByVal ColIndex as Integer) Dim rs as New ADODB.Recordset Set rs = Adodc1.Recordset If rs.Sort DataGrid1.Columns(ColIndex).DataField & “ ASC” Then rs.Sort = DataGrid1.Columns(ColIndex).DataField & “ASC” Else rs.Sort = DataGrid1.Columns(ColIndex).DataField & “DESC” End If End Sub 5.1.2.8. Giới thiệu về điều khiển ListView: Giới thiệu: Đây là một điều khiển tùy chọn chủ yếu trình bày nội dung của các đối tượng trong cơ sở dữ liệu, để sử dụng được ListView ta phải thêm nó vào Toolbox bằng cách click vào menu Projects chọn Components và đánh dấu vào phần Microsoft Windows Common Controls 6.0 và nhấn Apply để chấp nhận. Điều khiển ListView có 4 kiểu thể hiện cơ sở là: Icon, SmallIcon, List và Report. Điều khiển ListView bao gồm 3 tập hợp: + ListItem Collection là tập hợp các ListItem objects, mỗi object tương ứng với một phần tử của điều khiển. + ColumnHeaders Collection chứa các ColumnHeaders objects ảnh hưởng đến cách trình bày mỗi tiêu đề trong chế độ Report. + ListSubitems chứa dữ liệu của tất cả các cell được trình bày trong chế độ Report. Các thuộc tính trong thời gian thiết kế: Các thuộc tính chung: + View: các kiểu thể hiện của ListView có 4 giá trị là 0-lvwIcon, 1-lvwSmallIcon, 2-lvwList, 3-lvwReport có thể thay đổi giá trị trong chương trình. + Arrange: canh lề các icon trong điều khiển gồm các giá trị sau: 0-lvwNone(Default), 1-lvwAutoLeft, 2-lvwAutoTop. Thuộc tính này chỉ có tác dụng trong chế độ Icon và SmallIcon. + LabelEdit: qui định người dùng có thể soạn thảo văn bản kết hợp với một item trong điều khiển. Nếu giá trị này bằng 0-lvwAutomatic thì ta có thể hiệu chỉnh văn bản bằng phương thức StartLabelEdit. + LabelWrap(boolean): xác định các label có thể trình bày nhiều dòng hay không. + HideColumnHeaders(boolean): có trình bày các tiêu đề cột trong chế độ Report không. + MultiSelect(boolean): có thể chọn nhiều mục trong cùng một lúc hay không. + AllowColumnReorder(boolean): có thể thay đổi trật tự các cột bằng cách kéo thả các cột trong chế độ Report không. + GridLines(boolean): có trình bày lưới phân cách không. + FlatScrollBar(boolean): trình bày thanh cuộn không (true: không trình bày) + Checkboxes(boolean): có trình bày các ô kiểm tại mỗi dòng không. + FullRowSelect(boolean): có trình bày highlight toàn bộ trên một dòng không thay vì chỉ chọn cột đầu tiên trên cùng một dòng. + HotTracking(boolean): cho phép thay đổi hình dạng item khi di chuyển chuột lên item đó. + HoverSelection(boolean): có thể chọn một item bằng cách di chuyển chuột lên nó không. Các hoạt động trong thời gian thực thi: Thêm các đối tượng ListItem: ta có thể thêm một item mới vào một điều khiển ListView bằng phương thức Add của ListItems collection. Cú pháp như sau: Add([Index],[Key],[Text],[Icon],[SmallIcon]) as ListItem Trong đó: _ Index: tại đó mà phần tử mới được thêm vào, nếu bỏ qua thì phần tử mới sẽ được thêm vào cuối danh sách. _ Key: khóa của phần tử trong ListItems collection. _ Text: chuỗi văn bản trình bày _ Icon: là một index hoặc một key trong ImageList được thuộc tính Icon tham khảo đến. _ SmallIcon: là một index hoặc một key trong ImageList được thuộc tính SmallIcon tham khảo đến. Thêm các đối tượng ColumnHeaders: ta có thể thêm vào một cột bất kỳ trong lúc chương trình thi hành ứng dụng bằng phương thức Add của ColumnHeader. Cú pháp như sau: Add([Index],[Key],[Width],[Alignment],[Icon]) As ColumnHeader Trong đó: _ Index: là vị trí trong của cột trong tập hợp _ Key: là khóa của cột _ Text: chuỗi văn bản trình bày trong Header _ Width: bề rộng của cột (tính bằng twips) _ Alignment: chứa một trong các giá trị: canh lề trái, phải ,giữa _ Icon: là index hoặc key trong ListImage được thuộc tính ColumnHeaderIcons tham chiếu đến. Thêm ListSubItems: mỗi đối tượng ListItem có một ListSubItems collection, qua đó ta có thể tạo các giá trị trình bày trên cùng một dòng của main ListItem trong chế độ Report. Cú pháp như sau: Add([Index],[Key],[Text],[ReportIcon],[ToolTipText]) as ListSubItem Trong đó: _ Index: là vị trí của phần tử mới trong tập hợp _ Key: là khóa của phần tử mới _ Text: văn bản sẽ trình bày trong ô lưới _ ReportIcon: là chỉ số hoặc khóa của một icon trong ImageList được thuộc tính SmallIcons tham chiếu đến. _ ToolTipText: là phần văn bản sẽ xuất hiện khi người dùng giữ chuột bên trên phần tử. Điều khiển ListView không tự động liên kết với một database thông qua Data hay Remote Data hay một ADO Data. Vì vậy nếu cần lấy dữ liệu từ database ta phải tự viết mã theo qui trình sau đây: _ Lấy danh sách các Field trong Recordset. _ Tạo các ColumnHeader có chiều rộng thích hợp. _ Loại bỏ các Field không thể trình bày được. _ Xác định việc canh lề cho dữ liệu của mỗi Field. _ Tạo vòng lặp để lấy dữ liệu từ Recordset và đưa vào ListView. Ta có thể sắp xếp dữ liệu theo một cột nào đó mà ta qui định thông qua ba thuộc tính: _ Sorted: (=true) cho phép sắp xếp _ SortKey: sắp xếp dữ liệu theo cột nào _ SortOrder: sắp xếp dữ liệu theo thứ tự nào (tăng/giảm) Tìm kiếm các items trong ListView: Dùng phương thức FindItem của ListView để tìm kiếm các phần tử. Cú pháp như sau: FindItem(Search,[Where],[Start],[Match]) As ListItem Trong đó: _ Search: là chuỗi cần tìm _ Where: chỉ ra chỉ ra thuộc tính nào của chuỗi sẽ được tìm kiếm _ Start: là chỉ số hoặc khóa của ListItem mà tại đó bắt đầu tìm kiếm _ Match: 0-lvwWholeWord hoặc lvwPartial định nghĩa cách so trùng khi tìm kiếm (toàn bộ hoặc một phần). Chỉ có tác dụng khi Where = 0-lvwText. 5.1.2.9. Cách truy xuất file text tuần tự: Thao tác đọc tập tin tuần tự: Cú pháp: Open pathname For Input As #filenumber _ Lệnh Open dùng để mở file để đọc. _ pathname: tên tập tin cần đọc. _ #filenumber (thẻ file): là một số nguyên mà hệ thống tự động gán cho file, nếu ta cần mở nhiều file cùng một lúc ta dùng hàm FreeFile để lấy thẻ file kế tiếp, ví dụ: Dim nFile as Integer nFile = FreeFile Open “c:\myfile.txt” For Input As #nFile _ Từ khóa For Input xác định mở file để đọc. _ Ta dùng lệnh Line Input để đọc một dòng dữ liệu trong file. Cú pháp: Line Input #nFile, str_name _ Dùng lệnh Input để đọc một từ mà các từ này mặc định cách nhau một khoảng trắng. Cú pháp: Input #nFile, str_name _ Dùng hàm EOF() trả về giá trị kiểu boolean để xác định đã đọc đến cuối file hay chưa. _ Dùng vòng lặp Do While Loop để đọc file. Thao tác ghi tập tin tuần tự: Cú pháp: Open pathname For Append/Output As #nFile _ Lệnh Open dùng để mở file để ghi. _ pathname: tên tập tin để ghi dữ liệu. _ Mở file với từ khóa Append để ghi nối tiếp vào file _ Mở file với từ khóa Output, Visual Basic luôn tạo mới nếu chưa có và nếu file đã có thì sẽ xóa nội dung cũ mỗi lần ghi. _ Lệnh Print thực hiện lệnh ghi lên file tuần tự và luôn chèn một dòng mới vào sau mỗi lần thực hiện lệnh Print trừ khi có dấu ; hoặc các ký tự ngăn cách khác ở cuối văn bản được in. Cú pháp: Print #nFile, str_name _ Lệnh Write hoạt động tương tự như lệnh Print nhưng tự động thêm ký tự ngăn cách, dấu phẩy, Cú pháp: Write #nFile, str_name 5.2. YÊU CẦU: Có các tờ bảng điểm theo khổ giấy A4 đứng (phải đảm bảo các yêu cầu trên), sau khi scan xong được lưu dưới dạng file ảnh chuẩn của Windows là file bitmap BMP với bất kỳ tên nào cũng được. Có một máy scan để scan các tờ bảng điểm. Chương trình chạy với các máy tính có cài Hệ Điều Hành Windows98 và Windows2000. 5.3. XỬ LÝ: Sẽ có hai cách để thực hiện việc lấy điểm và lưa vào cơ sở dữ liệu: Chọn một file bảng điểm cùng với việc đặt tên file điểm để chương trình nhận dạng điểm sẽ thực hiện việc lấy điểm từ file bảng điểm đó. Sau đó theo yêu cầu người sử dụng sẽ lưu vào cơ sở dữ liệu. Chương trình nhận dạng điểm đã thực hiện việc lấy điểm từ file bảng điểm và đã xuất được điểm và số thứ tự file điểm rồi, thì chương trình sẽ lấy điểm và số thứ tự từ file điểm đó để thực hiện việc lưu điểm vào cơ sở dữ liệu. Sau đây em sẽ trình bày cách thứ nhất còn cách thứ hai cũng giống cách thứ nhất nhưng sẽ bỏ qua giai đoạn thực hiện việc lấy điểm từ file bảng điểm mà sẽ lấy trực tiếp từ file điểm đã có sẳn. 5.3.1. Chuẩn bị file ảnh và các vấn đề liên quan: Giao diện chương trình chính: Thực hiện: Ta đã có các file bảng điểm cùng số thứ tự của sinh viên, lớp, môn thi và điểm sau khi giáo viên tô vào phần tô kín một ô điểm trên tờ bảng điểm (bắt buộc phải có phần tô kín này để chương trình xử lý). Chương trình này sẽ thực hiện đối với từng bảng điểm một, cho phép người sử dụng duyệt để lấy file ảnh (bảng điểm) được lưu trong dĩa cứng của mình và sau khi người sử dụng chọn xong hình cần xử lý chương trình sẽ hiển thị ngay hình ấy lên cho người sử dụng xem trước khi xử lý nó. Duyệt lấy file ảnh và hiển thị file ảnh lên khung ảnh: Thêm một điều khiển có sẳn sau khi cài đặt Visual Basic 6.0 là Microsoft Common Dialog, điều khiển này giúp ta dễ dàng thực hiện việc duyệt file trong dĩa cứng của ta, nó còn cho phép ta quy định những loại file theo một định dạng nào đó sẽ được hiển thị hoặc tất cả các loại file. Trong chương trình ta chỉ quy định cho một loại file duy nhất được hiển thị là windows bitmap (*.bmp) còn các loại file khác không được hiển thị. Trong chương trình phần khung để hiển thị một ảnh bảng điểm theo khổ giấy A4 là nhỏ, cho nên ta phải xử lý việc hiển thị đầy đủ một file ảnh bmp cùng với hai thanh cuộn là thanh cuộn đứng và thanh cuộn ngang: * Đầu tiên ta sẽ có hai điều khiển picture box (khung chứa ảnh): một điều khiển nằm trên (picImage) và một điều khiển nằm dưới (picChild), ta cũng quy định thuộc tính AutoSize (tự động thay đổi kích thước khi file ảnh lớn hơn đối tượng chứa nó) cho picImage là False còn cho picChild là True. Nếu thuộc tính AutoSize = False thì đối tượng chứa ảnh sẽ giữ nguyên kích thước cho dù ảnh có lớn hơn nó, khi ảnh lớn hơn thì phần dư ra ngoài sẽ bị cắt bỏ còn ngược lại khi AutoSize = True thì đối tượng chứa ảnh sẽ thay đổi kích thước cho vừa với ảnh khi ảnh lớn hơn đối tượng chứa ảnh. Thuộc tính BorderStyle (kiểu đường viền của đối tượng) cho cả hai là 1 (BorderStyle = 1 thì đối tượng chứ ảnh sẽ có đường viền bao quanh còn khi = 0 thì không có). * Ta có hai thanh cuộn: thanh cuộn đứng (vscDung) và thanh cuộn ngang (hscNgang) để ta có thể cuộn ảnh xem phần ảnh không nằm trong khung ảnh, ta sẽ ẩn hai thanh cuộn này khi Form được nạp lên vì khi nào ảnh lớn hơn khung chứa thì thanh cuộn mới được xuất hiện để cuộn ảnh còn khi ảnh nhỏ hơn thì hai thanh cuộn không xuất hiện. hscNgang.Value = 0: vscDung.Value = 0 Ta đặt thuộc tính Value của hai thanh cuộn này = không khi người sử dụng đang thanh cuộn ở nửa chừng và đi chọn một ảnh khác thì đưa thanh cuộn về phần đầu (trên cùng). * Ta sẽ nạp file ảnh sau khi người sử dụng chọn vào picChild thông qua hàm LoadPicture(). Ta di chuyển picImage về đúng vị trí ban đầu của nó khi được thiết kế với các thông số Top, Left, Width, Height. Còn picChild ta cũng di chuyển về Top, Left ban đầu còn Width và Height thì tùy thuộc vào Width và Height của file ảnh. * Ta đặt thanh cuộn ngang hscNgang ở dưới đáy của khung ảnh picImage với chiều rộng bằng chiều rộng của picImage và đặt thanh cuộn đứng vscDung ở bên phải của picImage với chiều cao bằng chiều cao của picImage. * Ta thiết lập thuộc tính Max cho hscNgang là picChild.Width - picImage.Width Thuộc tính Max của vscDung là picChild.Height - picImage.Height * Xác định xem hai thanh cuộn này có xuất hiện hay không bằng cách, nếu (picImage.Height < picChild.Height) thì sẽ hiện thanh cuộn đứng còn nếu (picImage.Width < picChild.Width) thì sẽ hiện thanh cuộn ngang. * Xử lý sự kiện Change của hai thanh cuộn khi người dùng nhấn vào hai đầu của thanh cuộn thông qua hai thuộc tính Left và Top chỉ ra giá trị âm của thanh cuộn sao cho khi ta di chuyển lên, xuống, trái, phải màn hình sẽ hiện thị phần ảnh tương ứng. Đặt thuộc tính SmallChange = 150 tức là khi ta nhấn vào hai đầu của thanh cuộn sẽ di chuyển đi 150 twips, tương tự cho thuộn tính LargeChange =150 tức là ta nhấn vào phần thân của thanh cuộn cũng sẽ di chuyển đi 150 twips. Tên file ảnh (bmp) và tên file điểm (txt) cần phải có trước khi chương trình xử lý vì tham số đầu vào của chương trình xừ lý là tên file ảnh (xử lý file ảnh nào) và tên file điểm (xuất số thứ tự cùng với điểm ra file nào), đầu ra của chương trình là file điểm (số thứ tự và điểm nếu chương trình tính ra điểm) và một file chứa lỗi nếu trong quá trình xử lý có lỗi xuất hiện (danh sách các lỗi được nêu ra ở phần trên). Tên file điểm thì chương trình tạo ra mặc định là cùng tên với file bảng điểm và có phần mở rộng là .txt, bạn có thể đặt lại tên file điểm cho dễ gợi nhớ. Thực hiện một câu truy vấn để đếm số sinh viên trong một lớp là bao nhiêu và để phân chia số sinh viên trong một phòng thi thuộc cùng một lớp. Nếu trong lớp đó chưa có sinh viên nào (theo cơ sở dữ liệu giả định của em) thì báo cho người sử dụng biết để chọn lớp khác: Nếu số sinh viên trong lớp đó <= 30 thì ta phân số sinh viên đó vào trong cùng một lớp để thi. Nếu số sinh viên trong lớp đó từ hơn 30 sinh viên trở đi thì ta phân chia thành như sau: các phòng đầu có số sinh viên bằng nhau và bằng 30 sinh viên, còn phòng cuối cùng lúc nào cũng sẽ là số sinh viên bị dư ra. Ví dụ có 100 sinh viên trong một lớp thì phân chia được 4 phòng: 3 phòng đầu có số sinh viên như nhau và bằng 30 sinh viên còn phòng thứ 4 (phòng cuối cùng) sẽ có 10 sinh viên dự thi. Để lấy được số thứ tự của sinh viên theo phòng (trang) thì ta căn cứ vào việc chia phòng như trên, chẳng hạn: có 65 sinh viên trong một lớp thì ta được 3 phòng thi (trang) nếu chọn trang đầu tiên thì số thứ tự là từ 1 đến 30, còn nếu chọn trang 2 thì số thứ tự là từ 31 đến 60, còn nếu chọn trang 3 thì số thứ tự là từ 61 đến 65, còn ngược lại nếu chọn số khác thì sẽ không có sinh viên nào. Hai điều khiển thực hiện việc nhập liệu là số trang và đặt tên cho file điểm ta cũng phải kiểm tra người dùng nhập có đúng với yêu cầu không hay là nhập bừa vào: Để kiểm tra việc nhập vào tên file điểm ta dùng sự kiện Validate để bắt những lỗi do người dùng đánh vào, phần này yêu cầu nhập tên file điểm với điều kiện là phải có .txt sau cùng và không được bỏ trống. If txtFilediem.Text = “” then Cancel = True ElseIf Right$(txtFilediem.Text, 4) ".txt" Then Cancel = True End If Để kiểm tra việc nhập vào số trang ta cũng dùng sự kiện Validate để bắt lỗi: không được bỏ trống phần ghi số trang, ký tự nhập vào phải là số nguyên không âm, và số được nhập vào từ 1 đến 99. If txtTrangmay.Text = "" Then Cancel = True ElseIf txtTrangmay.Text "" And Not IsNumeric(txtTrangmay.Text) Then txtTrangmay.SelStart = 0 txtTrangmay.SelLength = 9999 Cancel = True ElseIf txtTrangmay.Text "" And CInt(txtTrangmay.Text) 99 Then txtTrangmay.SelStart = 0 txtTrangmay.SelLength = 9999 Cancel = True End If - Phần lớp và môn học sẽ được nạp lên điều khiển DataCombo từ cơ sở dữ liệu thông qua hai Recordset: rsMon cho phần hiển thị các môn học và rsLop cho việc hiển thị lớp học để cho người dùng chọn lựa cho dễ dàng tránh trường hợp nhập vào sai. Việc nạp môn và lớp được thực hiện khi Form được nạp lên. Phần hiển thị bên trên là tên môn học (dcbMongi.ListField=”TENMON”) và tên lớp học (dcbLopmay.ListField = "TENLOP") còn bên dưới chương trình thực hiện theo mã môn học (dcbMongi.BoundColumn = "MAMON") và mã lớp học (dcbLopmay.BoundColumn = "MALOP") tương ứng với phần tên. Nguồn dữ liệu của điều khiển DataCombo lớp: Set dcbLopmay.RowSource = rsLop Nguồn dữ liệu của điều khiển DataCombo môn học: Set dcbMongi.RowSource = rsMon 5.3.2. Xử lý file ảnh (bảng điểm) để cho ra file điểm: 5.3.2.1. Sơ đồ xử lý file ảnh ra file điểm: Bắt đầu Trang? Lớp? File điểm? Môn? S Common Dialog Đ Đ File ảnh S Picture Box Chuẩn bị xử lý 5.3.2.2. Trình bày việc xử lý file ảnh: Giao diện chương trình trước khi nhập điểm: Trước khi xử lý file bảng điểm thì các thông tin sau đây cần phải cung cấp cho chương trình: file bảng điểm (bmp) và file điểm (txt), đầu vào của chương trình xử lý bảng điểm là file bảng điểm nào và một file điểm để xuất điểm ra. Ngoài ra còn có tờ bảng điểm đó nằm ở trang mấy, môn gì và thuộc lớp (khóa học) nào. Sau khi có đầy đủ các thông tin trên (chương trình phải kiểm tra tính hợp lệ của thông tin như kiểm tra xem người sử dụng có chọn file bảng điểm nào chưa, có tên file điểm chưa, có nhập vào số trang hay không, có chọn lớp học hay không và môn học không. Nếu một trong các thông tin trên chưa có thì sẽ báo lỗi và yêu cầu người sử dụng nhập vào). Đến đây ta sẽ gọi một chương trình nhận dạng để xử lý file bảng điểm, chương trình này được bạn Trần Viết Khôi viết bằng ngôn ngữ C++ for DOS (như phần đầu đề tài đã nói) thông qua một hàm Shell của Visual Basic. Do mặc định, hàm Shell của Visual Basic và chương trình mà nó gọi thực hiện không đồng bộ với nhau, tức là khi hàm Shell thực hiện xong thì có thể chương trình bên trong nó chưa thực hiện xong mà do chương trình bên trong này thực hiện việc xuất dữ liệu ra file điểm, nên ta thêm một Form hiện câu thông báo yêu cầu người sử dụng chờ trong khỏang 1 giây để cho chương trình xử lý file bảng điểm chạy xong, sau khi chương trình chạy xong sẽ xuất ra một file lỗi và một file điểm. Nếu trong file lỗi có xuất hiện một dòng thông báo lỗi do chương trình xử lý đưa ra khi file ảnh đó không đúng như yêu cầu mà chương trình đưa ra thì chương trình chính sẽ đọc dòng thông báo lỗi trong file lỗi đó và đưa ra thông báo đó cho người sử dụng biết thông qua hàm Msgbox() và ngưng luôn chương trình. Khi chương trình thực hiện thành công (không có lỗi) và xuất được các điểm ra file điểm (file này nằm cùng chung một thư mục) thì chương trình thực hiện việc đếm số sinh viên và phân chia số sinh viên trong phòng thi như phần trên đã nói rõ. Câu truy vấn để đếm số sinh viên trong một lớp và phân chia phòng thi: Select q_STT_1.MASV AS MASV, q_STT_1.MALOP AS MALOP, Count(q_STT.MALOP) AS STT From q_STT, q_STT AS q_STT_1 Where (((q_STT_1.MASV) >= [q_STT].[MASV]) And ((q_STT_1.MALOP) = '" & LopMay & "')) Group by q_STT_1.MASV, q_STT_1.MALOP Dựa vào câu truy vấn trên ta biết được số sinh viên trong phòng thi và mã số của các sinh viên cùng với số thứ tự bắt đầu và kết thúc trong một phòng thi. 5.3.3. Xử lý trên cơ sở dữ liệu để nhập điểm: Giao diện của Form nhập điểm như sau: 5.3.3.1. Sơ đồ cho việc xử lý dữ liệu: Bắt đầu Thực hiện truy vấn Có dữ liệu K C Danh sách sinh viên cùng số thứ tự Số thứ tự, Điểm Điều khiển DataGrid Lớp Trang Môn 5.3.3.2. Trình bày cách xử lý dữ liệu: Sau khi thực hiện việc lấy sinh viên theo trang trong cơ sở dữ liệu cùng với số thứ tự và điểm tương ứng trong file điểm cho từng sinh viên để đưa lên điều khiển DataGrid trước khi lưu điểm vào cơ sở dữ liệu. Các thông tin sau đây phải được cung cấp: File bảng điểm. File điểm (chương trình xử lý xuất ra). Số trang (bảng điểm đó nằm ở phòng nào trong các phòng thi được chia theo quy tắc trên). Lớp mấy (khóa mấy). Môn học là gì. Thực hiện một câu truy vấn dựa vào các thông tin trên: Select STT, DIEM.MASV, DIEM.MAMON, TENSV, MON.TENMON, DIEM From MON, SINHVIEN, DIEM, q_STT_MON Where DIEM.MAMON = MON.MAMON And SINHVIEN.MASV = DIEM.MASV And DIEM.MAMON='" & MonGi & "' And MALOP='" & LopMay & "' And q_STT_MON.MASV=DIEM.MASV And STT Between " & ttDau & " And " & ttCuoi & " Câu truy vấn trên thực hiện việc lấy danh sách sinh viên theo môn học, lớp học, cùng với số thứ tự đầu và cuối cùng của phòng thi (đã lấy ở trên) thông qua một Recordset (rsSV). rsSV thực hiện việc mở câu truy vấn trên một liên kết (Connection). Khi một Recordset thực hiện thành công nó sẽ trả ra một tập các record (danh sách sinh viên thi), kết qủa trả ra này được làm nguồn dữ liệu cho điều khiển DataGrid hiển thị lên. Dữ liệu trên điều khiển DataGrid sau khi thực hiện một câu truy vấn ở trên bao gồm các cột sau đây: _ Số thứ tự (theo số thứ tự của tờ bảng điểm) _ Mã số sinh viên _ Mã môn học _ Họ và tên sinh viên _ Tên môn học _ Điểm thi Nhưng ta chỉ cho hiển thị số thứ tự, họ và tên sinh viên, tên môn học và điểm thi tương ứng, còn mã số sinh viên và mã môn học ta không hiển thị lên mà nó được dùng để xử lý. Khi dữ liệu được lấy lên từ cơ sở dữ liệu thì chỉ có phần điểm thi chưa có còn các thông tin khác đã có đầy đủ. Do đó ta sẽ đưa phần điểm thi này lên điều khiển DataGrid trước khi chúng được lưu vào cơ sở dữ liệu như sau: _ Từ file điểm (được chương trình xử lý xuất ra) ta đọc thông tin được lưu bên trong file gồm số thứ tự và điểm tương ứng với số thứ tự đó, tùy thuộc vào danh sách sinh viên thi là bao nhiêu (<=30) mà ta có bao nhiêu điểm tương ứng. _ Cách truy xuất tuần tự trong file text: mở file ra để đọc nếu chưa hết file thì đọc tiếp tục thực hiện vòng lặp để đọc số thứ tự và điểm đọc mỗi lần một dòng số thứ tự đọc trước điểm đọc sau đọc xong đóng file lại Đoạn chương trình sau đọc file điểm bất kỳ và lưu số thứ tự vào biến toàn cục là stt(30) và lưu điểm vào biến toàn cục là diem(30) với danh sách có tối đa 30 sinh viên: ‘fileKQ là file điểm do chương trình xử lý xuất ra Open fileKQ For Input As file If Not EOF(file) Then Do While Not EOF(file) ‘ở giữa phần số thứ tự và điểm cách nhau bằng một ‘khoảng trắng Input #file, stt(i) Input #file, diem(i) i = i + 1 Loop End If Close #file Sau khi đã lấy được số thứ tự cùng với điểm thi thì ta sẽ đưa điểm này lên điều khiển DataGrid để cho người sử dụng xem trước khi lưu, sau khi có được danh sách các sinh viên được thể hiện trong một Recordset rsSV ta duyệt qua từng record một, ta sẽ gán số thứ tự tăng dần cho danh sách sinh viên này (số thứ tự này trùng với số thứ tự trong danh sách thi). Chương trình đọc từng record trong một Recordset và kiểm tra từng record này bằng cách thực hiện một vòng lặp For i = số thứ tự đầu thực sự của phòng thi trong cơ sở dữ liệu to số thứ tự cuối thực sự của phòng thi trong cơ sở dữ liệu, ta lấy số thứ tự thực này để sau này ta thực hiện việc ghi điểm vào cơ sở dữ liệu được dễ dàng, còn để xử lý trên điều khiển DataGrid này ta lấy số thứ tự từ 1 đến sinh viên cuối cùng trong Recordset. Nếu số thứ tự này bằng với số thứ tự trong file điểm thì ta gán điểm tương ứng với số thứ tự trong file điểm vào cột điểm thi tương ứng với cột số thứ tự trong điều khiển DataGrid và thoát khỏi vòng lặp For, còn ngược lại ta sẽ gán giá trị rỗng cho số thứ tự đó (giá trị NULL tương ứng trong cơ sở dữ liệu). i = 1: j = 1: d = 0 ‘i: số thứ tự thực; j: số thứ tự để nhập điểm; d: số thứ tự theo file điểm If Not rsSV.EOF Then 'đưa con trỏ về record đầu tiên rsSV.MoveFirst Do While Not rsSV.EOF ‘số thứ tự bắt đầu và số thứ tự kết thúc của phòng thi ‘(trong CSDL) For i = ttDau To ttCuoi dtgDiem.Columns(0).Text = j soTTu = j If soTTu = stt(d) Then dtgDiem.Columns(5).Text = diem(d) d = d + 1 Exit For Else dtgDiem.Columns(5).Text = “” End If Next j = j + 1 rsSV.MoveNext Loop Else lblThongbao.Caption = "Trang " & TrangMay & " không có sinh viên, bạn hãy nhập vào số trang (phòng) trong khoảng từ 1 đến " & soPhong & " !" cmdGhi.Enabled = False End If Dữ liệu được trình bày trong điều khiển DataGrid để người sử dụng có thể xem xét và chỉnh sửa phần điểm nếu muốn thay đổi điểm thi hay có thể sai sót xảy ra khi chương trình xử lý phần điểm. Ta không thể thêm vào hay xóa đi một record trên điều khiển DataGrid vì một record nó liên quan đến nhiều bảng trong cơ sở dữ liệu, có ràng buộc dữ liệu với nhau và ta không thể nào ghi vào cơ sở dữ liệu. 5.3.4. Nhập điểm vào cơ sở dữ liệu: 5.3.4.1. Sơ đồ mô tả: Dữ liệu có sẳn trên điều khiển DataGrid Lưu? Cơ sở dữ liệu N Y Query cập nhật 5.3.4.2. Trình bày cách nhập điểm: Để thực hiện việc ghi điểm vào cơ sở dữ liệu với điều kiện dữ liệu phải có trên điều khiển DataGrid còn dữ liệu trên điều khiển DataGrid không có thì ta phải cấm nút Ghi (để tránh trường hợp người dùng bấm nút Ghi để ghi vào cơ sở dữ liệu khi không có dữ liệu). Ta mở một Connection mới và thực hiện việc mở lại Recordset (rsSV) dựa trên Connection đó, sau đó thực hiện việc cập nhật điểm thi vào cơ sở dữ liệu thông qua phương thức UpdateBatch của đối tượng Recordset. Khi người sử dụng nhấn vào nút Ghi thì ta sẽ hỏi lại người dùng có thật sự muốn ghi vào cơ sở dữ liệu không, nếu người dùng đồng ý thì thực hiện việc ghi còn nếu không muốn ghi thì ta hũy việc ghi đó bằng cách dùng phương thức CancelBatch của đối tượng Recordset. 5.3.5. Xem điểm sinh viên trong cơ sở dữ liệu theo lớp học hay theo môn học: 5.3.5.1. Sơ đồ mô tả: Môn học Lớp học Chọn theo? ListView với danh sách sv theo môn học ListView với danh sách sv theo lớp học = lớp = môn chọn 1 trong 2 5.3.5.2. Lấy dữ liệu và xem dữ liệu: Dữ liệu được trình bày trên một điều khiển ListView bao gồm 4 cột dữ liệu: mã số sinh viên, họ tên sinh viên, tên môn học và điểm thi. Giao diện của chương trình có dạng như sau: Có thể xem cơ sở dữ liệu theo hai cách sau: Xem theo môn học. Xem theo lớp học (khóa học). Để xem cơ sở dữ liệu điểm đầu tiên ta phải chọn một trong hai cách xem ở trên, cùng một lúc ta chỉ có thể xem một trong hai cách thể hiện, nếu ta chọn cách xem theo môn học thì chỉ có phần môn học được hoạt động còn phần lớp thì bị cấm hoạt động và ngược lại, được thể hiện qua đoạn mã sau đây: Select Case Index ‘0: chọn theo môn; 1: chọn theo lớp Case 0 dcbMon.Enabled = True dcbLop.Enabled = False Case 1 dcbMon.Enabled = False dcbLop.Enabled = True End Select Khi Form xem điểm được nạp lên thì dữ liệu trong hai DataCombo: _ Đối với DataCombo môn học ta sử dụng một Recordset (rsMonhoc) để thực hiện một câu truy vấn dựa trên bảng MON để lấy tên môn học làm nguồn dữ liệu cho DataCombo, còn mã môn học được chương trình sử dụng để hiển thị dữ liệu lên ListView. _ Đối với DataCombo lớp thì ta cũng sử dụng một Recordset (rsLop) để thực hiện một câu truy vấn dựa trên bảng LOP để lấy tên lớp làm nguồn dữ liệu cho DataCombo, còn mã lớp thì được chương trình sử dụng để hiển thị dữ liệu lên ListView. Khi Form xem điểm bị hũy thì ta kiểm tra xem trạng thái của rsMonhoc, rsLop, cn1 là đang mở hay đóng nếu đang mở thì ta đóng lại và giải phóng hai Recordset (rsMonhoc và rsLop) đồng thời cũng đóng một Connection tạm thời cho việc xử lý dữ liệu là cn1, còn ngược lại thì thôi để tránh trường hợp người sử dụng thực hiện nhiều lần cùng một tác vụ vì khi ta đang mở một Recordset hay một Connection mà ta lại mở tiếp thì chương trình sẽ báo lỗi: If rsMonhoc.State And adStateOpen Then rsMonhoc.Close Set rsMonhoc = Nothing End If If rsLop.State And adStateOpen Then rsLop.Close Set rsLop = Nothing End If If cn1.State And adStateOpen Then cn1.Close: Set cn1 = Nothing End If Khi ta cần thực hiện một việc gì liên quan đến cơ sở dữ liệu trong Visual Basic thì ta cần làm như sau: _ Đầu tiên phải mở một Recordset hay một Connection hay một Command. _ Tiếp theo là xử lý yêu cầu mà bài toán đặt ra. _ Cuối cùng sau khi thực hiện xong ta phải đóng lại và giải phóng đối tượng mà ta đã sử dụng. Khi người sử dụng nhấp lên phần thân của DataCombo môn học (dcbMon) và chọn một môn trong danh sách được liệt kê thì lập tức chương trình sẽ thực hiện câu truy vấn với một tham số là mã môn học và sẽ trình bày dữ liệu lên DataCombo sau khi thực hiện xong truy vấn. Tương tự khi người dùng nhấp lên phần thân của DataCombo lớp (dcbLop) và chọn một lớp trong danh sách được liệt kê ra thì lập tức chương trình sẽ thực hiện câu truy vấn với một tham số là mã môn học và sẽ trình bày dữ liệu lên DataCombo sau khi thực hiện xong truy vấn. Nếu có điều kiện chương trình được mở rộng thì ta có thể xuất dữ liệu ra một trang HTML hay ra một bảng tính Excel để tiện cho việc trình bày dữ liệu và in ấn nếu cần thiết. 5.4. GIẢI THUẬT: 5.4.1. Đánh số thứ tự của sinh viên: Giải thuật: Để đánh số thứ tự của sinh viên trong bảng SINHVIEN sau khi được sắp xếp mã số sinh viên tăng dần theo thứ tự Alphabet thì ta thực hiện như sau: Có sẳn một bảng SINHVIEN Tạo một bảng sau của bảng SINHVIEN là SINHVIEN_1 Thực hiện việc đếm tất cả sinh viên trong cơ sở dữ liệu Với điều kiện MASV của bảng SINHVIEN_1 lớn hơn hay bằng MASV của bảng SINHVIEN Nhóm theo MASV và MALOP của bảng SINHVIEN_1 Minh họa giải thuật trên bằng câu lệnh SQL: SELECT SINHVIEN_1.MASV AS MASV, SINHVIEN_1.MALOP AS MALOP, COUNT(SINHVIEN_1.MALOP) AS SOTT FROM SINHVIEN, SINHVIEN AS SINHVIEN_1 WHERE (((SINHVIEN_1.MASV)>=[SINHVIEN.MASV])) GROUP BY SINHVIEN_1.MASV, SINHVIEN_1.MALOP; 5.4.2. Cập nhật điểm thi: Để cập nhật điểm thi vào cơ sở dữ liệu ta thực hiện như sau: Trước tiên ta phải lấy được danh sách sinh viên tương ứng với yêu cầu của người sử dụng, ta thự hiện như sau: Có được số trang Lấy số thứ tự sinh viên từ trang Lấy môn học và lớp học Cụ thể như sau: SELECT STT, DIEM.MASV, DIEM.MAMON, TENSV, MON.TENMON, DIEM FROM MON, SINHVIEN, DIEM, q_STT_MON WHERE DIEM.MAMON =MON.MAMON AND SINHVIEN.MASV=DIEM.MASV AND DIEM.MAMON='" & MonGi & "' AND MALOP='" & LopMay & "' AND q_STT_MON.MASV=DIEM.MASV AND STT BETWEEN " & ttDau & " AND " & ttCuoi & " Câu truy vấn này sẽ lấy được danh sách các sinh viên có số thứ tự từ ttDau (số thứ tự đầu) đến ttCuoi (số thứ tự cuối) theo mã môn, mã lớp và số trang với các thông tin mô tả sinh viên cùng điểm thi của sinh viên đó gồm: số thứ tự (STT), mã sinh viên (MASV), mã môn học (MAMON), tên sinh viên (TENSV), tên môn học (TENMON), và điểm thi (điểm thi chưa có). Tất cả các thông tin đó ta đưa vào điều khiển DataGrid. Ta cũng thực hiện việc lấy số thứ tự và điểm tương ứng với số thứ tự từ trong file điểm do chương trình nhận dạng xuất ra. Từ số thứ tự của các sinh viên được lấy từ cơ sở dữ liệu và số thứ tự trong file điểm, ta sẽ thực hiện như sau: So trùng nếu hai số thứ tự bằng nhau ta sẽ gán điểm cho số thứ tự tương ứng. So trùng nếu không bằng nhau thì ta gán giá trị Null cho số thứ tự đó vì sinh viên tương ứng với số thứ tự đó trong bảng điểm không có thi hay không được dự thi. Các thông tin về sinh viên cùng điểm thi sẽ xuất hiện trên DataGrid. Và người dùng chỉ cần phát lệnh ghi thì điểm sẽ được cập nhật vào cơ sở dữ liệu. CHƯƠNG 6: ƯU ĐIỂM, KHUYẾT ĐIỂM VÀ HƯỚNG PHÁT TRIỂN ĐỀ TÀI 6.1. ƯU ĐIỂM: Thực hiện việc nhập điểm vào cơ sở dữ liệu thông qua tờ bảng điểm được nhanh chóng và chính xác. Chương trình rất dễ sử dụng và có phần trợ giúp cho người sử dụng lần đầu tiên sử dụng. Chạy trên hầu hết với những cấu hình máy tính hiện nay. Dễ dàng nâng cấp các tính năng mới và cao cấp sau này. Dung lượng chương trình sau khi cài đặt nhỏ, gọn. 6.2. KHUYẾT ĐIỂM: Phần thiết kế cho giao diện chương trình còn đơn giản, ít chức năng cho việc làm việc với cơ sở dữ liệu điểm của sinh viên. Thực hiện với cơ sở dữ liệu còn nặng vì phải thực hiện truy vấn lấy số sinh viên trong cơ sở dữ liệu có rất nhiều sinh viên cùng với môn học và lớp học. Ơû phần nhận dạng, chương trình mới nhận dạng được phần tô điểm còn những phần khác chưa được xử lý. Tờ bảng điểm có tối đa là 30 sinh viên mà vì lý do nào đó có thêm một vài sinh viên thì chương trình sẽ không xử lý được số sinh viên được thêm vào. 6.3. HƯỚNG PHÁT TRIỂN CỦA ĐỀ TÀI: Hiện tại cơ sở dữ liệu được sử dụng là Microsoft Access 2000 và sau này nếu có nâng cấp lên SQL Server thì cũng dễ dàng thực hiện. Sau này nếu có điều kiện phát triển thì chúng em sẽ thực hiện việc nhận dạng các thông tin trên tờ bảng điểm sẽ đầy đủ các phần như mã số sinh viên, lớp học, môn thi, kỳ thi, có thể có lần thi, kể cả phần giáo viên cho điểm thi bằng tay, phần này do chương trình nhận dạng điểm thi giải quyết. Có thể xuất dữ liệu theo yêu cầu của người sử dụng và xuất dữ liệu ra một trang Web hay ra bảng tính Excel để thuận tiện cho việc in ấn và thống kê khi cần thiết. Có thể xử lý những file ảnh có màu, chế độ 24bits màu, ảnh nén theo các giải thuật khác nhau. Xử lý ảnh bị biến dạng, bị dơ, ảnh kém chất lượng. Giao diện chương trình đẹp hơn và có nhiều chức năng để đáp ứng phần nào yêu cầu của người sử dụng. Khảo sát cơ sở dữ liệu thực tế của Trường để thiết kế chương trình sao cho thực hiện việc nhập điểm đơn giản và dễ dàng hơn. Đưa ra được mô hình ngoài và sự độc lập dữ liệu. LỜI CẢM ƠN Em xin gởi lời cám ơn chân thành đến Khoa CÔNG NGHỆ THÔNG TIN, trường ĐẠI HỌC DÂN LẬP KỸ THUẬT CÔNG NGHỆ TP HCM đã tạo điều kiện cho em thực hiện đề tài này. Em xin chân thành cám ơn thầy HUỲNH VĂN ĐỨC đã tận tình hướng dẫn, chỉ bảo em trong suốt thời gian thực hiện đề tài. Em cũng xin chân thành cảm ơn quý Thầy Cô trong Khoa đã tận tình giảng dạy, trang bị cho chúng em những kiến thức cần thiết trong suốt quá trình học tập tại trường, và cũng xin gởi lời biết ơn sâu sắc đến Cha, Mẹ, Em, và bạn bè đã ủng hộ, giúp đỡ, động viên em trong những lúc khó khăn cũng như trong suốt những năm học vừa qua. Mặc dù đã cố gắng hoàn thành luận văn với tất cả những nổ lực của bản thân, nhưng luận văn chắc không tránh khỏi những thiếu sót nhất định, kính mong sự cảm thông và tận tình chỉ bảo của quý Thầy Cô. Sinh viên thực hiện Nguyễn Văn Thành TÀI LIỆU THAM KHẢO 1. Microsoft Visual Basic 6.0 và Lập trình cơ sở dữ liệu của Nhà Xuất Bản Giáo Dục do các tác giả: Nguyễn Thị Ngọc Mai (chủ biên), Nguyễn Thị Kim Trang, Hoàng Đức Hải, Nguyễn Hữu Anh (cố vấn kỹ thuật). 2. Tài liệu tham khảo Visual Basic của thầy Lâm Tấn Phát. 3. Kỹ thuật lập trình - Visual Basic tự học trong 21 ngày của Nhà Xuất Bản Giáo Dục do các tác giả: Nguyễn Tiến, Ngô Quốc Việt, Phạm Nguyễn Tuấn Kỳ. 4. Tài liệu Lập trình Visual Basic và cơ sở dữ liệu của thầy Nguyễn Gia Tuấn Anh. 5. Giáo trình Microsoft Access 97 của Trung Tâm Tin Học Thực hành. 6. Bài giảng Lập trình quản lý và Hệ quản trị cơ sở dữ liệu Access của giáo viên Ngô Phước Nguyên. 7. Cơ sở đồ họa máy tính của Nhà Xuất Bản Giáo Dục do Hoàng Kiếm (chủ biên), Dương Anh Đức, Lê Đình Duy và Vũ Hải Quân.

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

  • docBAOCAO.doc
  • pptBAOCAO.PPT
  • docBaoCaoKhoi.doc
  • pptBaoCaoKhoi.ppt
  • docBIA NGOAI.doc
  • docBIA TRONG.doc
  • rarDemo.rar
  • rarSource.rar
Tài liệu liên quan