Dùng Control Data

Một phần của tài liệu Tự học Visual Basic phần 3 (Trang 35 - 46)

Control Data

T VB5, Visual Basic cho l p trình viên m t control đ truy c p c s d li u, tên nó ch đ n s là Data. Nh ta bi t, có m t c s d li u Microsoft gói kèm khi ta mua VB6 - đó là Jet Database Engine. Jet Database Engine là cái "phòng

máy" c a chính MS Access Database Management System.

Cho đ n th i VB5, Microsoft cho ta ba k thu t chính:

DAO (Data Acess Objects): DAO là k thu t bí truy n c a

Microsoft, ch đ dùng v i Jet Database Engine. Nó r t d dùng, hi u n ng và ti n, nh ng b gi i h n trong ph m vi MS Access. D u v y, nó r t th nh hành vì có l i ích th c ti n.

ODBC (Open Database Connectivity): ODBC đ c thi t k đ cho phép users n i v i đ lo i databases mà ch dùng m t method duy nh t. i u này c t b t gánh n ng cho l p trình viên, đ ch c n h c m t k thu t l p trình duy nh t mà có th làm vi c v i b t c lo i database nào. Nh t là khi sau này n u c n ph i thay đ i lo i database, nh nâng c p t Access lên SQLServer ch ng h n, thì s s a đ i v coding r t ít. Khi dùng ODBC chung v i DAO, ta có th cho Access Database n i v i các databases khác. Có m t b t l i c a ODBC là nó r c r i.

RDO (Remote Data Object): M t trong nh ng lý do chính

đ RDO đ c thi t k là gi i quy t khó kh n v s r c r i c a ODBC. Cách l p trình v i RDO đ n gi n nh DAO, nh ng th t ra nó dùng ODBC nên cho phép users n i v i nhi u databases. Tuy nhiên, RDO không đ c th nh hành l m.

VB6 ti p t c h tr các k thu t nói trên, và cho thêm m t k thu t truy c p database m i, r t quan tr ng, đó là ADO (ActiveX Data Objects). Trong m t bài t i ta s h c v ADO v i nh ng u đi m c a nó. Tuy nhiên, vì DAO r t đ n gi n và hi u n ng nên ta v n có th ti p t c dùng nó r t h u hi u trong h u h t các áp d ng. Do đó bài này và bài k s t p trung vào nh ng k thu t l p trình ph bi n v i DAO.

Cách dùng gi n ti n c a control Data là đ t nó lên m t Form r i làm vi c v i nh ng Properties c a nó. B n hãy b t đ u m t d án VB6 m i, cho nó tên

DataControl b ng cách click tên project trong Project Explorer bên ph i r i edit

property Name trong Properties Window.

DoubleClick lên Icon c a Control Data trong Toolbox. M t Control Data tên

Data1 s hi n ra trên Form. Mu n cho nó n m bên d i Form, gi ng nh m t StatusBar, hãy set property Align c a nó trong Properties Window thành 2 -

Align Bottom.

Click bên ph i hàng property DatabaseName, k đó click lên nút browse có ba ch m đ ch n m t file Access dabase t giao tho i cho Data1. đây ta ch n

E:\Program Files\Microsoft Visual Studio\VB98\BIBLIO.MDB , trong

computer c a b n có th nó n m trên disk C hay D.

Trong ch ng trình này ta mu n làm vi c v i table Titles c a database

BIBLIO.MDB, đ xem và edit các records. ý property DefaultType c a Data1 có tr s 2- UseJet, t c là dùng k thu t DAO, thay vì dùng k thu t

ODBC.

Khi b n click lên property Recordsource c a Data1, r i click lên cái tam giác nh bên ph i, m t ComboBox s m ra cho ta th y danh sách các tables trong database. B n hãy ch n Titles. ý property RecordsetType c a Data1 có tr s là 0 - Table:

Cái t m i mà ta s dùng th ng xuyên khi truy c p d li u trong VB6 là

Recordset (b records). Recordset là m t Set of records, nó có th ch a m t

s records hay không có record nào c . M t record trong Recordset có th là m t record l y t m t Table. Trong tr ng h p y có th ta l y v t t c records trong table hay ch nh ng records th a đúng m t đi u ki n, thí d nh ta ch mu n l y các records c a nh ng sách xu t b n tr c n m 1990 (Year Published < 1990).

