2009-04-06 2 views
4

У меня есть форма в базе данных MS Access, в которой перечислены все землевладельцы, с которыми проводились консультации по новой линии электропередач. В конце каждой строки есть кнопка, открывающая другую форму, показывающую детали всех консультаций, предложений, сделанных и т. Д.MS Access - открыть форму, берущую значение поля из предыдущего формуляра

Я пытаюсь использовать vb в MS Access, чтобы взять contactID и автоматически поместить его в поле в форма детали, так что детали консультаций с владельцами будут всплывать автоматически. Я вообще не программист на vb (у меня степень comp sci в основном на Java, и в настоящее время я работаю аналитиком GIS, но это небольшая компания, поэтому мне было предложено работать с базой данных Access).

Я хочу сказать [подробнееForm]! [ContactID] = [landownerlist]! [ID] таким образом, что vb и доступ будут довольны. Тогда я могу видеть, правильно ли я нахожусь на правильном пути, и если это действительно сработает! То, что у меня выше, на самом деле не работает. Он не будет компилироваться.

От Kaliana

ответ

3

Вы можете посмотреть в код, который находится за этими кнопками. Если вы используете docmd.openform, вы можете установить четвертую настройку в предложение where при открытии следующей формы.

DoCmd.OpenForm "OpenFormName", acNormal, , "[contactID] = " _ 
    & [detailsForm]![contactID] , acFormEdit, acWindowNormal 

Это предполагает, что идентификатор контакта является числовым и не требует каких-либо кавычек.

6

Если вы хотите, чтобы открыть форму для новой записи и установить идентификатор там, вы можете использовать OpenArgs, аргумент OpenForm:

DoCmd.OpenForm "FormName",,,,acFormAdd,,Me.ID 

Открывшаяся форме также потребуется код:

If Me.Openargs<>vbNullstring Then 
    Me.Id = Me.Openargs 
End If 

также можно найти:

Forms!LandownersList.Recordset.FindFirst "ID=" & Me.ID 

или заполнить значения:

Forms!LandownersList!Id = Me.ID 

на форме, открытой из вызывающей формы.

0

Как уже отмечалось, OpenArgs отлично подходит для этого. Один трюк я узнал, что это легко проходить в нескольких параметров, если требуется как строку с разделителями (запятая, например), целевая форма может затем получить доступ к этим данным с помощью функции Split() таким образом:

StringArrayVariable()= Split(me.OpenArgs,",") 
Me.textbox= StringArrayVariable(0) 
Me.textbox1= StringArrayVariable(1) 

и т. д.

Это воздушный код, поэтому ознакомьтесь с файлом справки для Split().

Также возможно передать объекты в OpenArgs, для этого требуется некоторая ручная манипуляция указателем на память, и у меня нет кода, но я уверен, что поиск в Google найдет несколько примеров. Однако этот метод может вызвать некоторые случайные сбои. Имейте в виду!

0

Использование открытых аргументов - это общепринятое решение, о котором говорят другие. Это просто подпадает под категорию «Для вас назидание» :) Одна из проблем с использованием открытых аргументов заключается в том, что, если вы не будете осторожны с вашими комментариями, легко забыть, что они должны были подразумевать. Вы проезжали более одного? Что это? Как я сделал это здесь? Как я это сделал и т. Д.Для моих собственных денег я стандартизовал это (ниже), поэтому я всегда могу пройти более одного аргумента без страха, и когда я просмотрю свой код через год, я все еще могу видеть, что с тобой без огромных проблем:

Option Explicit 

'Example use: DoCmd.OpenForm "Example", OpenArgs:="Some Filter|True" 

Public Enum eForm1Args 
    eFilter = 0 
    eIsSpecial = 1 
End Enum 

Private m_strArgs() As String 

Public Property Get Args(ByVal eForm1Args As eForm1Args) As String 
    Args = m_strArgs(eForm1Args) 
End Property 

Private Sub Form_Open(Cancel As Integer) 
    m_strArgs = Split(Nz(Me.OpenArgs, vbNullString), "|") 
    If LenB(Me.Args(eFilter)) Then Me.Filter = Me.Args(eFilter) 
End Sub 

Private Sub Command1_Click() 
    If LCase$(Me.Args(eIsSpecial)) = "true" Then 
     'Do something special 
    End If 
End Sub 
+0

Спасибо. Я просто использовал это. – HarveyFrench

+0

ИЛИ Без использования Open Args открыть другую форму, как если бы это был класс Создать модуль называется GlobalVars, который включает в себя следующую строку: \t \t Общественный Form_ProviderFileContents1 в Form_ProviderFileContents1 Затем в коде, который вы хотите открыть другое использование формы: Установите GlobalVars.Form_ProviderFileContents1 = New Form_ProviderFileContents1 'Измените форму, которую вы только что открыли, но хотите. С Form_ProviderFileContents1 .Visible = True . Контроль ("ProviderID") = Me.ProviderID Конец С Или использовать методы/preoperties на названной форме – HarveyFrench

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