dimmon777
|
Добрый день! (В учреждении около 20 рабочих мест, как не пытался внедрить циркулярное письмо, ничего к сожалению не получается.) Есть Excel (.ods)- таблица, в которую заносятся данные по организациям (свыше 15 тысяч наименований), ИНН, ОГРН, наименование, телефоны, и т.д. По итогу, нужно составить договора во Writer (- .odt). В общем, при работе макроса получается следующее: 1- поиск в таблице по ключу, 2-назначение переменных, 3. В шаблоне, Writer - предварительно расставлены "закладки", т.е. небольшие фрагменты, которые входе выполнения макроса заменяются (функция найти-заменить) между собой. Так например, ФИО_Руководителя -> Иванов И.В. Как-бы нужно реализовать 3й пункт, через текстовые поля, т.е. изменяю имя одного параметра текста - меняются все текстовые подобные поля. 
|
|
|
Записан
|
|
|
|
|
dimmon777
|
Mail Merge?
само циркулярное письмо пробовал - не годится. Так как наблюдаются сложности и "глюки". Во-первых, нужно настроить и обучить более 20пользователей предпенсионного возраста. Во- вторых, база редактируется "на лету" (хранится на сервере), а в циркулярном письме обновляется через 20-40 минут (новые записи появляются через 20-40 минут)! Мне бы хотелось все же воспользоваться макросом, т.к. он гибче
|
|
|
Записан
|
|
|
|
dimmon777
|
Порылся на сайте, единственное, что нашел это sub insTF Rem Макрос написан Alexey7ov для 0xJah 25/12/13, Rem стр.: http://forumooo.ru/index.php/topic,3844.0.html dim i as integer dim tdoc as object dim usF as object dim txtF(1) as object dim tCursS as object dim tCursE as object dim tCurs as object tdoc=thiscomponent tCursS=tdoc.Text().getStart() tCursE=tdoc.Text().getEnd() usF=tdoc.createInstance("com.sun.star.text.fieldmaster.User") ' Создание в документе пользовательского поля usF.Name="Al": usF.Content="Alexey7ov" for i=0 to 1 txtF(i)=tdoc.createInstance("com.sun.star.text.textfield.User") txtF(i).attachTextFieldMaster(usF) ' Создаёт ссылку на главное поле tCurs=iif(i=0,tCursS,tCursE) tdoc.Text.insertTextContent(tCurs,txtF(i),0) next end sub , у Питоньяка примерно то же самое - создать текстовое поле. А мне нужно не создавая поля, измнеть usF.Content="Alexey7ov" на свой, так как поле уже будет создано 
|
|
|
Записан
|
|
|
|
maksvlad
Форумчанин
 
Offline
Пол: 
Расположение: Иркутск
Сообщений: 158
|
Если я правильно понял "ТЗ", то нужен обработчик шаблона? Делал я что-то подобное при помощи связки python + sqlite + jinja2 Морда лица была в odb Создавался шаблон в odt с триггерами а-ля {{ИМЯ_КОНТОРЫ}}, которые потом на основе базы данных менялись на ООО "Рога и Копыта"
|
|
|
Записан
|
|
|
|
dimmon777
|
maksvlad ТЗ, правильно поняли! НО, я ниразу не программист. Разобраться бы с Бейскик ОО сначала))) maksvlad, Может быть будут рабочие примеры???
|
|
|
Записан
|
|
|
|
maksvlad
Форумчанин
 
