доступ к отчету из динамического запроса кросс-таблицы и VBA для «генерации» отчетов вручную - PullRequest
3 голосов
/ 02 февраля 2010

Я столкнулся с проблемой генерации сложных отчетов о доступе (под комплексом я имею в виду обработку данных, переменное число полей, среди прочих).
Позвольте мне объяснить более подробно некоторые вещи, которые мне нужно реализовать:

  • Некоторые поля не должны отображаться в соответствии с некоторыми значениями в запросе
  • Если определенной записи не существует, должно появиться приятное цветное (очень заметное) сообщение вместо значений, которые будут там (предположим, например, что существует запись с 03/04/2009 в поле даты, запись с 03/06/2009 в поле даты также существует, но записи с 03/05/2009 не существует. Прежде чем показывать данные, относящиеся к последней записи, я должен напечатать что-то вроде "Не показывался 03/05" / 2009 ")
  • Гистограмма, которая принимает в качестве данных не значения в записях, а что-то еще, что рассчитывается по набору записей (например, среднее значение всех оценок за определенную дату). Количество рядов в этой диаграмме также варьируется в зависимости от значений в записях, эта диаграмма будет не в разделе подробностей, а в заголовке страницы или в каком-либо заголовке группы.

Следует также отметить, что запрос является запросом TRANSFORM (точнее, INNER JOIN для многих запросов TRANSFORM), и, таким образом, количество столбцов, возвращаемых запросом, варьируется. Хотя в прошлом мне не удавалось связать этот запрос как источник записей для отчета, каким-то образом Access перестал жаловаться на данный момент (может кто-нибудь, пожалуйста, уточнить это? я должен избежать этого?)

Есть два варианта достижения того, чего я хочу (что я пока вижу):

  1. Создайте отчет без источника записи и множества несвязанных полей, а через несколько событий (Report_Open, Section_Format и т. Д.) И с помощью DAO вручную установите значения этих полей. Изменение серии данных диаграммы также возможно через VBA.
  2. Установите источник записи для запроса и создайте какой-нибудь сумасшедший и запутанный код VBA для обработки данных и реализации всего, что мне нужно.

Мне кажется, что вариант 2 будет огромной головной болью и пустой тратой времени, и я признаю, что вариант 1 во многом похож на запись в файл Excel (поскольку все данные получены с помощью DAO), который будет намного проще, так как у меня гораздо больше контроля над почти всем, что есть (но по многим другим причинам мы хотим все в отчете о доступе)

Несмотря на то, что я предвзят и собираюсь перейти к варианту 1, я обнаружил несколько проблем с этим параметром, например:

  1. Я не могу найти способ создания новых страниц в отчете с помощью VBA, и поэтому я ограничен только первой страницей.
  2. Отсутствие какой-либо бесплатной, онлайновой, достойной и полной документации по VBA и отчетам о доступе

Кроме того, если вариант 2 более жизнеспособен, я, безусловно, готов пойти на это, но мне также понадобятся некоторые советы и, возможно, несколько советов по решению проблем, которые я упомянул в этом вопросе.

Итак, вопросы:

  • Где я могу найти приличную и полную документацию по отчетам о доступе и VBA?
  • Как я могу создать страницы в отчете о доступе и выбрать, на какую страницу я хочу написать?
  • Имея в руках проблему, смогу ли я найти какие-либо узкие места, о которых мне следует знать? Должен ли я уже думать об альтернативах отчетам о доступе (например, записывать в электронную таблицу?)

Ответы [ 2 ]

1 голос
/ 02 февраля 2010

Похоже, вы хотите динамически создавать отчет и избегать всех пустых текстовых полей.

0 голосов
/ 03 февраля 2010

В отношении:

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

Похоже, ваше решение №1 предполагает несвязанный отчет.

Я думаю, что я бы сделал, чтобы в качестве источника строк использовалась форма кросс-таблицы, поэтому у вас будут записи для генерации страниц, изатем определите элементы управления вашего отчета без ControlSource (за исключением элементов управления, которые связаны с полями, которые всегда присутствуют в CrossTab).Затем вы можете назначить ControlSources во время выполнения на основе определенных столбцов.Вот SQL для кросс-таблицы, полученной из приложения, над которым я сейчас работаю:

  TRANSFORM First(impNoMatch.PersonID) AS FirstOfPersonID
  SELECT impNoMatch.LastName, impNoMatch.FirstBame
  FROM impNoMatch
  GROUP BY impNoMatch.LastName, impNoMatch.FirstName
  PIVOT impNoMatch.Status;

Теперь вы знаете, что поля в предложении SELECT будут присутствовать всегда, поэтому, если вы открыли набор записей вИспользуемая вами строка SQL и подсчет количества полей в коллекции полей набора записей (вы не можете использовать набор записей отчета, если это не набор записей ADO, т. Е. Не привязан к источнику записей):

  Dim strSQL As String
  Dim rsFields As DAO.Recordset
  Dim lngFieldCount As Long

  strSQL = Me.Recordsource
  Set rsFields = CurrentDB.OpenRecordset(strSQL)
  lngFieldCount = rsFields.Fields.Count

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

Вы начнете со всех своих элементов управления, которые будут отображать динамические поля, установленные так, чтобы их свойство Visible было ЛОЖНО.Вы также будете использовать соглашение об именах для этих элементов управления.В приведенном ниже коде я использовал txtNN, где NN - числовой индекс в коллекции Fields, отформатированный как 2 цифры.Вот код (который добавляет строки к тому, что перечислено выше, и запускается в событии OnOpen):

  Dim strSQL As String
  Dim rsFields As DAO.Recordset
  Dim lngFieldCount As Long
  Dim l As Long
  Dim strControlName As String

  strSQL = Me.RecordSource
  Set rsFields = CurrentDb.OpenRecordset(strSQL)
  lngFieldCount = rsFields.Fields.Count
  For l = 2 To lngFieldCount - 1
    strControlName = "txt" & Format(l, "00")
    Me(strControlName).ControlSource = rsFields.Fields(l).Name
    Me(strControlName).Visible = True
  Next l
  rsFields.Close
  Set rsFields = Nothing

Теперь, если вы хотите проявить фантазию, вы можете переформатировать элементы управления, изменив ширину и горизонтальный /Вертикальная позиция.Если вы делаете это, вы должны сделать это в другом событии, и это немного сложно выбрать.Единственное хорошее место для этого - событие OnFormat заголовка группы отчетов.Если у вас нет группы, вы можете добавить группу, которая ничего не делает.В случае моей кросс-таблицы двухуровневая сортировка по фамилии и имени и заголовок по группе «Имя», в котором ничего нет, является хорошим местом для использования события OnFormat для изменения внешнего вида / макета элементов управления в отчете.

Что касается вашего вопроса о том, как научиться это делать, я рекомендую взять книгу по программированию для среднего / продвинутого уровня.Руководство для разработчиков Access является золотым стандартом и включает в себя множество примеров программного управления отчетами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...