Đánh giá chủ đề:
  • 0 Votes - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
[Hỏi] Phương thức findfirst
#21
Hiện tại trong demo thì subform chỉ có 2 textbox, nhưng nếu subform có quá nhiều textbox thì tại event click của từng textbox đều phải cấu hình Me.Parent.sRequery. Có cách nào đơn giản vấn đề này ko MTNQ.
Với lại recordsourec của main form có trường id là theo subform, vì thế dùng lệnh requery parent để mainform thay đổi theo subform. Nhưng mình muốn là recordsource của mainform vẫn là toàn bộ record, khi click vào subform thì gọi findrec để mainform nhảy đến record tương ứng chứ không cần phải requery mainform (bởi vì mình nghỉ nếu cứ requery hoài như thế có thể tốn hiệu năng của phần mềm, cứ load sẵn toàn bộ record, rồi nhảy đến record cần nhảy thôi), nếu vậy thì làm thế nào bạn.
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
#22
(04-06-18, 03:23 PM)mrsiro Đã viết: Hiện tại trong demo thì subform chỉ có 2 textbox, nhưng nếu subform có quá nhiều textbox thì tại event click của từng textbox đều phải cấu hình Me.Parent.sRequery. Có cách nào đơn giản vấn đề này ko MTNQ.

Bạn tải lại demo ở bài #17 , ở file  đó mình đã bỏ hết sự kiện click của các textbox trong subform rồi mà:
Trích dẫn:...bỏ hết các sự kiện của txtID_Click và txtHoTen_Click đi, chỉ cần code cho sự kiện Form_Current (của subform) thui:

(04-06-18, 03:23 PM)mrsiro Đã viết: Với lại recordsourec của main form có trường id là theo subform, vì thế dùng lệnh requery parent để mainform thay đổi theo subform. Nhưng mình muốn là recordsource của mainform vẫn là toàn bộ record, khi click vào subform thì gọi findrec để mainform nhảy đến record tương ứng chứ không cần phải requery mainform (bởi vì mình nghỉ nếu cứ requery hoài như thế có thể tốn hiệu năng của phần mềm, cứ load sẵn toàn bộ record, rồi nhảy đến record cần nhảy thôi), nếu vậy thì làm thế nào bạn.

Vậy dữ liệu trên main có hoàn toàn giống subform không?
Mình hỏi vậy vì ở Acc 2007 trở lên có Split Form khá hay, với Acc 2003 ta cũng có thể làm tương tự bằng cách cho main và sub dùng chung một Recordset   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
#23
Đúng rồi, 2007 có cách split form, mình cũng có biết, có điều 2003 ko có bạn à. Bạn có cách làm tương tự cho 2003 thì giúp mình nha. Dữ liệu giữa main và subform là giống nhau nha, sub bao nhiêu record thì main cũng từng ấy record tương ứ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
#24
Thực ra load toàn bộ dữ liệu lên form không phải là ý hay, nhất là trong chế độ đa người dùng (Chiếm băng thông và hao tốn tài nguyên mạng, tăng tải trên máy chủ, tăng rủi ro corrupt dữ liệu... ). Trong khi mỗi người chỉ làm việc với một số ít trong cái "cục" dữ liệu bự chà bá đó, như vậy chẳng phải lãng phí lắm lắm  014

Thường thì trên main ta chỉ tương tác với một record thui, làm việc với thằng nào thì load thằng đó, ngay cả cái subform hiển thị danh sách cũng vậy, chỉ load dữ liệu cần thiết và luôn lọc theo một điều kiện nào đó (ví dụ: lọc theo ngày hiện tại, danh sách công việc chưa thực hiện...)

Vài ý của cá nhân mình thui, bạn có thể tham khảo thêm ý kiến của các bác có nhiều kinh nghiệm trên diển đàn  015
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
#25
(04-06-18, 11:50 PM)mrsiro Đã viết: Đúng rồi, 2007 có cách split form, mình cũng có biết, có điều 2003 ko có bạn à. Bạn có cách làm tương tự cho 2003 thì giúp mình nha. Dữ liệu giữa main và subform là giống nhau nha, sub bao nhiêu record thì main cũng từng ấy record tương ứng.

Việc này cũng khá đơn giản: chỉ cần gán recordset sủa sub = recordset của main thui:

Mã:
Set Me.frmDanhSach_sub.Form.Recordset = Me.Recordset

File đính kèm: FindRecord3.rar
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
#26
Mình mạn phép thêm vào demo findrecod3 điều kiện lọc ở field họ tên của mainform là : Like "*" & forms!frmdanhsach!hoten1 & "*".
1txtbox trên mainform và 1cmd find có tác dụng requey sub và mainfom.
Khi mình gõ họ tên cần lọc ví dụ "nguyễn" => lọc ra những người có chữ "nguyễn" trong họ tên. Sau đó ấn cmd find thì đã lọc được. Nhưng khi mình ấn chuột vào thanh kéo xuống rồi kéo thì access bị not repoding luôn. Bạn có thể xem giúp vì lí do gì hay không
https://www.dropbox.com/s/anftckyf9kp8u4...3.rar?dl=0
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
#27
Bạn sửa code của cmd lại như sau:
Mã:
Private Sub Command12_Click()
   Me.Requery
   Set Me.frmDanhSach_sub.Form.Recordset = Me.Recordset
