Đánh giá chủ đề:
  • 0 Votes - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
[Hỏi] Phương thức findfirst
#31
Mấy ngày này ngày nào cũng "xỉn" , "Sếp" kêu thì không đi cũng không được, chắc phải kết bạn với bomnhauag rùi  014

1/ Vấn đề không phải ở chỗ  "screen.active" mà là cái "ctl.OldValue" nó chỉ áp dụng cho Bound Control thui
Nếu muốn sử dụng "ctl.OldValue"  bạn phải lưu nó vào một chỗ nào đó (VD như clt.Tag hoặc  Collection)
2/Việc dùng 2 sub form như bạn nói mình thấy không cần thiết vì trên subform có thanh kéo dọc, kéo ngang... đâu cần tách 2 làm chi cho khổ. (nếu có thời gian mình sẽ làm thử theo yêu cầu của bạn, và sau khi xem nó bạn sẽ thấy "kỳ.... một cục"  014 )
 ... say quá rùi... hai mí mắt muốn sụp xuống... thui thì "hiệp sau sẽ rõ" ...  014
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
#32
Cái 1 bạn có thể hướng dẫn kĩ hơn được không, có demo thì tốt quá.
Còn cái 2 là do continous form độ rông max có 22in nên túng quá phải tùng quyền như vậy đó, chứ theo kiểu datasheet thì vô tư rồ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
#33
Đây:
FindRecord5.rar

Trong file trên:
-MTNQ sử dụng hàm AddFormatConditions  để tô màu cho Current Record  trên  2 sub

-Cái module mdlTools chứa một vài hàm mình xây dựng sẵn để  làm Unbound form

- thủ tục ListAllControls() dùng để lấy tên các điều khiển trên form (Ghi xuống cử sổ Immediate)
VD: Mở form frmDanhSach sau đó chạy thủ tục ListAllControls() ta sẽ được một chuỗi như sau:
txtID,txtHoTen,txtFindID,txtNamSinh,txtDiachi,txtGioiTinh

Sau đó chạy thủ tục:
Mã:
Private Sub t1()
   Dim strCtls As String, str As String

   strCtls = "txtID,txtHoTen,txtNamSinh,txtDiachi,txtGioiTinh"
   str = "Me.@.Value = .Fields(?).Value"
   
   Call BuildString1(strCtls, str)
End Sub

ta được:
Mã:
   With rst
       Me.txtID.Value = .Fields("ID").Value
       Me.txtHoTen.Value = .Fields("HoTen").Value
       Me.txtNamSinh.Value = .Fields("NamSinh").Value
       Me.txtDiachi.Value = .Fields("Diachi").Value
       Me.txtGioiTinh.Value = .Fields("GioiTinh").Value
   End With


Tiếp tục chạy :
Mã:
Private Sub t1()
   Dim strCtls As String, str As String
   
   strCtls = "txtHoTen,txtNamSinh,txtDiachi,txtGioiTinh"
   str = ".Fields(?).Value = Me.@.Value"
   
   Call BuildString1(strCtls, str, True)
End Sub

Được:
Mã:
   With rst
       .Edit
       .Fields("HoTen").Value = Me.txtHoTen.Value
       .Fields("NamSinh").Value = Me.txtNamSinh.Value
       .Fields("Diachi").Value = Me.txtDiachi.Value
       .Fields("GioiTinh").Value = Me.txtGioiTinh.Value
       .Update
   End With

...
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
#34
(11-06-18, 12:17 PM)MTNQ Đã viết: Đây:
FindRecord5.rar

Trong file trên:
-MTNQ sử dụng hàm AddFormatConditions  để tô màu cho Current Record  trên  2 sub

