LEADERSOFT.ru Разработка на заказ программ и сайтов
ЕСЛИ БАЗА ВАМ НУЖНА В ЛИДЕРСОФТ ЗАЙДИ СПЕРВА!
Список всех статей ... Подписка на новости (рассылка через subscribe.ru)




































Выпуск 23. Динамические отчеты

Подписка: "Access 2000 - программирование и готовые решения"
Дата:         31.01.2001
Сайт:         http://www.leadersoft.ru
Слоган:     Если база Вам нужна, в LeaderSoft зайди сперва.
Комментарий: 
      Мы разрабатываем по заказам клиентов различные программы, используя Microsoft Access. Базы данных разрабатываются "с нуля" или, используя готовые решения (Склад, Касса, Банк и т.п.), что позволяет достаточно гибко решать финансовые вопросы по оплате услуг за разработку. Для регистрации заказа заполните форму: Регистрация заказа на разработку


Введение.
    В этом выпуске рассказывается о том, как создать динамический отчет, продолжаются уроки по Access, даются ответы на вопросы.

Новые версии бизнес программ
   "Книги бухгалтерии" 4.0 В коммерческую версию программы (по просьбе организаций, которые оказывают только услуги) добавлена форма для печати новых счетов-фактур.

Бесплатные коды для Access 2000:
    Добавлены новые программы в открытых кодах:
   • Файл la_automat.mdb. 3. Word. Создание документа по шаблону. 4. Word. Создание таблицы в документе.
   • На некоторые вопросы по рассылке уже давно даны ответы и опубликованы на сайте, но они не рассылались. Сейчас они переместились в разделы предыдущих рассылок. Посмотрите их, а именно: sub19.htm,sub20.htm,sub21.htm

Access 2000. Урок 5. Общая информация о запросах
    Запросы в Access - это временные таблицы (условное название), которые строятся на основе постоянных таблиц с использованием специального языка SQL[1]. Существует множество реализаций языка SQL, например, SQL-86, SQL-89, T-SQL (SQL Server). Мы будем изучать SQL Access c расширениями Jet 4 (ANSI стандарт).
    Запросы применяются в формах, отчетах или в промежуточных вычислениях, т.е. там, где нужен быстрый доступ к табличной информации. Ранее, когда не было SQL, все запросы строились достаточно сложным образом, т.е. открывалась таблица (файл), далее находились нужные записи, считывались в промежуточную таблицу, потом файл закрывался. Теперь для получения данных из таблицы достаточно написать строку: SELECT * FROM [Товары] WHERE [Номер документа]=10. Это означает, что нужно выбрать из таблицы "Товары" записи, где "Номер документа" = 10. Кроме выборки каких-либо значений из таблиц базы данных существуют также запросы: на создание, удаление, обновление, добавление, объединение записей, полей или таблиц. К сложным запросам можно отнести и перекрестный запрос.
    Запросы SQL упрощают написание программы, но они существенно замедляют быстродействие базы данных. Существует правило, что запросы желательно сохранять на диске в явном виде, чем строить из VBA, но это не всегда возможно. И так, если можно использовать вместо запроса таблицу, то лучше использовать ее.
    О том, как использовать запросы при разработке базы данных, будет рассказано в следующих уроках.
Словарь
   • [1] SQL - SEQUEL, Structured English Query Language. Язык запросов предложен научно - исследовательской лабораторией IBM в начале 70 годов.

Ответы на вопросы
     Вопросы Вы можете задавать по email: или опубликовать на сайте в разделе "Доска объявлений".