End Sub
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
#28
(05-06-18, 05:06 PM)MTNQ Đã viết: Bạn sửa code của cmd lại như sau:
Mã:
Private Sub Command12_Click()
   Me.Requery
   Set Me.frmDanhSach_sub.Form.Recordset = Me.Recordset
End Sub

Chào bạn, hiện tại với 2 cách 
1. Dùng điều kiện tại field id, rồi dùng parent.requery (demo 2) - giờ nghĩ lại thấy cách này khá hay vì lúc này main chỉ load duy nhất 1 record.
2. Dùng set recordset sub = recordset form (demo3) - cái này phải cho main load all record thì thằng sub nó mới hiển thị all record theo.

Cả 2 cách này đều đã find được tốt record. Có điều cả 2 cách này đều bị tình trạng chớp chớp khi click vào record sub như mình đã nói ở đầu topic.
Mình đã nghĩ ra được 1 cách để ko bị chớp như thế này mà vẫn đáp ứng được find đến record, đó là cho main thành unbound form, sau đó tại event click của sub chỉ cần viết main.txtid = sub.txtid, main.txthoten = sub.txthoten. Còn code của nút lưu main chỉ cần sửa lại update record có id = txtid. Với cách này sub không bị chớp nữa, rất là sướng  015 015
Nhưng đến đây lại phát sinh vấn đề, mình có 1 function ghi nhật kí chỉnh sửa, function này sử dụng screen.active, và phải là bound form thì mới dùng được. 021 021

Đến đây thì bí quá. Bạn có ý tưởng gì 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
#29
Nếu viết được Unbound thì quá tốt rồi  015 
Cái vụ "ghi nhật kí chỉnh sửa" thì bạn phải đưa file mẫu hoặc cái hàm đó lên đây mình mới "có ý tưởng" được  005
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
#30
(07-06-18, 11:39 AM)MTNQ Đã viết: Nếu viết được Unbound thì quá tốt rồi  015 
Cái vụ "ghi nhật kí chỉnh sửa" thì bạn phải đưa file mẫu hoặc cái hàm đó lên đây mình mới "có ý tưởng" được  005
Code đây, sử dụng oldvalue với newvalue của screen.active
Mã:
Public Function WriteChanges()

    Dim frm As Form
    Dim ctl As Control
    Dim frmname As String, user As String, sql As String, changes As String
    Dim db As DAO.Database
    Dim fdate As String
    Dim ftime As String
    Dim fcomputer As String
    Set frm = Screen.ActiveForm
    Set db = CurrentDb

    frmname = Screen.ActiveForm.Name
    user = Application.CurrentUser
    fdate = Format(Date, "dd/mm/yyyy")
    ftime = Format(Time, "hh:mm:ss")
    fcomputer = Environ("computername")
    changes = ""

    sql = "INSERT INTO log " & _
         "(NgayCapNhat,FormCapNhat,NguoiCapNhat,maycapnhat,noidung) " & _
         "VALUES ('" & fdate & " " & ftime & "','" & frmname & "', '" & user & "', '" & fcomputer & "', "
    
    For Each ctl In frm.Controls
      Select Case ctl.ControlType
          Case acTextBox, acComboBox, acListBox, acOptionGroup
               If IsNull(ctl.OldValue) And Not IsNull(ctl.value) Then
                  changes = changes & _
                  ctl.Name & "--" & "BLANK" & "--" & ctl.value & _
                  " // "
               ElseIf IsNull(ctl.value) And Not IsNull(ctl.OldValue) Then
                  changes = changes & _
                  ctl.Name & "--" & ctl.OldValue & "--" & "BLANK" & _
                  " // "
               ElseIf ctl.value <> ctl.OldValue Then
                  changes = changes & _
                  ctl.Name & ": " & ctl.OldValue & "--> " & ctl.value & _
                  " // "
               End If
      End Select
    Next ctl

    sql = sql & "'(" & frm.txtid & ")" & "___" & changes & "');"
    db.Execute sql, dbFailOnError

    Set frm = Nothing
    Set db = Nothing

End Function
Bạn cho mình hỏi thêm vấn đề này nữa nhé, nếu demo2 mình thêm 1subform nữa, sub2 này có chung recordset với sub1 là từ 1 table, sub1 dùng để hiển thị từ field1,2,3,4. Sub2 dùng để hiển thị field1,2,5,6. Giả sử table này có 6 field.
Nếu click vào 1 record ở sub1 thì main find đến record đó đồng thời sub2 cũng nhảy tới record đó luôn.
Tương tự nếu mình click vào 1 record ở sub2 thì main find đến record đó đồng thời sub1 cũng nhảy tới record đó luôn.
Mục đích của việc chia ra 2 sub là vì continous form có max độ rộng là 22in, dữ liệu cần hiển thị nhiều cột lớn hơn độ rộng đó đành phải chia làm 2sub, mỗi sub hiển thị 1 khoảng field cần thiết.
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,086 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,339 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 682 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,312 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,339 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