Cháu xin hỏi hàm AddFormatCondition để tô màu cho Current Record trong continuous form như thế nào ạ.
Cháu xin cảm ơn
Chữ ký của DooHoaangPhuuc DooHoaangPhuuc,gia nhập Thủ Thuật Access từ 27-06 -17.
ღღღღღTài sản của DooHoaangPhuuc (View All Items) ღღღღღ
Reply
Những người đã cảm ơn
#35
1/Thủ tục listallcontrol và t1 phải sửa lại public đằng trước thì mới chạy đươc MTNQ à, với lại mình chỉ chạy listallcontrol rồi chạy tiếp t1 là nó ra luôn chứ đâu cần phải chạy 2 lần t1:
With rst
       .Edit
       .Fields("HoTen").Value = Me.txtHoTen.Value
       .Fields("NamSinh").Value = Me.txtNamSinh.Value
       .Fields("Diachi").Value = Me.txtDiachi.Value
       .Fields("GioiTinh").Value = Me.txtGioiTinh.Value
       .Update
End With
2/ Hình như trong vba của formdanhsach không có dùng đến các thủ tục này thì phải. Tại mình thấy hình như dùng thủ tục savedata rồi. Còn cái Savevalueofctl nó tương tự như cái buildstring1 phải không. Không biết mình có hiểu đúng không, các thủ tục trong module mtdtool là để dùng khi cần gọi cho nhiều form khác nhau, muốn ứng dụng cho nhiều form thì dùng các thủ tục trong này. Còn trong demo thì hoàn toàn chưa dùng tới, mà dùng trực tiếp các thủ tục loaddata, savedata với savevalueofctl ( 3 cái này cũng tương tự 3 cái thủ tục trong mdltool).

3/ Hàm formatcontion hay quá MTNQ, trước giờ mình toàn dùng theo kiểu cho 1txtbox làm màu nền. Có điều sử dụng cái này thì lại dính cái chớp chớp khi click vào sub ròi MTNQ ơi. 040 040
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
#36
(11-06-18, 11:26 PM)DooHoaangPhuuc Đã viết: Cháu xin hỏi hàm AddFormatCondition để tô màu cho Current Record trong continuous form như thế nào ạ.
Cháu xin cảm ơn

Bạn tham khảo bài viết của mình ở chủ đề sau:
http://thuthuataccess.com/forum/thread-9118-page-2.html
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 DooHoaangPhuuc
#37
(12-06-18, 10:32 AM)mrsiro Đã viết: 1/Thủ tục listallcontrol và t1 phải sửa lại public đằng trước thì mới chạy đươc MTNQ à, với lại mình chỉ chạy listallcontrol rồi chạy tiếp t1 là nó ra luôn chứ đâu cần phải chạy 2 lần t1:

2/ Hình như trong vba của formdanhsach không có dùng đến các thủ tục này thì phải. Tại mình thấy hình như dùng thủ tục savedata rồi. Còn cái Savevalueofctl nó tương tự như cái buildstring1 phải không. Không biết mình có hiểu đúng không, các thủ tục trong module mtdtool là để dùng khi cần gọi cho nhiều form khác nhau, muốn ứng dụng cho nhiều form thì dùng các thủ tục trong này. Còn trong demo thì hoàn toàn chưa dùng tới, mà dùng trực tiếp các thủ tục loaddata, savedata với savevalueofctl ( 3 cái này cũng tương tự 3 cái thủ tục trong mdltool).

-Các thủ tục trong mdlTools chỉ là công cụ hỗ trợ cho việc viết code thôi, mình đặt con trỏ vào thủ tục  và bấm F5 để chạy nên không cần public
Ví Dụ:
Trong module mdlTools mình có hàm sau:
Mã:
Private Sub BuildInsertString(strCtls As String, Optional strTableName As String)
    Dim arr, i As Integer, strTemp As String, strTemp1 As String
    arr = Split(strCtls, ",")
    
    If strTableName = "" Then strTableName = "Table1"
    strTemp = """" & "INSERT INTO " & strTableName & " "" _" & vbCrLf & vbTab & "& ""("
    
    For i = LBound(arr) To UBound(arr)
        strTemp = strTemp & Mid(arr(i), 4) & ","
        strTemp1 = strTemp1 & vbCrLf & vbTab & "& ""'""" & " & " & arr(i) & " & " & """'," & """ _"
    Next
    strTemp = Left(strTemp, Len(strTemp) - 1) & ")" & """ _" & vbCrLf & vbTab
    strTemp1 = Left(strTemp1, Len(strTemp1) - 4) & ")"""
    
    strTemp = strTemp & "& "" VALUES " & "("" _" & "" & strTemp1
    Debug.Print strTemp
