hic, vấn đề nan giải của tui, ai giúp tui với

  • Thread starter saigonpho
  • Ngày gửi
S

saigonpho

Thành viên sơ cấp
21/12/05
8
0
0
tp HCM
#1
Trong 1 form
Tôi có 1 list box hiển thị danh sách các thí sinh, gồm các file: SBD, Ten, Diem.
và 1 text box hiển thị tổng điểm thi của thí sinh đó (đặt tên là txtTongDiem)
Tui muốn, khi trong list box không thí sinh nào được chọn, thì txtTongDiem rỗng.
Làm sao để biết trong list box đã chọn 1 thí sinh nào đó hay chưa ??? Dùng hàm nào vậy. Ai có thể trả lời giúp tôi được ko.
Chân thành cám ơn.
 
HongViet

HongViet

Thành viên thân thiết
10/11/05
286
10
18
Đà nẵng
#2
saigonpho nói:
Trong 1 form Tôi có 1 list box hiển thị danh sách các thí sinh, gồm các file: SBD, Ten, Diem. sao để biết trong list box đã chọn 1 thí sinh nào đó hay chưa ??? Dùng hàm nào vậy
ListBox của bạn gồm 3 cột (trường); chúng cũng access cho người khác truy xuất số liệu như thường .Columns(i) : i=0 là trường đầu (mặc định) đó nghe!
:dzo:
 
Đào Việt Cường

Đào Việt Cường

Moderator
22/11/05
400
3
18
Khánh Hòa
#3
Dear saigonpho,
---------------
Vấn đề của bạn thực ra có nhiều cách "giải" mà cũng không thấy "nan" tẹo nào. Nếu bạn lắm vững cơ bản về MS Access thì bạn có thể làm một trong nhiều cách như thế này:
Cách 1: Tham khảo hàm IIF để kiểm tra SBD có IsNull hay không (nếu không thì kết hợp với hàm DLookup).
Cách 2:Viết thủ tục sự kiện SBD_AfterUpdate (hoặc SBD_Click): tôi chỉ gợi ý cho bạn sử dụng thuộc tính ListIndex của SBD để biết được index số báo danh được chọn trong ListBox. Nếu ListIndex=-1 có nghĩa là danh sách chưa được chọn.
Cách thứ 3: Other Mems psl
:0frown:
 
Sửa lần cuối:
S

saigonpho

Thành viên sơ cấp
21/12/05
8
0
0
tp HCM
#4
Cám ơn bạn đã trả lời câu hỏi của tôi.
Tuy nhiên, khi tui làm thì nó báo lỗi vậy nè
(báo lỗi ở chỗ gán cho txtTongDiem rỗng)

Run time error'-2147352567 (80020009)':

You can't assign a value to this object.

đoạn code như sau:

Private Sub cboMaNganh_Click()
Me.lstDSTS.Requery
Me.txtDiemDau.Requery
If Me.lstDSTS.ListIndex = -1 Then
Me.txtTongDiem = Null hoặc Me.txtTongDiem = " " -> báo lỗi
End If
End Sub

bạn có thể giúp tôi được ko, cám ơn bạn nhiều lắm
 
paulsteigel

paulsteigel

Thành viên thân thiết
13/11/05
103
0
16
42
Hoà Bình
www.sfdp.net
#5
Nào lật lại vấn đề một tẹo!
Bạn cần làm rõ nhé - txtTongdiem sẽ trả về giá trị cho bảng dữ liệu hay chỉ là hiển thị chơi?
Nếu để trả về dữ liệu cho bảng dữ liệu thì bạn cần xác định rõ điểm này!
Bạn cần đặt thủ tục gán dữ liệu cho txtTongdiem trong sự kiện beforeupdate của form vì access không thích bị rơi vào chế độ lặp vô định thụ động. Chu trình thực thi là:
Beforeupdate-> AfterUpdate
Nếu bạn vô tình để một boundObject - tức là một đối tượng có kết nối đến một trường dữ liệu thì bạn chỉ có thể thực thi các update trước khi form kết thúc công việc này.
Còn nếu bạn để txtTongdiem mà không trỏ controlSource đến trường nào thì nó được gọi là Unbound Object và bạn có thể gán thoải mái giá trị mà không gặp lỗi.
Tuy nhiên tôi có một góp ý thế này:
Bạn nên đặt thủ tục xử lý vào sự kiện AfterUpdate của list box thay vì On click vì mỗi khi bạn click một cái là nó thực thi cho dù bạn chẳng chọn đối tượng nào. Trong khi đó AfterUpdate sẽ chỉ thực thi khi đối tượng bạn chọn thực sự thay đổi.
Và phần gán chỉ cần thế này là đủ TxtTongdiem=""