M t Record trong Recordset c ng có th là t p h p các c t (columns) t hai (hay ba) tables qua các m i liên h one-to-one và one-to-many. Thí d nh khi l y các records t table Titles, ta mu n có thêm chi ti t tên công ty (Company Name) và đi n tho i (Telephone) c a nhà xu t b n (table Publishers) b ng cách dùng Foreign Key PubID trong table Titles làm Primary Key trong table

Publishers đ l y các chi ti t y.

Trong tr ng h p y ta có th xem nh có m t virtual ( o) table là t p h p

c a hai tables Titles và Publishers.

Bây gi b n hãy đ t lên Form 4 labels v i captions: Title, Year Published,

ISBN và Publisher ID. K đó cho thêm 4 textboxes t ng ng và đ t tên chúng là txtTitle, txtYearPublished, txtISBN và txtPublisherID.

Ch n textbox txtTitle, r i set property Datasource c a nó trong Properties Window thành Data1. Khi click lên property Datafield c a txtTitle và m ComboBox ra b n s th y li t kê tên các Fields trong table Titles. ó là vì Data1

đ c coi nh trung gian l y table Titles t database. đây ta s ch n c t Title.

L p l i công tác này cho 3 textboxes kia, và ch n các c t Year Published (n m xu t b n), ISBN (s lý l ch trong th vi n qu c t ), và PubID (s lý l ch nhà xu t b n) làm Datafield cho chúng.

T i đây, m c d u ch a vi t m t hàng code, ta có th ch y ch ng trình đ c r i. Nó s hi n th chi ti t c a record đ u tiên trong table Titles nh d i đây:

B n có th b m các nút di chuy n Navigator Buttons đ đi đ n các record

đ u (first), tr c (previous), k (next) và cu i (last). M i l n b n di

chuy n đ n m t record m i là chi ti t c a record y s hi n th . N u không dùng các Navigator Buttons, ta c ng có th code đ làm công tác t ng đ ong b ng cách g i các Recordset methods MoveFirst, MovePrevious, MoveNext và

MoveLast.

Khi record cu i c a Recordset đang hi n th , n u ta g i method MoveLast thì

property EOF (End-Of-File) c a Recordset tr thành True. T ng t nh v y,

khi record th nh t c a Recordset đang hi n th , n u ta g i method

N u m t Recordset không có ch a m t record nào c thì c hai properties EOF và BOF đ u là True.

c tính hi n th d li u trong các textboxex theo đúng record hi n th i (current record) đ c g i là data binding hay data bound (bu c vào d li u) và control TextBox h tr ch c n ng này đ c nói là Data Aware (bi t bà con d li u).

Khi record đ u tiên đang hi n th , n u b n edit Year Published đ đ i t 1985 thành 1983 r i click Navigator button Next đ hi n th record th nhì, k đó click Navigator button Previous đ hi n th l i record đ u tiên thì b n s th y là field Year Published c a record đ u tiên đã th t s đ c thay đ i (updated) thành 1983.

i u này có ngh a r ng khi Data1 navigates t record này đ n record khác thì n u record này đã có s thay đ i vì user edited, nó l u tr s thay đ i đó tr c khi di chuy n. Ch a ch c là b n mu n đi u này, do đó, n u b n không mu n user tình c edit m t record thì b n có th set property Locked c a các textboxes y thành True đ user không th edit các textboxes nh trong hình d i đây:

Ch đ nh v trí Database lúc ch y ch ng trình

Cách ch đnh tên DatabaseName trong giai đo n thi t k (at design time) ta đã dùng tr c đây tuy ti n l i nh ng h i nguy hi m, vì khi ta cài ch ng trình này lên computer c a khách, ch a ch c file database y n m trong m t folder có cùng tên. Thí d trên computer mình thì database n m trong folder E:\Program Files\Microsoft Visual Studio\VB98, nh ng trên computer c a khách thì database n m trong folder C:\VB6\DataControl ch ng h n. Do đó, khi ch ng trình kh i

cùng m t folder v i ch ng trình đang ch y, ta có th dùng property Path c a Application Object App nh sau:

Dim AppFolder As String

Private Sub Form_Load()

' Fetch Folder where this program EXE resides AppFolder = App.Path

' make sure it ends with a back slash

If Right(AppFolder, 1) <> "\" Then AppFolder = AppFolder & "\" ' Assign Full path database filename to Data1