End Sub

Khi chạy thủ tục:
Mã:
Sub t3()
   Dim strCtls As String, str As String
   strCtls = "txtHoTen,txtNamSinh,txtGioiTinh,txtDiachi"
   Call BuildInsertString(strCtls, "tblDanhSach")
End Sub

được:
Mã:
"INSERT INTO tblDanhSach " _
   & "(HoTen,NamSinh,GioiTinh,Diachi)" _
   & " VALUES (" _
   & "'" & txtHoTen & "'," _
   & "'" & txtNamSinh & "'," _
   & "'" & txtGioiTinh & "'," _
   & "'" & txtDiachi & "')"

Copy cái code trên cho vào thủ tục của nút cmdSave trên form frmCapNhatDS , sửa lại một chút là xong, đỡ phải ngồi gõ:

Mã:
Private Sub cmdSave_Click()
   If Nz(Me.txtHoTen.Value, "") = "" Then Exit Sub
   Dim strSQL As String
   strSQL = "INSERT INTO tblDanhSach " _
           & "(HoTen,NamSinh,GioiTinh,Diachi)" _
           & " VALUES (" _
           & "'" & txtHoTen & "'," _
           & txtNamSinh & "," _
           & "'" & txtGioiTinh & "'," _
           & "'" & txtDiachi & "')"
   
   CurrentDb.Execute strSQL, dbFailOnError
   
End Sub

Sau khi hoàn tất dự án  thì có thể  remove mdlTools vì nó không liên quan gì đến ứng dụng
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
#38
Hàm SaveValueOfCtl sửa lại một chút và đưa lên module để dùng chung:
Mã:
Public Sub SaveValueOfCtl(frm As Form, ByRef varCtls As Variant, strCtls As String)
   Dim arr, i As Integer
   arr = Split(strCtls, ",")
   ReDim varCtls(1, UBound(arr))
   With frm
       For i = LBound(arr) To UBound(arr)
           varCtls(0, i) = arr(i)
           varCtls(1, i) = .Controls(arr(i)).Value
       Next
   End With
End Sub
Để gọi thủ tục trên thì trên đầu trang code của form ta khai báo như sau:
Mã:
Private Const strCtls = "txtHoTen,txtNamSinh,txtGioiTinh,txtDiachi"
Dim varCtls As Variant

Gọi thủ tục:
Mã:
Call SaveValueOfCtl(Me, varCtls, strCtls)

Vì varCtls là một mảng 2 chiều nên phải sửa thủ tục  WriteChanges2 :
sửa dòng:
Mã:
For i = LBound(varCtls) To UBound(varCtls)
thành:
Mã:
For i = LBound(varCtls, 2) To UBound(varCtls, 2)

-Nếu có quá nhiều cột cần đưa lên sub form thì mình thấy dùng Datasheet cũng OK mà:
http://www.mediafire.com/file/e9vq5fu8mx...6.rar/file
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
#39
ở demo6 mình thấy thay cấu trúc của thủ tục savedata từ việc thao tác edit với update recordset của sub (demo5), thành chạy lệnh sql. 2 cái này có gì khác nhau vậy MTNQ, tại vì với demo5 mình test nếu mảng mình khai báo gồm "txthoten,txtgioitinh" thì tại thủ tục savedata cũng chỉ có tác dụng lưu 2 giá trị này, nếu khai báo:


Mã:
.Edit
 field("hoten") =  me.hoten
 field("gioitinh")= me.gioitinh
 field("diachi") = me.diachi
.Update


Thì field diachi không có tác dụng (ấn lưu cũng không cập nhật được field diachi). Muốn cập nhật được thì tại thủ tục savevalueofctl phải khai báo đầy đủ mảng ("txthoten,txtgioitinh,txtdiachi"). Có nghĩa muốn update 3 field thì phải khai báo đủ 3txt trong mảng, 4 field thì phải khai báo đủ 4txt trong mảng. 