' Mạn phép sửa lại nhé
Private Sub cboMaNganh_AfterUpdate()
'lstDSTS.Requery / bạn không cần làm điều này vì cái này chỉ cần thiết nếu bạn có thay đổi về bảng dữ liệu cấp cho Listbox
'Me.txtDiemDau.Requery
If nz(lstDSTS,-1) Then txtTongDiem = ""
' Hàm nz là hàm cho phép trả về giá trị gán bạn quy định khi giá trị xem xét là null
End Sub

Nay kính thư nhé
 
Sửa lần cuối:
S

saigonpho

Thành viên sơ cấp
21/12/05
8
0
0
tp HCM
#6
Trước tiên, xin cám ơn paulsteigel và các thành viên đã lưu tâm và trả lời tôi chủ đề này. Theo những gợi ý của paulsteigel, tôi đã làm như sau:
- Chuyển txtTongDiem thành unbound object để có thể gán thoải mái
- Đoạn code như sau :

Option Compare Database

Private Sub cboMaNganh_AfterUpdate()
Me.lstDSTS.Requery
Me.txtDiemDau.Requery
If Nz(Me.lstDSTS, -1) Then
Me.txtTongDiem = ""
End If
End Sub

Private Sub lstDSTS_Click()
Me.txtTongDiem = DSum("DiemThi", "KQ_THI", "SoBD = '" & Me.lstDSTS & "'")
Me.txtTongDiem.Requery
Me.txtKetQua.Requery
End Sub


Như vậy thì thoả mãn được yêu cầu là trong listbox ko được chọn thì txtTongDiem rỗng, tuy nhiên....
ví dụ tôi chọn cboMaNganh là CNTT, sau đó click chọn trong lstDSTS số báo danh 001. txtTongDiem được cập nhật lại tổng điểm của thí sinh 001
sau đó, tôi click chọn combo box với cboMaNganh là TOAN:
txtTongDiem rỗng, tất nhiên vì list box chưa chọn
Nhưng, khi tôi quay lại ngành CNTT, trong list box, record SBD 001 được tô đen, nhưng txtTongDiem rỗng.
Vậy tôi muốn, khi chọn lại CNTT, txtTongDiem là tổng điểm của thí sinh mà trước đó đã chọn thì phải làm sao ????

Bạn có thể cho vài lời góp ý được ko. Rất cám ơn.
 
Đào Việt Cường

Đào Việt Cường

Moderator
22/11/05
400
3
18
Khánh Hòa
#7
Dear saigonpho,
----------------
Một cách đơn giản mà bạn không phải coding là như thế này:
txtTongDiem.ControlSource =IIF([lstDSTS]="","",DSum("DiemThi", "KQ_THI", "SoBD = '" & [lstDSTS] &"'"))
Nhưng nếu bạn không muốn như thế thì:
- Sau mỗi lần cboMaNganh được Update, bạn nên trao cho Lisbox lstDSTS cái focus. Nghĩa là sau mỗi lần chọn ngành thì danh sách đã mặc định chọn một thí sinh nào đó rồi(thí sinh đầu tiên chẳng hạn). Như vậy thì bạn khỏi phải xử lý txtTongDiem khi IsNull(lstDSTS) làm gì! Hơn nữa, xử lý này đồng thời cung cấp cho DLOOKUP "SoBD = '" & Me.lstDSTS & "'" luôn, txtTongDiem luôn được trả về giá trị mà DLOOKUP tìm thấy.
- Điểm lưu ý nữa mà hình như bạn chưa để ý là cần phải kiểm tra Datasoure của lstDSTS có bị Empty hay không, vì nếu không có Record nào thì các xử lý bên dưới đối với lstDSTS có thể gây ra lỗi!
- Cuối cùng, bạn nên xác định cách viết mã nào tường minh và cần thiết hơn:
theo tôi viết:
saigonpho nói:
Me.txtTongDiem = DSum("DiemThi", "KQ_THI", "SoBD = '" & Me.lstDSTS & "'")
không tường minh bằng:
txtTongDiem.Value = DSum("DiemThi", "KQ_THI", "SoBD = '" & lstDSTS.Value & "'")
Chúc bạn thành công!:0frown:
 
Sửa lần cuối:
S

saigonpho

Thành viên sơ cấp
21/12/05
8
0
0
tp HCM
#8
Cám ơn Đào Việt Cường nhiều lắm. Tôi đã làm được rồi. Thực ra, đây là bài tập thầy cho, nên tôi muốn theo sát nhất yêu cầu của đề bài nên mới phải làm như vậy. Ko thì làm theo cách thứ hai của bạn là được rồi.

Cách thứ nhất của bạn đơn giản nhưng lại rất hay.

Cám ơn bạn lần nữa. Chúc vui.
 

Thành viên trực tuyến

  • homeclassic.vn1
  • daongocnam0603
  • hardes
  • quynhchi10
  • ACT ONE

Xem nhiều