2010-08-13 46 views
12

Tôi đã tạo biểu mẫu đăng nhập có tên đăng nhập nơi tên người dùng được nhập vào hộp văn bản txtEmployee và tôi cần hiển thị như vậy ở trang thứ hai dưới dạng khác trong MS Access.Chuyển thông số giữa các biểu mẫu trong MS Access

+0

Là người dùng tên giống như tên người dùng đăng nhập cửa sổ? Nếu có, bạn có thể lấy tên từ: http://www.mvps.org/access/api/api0008.htm – Fionnuala

+1

Ngoài ra, tại sao bạn cần hiển thị tên người dùng, chắc chắn người dùng biết họ là ai? Nếu bạn cần tên vì một số lý do khác, bạn nên nói như vậy, bởi vì có nhiều cách để truyền thông tin. Ví dụ, nếu tên được sử dụng để lọc các bản ghi, đối số Where của phương thức OpenForm có lẽ là tốt nhất. – Fionnuala

+2

Điều này nghe có vẻ như bạn đã xây dựng một hệ thống có bảo mật giả mạo. Tại sao bạn làm điều đó, thay vì sử dụng Jet ULS hoặc Windows NTFS security hoặc Active Directory? –

Trả lời

24

DoCmd.OpenForm cho phép bạn chuyển giá trị tùy ý làm thông số cuối cùng. Giá trị này có thể được truy cập trong hình thức mới như Me.OpenArgs:

' Invoked by some Button on the first form ' 
Sub GoToSecondPage() 
    DoCmd.OpenForm "MySecondPage", acNormal, , , , , txtEmployee.Value 
End Sub 

' Second form ' 
Sub Form_Open(Cancel As Integer) 
    If Not IsNull(Me.OpenArgs) Then 
     lblShowEmployeeName.Value = Me.OpenArgs 
    End If 
End Sub 

(. Mã ví dụ chưa được kiểm tra)

4

Cá nhân tôi sẽ vượt qua chúng thông qua các đối số mở khi mở biểu mẫu. Ví dụ từ hình thức Một bạn sẽ viết

DoCmd.OpenForm "frmB", , , , , acDialog,”Badger” 

Và sau đó trong sự kiện OnOpen của form B bạn có thể chụp những gì bạn đã gửi như thế này

Me.txtSomething=Me.OpenArgs 

Bạn chỉ có thể vượt qua một điều tuy nhiên Những gì tôi làm rất nhiều là vượt qua một chuỗi phân cách đường ống trong các đối số mở và sau đó tách ra.

+0

Tại sao bạn mở bằng acDialog? – Fionnuala

+0

Ví dụ này được lấy từ giống như một hình thức popup vì vậy tôi muốn nó là phương thức, điều này tất nhiên có thể được gỡ bỏ nếu OP chỉ muốn một hình thức bình thường –

0

Một vài ý tưởng ...

Sử dụng các sự kiện AfterUpdate trên các lĩnh vực tên đăng nhập để viết tên cho một biến toàn cầu, sau đó cư lĩnh vực này trên trang thứ hai với sự kiện onload.

Hoặc, nếu bạn có kế hoạch rời khỏi nhật ký ở dạng mở bất cứ lúc nào bạn có thể thiết lập giá trị mặc định của lĩnh vực này trực tiếp đến = [Forms]! [LogInForm]! [UserName]

0

Tại sao không tạo ra một chức năng công cộng lưu trữ &/hoặc truy lục một biến toàn cục mà bạn lưu trữ sau khi biểu mẫu đầu tiên được thực thi? Điều này sẽ cho phép bạn không chỉ sử dụng nó trên một hoặc nhiều biểu mẫu, mà còn là tiêu chí trong một truy vấn (ví dụ, để trả về các bản ghi khớp với tên người dùng bạn đã lưu trữ).

Tôi đồng ý điều này là bảo mật "giả", nhưng cũng có những lúc nó đủ cho nhu cầu của bạn. Tôi đã thực hiện điều này trước đây, nơi tôi kết hợp tên người dùng chuỗi môi trường với một mục nhập trong bảng người dùng.

BTW, tôi gọi tính năng này là cá nhân hóa chứ không phải bảo mật.

Chỉ là một ý nghĩ.

+1

Tôi sẽ không bao giờ sử dụng toàn cầu cho việc này. Thay vào đó, tôi sẽ sử dụng biến STATIC bên trong hàm trả về giá trị và nếu nó không được đặt, nó sẽ mở biểu mẫu để thu thập thông tin. Điều này có nghĩa là cả hai đều tự chữa bệnh và an toàn khỏi bị thay đổi ở nơi khác trong mã. –

5

Bạn có thể vượt qua một chuỗi giới hạn như tham số OpenArgs:

DoCmd.OpenForm FormName:="miscForm", OpenArgs:=paramstring 

Dưới đây là một thói quen để xử lý một chuỗi ống được phân định thông qua như là tham số để DoCmd.OpenForm:

Dim Pstring As Variant 

If Len(Me.OpenArgs) > 0 Then 
    Pstring = Split(Me.OpenArgs, "|") 
    var1 = Pstring(0) 
    <etc..> 
End If 
+1

Tôi thường thấy cần phải làm điều này như một dấu hiệu của một vấn đề thiết kế. Tức là, nếu bạn phải chuyển nhiều thông tin đó đến biểu mẫu, về cơ bản bạn nên sử dụng một số cách có cấu trúc để làm như vậy. –

+0

@David, Bạn đang đề cập đến biến kiểu 'struct'? Tôi chỉ sử dụng biểu mẫu này cho một biểu mẫu trong ứng dụng Access hiện tại của mình, để tôi không phải đặt nội dung vào cơ sở dữ liệu trước khi tôi đưa biểu mẫu lên và sau đó lại xuất hiện khi tôi ở trong biểu mẫu. Tôi mở ra một ý tưởng tốt hơn, tôi không có chuyên gia về Mẫu truy cập. –

+0

Có nhiều cách để thực hiện điều này. Một là chỉ đơn giản là chọc dữ liệu vào biểu mẫu được gọi từ ngữ cảnh gọi. Điều này có thể được thực hiện bằng cách mở biểu mẫu với cả acHidden và acDialog, và khi bạn hoàn thành việc đưa dữ liệu vào biểu mẫu được gọi, bạn làm cho nó hiển thị, điều này làm cho nó thực thi phương thức và mã trong ngữ cảnh gọi. Tôi thường không làm điều đó. Tôi có nhiều khả năng sử dụng một mô-đun lớp học, nhưng đó chỉ là lợi nhuận khi bạn có một số thuộc tính bạn cần vượt qua, chẳng hạn như khi lọc trên nhiều tiêu chí. –

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