Как я могу ссылаться на объект формы в коде отчета

#vba #database-design #ms-access-2016

Вопрос:

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

Код:

     Do.Cmd.OpenForm “FormOne”, acNormal
    Forms!FormOne.Visible = False 

    If Forms!FormOne.Form!Authorization.Value = 1 Then 
       Me.Label1.Caption = “Report A Details” 
    ElseIf Forms!FormOne.Form!Authorization.Value = 2 Then
       Me.Label1.Caption = “Report B Details” 
    End If
    End Sub 
 

Та часть, где я открываю форму и делаю ее невидимой, работает. Оператор If/Else не работает, но и не выдает никаких ошибок. Я также попытался заменить второе (!) на (.), но произошло то же самое.

Поскольку вопрос был напечатан на iPad, мои цитаты выглядят как умные цитаты.

Комментарии:

1. Попробуй с Forms!FormOne!Authorization.Value .

2. @Gustav Я только что попробовал это, но это не сработало. Спасибо!

3. Форма используется для взаимодействия с пользователем. Отчет, по сути, является объектом, доступным только для чтения. Открытие невидимой формы из кода отчета и использование значений свойств формы для задания свойств отчета кажется обратным. Обычно вы отображаете форму, ждете, пока пользователь нажмет кнопку или что-то еще, затем открываете отчет и задаете свойства отчета в коде формы.

4. @NicholasHunter Я на самом деле загрузил код в событие Report_Load. Я понимаю, о чем вы говорите, я попробую сделать это таким образом. Знаете ли вы, как ссылаться на объект отчета в форме? В значительной степени у меня есть отчет, в котором есть два подотчета. На основе определенного значения в форме я хочу, чтобы заголовок заголовка отчета изменился.

Ответ №1:

Я бы предпочел задать заголовок с помощью свойства OpenArgs отчета. Вот событие нажатия кнопки вашей формы.

 Private Sub Command1_Click()

    Dim args As Variant

    If Me.Authorization.Value = 1 Then
       args = "Report A Details"
    ElseIf Me.Authorization.Value = 2 Then
       args = "Report B Details"
    End If

    DoCmd.OpenReport "Report1", acViewPreview, OpenArgs:=args
    
End Sub
 

а вот отчет об открытом мероприятии

 Private Sub Report_Open(Cancel As Integer)

    If Not IsNull(Me.OpenArgs) Then
        Me.Label1.Caption = Me.OpenArgs
    End If
    
End Sub
 

Комментарии:

1. Большое вам спасибо, что перезвонили мне. Я попробую сделать это сейчас.

2. Таким образом, отчет по-прежнему открывается, но метки не меняются. Теперь у меня уже есть текст внутри метки, которой я хочу манипулировать (Label1), может ли это быть проблемой? Если я удалю текст в представлении дизайна отчета, метка тоже исчезнет.

3. Или отчет уже нужно открыть, чтобы внести изменения? В этом случае мы вызвали acViewPreview после оператора If/Else.

4. В моем примере предполагается, что отчет называется Report1, а элемент управления, который вы пытаетесь изменить, — это метка под названием Label1. Вам нужно убедиться, что метка достаточно широкая, чтобы на ней отображался необходимый текст. Не имеет значения, каков заголовок метки во время разработки, потому что во время выполнения он будет заменен содержимым свойства OpenArgs отчета. Заголовок метки не изменится, если вы не откроете отчет, выполнив команду Command_Click1 sub. Вам нужно настроить его на выполнение при нажатии кнопки в форме.