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

Thảo luận trong 'Ứng dụng Access' bắt đầu bởi saigonpho, 21 Tháng mười hai 2005.

2,918 lượt xem

  1. saigonpho

    saigonpho Thành viên sơ cấp

    Bài viết:
    8
    Đã được thích:
    0
    Nơi ở:
    tp HCM
    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.
     
    #1
  2. HongViet

    HongViet Thành viên thân thiết

    Bài viết:
    286
    Đã được thích:
    10
    Nơi ở:
    Đà nẵng
    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:
     
    #2
  3. Đào Việt Cường

    Đào Việt Cường Moderator

    Bài viết:
    400
    Đã được thích:
    3
    Giới tính:
    Nam
    Nơi ở:
    Khánh Hòa
    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:
     
    Last edited: 21 Tháng mười hai 2005
    #3
  4. saigonpho

    saigonpho Thành viên sơ cấp

    Bài viết:
    8
    Đã được thích:
    0
    Nơi ở:
    tp HCM
    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
     
    #4
  5. paulsteigel

    paulsteigel Thành viên thân thiết

    Bài viết:
    103
    Đã được thích:
    0
    Nơi ở:
    Hoà Bình
    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é
     
    Last edited: 21 Tháng mười hai 2005
    #5
  6. saigonpho

    saigonpho Thành viên sơ cấp

    Bài viết:
    8
    Đã được thích:
    0
    Nơi ở:
    tp HCM
    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.
     
    #6
  7. Đào Việt Cường

    Đào Việt Cường Moderator

    Bài viết:
    400
    Đã được thích:
    3
    Giới tính:
    Nam
    Nơi ở:
    Khánh Hòa
    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:
    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:
     
    Last edited: 22 Tháng mười hai 2005
    #7
  8. saigonpho

    saigonpho Thành viên sơ cấp

    Bài viết:
    8
    Đã được thích:
    0
    Nơi ở:
    tp HCM
    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.
     
    #8

Chia sẻ trang này