Đánh giá chủ đề:
  • 0 Votes - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
[Hỏi] Phương thức findfirst
#1
Chào anh chị, mình có 1 form với listbox, khi click vào listbox thì mình dùng lệnh findfirst. Nhưng như vậy thì mỗi khi click vào listbox nó cứ chớp chớp như kiểu refresh, nhìn rất là cùi  005 005 
Và khi dùng lệnh me.listbox.requery mỗi khi ấn lưu thì listbox nó trở về record đầu tiên, khi đó lại phải mất công kéo xuống record vừa focus.
Mình muốn hỏi có phương thức nào thay thế mà không làm cho listbox chớp chớp kiểu vậy không. Và phương thức nào làm listbox vẫn ở vị trí record hiện tại không.
Chữ ký của mrsiro Xin chào, mình là mrsiro, Tham gia http://thuthuataccess.com/forum từ ngày 05-12 -14.
Reply
Những người đã cảm ơn
#2
Bạn xem file này :
http://www.mediafire.com/file/28kx1eak0b...Record.rar

Mã:
Option Compare Database
Option Explicit

Private Sub cmdSave_Click()
   If Me.Dirty Then DoCmd.RunCommand acCmdSaveRecord
   Me.lstTest.Requery
End Sub

Private Sub Command14_Click()
   If FindRec(Me, "[ID] = " & Nz(Me.Text12.Value, 0)) = 0 Then
       MsgBox "khong tim thay ID: " & Nz(Me.Text12.Value, 0)
   End If
End Sub

Private Sub Form_Current()
   If Nz(Me.txtID.Value, 0) <> 0 Then Call FindRec(Me.lstTest, "[ID] = " & Me.txtID.Value)
End Sub

Private Sub lstTest_DblClick(Cancel As Integer)
   If Me.lstTest.ItemsSelected.Count > 0 Then
       Call FindRec(Me, "[ID] = " & Me.lstTest.Value)
   End If
End Sub

Public Function FindRec(objLst As Object, strCriteria As String) As Integer
   Dim rst As DAO.Recordset
   
   On Error GoTo ErrorHandler
   
   Set rst = objLst.Recordset.Clone
   rst.FindFirst strCriteria
   If Not rst.NoMatch Then
       If InStr(TypeName(objLst), "ListBox") > 0 Then
           objLst.Selected(rst.AbsolutePosition) = True
       ElseIf InStr(TypeName(objLst), "Form") > 0 Then
           objLst.Bookmark = rst.Bookmark
       End If
       FindRec = -1
   Else
       FindRec = 0
   End If
   
   
Exit_ErrorHandler:
   Set rst = Nothing
   Exit Function

ErrorHandler:
   FindRec = 1
   MsgBox "Err: " & Err.Number & vbCrLf & "Description: " & Err.Description
   Resume Exit_ErrorHandler
End Function
Chữ ký của MTNQ Thời gian nước chảy... da mòn
Ngủ quên một chốc thấy còn bộ xương!
Reply
Những người đã cảm ơn mrsiro
#3
bạn ơi, click vào nút tìm thì lỗi stop access luôn. Còn ấn vào listbox thì lỗi the macro or function set to the before update  or validationrule.
Chữ ký của mrsiro Xin chào, mình là mrsiro, Tham gia http://thuthuataccess.com/forum từ ngày 05-12 -14.
Reply
Những người đã cảm ơn
#4
Máy tôi chạy bình thường nhé. Access 2013. Windows 7 32bit
Chữ ký của ongke0711 If you BORN poor, it's not your mistake. But if you DIE poor, It's your mistake!
ღღღღღTài sản của ongke0711 (View All Items) ღღღღღ
Reply
Những người đã cảm ơn
#5
mở bằng access 2003 bị lỗi bạn ơi.
Chữ ký của mrsiro Xin chào, mình là mrsiro, Tham gia http://thuthuataccess.com/forum từ ngày 05-12 -14.
Reply
Những người đã cảm ơn
#6
Đưa cái form của bác lên đây  007
Chữ ký của MTNQ Thời gian nước chảy... da mòn
Ngủ quên một chốc thấy còn bộ xương!
Reply
Những người đã cảm ơn
#7
(29-04-18, 01:02 AM)mrsiro Đã viết: mở bằng access 2003 bị lỗi bạn ơi.

Đã sửa lại cho AC2003, bác tải lại nhé
Chữ ký của MTNQ Thời gian nước chảy... da mòn
Ngủ quên một chốc thấy còn bộ xương!
Reply
Những người đã cảm ơn mrsiro
#8
(29-04-18, 12:17 PM)MTNQ Đã viết:
(29-04-18, 01:02 AM)mrsiro Đã viết: mở bằng access 2003 bị lỗi bạn ơi.

Đã sửa lại cho AC2003, bác tải lại nhé

Chào bác, đối với nút lưu thì dùng docmd.runcommand save record + list.requey thì ngon rồi, list box không bị trả về focus record đầu tiên nữa. Nhưng vấn đề với nút thêm record mới bác à, trên form em có nút thêm dữ liệu, khi ấn thì mở form mới để nhập liệu rồi lưu record mới. Tại form cũ có nút làm tươi dùng lệnh me.requery + listbox.requery, lúc này nó lại trả về focus record đầu tiên bác à. Em có thử dùng lệnh docmd.refresh + listbox.requery cho nút làm tươi, thì lúc này mặc dù trên list box có thể hiện record vừa thêm, nhưng click vào record đó thì ko find được record do đó bắt buộc phải dùng me.requery + listbox.requery cho nút làm tươi chứ không thể docmd.refresh + listbox.requery được.

