2010-02-02 1 views
3

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

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

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

есть два варианта, чтобы достичь того, что я хочу (что я могу видеть на данный момент):

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

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

Хотя я предвзятый и намерен пойти с вариантом 1, я нашел несколько проблем с этой опцией, например:

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

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

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

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

Рассматривали ли вы создание отчета в Word (автоматизация) или использование HTML? – Fionnuala

+0

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

ответ

1

Похоже, что вы хотите dynamically create the report и избегайте всех текстовых полей.

+0

Это действительно супер-статья, но мне кажется слишком сложным создавать «на лету» отчеты для чего-то повторяющегося действия, и единственное вещь, которая изменяется, - это точное количество столбцов в кросс-таблице в зависимости от конкретного набора данных. –

+0

Вы можете найти как минимум 3-5 столбцов, так что остальное можно было бы создать динамически. Позиционирование будет таким же сложным в кросс-вкладке. Как насчет открытия отчета в программном режиме? – JeffO

+0

Мне нужно открыть любой объект в режиме проектирования - это ошибка. Во-первых, он не будет работать в MDE/ACCDE. Кроме того, если вы пытаетесь добавить элементы управления «на лету», вы в конечном итоге закончите работу, так как существует ограничение на 700 нечетных элементов управления за время жизни формы/отчета, независимо от того, удаляете ли вы или не сохраняете объект. Так, вообще, не рекомендуется вообще. –

0

В отношении:

Я не могу найти способ создания новых страниц в отчете с помощью 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; 

Теперь вы знаете, что поля в ЗЕЬЕСТЕ всегда будут присутствовать, так что если вы открыли записи на строке SQL вы используете, и подсчитать количество полей в коллекции Fields набора записей (вы не можете использовать Recordset в докладе, если это не антидопинговые записи, т.е. не связаны с RecordSource):

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 (т. е. заголовки строк), вы можете рассчитать количество динамических элементов управления, которые вы хотите назначить, и вы можете использовать этот рекордер коллекции полей dset, чтобы назначить ControlSources и отобразить элементы управления.

Вы начнете со всех своих элементов управления, которые будут отображать динамические поля, чтобы их свойство Visible было FALSE. Вы также должны использовать соглашение об именах для этих элементов управления. В приведенном ниже коде я использовал txtNN, где NN - числовой индекс в коллекции полей, отформатированный как 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 заголовка группы отчетов. Если у вас нет группировки, вы можете добавить ту, которая ничего не делает. В случае моей кросс-таблицы двухуровневая сортировка по Lastname и Firstname и заголовок в группе Firstname, в которой нет ничего, является хорошим местом для использования события OnFormat для изменения внешнего вида/компоновки элементов управления в вашем отчете.

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

+0

Спасибо за ответ. Хотя я предпочитал вариант №1, неспособность создавать страницы вручную заставила меня приблизиться к №2. Поскольку данные, отображаемые в отчете, не являются точно данными в записях, я использую метки и вручную настраиваю их заголовок через VBA и DAO. Кроме того, я использовал много Me.NextRecord = False и Me.NextRecord = True, чтобы заполнить значения из DAO RecordSets, которые не входят в Report RecordSource (здесь много работы, я должен признать). Я думаю, однако, что я, вероятно, сделаю это :) Кроме того, большое спасибо за ссылку на документацию. –

+0

Мне кажется, что вам лучше делать это в HTML или автоматизировать Word. Отчеты о доступе не так хорошо работают с произвольным результатом - они построены на предположении, что поверхность отчета будет жестко привязана к записям за ней. –

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

  • Нет связанных вопросов^_^