Offline
Пол: 
Расположение: Иркутск
Сообщений: 158
|
Я сам далек от программирования и IT (ни по образованию, ни по профессии ни разу не программист). Когда встал примерно такой вопрос как в топике, то бейсик оказался не сильно удобным инструментом, тем более, ограниченный ООо (LО) Решение нашел через использование внешней базы данных (sqlite в моем случае, может быть любая другая), движка шаблонов jinja2 для расстановки данных в шаблон xml и связывающего это все хозяйство скрипта на python, который обеспечивал запрос данных из БД, обработку результатов в нужном формате для шаблонизатора, манипуляцию с файлами и архивами Алгоритм работы примерно следующий: 1) В ЛО создается шаблон в виде файла в формате odt (odt-шаблон), в котором указываются соответствующие метки. 2) Из odt-шаблона создается копия, которая и будет в последующем фалом с результатом (odt-копия) 3) Их odt-шаблона извлекается context.xml, последний и используется как шаблон для Jinja2 4) На следующем этапе Jinja шинкует данные по шаблону в файл xml, который будучи поименованным context.xml помещается в odt-копию (файлы OOo LO - это zip-архивы) И мы имеем нужную нам версию документа
Для быстрой разработки "междумордия" (GUI) использовал BASE.
Поскольку делалось исключительно для себя, без цели распространения, то смысла выкладывать код не вижу, ибо комментарии там личные, а чистить (переписывать) мне их лень.
|
|
|
Записан
|
|
|
|
dimmon777
|
maksvlad Спасибо!  , Компьютера в учреждении закрыты, даже флешку так просто не вставишь, не говоря об установке всяких jinja и прочего  Есть только Орен офис и все. Так что вопрос актуальный
|
|
|
Записан
|
|
|
|
maksvlad
Форумчанин
 