Data1.DatabaseName = AppFolder & "BIBLIO.MDB"

End Sub

V i cách code nói trên ta s đ m b o ch ng trình tìm th y file database đúng ch , không c n bi t ng i ta cài ch ng trình b n đâu trong hard disk c a computer khách.

N u b n đang h c VB6 t xa, khi n p bài database cho giám th VB6 mà b n hardcode (vi t ch t c ng) v trí c a file database trong lúc thi t k thì giám th (tutor) c ng g p cùng s khó kh n này vì ch a ch c giám th s ch a database trong m t folder có cùng tên nh trong harddisk c a b n.

Thêm b t các Records

Ch ng trình trên dùng c ng t m đ c, nh ng nó không cho ta ph ng ti n đ

thêm (add), b t (delete) các records. Bây gi b n hãy đ vào Form 5 buttons tên: cmdEdit, cmdNew, cmdDelete, cmdUpdate và cmdCancel.

M c d u b n không th y, nh ng th t ra Control Data Data1 có m t property Recordset và khi ta dùng Navigator buttons là di chuy n t record này đ n record khác trong Recordset y. Ta có th nói đ n nó b ng Notation (cách vi t)

Data1.Recordset, và m i l n mu n l y Recordset m i nh t t database ta

dùng method Refresh nh Data1.Recordset.Refresh.

Lúc chu ng trình m i kh i đ ng, user đang xem (browsing) các records thì hai buttons Update và Cancel không c n ph i làm vi c. Do đó ta s nhân ti n Lock (khóa) các textboxes và disable (làm cho b t l c) hai buttons này vì không c n dùng chúng.

Trong Sub SetControls d i đây, ta dùng m t parameter g i là Editing v i tr s False hay True tùy theo user đang Browse hay Edit, ta g i là Browse mode và Edit mode. Trong Edit mode, các Textboxes đ c unlocked (m khóa) và các nút cmdNew, cmdDelete và cmdEdit tr nên b t l c:

Sub SetControls(ByVal Editing As Boolean) ' Lock/Unlock textboxes

txtTitle.Locked = Not Editing

txtYearPublished.Locked = Not Editing txtISBN.Locked = Not Editing

txtPublisherID.Locked = Not Editing ' Enable/Disable buttons

CmdUpdate.Enabled = Editing CmdCancel.Enabled = Editing CmdDelete.Enabled = Not Editing cmdNew.Enabled = Not Editing CmdEdit.Enabled = Not Editing

End Sub

Trong Browse mode, Form có d ng nh sau:

Sub SetControls đ c g i trong Sub Form_Load khi ch ng trình kh i đ ng và trong Sub CmdEdit khi user click nút Edit nh sau:

Private Sub Form_Load()

' Fetch Folder where this program EXE resides AppFolder = App.Path

' make sure it ends with a back slash

If Right(AppFolder, 1) <> "\" Then AppFolder = AppFolder & "\" ' Assign Full path database filename to Data1

Data1.DatabaseName = AppFolder & "BIBLIO.MDB" ' Place controls in Browse Mode

SetControls (False)

End Sub

Private Sub CmdEdit_Click() ' Place controls in Edit Mode SetControls (True)

Khi ta Delete m t record trong recordset, v trí c a record hi n t i (current record) v n không thay đ i. Do đó, sau khi delete m t record ta ph i

MoveNext. Kh n i, n u ta v a delete record cu i c a Recordset thì sau khi

MoveNext, property EOF c a Recordset s thành True. Thành ra ta ph i ki m

tra đi u đó, n u đúng v y thì l i ph i MoveLast đ hi n th record cu i c a Recordset nh trong code c a Sub cmdDelete_Click d i đây:

Private Sub CmdDelete_Click() On Error GoTo DeleteErr With Data1.Recordset ' Delete new record .Delete

' Move to next record .MoveNext

If .EOF Then .MoveLast Exit Sub End With DeleteErr: MsgBox Err.Description Exit Sub End Sub

Trong lúc code, ta Update (c p nh t hóa) m t record trong Recordset b ng method Update. Nh ng ta ch có th g i method Update c a m t Recordset khi Recordset đang trong Edit hay AddNew mode. Ta đ t m t Recordset vào

Edit mode b ng cách g i method Edit c a Recordset, thí d nh

