Замена циркулярному письму

Автор dimmon777, 4 июля 2017, 17:59

0 Пользователи и 1 гость просматривают эту тему.

dimmon777

Добрый день!
(В учреждении около 20 рабочих мест, как не пытался внедрить циркулярное письмо, ничего к сожалению не получается.)
Есть Excel (.ods)- таблица, в которую заносятся данные по организациям (свыше 15 тысяч наименований), ИНН, ОГРН, наименование, телефоны, и т.д. По итогу, нужно составить договора во Writer (- .odt).
В общем, при работе макроса получается следующее: 1- поиск в таблице по ключу, 2-назначение переменных,  3. В шаблоне,  Writer - предварительно расставлены "закладки", т.е. небольшие фрагменты, которые входе выполнения макроса заменяются (функция найти-заменить) между собой. Так например, ФИО_Руководителя -> Иванов И.В.
Как-бы нужно реализовать 3й пункт, через текстовые поля, т.е. изменяю имя одного параметра текста - меняются все текстовые подобные поля. ???

mikekaganski

С уважением,
Михаил Каганский

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

Если я правильно понял "ТЗ", то нужен обработчик шаблона?
Делал я что-то подобное при помощи связки python + sqlite + jinja2
Морда лица была в odb
Создавался шаблон в odt с триггерами а-ля {{ИМЯ_КОНТОРЫ}}, которые потом на основе базы данных менялись на ООО "Рога и Копыта"

dimmon777

Цитата: maksvlad от  5 июля 2017, 15:38maksvlad
ТЗ, правильно поняли! НО, я ниразу не программист. Разобраться бы с Бейскик ОО сначала)))

maksvlad, Может быть будут рабочие примеры???

maksvlad

Я сам далек от программирования и 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  Спасибо!  :beer:,
Компьютера в учреждении закрыты,  даже флешку так просто не вставишь,  не говоря об установке всяких jinja и прочего  :'( Есть только Орен офис и все.  Так что вопрос актуальный

maksvlad

Если средствами ОпенОффис, Проще всего через поля слияния.
Сам пользу поля и связь с таблицами, условие и обработку данных (например формирование текста определенного содержания) можно делать в таблице (во всяком случае для меня так проще)
На форуме есть некто АКА "economist", из его постов следует, что он слияние пользует активно. Может быть согласится помочь :)
Кстати, в ЛО, если нажать на кнопку быстрой печати, то программа выведет запрос на использование данных по ссылкам в полях и выдаст таблицу с выбором вариантов. Это оказалось проще, чем циркулярное письмо (mail merge)

economist

Цитата: dimmon777 от  4 июля 2017, 19:04само циркулярное письмо пробовал - не годится. Так как наблюдаются сложности и "глюки". Во-первых, нужно настроить и обучить более 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

Цитата: economist от  6 июля 2017, 11:34
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

Цитата: dimmon777 от  6 июля 2017, 10:02Впринципе работа макроса устраивает. Но хотелось бы повторно этот макрос использовать,  так как поля уже поменяны,  а новые значения он не вставляет!
Повторно этот макрос использовать не надо. Для изменения содержимого существующего поля пользователя (с именем "Al" как в предыдущем примере или другим существующим) используйте:
Sub main
Dim oUserField
oUserField=ThisComponent.TextFieldMasters.getByName("com.sun.star.text.fieldmaster.User.Al")
oUserField.Content="Новый Content"
End Sub

economist

#14
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, её отчеты, и вот они: в любой момент готовые Протоколы профкома, Реестр на выдачу, Платежная ведомость. Красота...
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...