• Truy vấn trực tiếp đến textbox subform Bound
  • Truy vấn trực tiếp đến textbox subform Bound

    yamakashi2003 > 27-09-20, 10:34 AM

    Em chào các bác ạ, giả sử em có 1 subform có nguồn là table: T_sanpham; gồm 3 field là SKU, TenSP, SoLuong. 
    Và 1 main form có 1 textbox: txttensp
    Giả sử bài toán là: khi ấn 1 button thì nó sẽ tìm trong subform mã SKU = 3661033 rồi trả về tên sản phẩm tương ứng ở subform vào txttensp ở mainform
    Nhờ bác nào biết chỉ giúp em code truy vấn trực tiếp đến subform mà không phải thông qua table nguồn của subform ạ
    Hiện em đang dùng code này nhưng thấy nó phải qua truy vấn đến table rồi mới hiển thị trên form. Nên hơi lòng vòng
    Em xin cảm ơn!

    Set rs = db.OpenRecordset(" SELECT * FROM T_sanpham ")
            Do While Not rs.EOF
                If rs!SKU = 3661033 > 0 Then
                    me.txttensp = rs!TenSP
                    rs.MoveNext
                Else
                    rs.MoveNext
                End If
            Loop

    me.refresh
  • RE: Truy vấn trực tiếp đến textbox subform Bound

    tranthanhan1962 > 27-09-20, 12:34 PM

    Trước hết bạn phả chuyển con trỏ vào SubForm:
       Subform.SetFocus
    Đối với form có recordsource thay vì truy cập vào table nguồn bạn có thể dùng
       rs=Me.RecordsetClone
    Me.RecordsetClone chính là nguồn recordset của form mà không cần biết nó table hay query
    Bạn chỉ cần theo cú pháp:

    Dim rs As Recordset
    Set rs = Me.RecordsetClone

    Sau này bạn lam gì với record source cũng được. Nó chỉ biết đến record source hiện hành của form

    =>
    Set rs = Me.RecordsetClone

            Do While Not rs.EOF
                If rs!SKU = 3661033 > 0 Then
                    me.txttensp = rs!TenSP
                    rs.MoveNext
                Else
                    rs.MoveNext
                End If
            Loop
    Me.Refresh
    Cũng có cách khác:
    Tạo một textbox TongRecord có giá trị =Count([FieldX]). FieldX là field bất kỳ của subform. Mục đích lấy tổng số record trên subform.

    Subform.SetFocus
        DoCmd.GoToRecord , , acFirst
            Do While Me.CurrentRecord<>TongRecord

                If SKU.Value = 3661033 > 0 Then
                    me.txttensp = TenSP.Value
                        DoCmd.GoToRecord , , acNext
                Else
                        DoCmd.GoToRecord , , acNext
                End If
            Loop
    Me.Refresh
  • RE: Truy vấn trực tiếp đến textbox subform Bound

    ongke0711 > 28-09-20, 12:40 AM

    (27-09-20, 10:34 AM)yamakashi2003 Đã viết: Giả sử bài toán là: khi ấn 1 button thì nó sẽ tìm trong subform mã SKU = 3661033 rồi trả về tên sản phẩm tương ứng ở subform vào txttensp ở mainform
    Nhờ bác nào biết chỉ giúp em code truy vấn trực tiếp đến subform mà không phải thông qua table nguồn của subform ạ
    Hiện em đang dùng code này nhưng thấy nó phải qua truy vấn đến table rồi mới hiển thị trên form. Nên hơi lòng vòng

    Cách làm như anh tranthanhan1962 đã đề cập là dùng RecordsetClone nhưng thay vì dùng vòng lặp Do While... thì dùng phương thức Findfirst của DAO để tìm cho gọn hơn. Dùng RecordsetClone nhanh gấp nhiều lần so với việc mở Recordset mới.

    Mã PHP:
    Dim rs As DAO.Recordset
    Dim strCriteria 
    As String

    strCriteria 
    "SKU =" Me.txtSKUTimKiem

    Set rs 
    Me.SubformABC.Form.RecordsetClone

    rs
    .FindFirst strCriteria
    If rs.NoMatch Then
         Msgbox 
    "Khong tim thay"
    Else
         Me.txtTenSP rs!TenSP
    End 
    If 
  • RE: Truy vấn trực tiếp đến textbox subform Bound

    yamakashi2003 > 28-09-20, 10:29 AM

    (27-09-20, 12:34 PM)tranthanhan1962 Đã viết: Trước hết bạn phả chuyển con trỏ vào SubForm:
       Subform.SetFocus
    Đối với form có recordsource thay vì truy cập vào table nguồn bạn có thể dùng
       rs=Me.RecordsetClone
    Me.RecordsetClone chính là nguồn recordset của form mà không cần biết nó table hay query
    Bạn chỉ cần theo cú pháp:

    Dim rs As Recordset
    Set rs = Me.RecordsetClone

    Sau này bạn lam gì với record source cũng được. Nó chỉ biết đến record source hiện hành của form

    =>
    Set rs = Me.RecordsetClone

            Do While Not rs.EOF
                If rs!SKU = 3661033 > 0 Then
                    me.txttensp = rs!TenSP
                    rs.MoveNext
                Else
                    rs.MoveNext
                End If
            Loop
    Me.Refresh
    Cũng có cách khác:
    Tạo một textbox TongRecord có giá trị =Count([FieldX]). FieldX là field bất kỳ của subform. Mục đích lấy tổng số record trên subform.

    Subform.SetFocus
        DoCmd.GoToRecord , , acFirst
            Do While Me.CurrentRecord<>TongRecord

                If SKU.Value = 3661033 > 0 Then
                    me.txttensp = TenSP.Value
                        DoCmd.GoToRecord , , acNext
                Else
                        DoCmd.GoToRecord , , acNext
                End If
            Loop
    Me.Refresh
    Em cảm ơn 2 bác ạ,
    Mong muốn của em là muốn hỏi cách 2 của bác tranthanhan1962 ạ, tức là mình sửa trực tiếp trên subform luôn, 
    chứ không phải như cách 1 là sửa trên table/ query nguồn rồi load lại subform ạ
  • RE: Truy vấn trực tiếp đến textbox subform Bound

    yamakashi2003 > 28-09-20, 10:42 AM

    (27-09-20, 12:34 PM)tranthanhan1962 Đã viết: Trước hết bạn phả chuyển con trỏ vào SubForm:

    Cũng có cách khác:
    Tạo một textbox TongRecord có giá trị =Count([FieldX]). FieldX là field bất kỳ của subform. Mục đích lấy tổng số record trên subform.

    Subform.SetFocus
        DoCmd.GoToRecord , , acFirst
            Do While Me.CurrentRecord<>TongRecord

                If SKU.Value = 3661033 > 0 Then
                    me.txttensp = TenSP.Value
                        DoCmd.GoToRecord , , acNext
                Else
                        DoCmd.GoToRecord , , acNext
                End If
            Loop
    Me.Refresh
    Bác cho em hỏi trong đoạn này nếu muốn bôi đen toàn bộ record có SKU thõa mãn điều kiện thì làm như thế nào ạ
  • RE: Truy vấn trực tiếp đến textbox subform Bound

    tranthanhan1962 > 28-09-20, 01:54 PM

    Bạn có thể dùng Conditional Formatting để xử lý vấn đề này
  • RE: Truy vấn trực tiếp đến textbox subform Bound

    yamakashi2003 > 02-10-20, 11:29 PM

    (28-09-20, 01:54 PM)tranthanhan1962 Đã viết: Bạn có thể dùng Conditional Formatting để xử lý vấn đề này
    Bác ơi cho em hỏi:
    HIện em đang dung subform để hiển thị dữ liệu, và em để dạng data sheet để lọc các cột theo ý mình cho nhanh, 
    Sau khi lọc xong thi em copy toàn bộ dữ liệu đã được lọc ở subform vào 1 bảng tạm (giả sử tableTam) có cấu trúc y hệt subform
    sau đó em mới chạy 1 report có nguồn từ tableTam đó
    Vậy có đoạn code nào có thể copy dữ liệu đang hiển thị ở subfrom (đã được lọc) vào bảng tạm không ạ
    Còn code để chạy report thì em biết rồi ạ
    Nhờ bác giúp đỡ, em xin cảm ơn ạ
  • RE: Truy vấn trực tiếp đến textbox subform Bound

    yamakashi2003 > 03-10-20, 01:59 PM

    (02-10-20, 11:29 PM)yamakashi2003 Đã viết:
    (28-09-20, 01:54 PM)tranthanhan1962 Đã viết: Bạn có thể dùng Conditional Formatting để xử lý vấn đề này
    Bác ơi cho em hỏi:
    HIện em đang dung subform để hiển thị dữ liệu, và em để dạng data sheet để lọc các cột theo ý mình cho nhanh, 
    Sau khi lọc xong thi em copy toàn bộ dữ liệu đã được lọc ở subform vào 1 bảng tạm (giả sử tableTam) có cấu trúc y hệt subform
    sau đó em mới chạy 1 report có nguồn từ tableTam đó
    Vậy có đoạn code nào có thể copy dữ liệu đang hiển thị ở subfrom (đã được lọc) vào bảng tạm không ạ
    Còn code để chạy report thì em biết rồi ạ
    Nhờ bác giúp đỡ, em xin cảm ơn ạ
    có ai giúp em với
    hay là việc copy dữ liệu trực tiếp từ subform (không thông qua table nguồn) sang table khác có cấu trúc y hệt, là không thực hiện bằng code được ạ
    Mong các tiền bối chỉ giúp em
  • RE: Truy vấn trực tiếp đến textbox subform Bound

    ongke0711 > 03-10-20, 05:04 PM

    (03-10-20, 01:59 PM)yamakashi2003 Đã viết: HIện em đang dung subform để hiển thị dữ liệu, và em để dạng data sheet để lọc các cột theo ý mình cho nhanh, 
    Sau khi lọc xong thi em copy toàn bộ dữ liệu đã được lọc ở subform vào 1 bảng tạm (giả sử tableTam) có cấu trúc y hệt subform
    sau đó em mới chạy 1 report có nguồn từ tableTam đó
    Vậy có đoạn code nào có thể copy dữ liệu đang hiển thị ở subfrom (đã được lọc) vào bảng tạm không ạ
    Còn code để chạy report thì em biết rồi ạ
    Nhờ bác giúp đỡ, em xin cảm ơn ạ
    Trích dẫn:có ai giúp em với
    hay là việc copy dữ liệu trực tiếp từ subform (không thông qua table nguồn) sang table khác có cấu trúc y hệt, là không thực hiện bằng code được ạ
    Mong các tiền bối chỉ giúp em

    Vấn đề này của bạn rất đơn giản.
    - Thứ nhất cần làm rõ lý thuyết lại: bạn nói "copy dữ liệu từ Subform.." thực chất nó chính là dữ liệu từ Form Record Source và nó cũng là Table hoặc Query thôi vì Form của bạn là Bound Form. Không thể tách rồi ra nói dữ liệu của Subform với dữ liệu Table/Query gốc được. Nếu là Unbound Form thì dữ liệu hiển thị trên Form mới là dữ liệu của các Controls (textbox, combobox...) trên form vì không gắn với RecordSouce nào cả.
    - Thứ hai, bạn muốn chạy Report có nguồn từ cái Datasheet Form vừa được lọc (filtered) thì cần gì phải qua bước tạo Table tạm chi cho mất thời gian, bộ nhớ, bạn lấy thẳng nguồn của Datasheet Form là Record Souce cho Report luôn.

    Code cho nút lệnh "In report": sau khi bạn đã lọc, sort các kiểu trên Subform Datasheet.

    Mã PHP:
    DoCmd.OpenReport "rptABC"acViewPreview, , Me.sfmABC.Form.FilteracWindowNormal 

    Đối với Report: lấy nguồn từ Subform

    Mã PHP:
    Private Sub Report_Open(Cancel As Integer)
        Me.RecordSource Forms![frmMainABC]![sfmABC].Form.RecordSource
    End Sub 
  • RE: Truy vấn trực tiếp đến textbox subform Bound

    yamakashi2003 > 03-10-20, 08:33 PM

    (03-10-20, 05:04 PM)ongke0711 Đã viết:
    (03-10-20, 01:59 PM)yamakashi2003 Đã viết: HIện em đang dung subform để hiển thị dữ liệu, và em để dạng data sheet để lọc các cột theo ý mình cho nhanh, 
    Sau khi lọc xong thi em copy toàn bộ dữ liệu đã được lọc ở subform vào 1 bảng tạm (giả sử tableTam) có cấu trúc y hệt subform
    sau đó em mới chạy 1 report có nguồn từ tableTam đó
    Vậy có đoạn code nào có thể copy dữ liệu đang hiển thị ở subfrom (đã được lọc) vào bảng tạm không ạ
    Còn code để chạy report thì em biết rồi ạ
    Nhờ bác giúp đỡ, em xin cảm ơn ạ
    Trích dẫn:có ai giúp em với
    hay là việc copy dữ liệu trực tiếp từ subform (không thông qua table nguồn) sang table khác có cấu trúc y hệt, là không thực hiện bằng code được ạ
    Mong các tiền bối chỉ giúp em

    Vấn đề này của bạn rất đơn giản.
    - Thứ nhất cần làm rõ lý thuyết lại: bạn nói "copy dữ liệu từ Subform.." thực chất nó chính là dữ liệu từ Form Record Source và nó cũng là Table hoặc Query thôi vì Form của bạn là Bound Form. Không thể tách rồi ra nói dữ liệu của Subform với dữ liệu Table/Query gốc được. Nếu là Unbound Form thì dữ liệu hiển thị trên Form mới là dữ liệu của các Controls (textbox, combobox...) trên form vì không gắn với RecordSouce nào cả.
    - Thứ hai, bạn muốn chạy Report có nguồn từ cái Datasheet Form vừa được lọc (filtered) thì cần gì phải qua bước tạo Table tạm chi cho mất thời gian, bộ nhớ, bạn lấy thẳng nguồn của Datasheet Form là Record Souce cho Report luôn.

    Code cho nút lệnh "In report": sau khi bạn đã lọc, sort các kiểu trên Subform Datasheet.

    Mã PHP:
    DoCmd.OpenReport "rptABC"acViewPreview, , Me.sfmABC.Form.FilteracWindowNormal 

    Đối với Report: lấy nguồn từ Subform

    Mã PHP:
    Private Sub Report_Open(Cancel As Integer)
        Me.RecordSource Forms![frmMainABC]![sfmABC].Form.RecordSource
    End Sub 
    Em cám ơn bác, do em nghĩ là khi filter thì report sẽ luôn hiển thị hết dữ liệu của table, hoặc query ạ 021 021