Data1.Recordset.Edit. T ng t nh v y, ta đ t m t Recordset vào AddNew

mode b ng cách g i method AddNew c a Recordset, thí d nh

Data1.Recordset.AddNew.

Private Sub cmdNew_Click()

' Place Recordset into Recordset AddNew mode Data1.Recordset.AddNew

' Place controls in Edit Mode SetControls (True)

End Sub

Sau khi Recordset g i method Update thì Recordset y ra kh i AddNew hay Edit modes. Ta c ng có th t thoát ra kh i AddNew hay Edit modes, hay nói cho

đúng h n là h y b m i pending (đang ch đ i) Update b ng cách g i method

CancelUpdate, thí d nh Data1.Recordset.CancelUpdate. Dùng DataBound Combo

Trong ch ng trình hi n t i ta ch hi n th lý l ch nhà xu t b n (PubID) c a Title, ch không có thêm chi ti t. Ph i chi m c d u ch ng trình l u tr PubID,

nh ng hi n th đ c Company Name c a nhà xu t b n cho ta làm vi c đ kh i ph i nh các con s thì hay quá. Ta có th th c hi n đi u đó b ng cách dùng

Control DBCombo (Data Bound Combo). B n hãy dùng IDE Menu Command

Project | Components... đ ch n Microsoft Data Bound List Controls 6.0 r i click Apply.

K đó, thêm m t DBCombo tên DBCombo1 vào Form. Vì ta c n m t Recordset khác đ cung c p Table Publisher cho DBCombo1, nên b n hãy thêm m t control Data th nhì tên Data2 vào Form. Cho Data2, hãy set property DatabaseName

thành E:\Program Files\Microsoft Visual Studio\VB98\BIBLIO.MDB và

property RecordSource thành Publishers. không cho ng i ta th y hình Data2 lúc run-time, b n hãy set property Visible nó thành False.

Cái m c đích c a chúng ta khi dùng DBCombo1 là hi n th Company Name c a nhà xu t b n, nh ng đ ng sau l ng thì không có gì thay đ i, t c là ta v n làm vi c v i PubID cho các record Title c a Data1. Khi user click lên DBCombo1 đ

ch n m t nhà xu t b n, thì ta theo Company Name đó mà ch a PubID t ng ng trong record Title c a Data1. Do đó có nhi u th ta ph i s p đ t cho DBCombo1 nh sau:

Property Value Chú thích

RowSource Data2 ây là datasource c a chính DBCombo1. Nó cung c p table Publishers.

Listfield Company

Name

Khi RowSource phía trên đã đ c ch n r i, Combo c a property Listfield này s hi n th các fields c a table Publishers. Company Name là field c a RowSource mà ta mu n hi n th trên DBCombo1.

DataSource Data1 ây là datasource c a record mà ta mu n. edit, t c là record c a table Titles

Datafield PubID Field (c a record Title) s đ c thay đ i.

BoundColumn PubID

Field trong RowSource (table Publishers) t ng ng v i item user ch n trong DBCombo1 (Company Name).

Khi trong Edit mode user ch n m t Company Name khác trong DBCombo1 r i click nút Update b n s th y Textbox txtPublisherID c ng đ i theo và hi n th con s lý l ch PubID m i. N u tr c khi Update b n mu n th y PubID m i hi n th trong Textbox txtPublisherID thì b n có th dùng Event Click c a DBCombo1 nh sau:

Private Sub DBCombo1_Click(Area As Integer) ' Display new PuBID

txtPublisherID.Text = DBCombo1.BoundText

End Sub

Property BoundText c a DBCombo1 là tr s c a BoundColumn mà ta có th

truy c p (vi t hay đ c) đ c. Thí d nh b n mu n m i khi thêm m t record Title m i thì default PubID là 324, t c là Company Name= "GLOBAL ENGINEERING". B n có th assign tr s 324 vào property BoundText c a DBCombo1 trong Sub cmdNew_Click nh sau:

Private Sub cmdNew_Click()

' Place Recordset into Recordset AddNew mode Data1.Recordset.AddNew

DBCombo1.BoundText = 324 ' Place controls in Edit Mode SetControls (True)

End Sub

Trong bài t i ta s h c thêm v cách coding đ dùng Recordset trong k thu t DAO.

L p trình v i k thu t DAO

Một phần của tài liệu Tự học Visual Basic phần 3 (Trang 35 - 46)