powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Создание пользовательских печатных форм из Access в Word (готовый вариант)
25 сообщений из 27, страница 1 из 2
Создание пользовательских печатных форм из Access в Word (готовый вариант)
    #39750478
Swa111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Предлагаю на суд общественности почти готовое решение по созданию отчетов в формате RTF из Access с почти любой сложностью.
Способ формирования был взят от компонента для Delphi EkRtf .
Использование свободное при наличии в описании программы ссылки на данный топик.

Для создания отчета нужно придумать шаблон и сохранить его в формате RTF. В качестве управляющих полей используются поля (Что бы их увидеть alt+f9, что бы добавить ctrl+f9). Все управляющие команды имеют формат Функция(СписокПараметров).
Команды разделяются на две категории: управление ходом выполнения, управление данными

Управление ходом: Scan..EndScan Пара команд открывает данные и прокручивает блок для каждой строки
if..elif..else..endif - Стандартное ветвление

Для Вывода данных используется команда f(Поле)

В самом Access нужно заполнить таблицу t_rep - Объект отчета, содержит ссылку на шаблон и таблицу t_repQuery содержит запросы используемые командой Scan

Что бы распечатать отчет необходимо создать контекст
Код: vbnet
1.
2.
  Dim dic As New Scripting.Dictionary
  dic.CompareMode = TextCompare


инициализировать исходные данные
Код: vbnet
1.
2.
3.
4.
'Так сложно нужно только для форматера ;stdf:
  dic("Код.oper") = 1 'равно см таблицу t_operand
  dic("Код.value") = Me.Код.Value
  dic("Код.type") = "n" 'Тип параметра n-число, s-строка, d-Дата


а дальше запускаем формирование и чистим память
Код: vbnet
1.
2.
  PrintReport 1, dic' распечатать отчет с кодом 1 (таблица t_rep)
  Set dic = Nothing



более подробно как работают шаблоны см вложенную инструкцию.
...
Рейтинг: 0 / 0
Создание пользовательских печатных форм из Access в Word (готовый вариант)
    #39750630
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть несколько вопросов к автору.
Чем Ваше решение лучше использования обыкновенных закладок для вывода информации в Word? Там ведь тоже используется шаблон, в котором размещаются закладки (правда формата DOT), а потом на их место подставляется нужный текст. (пример la_automati с LeaderSoft.ru)

Я в своё время собирал разные примеры по работе с Word из Access - Несколько советов по созданию документов в Word из Access вот тут на них можно посмотреть.

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

Импорт в Word у Access организован из рук вон плохо. Ещё в Access XP/2003 для электронных документов я использовал формат PDF, который получал при помощи виртуального бесплатного принтера doPDF прямо из отчётов. Если же нужен был формат doc(rtf) то я полученные PDF документы обрабатывал программой SolidConverter. Получался довольно точный вид. Сейчас есть и другие программы для конвертации PDF в Word.

Пример прямого формирования документа Word из программы на Access
...
Рейтинг: 0 / 0
Создание пользовательских печатных форм из Access в Word (готовый вариант)
    #39750631
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Из-за ограничения сессии по времени пока возился с перерегистрацией пример отвалился. Прикрепляю повторно.
...
Рейтинг: 0 / 0
Создание пользовательских печатных форм из Access в Word (готовый вариант)
    #39750691
Swa111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Joss,

1) Чем лучше закладок

Если я правильно понял речь идет про механизм создания документов через рассылки?
Более гибкий механизм, возможно создавать иерархическую структуру документа (до 16 уровней вложенности запросов), использование условий позволяет включать или отключать части документа. Не нужно перескакивать между приложениями.

2) Шаблон vs программного метода

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

3) Access -> Pdf -> Word
Костыли они конечно везде, но как то слишком много действий для конечного пользователя, да и в результате структура документа может не много отличаться от исходно задуманной.

Я не претендую на единственный верный способ формирования, просто предлагаю вариант. Основная же идея данного поста протестировать механизм на большем полигоне, отловить ошибки которые не выявлены на моих частных примерах.
...
Рейтинг: 0 / 0
Создание пользовательских печатных форм из Access в Word (готовый вариант)
    #39750800
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор1) Чем лучше закладок

Если я правильно понял речь идет про механизм создания документов через рассылки?
... Нет. Здесь ни слова о рассылках. Прикладываю пример la_automat . Смотрите 3 пример Создание документа с использованием шаблона.
...
Рейтинг: 0 / 0
Создание пользовательских печатных форм из Access в Word (готовый вариант)
    #39750808
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор2) Шаблон vs программного метода