Общий вопрос Как создать динамический отчет?
Вопрос 26. Разрабатывая в Access'97 задачи по Учету банковских операций и по Учету контрольно - измерительных приборов (КИП) столкнулась с трудностью создания отчета (на основе перекрестного запроса) с динамически меняющейся шириной границы (в зависимости от данных, входящих в заданный пользователем период). Например, в моем отчете - "Журнал-ордер" количество корреспондирующих счетов (заголовки столбцов) в каждый период различно, а общее их кол-во велико их полное размещение в "шапке" отчета не целесообразно (60 с лишним колонок! по числу счетов). Пока что я поменяла местами заголовки столбцов и строк (соответственно - дни месяца и счета). Отчет стал компактнее, однако не всем моим пользователям удобен такой вариант. Очень нужно создать "плавающую границу" в отчете. Посоветуйте, пожалуйста, как это реализовать программно?
Вопрос 52. Подскажите, пожалуйста, ответ на давно мучающий меня вопрос. Как сделать чтобы заголовки столбцов (PIVOT) перекрестного запроса выбирались бы из формы пользователем, или бы из отдельной таблицы, в которую бы пользователь их заносил?
Вопрос 78 (20.11.2000). Необходимо получить файл отчета в формате Word. При транспортировке отчета пропадают все линии. Как быть?
Вопрос 85 (21.11.2000). Возможно ли отчет сделать так, чтобы не только строки были динамическими, но и столбцы? Не знаю понятно ли я задал вопрос. То есть я хочу, чтобы столбцы печатались только по удовлетворению запроса что - ли, как строки (в конструкторе - это из поля).
Вопрос 129(15.12.2000) Объясните,  пожалуйста,  как сохранить отчёт в виде вордовского файла, без потери рамочек в таблицах?
Вопрос 138(20.12.2000) Просто огромная просьба, пожалуйста, покажите эти три примера на моих отчетах (в файле сопровождения): - отчет "Заявка" я пытался отправить по факсу с ПК; там же я пытался добавить еще раз надпись при печати (она мне постоянно debug и желтым строчку в процедуре) - в отчете "Товар в пути" я пытался вот так реализовать столбцы "динамически", т. е. по топорному вручную их тусуешь, а хотелось бы чтобы они работали как строки; здесь же - (для ясности картины) на основании чего строится отчет (кстати эту программу я строил на основе общедоступной "Склад" в Access2000, оставил форму с подформой и другие, а также переделал тоже другие составляющие) - это несколько таблиц "Товары", "Типы", "Закупки" и "Сделки"(они заполняются из формы и подформы), "Неделя выхода контейнера" и другие мелкие. На основе таблиц сначала простой запрос на выборку, потом на основе этого запроса сделал перекрестный (чтобы поменять строки и столбцы, теперь строки - это контейнера, столбцы - наименования товаров), потом на основе перекрестного сделал простой и на его основе уже отчет "Товар в пути". Надеюсь не утомил!!!
Вопрос 169(09.01.2000) Если кто знает, как создать отчет на основе перекрестного запроса, помогите, пожалуйста!!
Вопрос 185(25.01.2000) Мне нужно формировать договора в Word, с использованием очень большого количества полей. При создании запроса некоторые срабатывают (в основном с физическими лицами), а как начинаются названия организаций выдает ошибку: \"Слишком большая длина записи\" как это обойти ? может можно делать слияние с двумя таблицами ?
Вопрос 187(25.01.2000) 1. Существует некая таблица(Access2000), в которой поле Test(тип- объект OLE) имеет значение "Документ Word" (вставлен документ
MsWord2000), как программно обратится к содержимому этого документа, чтобы присвоить переменной strTextLine последовательно содержимое каждой
строки документа. Что нужно изменить в следующем куске:
Dim xlApp As Object
Dim MyXL As Object
Dim rst As Recordset
Set db = CurrentDb()
Set rst = db.OpenRecordset("таблица1", dbOpenDynaset)
CC:
With rst
.Edit
strFile = !Test
.Update
.Bookmark = .LastModified
End With
Set xlApp = CreateObject("word.application")
'необходимо задать для свойства Visible
'значение True, чтобы приложение было видимым
xlApp.Visible = -1
'Использование xlApp для доступа к другим
'объектам Microsoft Word
Set MyXL = GetObject(strFile)
Open (strFile) For Input As #1
Do While Not EOF(1)
Line Input #1, strTextLine
L = Len(strTextLine)
   Ответ. Группа вопросов 26, 52, 78, 85, 129, 138, 169, 185, 187 имеют общую проблему. Пользователи пытаются создать сложные отчеты средствами Access или экспортируют отчеты в Word. Попробуем взглянуть на проблему по другому и введем новое понятие "динамический отчет". К таким отчетам будем относить отчеты: а) которые могут формироваться на основе перекрестных запросов б) у которых нет четкого названия и количества полей в) в которых после форматирования документа надо вносить изменения в строки и столбцы, изменять шрифт и формулы у ячеек таблицы, менять форму линий таблицы. Таким образом, к динамическим отчетам будем относить отчеты, которые можно полностью изменить, удалить или перестроить из программы VBA.
   К сожалению построить такие отчеты только средствами Access у Вас не получиться из-за ограничений в базе данных.  Но, если использовать Word, то Вы сможете создавать очень сложные документы. Алгоритм решения проблемы следующий:
   • создаем шаблон документа, т.е. файл с расширением *.dot (например, la_automat.dot)
   • устанавливаем в шаблоне нужные закладки, т.е. где будет находиться название фирмы, корсчет, банк и таблица.
   • далее создаем документ Word из шаблона:
      Set app = New Word.Application 'Новое приложение Word
      app.Visible = True 'Отображаем документ
      app.Documents.Add "c:\la_automat.dot" 'Добавляем шаблон
   • Находим закладку "Фирма" и вставляем текст из формы:
     app.ActiveDocument..Bookmarks.Item("Фирма").Range.Text = Me("Фирма")
   • Далее ищем закладку таблицы:
      Set rng = app.ActiveDocument.Bookmarks("Таблица").Range
   • Вставляем таблицу в Word из Access, используя запрос:
      rng.InsertDatabase Connection:="Query ЗапросПримера04", DataSource:="c:\la_automat.mdb"
   • Форматируем всю таблицу:
      tbl.Range.Font.Size = 10 ' Выбираем шрифт
      tbl.AutoFormat wdTableFormatGrid8 ' Выбираем авто-формат
   • Если нам надо добавить строку или колонку используем метод Add, Например,
     tbl.Columns.Add tbl.Columns(1) ' Добавляем колонку в начало таблицы
     tbl.Rows.Add ' Добавляем строку в конец таблицы
   • В последнюю ячейку вставляем формулу:
      tbl.Cell(tbl.Rows.Count, 1).Formula "=SUM(ABOVE)"
   • На последнем этапе сохраняем документ или посылаем его на печать или факс.
    Вообще можно форматировать таблицу как угодно. Для этого существуют зоны отбора, форматы строк, все просто перечислить невозможно. Для более детальной информации посмотрите лучше файл: la_automat.mdb с примерами 2-4 и справочную систему.
   Дополнительные ответы к вопросам.
   (78) При экспорте линии отчета сохранить нельзя.
   (85) Отчет с переменным количеством полей по горизонтали можно сформировать следующими способами: с помощью рисования полей (есть пример на сайте), созданием в конструкторе лишних (невидимых) полей, созданием отчета Crystal Reports непосредственно в среде Microsoft Access, используя Add-in компоненты.
   (138) Пример, как послать факс из Access через SendObject есть на сайте. Существует способы рассылки факса через dde интерфейс, через установку принтера по умолчанию с использованием api-интерфейса и другие.
