Неверный RecordCount по фильтрованной форме с SQL View DataSource

Я использую Access2010 project как интерфейс, ссылаясь на MS SQL Server 2008 как сервер. В моем проекте «Доступ» есть форма frmKlientenÜbersicht . Эта форма имеет вид abfKlientenÜbersicht как dataSource.

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

Private Sub Form_Current()
    Debug.Print "Form_Current: " & anzahlDatensätze
    lblAnzahlDatensätze.Caption = anzahlDatensätze & " Klient(en)"
End Sub

Private Function anzahlDatensätze() As Integer
    Dim rs As Recordset
    Set rs = Me.RecordsetClone
    rs.MoveLast
    anzahlDatensätze = rs.RecordCount
End Function

Это работает нормально, пока я не использую некоторые фильтры. Если я с использованием любого фильтра в моей форме, количество записей остается неизменным !

  • Что мне нужно изменить, чтобы отобразить текущее количество записей (если они отфильтрованы или нет)?
  • В чем причина, почему мой код не показывает правильное количество записей?

Access Project Overview

EDIT: в соответствии с данными комментариями и ответами я попытался установить Count ([pkKlient] в текстовое поле (см. Новый рис.) И попытался выполнить DCount ("*", "abfKlientenÜbersicht", me.Filter ) из кода VBA.

К сожалению, кажется, что filterClause недействителен при использовании его в качестве значения параметра для DCount. (см. рис. для filterClause).

As you can see count(..) does not result in a correct number - and the filterClause (generated by access!!) seems not to be valid for use by DCount(..)

Если кто-то хочет попробовать, сам по себе, просто создайте ADP, добавьте форму, добавьте представление, форму dataSource - это представление, установите фильтр и попытайтесь получить количество записей? !!

Looking forward for any comments/answers/hints!

form Screenshot when filtered

0
nl ja de
Можете ли вы также показать нам свои фильтры?
добавлено автор bonCodigo, источник
Извинения за то, что они явно не ясны. Лучше всего предположить, что вы смотрите на paramterized query . Так почему бы не посмотреть на SQL View после добавления фильтров :)
добавлено автор bonCodigo, источник
Извинения за то, что они явно не ясны. Лучше всего предположить, что вы смотрите на paramterized query . Так почему бы не посмотреть на SQL View после добавления фильтров :)
добавлено автор bonCodigo, источник
Фильтры будут динамически настроены пользователем , щелкнув соответствующий RibbonBarButtons и выбрав значения для фильтрации!
добавлено автор Pilgerstorfer Franz, источник
Фильтры будут динамически настроены пользователем , щелкнув соответствующий RibbonBarButtons и выбрав значения для фильтрации!
добавлено автор Pilgerstorfer Franz, источник
К сожалению, я не совсем уверен, что вы имели в виду - возможно, вы можете добавить anser, показывающий/описывающий, как реализовать ваше решение. Кроме того, все, что я хочу знать, - это количество записей, доступ к которым уже отображается в навигационной панели внизу (например: 1 из 4 - отфильтрованный). IMO запрошенная информация уже находится где-то внутри доступа - я просто не знаю, как ее получить?
добавлено автор Pilgerstorfer Franz, источник
К сожалению, я не совсем уверен, что вы имели в виду - возможно, вы можете добавить anser, показывающий/описывающий, как реализовать ваше решение. Кроме того, все, что я хочу знать, - это количество записей, доступ к которым уже отображается в навигационной панели внизу (например: 1 из 4 - отфильтрованный). IMO запрошенная информация уже находится где-то внутри доступа - я просто не знаю, как ее получить?
добавлено автор Pilgerstorfer Franz, источник

3 ответы

с VBA, DCount даст вам то, что вам нужно

DCount("*", "MyTable", Me.Filter)

If you want to put this on the form, there's an easier way. use an unbound box, and set it to =count([FieldName])

using Count in form proerties

Этот счет должен оставаться верным, независимо от того, подсчитывается ли он отфильтрованными отчетами или нет.