Минус программного метода: это необходимость программировать каждую часть документа.
Документ на базе шаблона если в нем не меняется запрос, может поправить и пользователь.
Документ на основе шаблона так же позволяет создавать более сложную структуру документа за более короткий срок, нежели полностью программным методом.
Если не нравится факт что вместе с БД нужно тащить шаблоны, то ни кто не мешает их хранить в самой БД.
Я не возражаю против использования шаблонов. Просто указал, что в некоторых случаях лучше использовать код. Кстати, я в некоторых программах , которые делаю для сторонних организаций храню шаблоны внутри программы. Причём предусмотрен механизм выгрузки и загрузки таких шаблонов в программу.

Пример.
Надо вывести в документ таблицу с переменным количеством строк (это чаще всего) или столбцов. Как Вы это сделаете при помощи шаблона? А кодом можно.
...
Рейтинг: 0 / 0
Создание пользовательских печатных форм из Access в Word (готовый вариант)
    #39750827
Swa111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Joss,

С столбцами согласен, предложенный вариант не справится, точнее не будет корректно построен.
а вот с строками, легко. Сразу видно Вы не пробовали запустить пример, лучше сразу запустите "Печать за период" указав период с 01.12.2018 по 31.12.2018.
...
Рейтинг: 0 / 0
Создание пользовательских печатных форм из Access в Word (готовый вариант)
    #39750861
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, согласен. Закладки с этим не справятся.
...
Рейтинг: 0 / 0
Создание пользовательских печатных форм из Access в Word (готовый вариант)
    #39750866
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Маленький совет. В описании стоит указать сильные стороны вашего способа, его отличие от других, в каких случаях его предпочтительно использовать.
...
Рейтинг: 0 / 0
Создание пользовательских печатных форм из Access в Word (готовый вариант)
    #39750867
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прочитав описание, я не увидел, чем Ваш способ лучше тех же закладок. А вот если бы Вы указали, что при вашем способе легко формируются списки и таблицы с произвольным количеством строк, то это наверняка бы многих заинтересовало.
...
Рейтинг: 0 / 0
Создание пользовательских печатных форм из Access в Word (готовый вариант)
    #39750874
Swa111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Joss,

Под фразой "с почти любой сложностью" это и понималось, да и не считал что формирование таблиц это какая то архисложная задача
...
Рейтинг: 0 / 0
Создание пользовательских печатных форм из Access в Word (готовый вариант)
    #39750895
alecko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
предложенный вариант не выполняет задачу, которая стоит перед программируемым шаблоном - изменение пользователем структуры документа (добавление новых данных, либо удаление их) - для того чтобы это сделать нужно лезть в базу.
вероятно каким-то промежуточным решением мог бы быть вывод полных данных, с названиями полей, их значениями и примером вызова этого поля (с учетом названия запроса) , также может быть функций с описанием, может ещё что - в эксель (ворд) (типа справки, просто чтоб знать как вызывать поле ИНН из базы например).
...
Рейтинг: 0 / 0
Создание пользовательских печатных форм из Access в Word (готовый вариант)
    #39751139
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Swa111 , если хотите, чтобы Ваша разработка не затерялась в глубинах форума, разместите её на сайте Андрея Митина - am.rusimport.ru Там, в левом меню есть кнопка "Добавить статью". Подготовьте, добавьте. После оценки, Андрей её сделает доступной для всех. Правила там очень демократичны.

Форум там практически не посещаем, зато есть много примеров и наработок.
...
Рейтинг: 0 / 0
Создание пользовательских печатных форм из Access в Word (готовый вариант)
    #39768948
Swa111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ПЕНСИОНЕРКА,
благодарю за внимание!

Исправлены некоторые ошибки, добавлены объявления переменным.

Теперь транслированный шаблон хранится в самой БД, (преобразование не обратимо).
Логика получения шаблона следующая:
Проверяется есть ли на диске файл с шаблоном (имя хранится в таблице t_rep)
Если время редактирования файла изменилось то запускается процесс трансляции во внутреннее представление
Если файл не существует или он не изменился то шаблон берется непосредственно из БД

Для переноса в свой проект необходимо:
перетащить объекты
t_rep

t_repQuery

Common

Filter

Report

