2010-08-13 6 views
12

Я создал регистрационную форму с именем login, где имя пользователя вводится в текстовое поле txtEmployee, и мне нужно отобразить его на второй странице в другой форме в MS Access.Передача параметров между формами в MS Access

+0

Является ли пользователь имя совпадает с именем пользователя входа в Windows? Если это так, вы можете получить имя от: http://www.mvps.org/access/api/api0008.htm – Fionnuala

+1

Кроме того, почему вам нужно отображать имя пользователя, конечно, пользователь знает, кто они? Если вам нужно имя по какой-то другой причине, вы должны сказать это, потому что есть более одного способа передать информацию. Например, если имя используется для фильтрации записей, аргумент Where для метода OpenForm, вероятно, лучше всего. – Fionnuala

+2

Похоже, вы создали систему с поддельной безопасностью. Почему вы это сделали, вместо использования Jet ULS или безопасности Windows NTFS или Active Directory? –

ответ

24

DoCmd.OpenForm позволяет передавать произвольное значение в качестве последнего параметра. Это значение можно получить в новой форме 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 

(. Пример кода непроверенного)

4

Лично я бы передать их через открытые аргументы при открытии формы. Например, из формы А ваш будет писать

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

А потом в OnOpen случае формы B вы можете захватить то, что вы послали, как этот

Me.txtSomething=Me.OpenArgs 

Вы можете передавать только одну вещь, однако, что я делаю много пропускает строку с разделителями в открытых аргументах и ​​затем разделяет это.

+0

Почему вы открываете acDialog? – Fionnuala

+0

Ну, этот пример был взят из всплывающей формы, поэтому я хотел, чтобы он был модальным, это, конечно, можно удалить, если OP просто хочет нормальную форму. –

0

пара идей ...

Используйте событие AfterUpdate на поле Логин имя пользователя, чтобы написать имя глобальной переменной, а затем заполнить поле на второй странице с событием OnLoad.

Или, если вы планируете оставить журнал в виде открыт в любое время вы можете установить значение по умолчанию для поля непосредственно = [Формы]! [LoginForm]! [UserName]

0

Почему бы не создать публичная функция, которая хранит &/или извлекает глобальную переменную, которую вы сохраняете после выполнения первой формы? Это позволит вам не только использовать его в одной или нескольких формах, но и как критерии в запросе (например, для возврата записей, которые соответствуют сохраненному имени пользователя).

Я согласен, что это «поддельная» система безопасности, но есть также моменты, когда этого достаточно для ваших нужд. Я реализовал это раньше, когда я сопоставляю имя пользователя строки среды с записью в пользовательской таблице.

BTW, я рассматриваю эту функцию как персонализацию, а не безопасность.

Просто мысль.

+1

Я бы никогда не использовал глобальный для этого. Вместо этого я бы использовал переменную STATIC внутри функции, которая возвращает значение, и если оно не установлено, оно откроет форму для сбора информации. Это означало бы, что и самовосстановление, и безопасность могут быть изменены в другом месте кода. –

5

Вы можете передать строку с разделителями в качестве параметра OpenArgs:

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

Вот процедура для обработки колонны труб с разделителями, переданного в качестве параметра DoCmd.OpenForm:

Dim Pstring As Variant 

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

Обычно я вижу необходимость сделать это как указание проблемы дизайна. То есть, если вам нужно передать эту информацию в форму, вы в основном должны использовать какой-то структурированный способ сделать это. –

+0

@David: Вы имеете в виду переменную типа 'struct'? Я использую это только для одной формы в моем текущем приложении Access, так что мне не нужно помещать материал в базу данных, прежде чем я открою форму, а затем снова, когда я буду в форме. Я открыт для лучшей идеи, я не эксперт по форме доступа. –

+0

Существует несколько способов решения этой задачи. Один из них состоит в том, чтобы просто вытолкнуть данные в вызываемую форму из вызывающего контекста. Это можно сделать, открыв форму с помощью achidden и acDialog, и когда вы закончите получать данные в вызываемую форму, вы сделаете ее видимой, что делает ее модальной и выполнение кода в вызывающем контексте останавливается. Обычно я этого не делаю. Я скорее всего использую модуль класса, но это выгодно только тогда, когда у вас есть несколько атрибутов, которые нужно передать, например, при фильтрации по нескольким критериям. –

Смежные вопросы