Nếu dùng docmd.refresh + listbox.requery thì không bị trả về focus record đầu tiên, nhưng lại không find được record khi ấn vào listbox. Còn nếu dùng me.requery + listbox.requery thì find được record nhưng lại bị trả focus về record đầu tiên.

Có cách nào giải quyết không bác.

Còn demo của bác em thấy double click vào listbox thì nó vẫn bị chớp chớp ấy bác. Có cách nào click vào listbox thì findrecord nhưng ko bị chớp chớp cái listbox ko bác.
Chữ ký của mrsiro Xin chào, mình là mrsiro, Tham gia http://thuthuataccess.com/forum từ ngày 05-12 -14.
Reply
Những người đã cảm ơn
#9
Của bạn đây: http://www.mediafire.com/file/0kf94y6prk...Record.rar
File trên MTNQ đã thêm vào form "Thêm mới" và code cho nút lưu trên form này như sau: 
Mã:
Private Sub cmdSave_Click()
   If Nz(Me.txtID.Value, 0) = 0 Then Exit Sub
   DoCmd.RunCommand acCmdSaveRecord
   
   If CurrentProject.AllForms("frmDanhSach").IsLoaded = False Then Exit Sub
   
   Forms.frmDanhSach.Requery
   Forms.frmDanhSach.lstTest.Requery
   Call FindRec(Forms.frmDanhSach, "[ID] = " & Nz(Me.txtID.Value, 0))
   Call FindRec(Forms.frmDanhSach.lstTest, "[ID] = " & Nz(Me.txtID.Value, 0))
   DoCmd.Close acForm, Me.Name
End Sub

Trên máy của mình thì không thấy "chớp chớp" như bạn nói (bạn thử thay list box bằng SubForm Datasheet hoặc Continuous xem)

Có một lưu ý  giới hạn tối đa cho list box Access là 65 535  dòng, do đó nếu dữ liệu nguồn lớn hơn sẽ bị cắt bớt và không hiện trên list 
(Trong ví dụ trên mình đưa vào table hơn 70 ngàn mẫu tin, nếu nhập ID nhỏ như 1, 2 hay 3... sẽ không tìm thấy trên list)
Chữ ký của MTNQ Thời gian nước chảy... da mòn
Ngủ quên một chốc thấy còn bộ xương!
Reply
Những người đã cảm ơn mrsiro
#10
Chào bạn, với demo mới của bạn thì chỉ cần ấn lưu trên form thêm mới thì from danh sách tự động find đến record vừa thêm, rất là hay. Nhưng mình vẫn muốn để lại nút làm tươi trên from danh sách bởi vì ngoài thêm mới tại máy người dùng này, thì khi thêm mới tại máy khác phải có nút làm tươi để lấy dữ liệu được thêm mới.  có thể còn nút xóa nữa, trong môi trường mạng lan nhiều người dùng thì nếu có 1 người nào đó xóa record tại máy khác thì máy này ấn làm tươi để không hiển thị record vừa xóa.  Nhưng nếu nút làm tươi mà dùng me.requery + listbox.requery thì như mình đã nói là sẽ trả focus về record đầu tiên, rất là bất tiện.

Còn cái chớp chớp là do listbox của bạn 1 record chỉ có 2 field nên nó ko bị chớp đó bạn, trên listbox của mình nếu mình giảm xuống còn 2 field như bạn thì nó cũng ko chớp gì cả.
Chữ ký của mrsiro Xin chào, mình là mrsiro, Tham gia http://thuthuataccess.com/forum từ ngày 05-12 -14.
Reply
Những người đã cảm ơn


Có thể liên quan đến chủ đề
Chủ đề: Tác giả Trả lời: Xem: Bài mới nhất
  [Help] Làm sao ghi giờ khi mở form và nút lệnh thực hiện ghi giờ khi kết thúc form tronghieu9792 2 1,084 25-01-16, 11:30 AM
Bài mới nhất: tronghieu9792
  [Hỏi] [Hep]honglv157_Tạo công thức tính trung bình của các tiêu chí đánh giá GV maidinhdan 14 3,320 15-07-15, 09:51 AM
Bài mới nhất: maidinhdan
  [Hỏi] Có ai mắc lôi tìm kiếm theo điều kiện trên office 2007 không thực hiện lệnh applyfite quanghoasla 0 679 29-11-14, 11:30 PM
Bài mới nhất: quanghoasla
  [Help] Nhờ hướng dẫn công thức trên Forms DoquangLam 3 1,310 08-04-14, 04:55 PM
Bài mới nhất: DoquangLam
  [Hỏi] Gọi thực hiện 1 Private Sub trên Form này từ Form khác. Minh Tiên 10 3,327 25-01-14, 04:54 PM
Bài mới nhất: Minh Tiên

Chuyển nhanh:


User(s) browsing this thread: 1 Guest(s)
Diễn Đàn Thơ Văn Thi Ẩm Lâu|Nhà Hàng Sông Thơ| PMA Nha Trang| Gỗ Acrylic Không Đường Line