Так же в референсах необходимо подключить

Microsoft Scripting Runtime

Microsoft VBScript Regular Expressions 5.5
...
Рейтинг: 0 / 0
Создание пользовательских печатных форм из Access в Word (готовый вариант)
    #39768967
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JossЧем Ваше решение лучше использования обыкновенных закладок для вывода информации в Word?

Закладки - это плохо.
Я ваще не понимаю упертых идиотов, использующий этот механизм.
Когда в Word уже 100 лет есть DocumentVariables.
...
Рейтинг: 0 / 0
Создание пользовательских печатных форм из Access в Word (готовый вариант)
    #39768973
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Swa111Исправлены некоторые ошибки, добавлены объявления переменным.

не всегда же количество платежей --четное
добавила 13-й платеж --в ВОРД он не попал
НеделяПлатежНеделяПлатеж110071202120812031209120412010120513011100613012100
...
Рейтинг: 0 / 0
Создание пользовательских печатных форм из Access в Word (готовый вариант)
    #39769039
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222JossЧем Ваше решение лучше использования обыкновенных закладок для вывода информации в Word?

Закладки - это плохо.
Я ваще не понимаю упертых идиотов, использующий этот механизм.
Когда в Word уже 100 лет есть DocumentVariables.
необязательно применять закладки --можно ЗАМЕНУ, некое слово в скобках, а в программе прописать

заменить "фио",cells(номер активной строки, некого столбца)

------------пример документа-----------

договор (номер) от (дата)
заключен между (клиент) (должность клиента) (фио) и фирмой РОГА И КОПЫТА в лице....


подписи
клиент
фирма (фирма)
должность (должность клиента)
фио (фио)
....
-----------------------------------------------
если имена замен будут соответствовать первой(второй) строке ексель -листа(или именам полей таблицы/запроса аксесс), то код модуля будет единый

для всех непустых столбцов
заменить "(" cells(1, некого столбца) & ")",cells(номер активной строки, некого столбца)

----
для более полного понимания хотелок надо конечно сначала смотреть
--пример типичной ексель/аксесс таблицы(данные можно условные)
--пару примеров ворд-шаблонов(чистый договор без таблицы, договор с таблицей)

таблицей считается только та, что показывает перечень услуг/работ
таблица для форматирования шапок/подписей --это не таблица, а просто очень удобный прием для форматирования ворд-документа
__________________
...
Рейтинг: 0 / 0
Создание пользовательских печатных форм из Access в Word (готовый вариант)
    #39769168
Swa111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Внесены изменения в поиск параметров:

Если параметр находится на форме, то теперь его можно не добавлять в контекст и использовать в запросе напрямую

Код: sql
1.
select * from Платежи where Код_контракта = %Forms!Контракты!Код_контракта%;



Или же непосредственно в шаблоне { f(Forms!Контракты!Дата_контракта) }

В результате код вызова будет таким

Код: vbnet
1.
2.
3.
  Dim dic As Scripting.Dictionary 'Словарь только объявляется, не создавая новый экземпляр
  PrintReport 1, dic 'Распечатать 1-й отчет
  Set dic = Nothing 'Но удалить его все равно надо
...
Рейтинг: 0 / 0
Создание пользовательских печатных форм из Access в Word (готовый вариант)
    #39821985
Swa111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В генератор добавлена возможность вывода картинок в документ RTF. Из настроек пока можно задать только высоту и ширину.

Новые функции:
Код: sql
1.
open(имя_файла;кодировка)

- открывает указанный файл. Если кодировка не указана, то файл открывается как бинарный и результат можно использовать для вставки изображения по имени файла. если имя файла начинается с ".\", то в начало подставляется имя папки, в которой размещена БД.

Код: sql
1.
rtfrimg(бинарный_файл; ширина; высота) 

- вставляет в документ изображение из бинарных данных, полученных напрямую из поля или с помощью команды open. Поддерживаются изображения только форматов jpeg, png, emf

Описание как создавать шаблон см. в предыдущем посте.

Для добавления в свой проект необходимо перетащить таблицы t_Rep, t_RepQuery и модули Common и Report. Так же в референсах нужно добавить:
Microsoft Scripting Runtime
Microsoft VBScript Regular Expressions 5.5
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Создание пользовательских печатных форм из Access в Word (готовый вариант)
    #39985175