1
добавлено
unfortunatelly Count ([primaryKeyColumn]) не приводит к правильному количеству записей, а DCount из моего кода VBA не работает. Кажется, что FilterClause (сгенерированный доступом) недействителен - см. Отредактированный вопрос ..
добавлено автор Pilgerstorfer Franz, источник

с VBA, DCount даст вам то, что вам нужно

DCount("*", "MyTable", Me.Filter)

If you want to put this on the form, there's an easier way. use an unbound box, and set it to =count([FieldName])

using Count in form proerties

Этот счет должен оставаться верным, независимо от того, подсчитывается ли он отфильтрованными отчетами или нет.

1
добавлено
unfortunatelly Count ([primaryKeyColumn]) не приводит к правильному количеству записей, а DCount из моего кода VBA не работает. Кажется, что FilterClause (сгенерированный доступом) недействителен - см. Отредактированный вопрос ..
добавлено автор Pilgerstorfer Franz, источник

Некоторые заметки, есть десяток вещей, которые могут пойти не так с этим, его вряд ли можно даже назвать проверенным. Тем не менее, он возвращал мне правильный счет.

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

Private Sub Form_ApplyFilter(Cancel As Integer, ApplyType As Integer)

    With Me.Recordset
        ''Filter
        If ApplyType = 1 Then
            ''Very, very roughly. Remove form name, use single quotes
            ''You will need a lot more code for safety
            sfilter = Replace(Me.Filter, "[" & Me.Name & "].", "")
            sfilter = Replace(sfilter, """", "'")

            .Filter = sfilter 

            MsgBox "Recordset : " & Me.Recordset.RecordCount & vbCrLf _
            & "Filtered : " & .RecordCount

        Else
            ''Remove filter - ApplyType 0
            .Filter = ""
        End If

    End With

End Sub

Дополнительная заметка с аналогичными оговорками

Вы также можете установить текстовое поле для чего-то в этих строках:

=IIf([FilterOn]=True,DCount("id","ATable",
 Replace(Replace([Filter],"[" & [Name] & "].",""),"""","'")),Count([id]))

(Удалите перерыв в линии, он косметический)

0
добавлено
Я использовал Access 2010 и SQL Server Express 2012 для создания adp. Первоначально я получал те же результаты, что и вы наброски, то есть форму отфильтрованных данных и счет, который не совпал. Я поставил вышеизложенное из ряда сообщений по этому вопросу. Это зависит от применения фильтра к набору записей, а не к форме.
добавлено автор Fionnuala, источник
Обратите внимание, что это проблема с adps и вообще не существует для связанных таблиц, что теперь является рекомендуемым способом использования внутренней базы данных.
добавлено автор Fionnuala, источник
Когда я говорю связанные таблицы, я имею в виду в нормальном accdb, а не в adp.
добавлено автор Fionnuala, источник
thx для вашего ввода - по крайней мере, это может быть объяснение, почему count не вернул правильный номер для меня. Когда вы заявили, что вы получили правильный результат, , где вы используете SQL Server как бэкэнд и Access как интерфейс ? При использовании базы данных Access я тоже получаю правильные результаты
добавлено автор Pilgerstorfer Franz, источник
Я просто задаюсь вопросом, какую логику/функцию использует Access - как она показывает правильный номер прямо сейчас ?! (см. второй скриншот)
добавлено автор Pilgerstorfer Franz, источник
Я использую связанные таблицы и запрос как dataSource для формы. К сожалению, у меня все еще есть проблема. Присвоение фильтра набору записей может быть решением, но позволяет пользователю использовать встроенную функцию фильтра ... Нашел решение, которое разделило высоту формы на высоту записи, чтобы получить правильную номер
добавлено автор Pilgerstorfer Franz, источник
Хотя ваш ответ помог мне - я все еще немного раздражен тем, как доступ делает такую ​​магию (подсчет видимых записей с помощью clientFilter и запрос как dataSource)? thx для вашего ввода!
добавлено автор Pilgerstorfer Franz, источник