2010-04-13 40 views
5

Tôi có biểu mẫu chính với điều khiển tab có chứa nhiều biểu mẫu con. Tôi cần đảm bảo rằng dữ liệu trong biểu mẫu con được lưu khi người dùng chuyển đổi tab. Vấn đề là DoCmd.RunCommand acCmdSaveRecord dường như chỉ áp dụng cho biểu mẫu hiện tại để nó không lưu dữ liệu trong biểu mẫu con.Ms Access Lưu bản ghi trong biểu mẫu con

Tôi đã thử các sự kiện khác nhau trên biểu mẫu con như tắt, OnLostFocus vv nhưng chúng không kích hoạt cho đến khi một trường khác ở nơi khác lấy tiêu điểm.

Giải pháp lý tưởng có vẻ là đặt một thứ gì đó trên sự kiện OnChange của điều khiển tab để đảm bảo rằng tất cả dữ liệu được lưu. Đó là câu hỏi của tôi, làm thế nào để tôi lưu hồ sơ trong một biểu mẫu con?

Trả lời

2

Trong Access, mặc định là để lưu, vì vậy trừ khi bạn đã làm điều gì đó khá phức tạp để ngăn chặn điều này, di chuyển tiêu điểm từ biểu mẫu phụ sẽ tự động lưu bản ghi. Bạn có thể kiểm tra điều này bằng cách thêm một bản ghi, di chuyển từ biểu mẫu con và sau đó kiểm tra bảng.

+0

Tôi đã tìm ra giải pháp. Tôi cần chạy một số mã để cập nhật các trường khác khi dữ liệu nhất định được thay đổi. Những gì đã xảy ra là điều này đã không bắn khi nó được cho là ... Cảm ơn cho đầu vào! – Icode4food

+0

Cho rằng bạn có thể xem xét các sự kiện LostFocus của các điều khiển biểu mẫu con. –

1

Bạn không phải làm gì cả, vì biểu mẫu con được lưu ngay sau khi mất tiêu điểm (khi điều khiển tab thay đổi).

Nhưng khi tập thể dục, tôi đã vạch ra mã bạn muốn viết nếu cần.

Bạn có thể lưu bất kỳ biểu mẫu nào bằng cách đặt biểu mẫu .Dirty property thành False. Đối với một cái gì đó như thế này mà sẽ chạy rất nhiều, tôi nghĩ rằng tôi muốn viết một phụ để đi qua các subforms, kiểm tra nếu có bẩn, và lưu những người bẩn. Một cái gì đó như thế này:

Public Sub SaveSubFormsOnTab() 
    Dim pge As Control 
    Dim ctl As Control 

    For Each pge In Me!ctlTab.Pages 
     Debug.Print pge.Name 
     For Each ctl In pge.Controls 
     If ctl.ControlType = acSubform Then 
      If ctl.Form.Dirty Then 
       ctl.Form.Dirty = False 
      End If 
      Debug.Print ctl.Name 
     End If 
     Next ctl 
    Next pge 
    Set ctl = Nothing 
    Set pge = Nothing 
    End Sub 

Bây giờ, điều đó thực sự không hiệu quả trong trường hợp bạn có nhiều điều khiển trên điều khiển tab không phải là biểu mẫu con. Nếu tab của bạn không có gì ngoài các biểu mẫu con, nó sẽ khá hiệu quả. Trong cả hai trường hợp, việc sử dụng bộ sưu tập tùy chỉnh được thêm vào trong sự kiện OnLoad của biểu mẫu hiệu quả hơn nhiều, và sau đó bạn sẽ đi bộ sưu tập đó bao gồm không có gì ngoài biểu mẫu con của điều khiển tab và lưu bất kỳ tệp nào bị bẩn.

Một trong hai cách này thích hợp hơn khi sử dụng sự kiện OnChange của tab, vì mỗi khi bạn thêm trang tab có biểu mẫu phụ hoặc thay đổi tên của điều khiển biểu mẫu con, bạn phải thay đổi sự kiện OnChange.

-2

Đặt thuộc tính bẩn thành sai có thể bắt buộc Access lưu dữ liệu vào cơ sở dữ liệu, nhưng nó bỏ qua sự kiện before_update. Điều này có nghĩa rằng nếu bạn đã sử dụng sự kiện này để xác thực hoặc các mục đích khác, bây giờ bạn có thể có dữ liệu xấu trong cơ sở dữ liệu của bạn.

+2

Điều đó không đúng - sự kiện cập nhật MẪU tất cả các đám cháy (tôi vừa thử nghiệm). Tuy nhiên, các sự kiện của các điều khiển riêng lẻ không nhất thiết phải kích hoạt (vì chúng sẽ không được kích hoạt bằng cách chỉ lưu bản ghi). –

0

Tôi gặp sự cố tương tự khi tôi cần nhiều mã khác nhau để chạy trong biểu mẫu con và giá trị trong biểu mẫu chính - được dựa trên giá trị trong biểu mẫu con - để được tính toán lại. Dưới đây là những gì cuối cùng đã làm việc:

Đây là một ví dụ với biểu mẫu chính có tên 'frmCustomers' có chứa biểu mẫu con 'sfmTransaction', lần lượt có biểu mẫu con được gọi là 'sfmOrderLine'. Các biểu mẫu có nút 'cmdSave' chỉ hiển thị khi người dùng nhấp vào nút 'cmdEdit' (mục đích là khóa tất cả các điều khiển cho đến khi người dùng nhấp vào nút chỉnh sửa, sau đó khóa lại khi họ nhấp vào lưu):

Trên biểu mẫu chính ('frmCustomer') chuyển sự kiện thoát của biểu mẫu con và thêm 'tôi.recalc' hai lần, như thế này:

Private Sub sfmTransaction_Exit(Cancel As Integer) 
    If (Not Form_sfmTransaction.NewRecord And Form_sfmTransaction.cmdSave.Visible) Or (Not Form_sfmOrderLine.NewRecord And Form_sfmOrderLine.cmdSave.Visible) Then 
     'To save subforms 
     Me.Recalc 
     Me.Recalc 
    End If 
End Sub 

Trong subform ('sfmTransaction') đi kiện thoát subform của của subform, và thêm 'me.recalc' hai lần, như thế này:

Private Sub sfmOrderLine_Exit(Cancel As Integer) 
    If Not Form_sfmOrderLine.NewRecord And Form_sfmOrderLine.cmdSave.Visible Then 
     'To save subform 
     Me.Recalc 
     Me.Recalc 
    End If 
End Sub 

Hy vọng điều này sẽ hữu ích.

Các vấn đề liên quan