Swa111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добавлена возможность работы с изображениями из поля с типом Attachments.
Например что бы вывести изображение из поля "Фото" нужно в шаблон добавить поле с содержанием
Код: vbnet
1.
f(rtfimg(attach(a.Фото); 60; 80))



где функции:
f - добавить значение в документ
rtfimg - Преобразовать бинарное поле в картинку RTF c максимальными размерами 60 на 80 мм
attach - Извлечь файл из поля с типом Attachment, Функция имеет второй параметр где указывается маска файла в формате RegExp . По умолчанию используется маска ".+\.(jpg|jpeg|png|emf)$". Если маске соответствует несколько файлов выбирается первый. На данный момент эта единственная функция, которая может работать с полями типа Attachments.

База что то разрослась поэтому изображение только у первого клиента.

Руководство по созданию шаблонов см. предыдущие посты.
...
Рейтинг: 0 / 0
Создание пользовательских печатных форм из Access в Word (готовый вариант)
    #39985205
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересно, посмотрим.
...
Рейтинг: 0 / 0
Создание пользовательских печатных форм из Access в Word (готовый вариант)
    #39987268
Swa111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не много переработал генератор.

Что нового:
  • Пересмотрена структура хранения отчетов. Теперь используется только одна таблица t_rep. Текст запросов перенесен в шаблон;
  • Все объекты переведены на позднее связывание, теперь не нужно ни чего добавлять в References;
  • Весь функционал теперь в виде одного файла. Для установки в проект импортируйте файл Report.bas. Запустите процедуру InstallRepSystem, что бы создать таблицу для хранения шаблонов. Запустите процедуру InstallReportTemplate что бы добавить шаблон в хранилище;
  • Изменен синтаксис команды scan. {Scan("Имя_Курсора" for "Текст запроса")}...{EndScan()}. В тексте по прежнему можно использовать подстановочные знаки %ххх%;
  • Убрано ограничение на 16 вложенных запросов;
  • Добавлена поддержка пользовательских функций при вычислении выражений;
  • Добавлена возможность использования шаблона без его установки. Для этого при вызове функции PrintReport в параметре vReport необходимо передать не код шаблона в таблице t_rep, а путь до файла шаблона. Данные метод не много медленнее, так как приходится каждый раз разбирать файл на части.
  • Добавлена конструкция {skip()}...{endskip()}, для того что бы можно было вырезать часть шаблона.
Установка.
Для установки в проект импортируйте файл Report.bas. Запустите процедуру InstallRepSystem, что бы создать таблицу для хранения шаблонов. Запустите процедуру InstallReportTemplate что бы добавить шаблон в хранилище;

Подготовленные шаблоны хранятся в таблице t_rep. Большинство полей заполняются процедурой InstallReportTemplate.
Наименование столбцаОписаниеsCaptionНазвание отчета. Может применяться в качестве параметра vReport функции PrintReport.sDescriptionБолее подробное описание отчета (опиши зачем отчет нужен)sOrignTemplateПуть до шаблона. При первом построении отчета шаблон переведется во внутреннюю форму и сохранится в clTemplate. В дальнейшем он будет обновляться если дата изменения файла будет больше чем в поле dEditTemplate. После сохранения шаблона внешний файл больше не нужен

Так же возможно построение отчета напрямую из файла шаблона, без сохранения в t_rep. Для этого при вызове функции PrintReport в параметре vReport необходимо передать не код шаблона в таблице t_rep, а путь до файла шаблона. Данные метод не много медленнее, так как приходится каждый раз разбирать файл на части.
Отчет готовится в текстовом процессоре MS Word, с включением управляющих инструкций-полей (добавляются сочетанием клавиш Ctrl + F9) и имеют формат <Команда>(<Аргумент>). Некоторые управляющие конструкции такие как IF, SCAN - парные и требуют соответствующих закрывающих команд.

Инструкции.

