2014-01-05 5 views
1

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

Как только кнопка выбора запускается, фильтр, созданный внутри подформы, более недействителен.

Я пытаюсь определить следующие 2 вещи с минимальным успехом на обоих:

1- можно ли запустить фильтр на столе уже фильтруется и поддерживать правила для обоих фильтров?

2- если нет, то я пытаюсь инкорпорировать и утверждение в коде кнопки опции фильтра, но имеют мало успеха ...

в основном, я хотел бы следующие два утверждения, которые будут включены в один заявление с использованием И

Me! [frmProjectSubPhase04] .Form.Filter = "[overall_status] = 'задержка'" И Me! [frmProjectSubPhase04] .Form.Filter = "[осуществление] = не равно нулю"

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

+0

Как применяется оригинальный фильтр? Не могли бы вы сделать это через базовый запрос, если он согласован/постоянный. Если это настраиваемый фильтр, применяемый пользователем (щелкните правой кнопкой мыши в подформе), который вы хотите сохранить, это более сложно. Кажется, я вспоминаю, как что-то похожее назад, которое объединяет фильтр внутри субформы и один из кнопок параметров или ComboBox, позвольте мне попытаться вспомнить. –

ответ

1

Как предложил вам нужно объединить существующую .Form.Filter с новые критерии с помощью кнопки выбора. Однако есть ситуации, которые могут вызвать проблемы с самым простым решением. Я предполагаю, что кнопка выбора на основной форме - optDelayedOnly с заголовком Delayed Records Only.

  1. Если есть поле status в подчиненной, которые пользователь может уже просочились на то это может привести к конфликту. Вам нужно будет решить, следует ли удалять определяемые пользователем критерии в этом поле перед добавлением собственных критериев. Мое решение не проверяет для этого.

  2. Когда пользователь отключает кнопку optDelayedOnly, вам необходимо удалить этот элемент фильтра. Фильтр также может включать в себя ранее существовавшие критерии, указанные ранее пользователем, такие как [exercise] IS NOT NULL.

  3. Access имеет привычку добавлять дополнительный набор скобок вокруг частей фильтра, такого как ((([status]='delayed'))) AND ([example_table].[exercise] = 'my exercise')

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

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

Private Sub Form_Open(Cancel As Integer) 

    Me.sfexample_table.Form.Filter = "" 

End Sub 

Private Sub optDelayedOnly_AfterUpdate() 

    Dim strFilter As String, strDelayedOnlyFilter As String 

    strFilter = Me.sfexample_table.Form.Filter   ' get the current filter from the form 
    strDelayedOnlyFilter = "[status] = 'delayed'"  ' define the new status filter 

    If Me.optDelayedOnly = False Then 
     strFilter = Replace(strFilter, strDelayedOnlyFilter, "") ' remove the DelayedOnly filter if it exists 
     Do Until InStr(strFilter, "()") = 0       ' remove any empty parentheses if they exist 
      strFilter = Replace(strFilter, "()", "") 
     Loop 
     strFilter = Trim(strFilter) 
     If Left(strFilter, 3) = "AND" Then strFilter = Trim(Right(strFilter, Len(strFilter) - 3)) ' remove a leading AND 
     If Right(strFilter, 3) = "AND" Then strFilter = Trim(Left(strFilter, Len(strFilter) - 3)) ' remove a trailing AND 
    Else 
     ' this is when the option box is selected so apply a filter on top of the existing (user-specified) filter 
     ' test the existing filter 
     If Len(strFilter) > 0 Then 
      strFilter = strFilter & " AND " & strDelayedOnlyFilter ' tag our DelayedOnly filter on the end (AND is required) 
     Else 
      strFilter = strDelayedOnlyFilter      ' just use the DelayedOnly filter (AND is not required) 
     End If 
    End If 
    ' MsgBox strFilter - used for debugging 

    ' now assign the new filter to the subform and apply it 
    Me.sfexample_table.Form.Filter = strFilter 
    Me.sfexample_table.Form.FilterOn = True 

End Sub 

Пожалуйста, не стесняйтесь комментировать дальнейшее уточнение, если мои предположения неверны. Обратите внимание, что я не использовал одинаковое имя формы, и мое поле называется status, а не overall_status. Я могу отправить вам файл Access, который я использовал, если вам нужно.

+0

Большое спасибо за вашу преданность моей проблеме ... Я дам вам попытку и дам вам знать. Могу ли я задать другой вопрос. Я не уверен, связана ли эта проблема, но может быть. Я собираюсь опубликовать вопрос для общественности под названием «ФИЛЬТР КОНФЛИКТ» ... Я был бы признателен, если бы вы могли посмотреть, я чувствую, что вы можете знать ответ. Еще раз спасибо ... ваш код выглядит точечным с тем, что я пытаясь сделать ... –

+0

@MarcheseIlChihuahua Надеюсь, это поможет. Из вашего профиля я заметил, что вы не отметили никаких ответов на свои предыдущие вопросы о переполнении стека, как принято. Хорошая практика заключается в том, чтобы продвигать и отмечать наилучший ответ как принятый, предполагая, что он решает описанную проблему. Я увидел ваш другой вопрос и подумаю, когда этот вопрос будет разрешен удовлетворительно. Удачи. –

+0

Еще раз спасибо Мэтт .. Да, я новичок в этой культуре и не понял, что мне нужна была обратная связь ... Спасибо за подсказку! –

2

Если ваш существующий фильтр

Me![frmProjectSubPhase04].Form.Filter = "[overall_status]='delayed'" 

и вы хотите добавить второе условие, которое вы должны быть в состоянии использовать такой код следующим

Me![frmProjectSubPhase04].Form.Filter = _ 
     "(" & Me![frmProjectSubPhase04].Form.Filter & ") " & _ 
      "AND ([exercise] IS NOT NULL)" 
Смежные вопросы