Offline
Пол: 
Расположение: Иркутск
Сообщений: 158
|
Если средствами ОпенОффис, Проще всего через поля слияния. Сам пользу поля и связь с таблицами, условие и обработку данных (например формирование текста определенного содержания) можно делать в таблице (во всяком случае для меня так проще) На форуме есть некто АКА "economist", из его постов следует, что он слияние пользует активно. Может быть согласится помочь  Кстати, в ЛО, если нажать на кнопку быстрой печати, то программа выведет запрос на использование данных по ссылкам в полях и выдаст таблицу с выбором вариантов. Это оказалось проще, чем циркулярное письмо (mail merge)
|
|
|
Записан
|
|
|
|
economist
|
само циркулярное письмо пробовал - не годится. Так как наблюдаются сложности и "глюки". Во-первых, нужно настроить и обучить более 20пользователей предпенсионного возраста. Во- вторых, база редактируется "на лету" (хранится на сервере), а в циркулярном письме обновляется через 20-40 минут (новые записи появляются через 20-40 минут)! На самом деле Сервис - Рассылка писем - абсолютно годный, несложный для пенсионеров и неглючный вариант. Глюки связаны с тем, что механизм сталкивается с невалидным значением (вместо числа - текст) или со значением ошибки (например, в кач-ве БД используется Таблица (xls/ods), а в ячейке её - #N/A #Н/Д #ДЕЛ/0 итп. Поэтому: 1) выбор БД - в сторону SQLite - правильный. В неё все хранится как есть, то есть как текст. У меня база данных 200 Мб обновляется по сети каждые 3-10 минут, от разных клиентов, без сервера (файловый режим). 2) выбор БД в виде Эл. таблицы - требует внимания, и допустим на уровне маленького отдела, в одном кабинете 3) поля слияния во Writer - лучшее, что сделано в мире ПО. Они форматируются, переносятся, ищутся, проверяется орфография (здесь вру, но несильно). 4) механизм выборочного слияния, по Ctrl+Shift+F4 (или просто F4) - шедевр юзабельности. Научить жать Ctrl+F, находить нужную строку и жать кнопку Данные в поля - очень легко. PS А в чем были глюки и сложности? Если с данными - так их надо готовить... Поясните.
|
|
|
Записан
|
Руб. за сто, что Питоньяк Любит водку и коньяк! Потому что мне, без оных, - Не понять его никак...
|
|
|
maksvlad
Форумчанин
 
Offline
Пол: 
Расположение: Иркутск
Сообщений: 158
|
1) выбор БД - в сторону SQLite - правильный. В неё все хранится как есть, то есть как текст. У меня база данных 200 Мб обновляется по сети каждые 3-10 минут, от разных клиентов, без сервера (файловый режим).
Что значить обновляется по сети? У каждого клиента своя реплика? И как конфликты разрешаются?
|
|
|
Записан
|
|
|
|
dimmon777
|
maksvlad, как писал выше, циркулярное письмо не вариант. Есть 20 пользователей - предпенсионного возраста, работающие за копейки (т. е. учеба про всякие циркулярные письма им не интересна). Сделал макрос, в котором вводишь один из параметров - ИНН организации, открывается Шаблон в котором меняются поля на нужные (найти - заменить, писал выше). Впринципе работа макроса устраивает. Но хотелось бы повторно этот макрос использовать, так как поля уже поменяны, а новые значения он не вставляет!
|
|
|
Записан
|
|
|
|
economist
|
maksvlad - файл SQLite - базы один, лежит на сетевой шаре. Подключение - файловое, через сетевые диски или в манере \\fileserver\share\dbfile.sqlite или \\ip-address\share\dbfile.sqlite
Файл поддерживает 4 потока на чтение и 1 поток на запись, все что больше - уходит в регулируемый тайм-аут. У меня при ежечасных 20 чтениях от 20 пользователей - никто не жалуется, т.к. сама SQLite быстрая неимоверно. Таймауты на 10 секунд возникают единичные, в основном при записи кем-то. Саму базу читают до 100 человек, но отслеживать коннекты я после краштестов перестал, т.к. всё работает ровно. По скорости - равно MS Access 2003 при 5-10 юзверях.
Вся магия в "указателях" внутри файла БД, он не перезаписывается целиком никогда.
Конфликтов в SQLite не бывает, кто последний - тот и папа, ACID и Rollback - есть.
|
|
|
Записан
|
Руб. за сто, что Питоньяк Любит водку и коньяк! Потому что мне, без оных, - Не понять его никак...
|
|
|
rami
|
Впринципе работа макроса устраивает. Но хотелось бы повторно этот макрос использовать, так как поля уже поменяны, а новые значения он не вставляет! Повторно этот макрос использовать не надо. Для изменения содержимого существующего поля пользователя (с именем " Al" как в предыдущем примере или другим существующим) используйте: Sub main Dim oUserField oUserField=ThisComponent.TextFieldMasters.getByName("com.sun.star.text.fieldmaster.User.Al") oUserField.Content="Новый Content" End Sub
|
|
|
Записан
|
|
|
|
economist
|
dimmon777 - "циркулярка" нужна не всегда, поясню. Вот как работает у меня:
Для нескольких писем конкретным адресатам:
1) Пользователь запускает Writer и выбирает из шаблона, а чаще просто в пустом листе набирает 2-3 буквы - фб (фирменный бланк), пж (письмо-жалоба), пз (претензия по задолженности), дп (договор поставки) и жмет F3. Появляется готовый документ с "серыми" полями из БД. В письме-претензии - это порядка 10 полей, в договоре - 20.
2) Пользователь жмет Ctrl+Shift+F4 (открывается таблица СУБД - результат запроса, содержащая всё, что может понадобиться в жизни - адреса, фио и ДР рук-ей, номера доверенности, суммы задолженности, лимит её, среднемесячный оборот, количество просрочек, колонку прайса итп),
3) Пользователь жмет Ctrl+F вводит "хвост" ИНН (5-6 цифр) и Enter. Курсор находит нужную строку.
4) Пользователь жмет кнопку Данные - в поля. Всё, документ готов к печати
Для тысячи писем - всем из таблицы "Должники с просрочкой свыше 100000 и 3-х мес": ... 3) Сервис - Рассылка - Далее (4 раза). Всё, получен один 1000 страничный или 1000 одностраничных ODT/DOC/PDF-файлов, с помощью расширения MultiSave.
Обучаются этой системе за 2-3 часа. Макросов здесь нет, а если и есть - копеечные. Например тут, когда нужна "обратная связь" - файла ODT -> ODB -> ODBC -> SQLite -> ODB -> другой ODT. Скажем, у меня человек пишет заявление на матпомощь во Writer, тратит 1 минуту (там списки, чекбоксы, автодиагностика - положена она ему или нет) - данные из него сразу попадают в SQLite, её отчеты, и вот они: в любой момент готовые Протоколы профкома, Реестр на выдачу, Платежная ведомость. Красота...
|
|
« Последнее редактирование: 6 Июль 2017, 13:16 от economist »
|
Записан
|
Руб. за сто, что Питоньяк Любит водку и коньяк! Потому что мне, без оных, - Не понять его никак...
|
|
|
|