{Scan(Имя_курсора for Текст_запроса)} {EndScan()} – Открывает новый набор данных и подготавливает его. Если набор будет пуст то управление передается на позицию идущую за парной инструкцией EndScan(). Имя_курсора и Текст_запроса должны быть выражением или текстовым литералом заключенном в двойные кавычки. Имя курсора будет использовано как префикс к результатам полученным в ходе выборки.
Пример: {scan("a" for "select 1 as b from dual"} {f(a.b)} {endScan()}
Открывает курсор с именем а, считывает результаты запроса и укладывает результат в переменную с именем a.b

Дополнительно создаются переменные Имя_Курсора.EOF возвращающие True на последней строке запроса и Имя_Курсора.rownum содержащей номер текущей строки. После endScan() значения переменных не очищается и их можно использовать. Явного запрета на переиспользование имени курсора во вложенном цикле - нет, но вложенный цикл может затереть данные родительского цикла.
В тексте запроса можно обращаться к переменным окружения, для этого вставьте переменную обрамив ее символами %.
Пример: {scan("a" for "select * from MyTable where id = %id%"}
или пример с вложенными запросами {scan("Parent" for "select * from MyTable where id = %id%"}{scan("Child" for "select * from MyChildTable where idParent = %Parent.id%"}{endScan()}{endScan()}

для некоторых типов возможно указать формат: %Имя_переменной; Формат%
для создания критерия отбора необходимо использовать следующую подстановку %Имя_поля_Фильтра; stdf:Имя_поля% что означает примени параметр Имя_поля_Фильтра к полу Имя_поля. Для добавления параметра в окружение можно использовать функцию BuildParam совместно с GetFilter. См. примеры вызова ниже.

{If(<Выражение>)}… {elif (<Выражение>)}…{else()}…{endif()} обычный оператор условия.

{skip()} {endskip([skip_lf])} Вырезают из шаблона часть, если у endskip указан параметр skip_lf, то он заберет с собой перевод строки

{f(<Выражение>)} Выводит выражение в отчете

Выражения.

Для упрощения парсера в выражениях используются только функции. Все операции так же заменены на функции. Например если нужно вычислить выражение 2+3 то необходимо записать это следующим образом: plus(2;3). Параметры функций отделяются друг от друга символом ;.

Встроенные функции

ФункцияСинонимКол-во операндовРезультатОписаниеplus+2..16DoubleСкладывает все операндыminus-2DoubleВычитаниеmul*2..16DoubleУмножениеdiv/2DoubleДелениеIdiv\2LongЦелочисленное делениеmod2LongОстаток от деленияconcat2..16StringОбъединяет все операнды в одну строкуeq=2BooleanПроверка на равенство ls<2BooleanИстина если первое меньше второгоgr>2BooleanИстина если первое больше второгоle<=2BooleanИстина если первое не больше второгоge>=2BooleanИстина если первое не меньше второгоne<> или !=2BooleanИстина если первое не равно второмуor2..16BooleanИстина если хотя бы один истинныйand2..16BooleanИстина если все истинныxor2..16BooleanСумма по модулю 2 всех параметровnot1BooleanИстина если параметр ложьisnull1BooleanИстина если значение Null rel1Вычисляет строковое значение и возвращает значение переменной с таким именемiif3Если выражение1 истинно то возвращает выражение2 в противном случае Выражение3calc2Вычисляет оба параметра и присваивает переменной с именем первого параметра значение второго параметра и возвращается имя переменнойopenимя_файла;кодировкаоткрывает указанный файл. Если кодировка не указана то файл открывается как бинарный и результат можно использовать для вставки изображения по имени файла. если имя файла начинается с ".\" то в начало подставляется имя папки в которой размещена БД.rtfimgбинарный_файл; ширина; высотаStringвставляет в документ изображение из бинарных данных полученных напрямую из поля или с помощью команды open. Поддерживаются изображения только форматов jpeg png emfattachИмя_поля; МаскаИзвлекает файл из поля с типом Attachment Функция имеет второй параметр где указывается маска файла в формате RegExp. По умолчанию используется маска ".+\.(jpg|jpeg|png|emf)$". Если маске соответствует несколько файлов выбирается первый. На данный момент эта единственная функция которая может работать с полями типа Attachments.
Если Функция не будет найдена в предопределенном наборе, будет попытка вызвать пользовательскую.
Пользовательская функция имеет следующий интерфейс
Код: vbnet
1.
2.
3.
4.
Public function MyFnс(pParamList, aArg)
 'pParamList – Словарь с окружением, содержит все переменные и объекты текущего шаблона. Вызови pParamList("a.b") что бы получить значение поля b курсора a
 'aArg – массив с аргументами. за раз можно передать не более 16 параметров
End function



Пример запуска отчета

Все переменные хранятся в объекте типа Dictionary поэтому его необходимо создать, а после завершения операции уничтожить. Если объект не уничтожить то переменные созданные в первом отчете будут доступны и в последующих.

Код: vbnet
1.
2.
dim dic
Set dic = CreateObject("Scripting.Dictionary")



Альтернативный вариант создания окружения это через функцию BuildParam. Первым параметром необходимо указать переменную с контекстом или Nothing если нужно создать новый контекст, Дальше следует набор пар Имя_параметра, Значение. Количество не ограниченное.

Код: vbnet
1.
2.
dim dic
set dic = BuildParam(Nothing, "ID", 1, "Date", date() - 1)



Для создания критерия фильтра используйте функцию GetFilter. pParamName - Имя параметра. Префиксы параметров для getFilter жестко определяют, с какими типами данных работать: s – строки, n – число, d – дата. От них будет зависеть, как будет отформатирован запрос. pOperation - применяемая операция, перечень определен в перечислении tOperationType. Третьим и последующим параметром идут значения или 0 если критерий не применяется. Для многих операций должно быть только одно значение, для операций типа between - два значения, для операций типа in, not in может быть много значений. Множество значений можно передавать массивом
Критерии фильтра можно перемежать с обычными параметрами.

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
dim dic
'Рассмотрим на примере {scan("a" for "select * from MyTable where true %nF; stdf:id%%sF; stdf:sName%"}, буду выводить только значение после where
set dic = BuildParam(Nothing, GetFilter("nF", opEQ, 1)) ' true and id = 1
... GetFilter("nF", opGR, 1) ' true and id > 1
... GetFilter("nF", opBTW, 1, 10) ' true and id between 1 and 10
... GetFilter("nF", opIn, 1, 2, 3) ' true and id in (1,2,3)
... GetFilter("nF", opNIn, array(1, 2, 3)) ' true and not id in (1,2,3)
... GetFilter("sF", opCont, "abc") ' true and sName like '%abc%'
... GetFilter("sF", opNCont, "abc"),  GetFilter("nF", opGR, 10) ' true and id > 1 and not sName like '%abc%'



Запуск формирования отчета

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
  PrintReport 1, dic 'Запускает отчет с кодом 1
  Set dic = Nothing
...
  PrintReport "d:\RTFReport\Template.rtf", dic, "d:\Complete\Report.rtf"  'Запускает отчет из шаблона на диске, результат сохраняется так же на диске
  Set dic = Nothing
...
  PrintReport "Template", dic 'Запускает отчет с именем Template
  Set dic = Nothing
...
Рейтинг: 0 / 0
Создание пользовательских печатных форм из Access в Word (готовый вариант)
    #39987716
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Joss
Прочитав описание, я не увидел, чем Ваш способ лучше тех же закладок. А вот если бы Вы указали, что при вашем способе легко формируются списки и таблицы с произвольным количеством строк, то это наверняка бы многих заинтересовало.


Лучше закладок Word - DOCUMENTVARIABLES.

Это VBS, но переделать под VBA - нет проблем.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
' Изготовление документа Word по шаблону (универсальное) на основе переменных документа (DocVars)
' v3
On Error Resume Next

Set Args = Wscript.Arguments

ProcName  = Args(0) ' имя процедуры для получения данных
pr_key    = Args(1) ' параметр процедуры, идентифицирующий список данных (можно генерировать документы пачками)
NoProtect = Args(2) ' отключение установки защиты на файл "noprotect"
err.Clear
if ProcName = "" or pr_key = "" then 
   Log( "ProcName = '' or pr_key = '': " & CStr(Err.Number) & " " & Err.Description )
   Wscript.Quit -1
end if

'-- пароль защиты документа
wordProtectionPassword = "**********"

'-- сеть
Server  = "\\mtserver\"
Set objNetwork = CreateObject("WScript.Network")
Set colDrives = objNetwork.EnumNetworkDrives
For i = 0 to colDrives.Count - 1 Step 2
    dr = colDrives.Item(i)
    sh = colDrives.Item(i + 1)
    If left(sh, len(Server) ) = Server Then
       if dr = "" then dr = sh
       objNetwork.RemoveNetworkDrive dr, True, False
    End If
Next
ServerShare = Server + "web\Contract"
UserName = "*******l\contract"
Password = "*********"
err.Clear
objNetwork.MapNetworkDrive "", ServerShare, False, UserName, Password
if err.Number <> 0 then
  Log( " objNetwork.MapNetworkDrive: " & CStr(Err.Number) & " " & Err.Description )
  Wscript.Quit -1
end if

'--- соединение с базой ---
Set objAdoConn = CreateObject("ADODB.Connection")
If objAdoConn Is Nothing Then 
  LogFatal( " objAdoConn Is Nothing: " & CStr(Err.Number) & " " & Err.Description )
end if
objAdoConn.ConnectionString = "Provider=SQLOLEDB;Initial Catalog=AVALON2009;Data Source=HPSERVER\#######;integrated security=SSPI;"
objAdoConn.Open 
if objAdoConn.State <> 1 then 
  Log( " objAdoConn.State <> 1: " & CStr(Err.Number) & " " & Err.Description )
  Wscript.Quit -1
end if

'--- открываем рекордсет  ---
Set objAdoRs = objAdoConn.Execute("exec " + ProcName + " " + pr_key, RecordsAffected, 1)
If objAdoRs Is Nothing Then 
  Log( " objAdoConn Is Nothing: " & CStr(Err.Number) & " " & Err.Description )
  Wscript.Quit -1
end if
if objAdoRs.State <> 1 then 
  Log( " objAdoRs.State <> 1: " & CStr(Err.Number) & " " & Err.Description )
  Wscript.Quit -1
end if
if objAdoRs.EOF then
  Log( " objAdoRs.EOF: " & CStr(Err.Number) & " " & Err.Description )
  Wscript.Quit -1
end if

'--- файловая система ---
set objFileSys = CreateObject("Scripting.FileSystemObject")
If objFileSys Is Nothing Then 
  Log( " objFileSys Is Nothing: " & CStr(Err.Number) & " " & Err.Description )
  Wscript.Quit -1
end if

'--- открываем Word ---
Set objWDApp = CreateObject("Word.Application") 
If objWDApp Is Nothing Then 
  Log( " objWDApp Is Nothing: " & CStr(Err.Number) & " " & Err.Description )
  Wscript.Quit -1
end if
objWDApp.Visible = False
objWDApp.DisplayAlerts = 0
objWDApp.Options.CheckSpellingAsYouType = False
objWDApp.Options.CheckGrammarAsYouType = False
objWDApp.Options.SaveInterval = 0

while not objAdoRs.EOF 

  '--- имена файлов ---
  shablon  = ""
  filename = ""
  copyfilename = ""
  shablon  = objAdoRs.Fields("_Shablon").Value
  filename = objAdoRs.Fields("_PathFile").Value 
  copyfilename = objAdoRs.Fields("_CopyPathFile").Value
  copyfilefolder = objAdoRs.Fields("_CopyPathFileFolder").Value
  err.Clear

  If shablon  = "" or filename = "" Then 
    Log( " shablon  = '' or filename = '': " & CStr(Err.Number) & " " & Err.Description )
    objWDApp.Quit(0)
    Wscript.Quit -1
  end if

  '-- копируем шаблон
  if objFileSys.FileExists(shablon) then
     objFileSys.CopyFile shablon, filename, True
     if err.Number <> 0 then
       Log( " objFileSys.CopyFile shablon: [" & shablon & "], filename: [" & filename & "] err: " & CStr(Err.Number) & " " & Err.Description )
       objWDApp.Quit(0)
       Wscript.Quit -1
    end if
  else 
    Log( " objFileSys.FileExists(shablon): [" & shablon & "] err:" & CStr(Err.Number) & " " & Err.Description )
    objWDApp.Quit(0)
    Wscript.Quit -1
  end if

  '-- открываем копию
  Set objWDNewDoc = objWDApp.Documents.Open(filename) 
  If objWDNewDoc Is Nothing or err.Number <> 0 Then 
    Log( " objWDApp.Documents.Open(filename): " & CStr(Err.Number) & " " & Err.Description )
    objWDApp.Quit(0)
    Wscript.Quit -1
  end if

  '-- это позволяет непариться за защищенные шаблоны
  If objWDNewDoc.ProtectionType <> -1 Then 
   objWDNewDoc.Unprotect wordProtectionPassword 
  End If

  ' --- заполняем переменные документа ---
  e = err.Number
  for each r in objAdoRs.Fields

    if left(r.Name, 1) <> "_" then

       v = r.Value
       if v = "" then v = " "

       err.Clear
       objWDNewDoc.Variables(r.Name).Value = v
       if err.Number <> 0 then
         objWDNewDoc.Variables.Add r.Name, v 
       end if

    end if

  next 
  err.Number = e

  ' удаляем ненужные
  e = err.Number
  for each d in objWDNewDoc.Variables

       err.Clear
       v = objAdoRs.Fields(d.Name).Value
       if err.Number <> 0 or left(d.Name, 1) = "_" then
	 objWDNewDoc.Variables(d.Name).Delete 
       end if

  next
  err.Number = e

  ' --- обновляем поля
  for each sr in objWDNewDoc.StoryRanges
     sr.Fields.Update
     While Not (sr.NextStoryRange Is Nothing)
       Set sr = sr.NextStoryRange
       sr.Fields.Update
     Wend
  next
  if err.Number <> 0 then
     Log( " objWDNewDoc.Fields.Update: " & CStr(Err.Number) & " " & Err.Description )
     objWDApp.Quit(0)
     Wscript.Quit -1
  end if
  objWDNewDoc.ActiveWindow.View.ShowFieldCodes = False 

  ' --- блокируем документ 
  if NoProtect <> "noprotect" then 
    'objWDNewDoc.Protect 2, False, "VjhtNh'dtk123"
    objWDNewDoc.Protect 2, False, wordProtectionPassword
    if err.Number <> 0 then
       Log( " objWDNewDoc.Protect: " & CStr(Err.Number) & " " & Err.Description )
    end if
  end if

  objWDNewDoc.Close(-1)
  if err.Number <> 0 then
     Log( " objWDNewDoc.Close(-1): " & CStr(Err.Number) & " " & Err.Description )
     objWDApp.Quit(0)
     Wscript.Quit -1
  end if

  ' --- создаем папку, если запрошено
  if copyfilefolder <> "" and not (objFileSys Is Nothing) then 
     if Not objFileSys.FolderExists(copyfilefolder) Then objFileSys.CreateFolder copyfilefolder
     if err.Number <> 0 then
       Log( " objFileSys.CreateFolder copyfilefolder: [" & copyfilefolder & "] err: " & CStr(Err.Number) & " " & Err.Description )
     end if
  end if

  ' --- копируем документ, если копирование запрошено
  if copyfilename <> "" and not (objFileSys Is Nothing) then 
     if objFileSys.FileExists(filename) Then objFileSys.CopyFile filename, copyfilename, True
     if err.Number <> 0 then
       Log( " objFileSys.CopyFile filename: [" & filename & "], copyfilename: [" & copyfilename & "] err: " & CStr(Err.Number) & " " & Err.Description )
     end if
  end if

  objAdoRs.MoveNext

wend

'--- закрываем Word и коннекты ---
objWDApp.Quit(0)
objAdoRs.Close
objAdoConn.Close

Set objWDNewDoc = Nothing
Set objWDApp = Nothing
set objFileSys = Nothing
Set objAdoRs = Nothing 
Set objAdoConn = Nothing
Set objNetwork = Nothing

'--- записываем ошибку ---
If Err.Number <> 0 Then
  Log( "final Err: " & CStr(Err.Number) & " " & Err.Description )
End If

'===============================================================

Sub Log( str )

  Set objFSO = CreateObject("Scripting.FileSystemObject")
  Set objOutputFile = objFSO.OpenTextFile("MakeDoc_v3." + ProcName + "_" +  pr_key + ".log", 8, True)
  objOutputFile.WriteLine Date & " " & Time & "| " & str 
  objOutputFile.Close
  Set objFSO = Nothing
  Set objOutputFile = Nothing

End Sub
...
Рейтинг: 0 / 0
Создание пользовательских печатных форм из Access в Word (готовый вариант)
    #39987723
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может в силу своей тупости.может по какой другой причине, но я искренне не могу понять следующее:а занахрена заниматься экспортом,создавая в сторонней программе, такой же точно документ который можно без проблем (и громоздкого кода когда вполне достаточно OutputTo) создать и распечатать из ACCESS.Понимаю экспорт только в случае недостатка возможностей ACCESS(например форматирование внутри поля и т.п) растолкуйте, пожалуйста.
...
Рейтинг: 0 / 0
Создание пользовательских печатных форм из Access в Word (готовый вариант)
    #39987727
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вдогонку:
Может авторы подобных кодов просто не знают ВСЕХ возможностей ACCESS и не используют их(например подчиненный отчет с переменным количеством столбцов,"переворачивание" таблицы и пр.)
...
Рейтинг: 0 / 0
25 сообщений из 27, страница 1 из 2
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Создание пользовательских печатных форм из Access в Word (готовый вариант)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]