Thứ 2: Mình muốn hỏi là có cách nào cho loaddata và savedata dùng chung mảng luôn không. Có nghĩa mình khai báo 1 mảng trước "txtid,txthoten,txtgioitinh" sau đấy loaddata và savedata dùng mảng này luôn. Đỡ phải viết lại nhiều lần.
Loaddata tự hiểu 3txt trong mảng kia ở sub = main (dĩ nhiên có thể phải quy định tên của txt ở sub giống với txt ở main chẳng hạn). Tương tự save data cũng dùng luôn.

Thứ 3: Nếu ví dụ mình thêm 1txtbox filterhoten chẳng hạn ở main, khi mình filter giá trị không có trong dữ liệu khi đó sub trả về giá trị trống, nhưng các txtbox trên main vẫn đang hiện giá trị của record trước đó, mình muốn khi filter giá trị trả về ko có record trong sub thì các txtbox trên main null hết luôn, mình có nghĩ ra cách là gọi 1 hàm set null cho toàn bộ txtbox trên main, khi sub ko có record thì gọi hàm này, nhưng như mình muốn đề cập ở trên là lại phải viết txt1= null, txt2= null. Nếu main có quá nhiều txtbox thì code dài thòng lòng. 040

Đưa cả loaddata và savedata lên module, tại form thì khai báo 1 mảng các txtbox, sau đó gọi các thủ tục cần thiết dùng lại mảng này. Code sẽ đỡ loằng ngoằng hơn. À mà mình nghỉ nên dùng cách khai báo các txt cần thiết trong mảng sẽ hay hơn cách quét toàn bộ txt trên form để đưa vào mảng. Bởi vì có thể form nó còn tồn tại những txtbox mà mình không muốn đưa vào mả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
#40
1/Vấn đề 1:
a)Do code của nút Save:
Mã:
Private Sub cmdSave_Click()
   ...
   If WriteChanges2(Me, varCtls, Me.txtID.Value) = True Then
       Call SaveData 
...  
   End If
End Sub
if WriteChanges2 = true Tức là  nếu có thay đổi dữ liệu thì mới gọi thủ tục SaveData
Để SaveData luôn được gọi mỗi khi bấm lưu thì sửa lại như sau:
Mã:
Private Sub cmdSave_Click()
   LockCtl True
   Call WriteChanges2(Me, varCtls, Me.txtID.Value)
   Call SaveData
End Sub

b)Do thủ tục WriteChanges2 sai ở dòng For i = LBound(varCtls) To UBound(varCtls)
Vì varCtls là mảng đa chiều nên ta phải chỉ định chính xác duyệt phần tử ở chiều nào của mảng:
Mã:
For i = LBound(varCtls, 2) To UBound(varCtls, 2)
(MTNQ đã up lại FindRecord5 Bạn tải lại nhé)

2/Vấn đề 2:"có cách nào cho loaddata và savedata dùng chung mảng"
Hoàn toàn có thể được
Ví dụ:
-Ở đầu trang code khai báo một chuỗi chứa tên các điều khiển (Đk trên Main và Sub có tên giống nhau):
Mã:
Private Const strCtls = "txtHoTen,txtNamSinh,txtGioiTinh,txtDiachi"

Thủ tục lấy dữ liệu từ sub lên Main (LoadData) như sau:
Mã:
Dim arr As Variant
   arr = Split(strCtls, ",")
   With Me
       .txtID.Value = .frmDanhSach_sub.Form.txtID.Value
       For i = LBound(arr) To UBound(arr)
           .Controls(arr(i)).Value = .frmDanhSach_sub.Form.Controls(arr(i)).Value
       Next
   End With

Thủ tục gán dữ liệu từ Main xuống sub (SaveData):
Mã:
Dim arr As Variant
   arr = Split(strCtls, ",")
   With Me
       For i = LBound(arr) To UBound(arr)
           .frmDanhSach_sub.Form.Controls(arr(i)).Value = .Controls(arr(i)).Value
       Next
   End With
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


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