Вопрос 162(09.01.2000) Как программно добраться до буфера обмена Windows? В VB Clipboard.Gettext и т. д. В Accese (2000) не работает.
  В данном случае у VB есть класс Clipboard, а в Access нет, поэтому его надо придумать. В файле la_api.mdb посмотрите пример 4, который показывает как создать класс для работы с текстовым буфером Windows. Пример использования класса указан ниже.
  Dim buffer As New TextClipboard
  buffer.CopyText Nz(Me.myText) ' Копирование в буфер
  Me.myBuffer = buffer.GetText() ' Восстановление из буфера
Вопрос 164(09.01.2000) Каким образом в Access 2000 заставить "Помощник" отображать сообщения msgbox также, как и в Access 97. Т.е. показывать сообщения в ballon, с параметрами заданными в msgbox и соответственно получать значения в зависимости от нажатия кнопок "Ok" и т.д. В общем, чтобы стандартное окно сообщения показывал Помощник . В 97 это элементарно, а в 2000?
  Ответ. Как использовать "Помощник" в базе данных рассказано в программе "Лекции по Access". Вот пример с вызовом стандартного сообщения msgbox
Set bln = .NewBalloon 'Создаем Помощник
With bln
. Heading = "Вопрос 158" 'Устанавливаем заголовок
. Labels(1).Text = "Пункт 1" 'Включаем меню 1
. Labels(2).Text = "Пункт 2" 'Включаем меню 2
 .BalloonType = msoBalloonTypeButtons 'Устанавливаем тип меню
. Button = msoButtonSetNone 'Отключаем клавиши помощника
 Select Case .Show 'Реакция на выбор меню
    Case 1: MsgBox("Пункт 1") 'Назначаем 1 сообщение
    Case 2: MsgBox("Пункт 2") 'Назначаем 2 сообщение
 End Select 'Конец вариантов
End With
Вопрос 166(09.01.2000) У меня такая проблема в Access2000. Я использую такой код:
Dim dbs As Database
Dim rs As Recordset
Set dbs = OpenDatabase("Рейтинг банков.mdb")
Set rs = dbs.OpenRecordset("ПоказателиБанков", dbOpenTable)
На последней строке выдаётся ошибка:
Run-time error '13':
Time mismatch
При этом, Microsoft 3.6 DAO Object Library подключена. Пробовал схожий код для базы "Борей". Всё работает.
   Ответ. Программа написана у Вас правильно, но если кроме DAO установлена библиотека ADO, то может быть ошибка, т.к. recordset есть и в DAO и ADO. Решение проблемы заключается в следующем: a) Отключите лишние ссылки b) DAO разместите вверху c) Укажите явно объекты, например, DAO.Recordset
Вопрос 174(09.01.2000) Не могу отфильтровать записи в одном combobox'е "КодЗН" относительно другого combobox'а "КодПротез". Когда открываешь "КодЗН" работает связь, а вот обратно никак. (Взят из файла mdb)
  Ответ. У Вас отраслевая база данных. Вникать в отраслевые задачи без техзадания очень сложно. Вообще на сайте есть примеры работы с combobox. Еще чем могу помочь Вам, так это тем, что могу связать Вас с главврачем медицинского учреждения. Я помогал им сделать небольшой проект. Но из переписки ясно, что у них есть разные Access базы данных по медицинской отрасли. Возможно они Вам помогут.
Вопрос 176(09.01.2000) Такая проблема: Хочу я, значит, проверить значение поля в форме на наличие в нем чего-то смыслового...
Например, таким-вот образом:
Dim tempVar As Variant
tempVar = Form_add.Controls.Item(i).Value
If tempVar = Null Then
...
End If
А оно не проверяется, блин!.. Сразу перескакивает на Энд Иф!.. Хотя при дебаге показывает что tempVar = Null и поле действительно пустое... Обидно... Помогите, пожалста...
   Ответ. Для проверки на нулевое значение существует оператор IsNull, можно использовать Nz, или изменить переменную через & "". Также применяют On Error resume Next c проверкой Err.Number для сложных случаев.