Печать копий документа с инкрементным счетчиком внутри

Автор Lesovik, 22 февраля 2020, 00:12

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

Lesovik

Привет всем.
Помогите решить задачу, пожалуйста.
Есть многостраничный документ (паспорт продукции) в формате *.doc (MS Ofiice 97-2003), в одной одном конкретном месте (страница/строка/сдвиг) которого необходимо указывать серийный номер (SN) продукции из заданного диапазона.
В качестве офисного пакета используется LibreOffice (Writer).
Нужно, чтобы при печати n-копий этого документа, в каждой его копии в конкретном месте печатался уникальный серийный номер, последовательно перебирая этот диапазон.
Соответственно, кол-во копий, отправляемых на печать совпадает с кол-вом серийных номеров и задается в диалоге печати принтера.
В идеале, диапазон серийных номеров нужно как-то/где-то задать - внутри этого документа (например, по клику на поле, в котором д.б. SN), или каком-то внешнем файле - например в *.txt или *.xls,
в формате, условно: 600000:600020, 600025, 600030:600100
- т.е. внутри диапазона (600000:600100) могут быть пропуски. Или просто диапазон, если первое сильно сложнее.
Или печатать n-копий начиная с заданного номера.
Подскажите, как прикрутить такой счетчик?
Есть ощущение, что это типовая задача и должно быть готовое решение. Но в меню (Поле/Переменные, Поле/Формула и т.д.) я ничего не нарыл (или не понял, как пользоваться), а с макросами я никогда не работал..
Или м.б. это проще делается каким-то другим инструментом?..

bigor

Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

economist

Про рассылку:  

1) создаете файл *.xls/*.ods "с номерами" в столбик (со 2-й строки, первая - заголовки), а в строке правее - связанные с ними даты, email покупателей, ФИО контролеров ОТК итп. Именуете полученный диапазон в левом верхнем углу Calc.

2) создаете и сохраняете Базу данных LO Base (*.odb) в режиме подключения к вашему *.xls/*.ods. Вы увидите в ней "таблицу" - тот сам диапазон

3) открываете ваш *.doc и жмете Ctrl+Shift+F4 - вверху экрана вы видите свою "таблицу" - тот сам диапазон. Теперь в перетаскиваете в документ заголовки столбцов "таблицы", они превращаются в серые <поля>. Выделив в таблице любую строку - можно нажать кнопку Данные в поля и увидеть готовый док.

4) вверху экрана появилась строка с кнопками той самой "Рассылки писем". Она перебирает ВСЮ таблицу и подставляет номера из таблицы - в документ DOC. Полученные "письма" можно автосохранить в один/несколько DOC/ODT/PDF-файлов, автоотправить их, каждому покупателю по email (если он был в xls)

5) текст DOC-шаблона может самопереверстываться, т.е. скрывать показывать слова, абзацы и разделы в зависимости от того, что написано в xls.

6) Рассылка работает по всей таблице, а если нужна не вся, а только с-по и по такой-то номенклатуре - то, о чудо, идете в ODB b пишете/конструируете SQL-запрос и далее пп 3-4.
 
Но если вам нужен просто "нумератор" печатных копий, то задача описана неполно, и непонятно почему могут быть пропуски - они исключают привязку к принтеру. Делать из принтера Журнал регистрации - очень плохая идея.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

Lesovik

#3
Bigor, economist - спасибо! )
economist - отдельное большое спасибо!, за детальное руководство.
Я к тому времени, спустя часа 4 экспериментов, уже добрался до вставки "серого поля", но посредством "Рассылки писем", без Ctrl+Shift+F4
И было не очевидно, что кроме таблицы нужна и база данных, через которую эта таблица подключается.
Да и вообще, что нужна обязательно таблица - стало очевидно не сразу.. )
И счетчик работать отказывался..
Твой пост помог снять ряд вопросов и понять общую структуру механизма.

Есть еще пару вопросов:

1. Можно ли в файле базы данных (ODB) подключить несколько таблиц?

Как бы формулировка "ТаблицЫ"  подразумевает, что там можно больше одной таблицы подключать, но как - я не понял.
Если только несколько файлов ODB добавлять, но это как-то не красиво..

2.
ЦитироватьВыделив в таблице любую строку - можно нажать кнопку Данные в поля и увидеть готовый док.
У меня эта кнопка не активируется. Есть ли идеи - почему?
---
ЦитироватьНо если вам нужен просто "нумератор" печатных копий, то задача описана неполно, и непонятно почему могут быть пропуски - они исключают привязку к принтеру. Делать из принтера Журнал регистрации - очень плохая идея.
Для решения этой задачи - этого достаточно, нужен просто нумератор.
Про пропуски - имелось ввиду, что пропуски не в таблице (не пустые ячейки), а в номерах, т.е.:
не обязательно подряд 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
а, например:  1, 2, 3, 5, 7, 8, 9, 10 (без 4 и 6)
Какие-то товары не проходят ОТК и возвращаются она производство, но к этому времени им уже присвоены серийные номера (зашиты в прошивку, приклеены наклейки).
На момент формулирования задачи я не отчетливо представлял, в каком типе файла и с каким форматированием будет указываться перечень номеров,  в моих фантазиях это могло, например, быть и в строку как в табличных формулах :
1:3, 5, 7:10

economist

1) Можно ли в файле базы данных (ODB) подключить несколько таблиц?
ODB, подключенный к одному ODS-файлу - покажет все таблицы в нем (все именованные диапазоны Calc и все листы).
ODB, подключенный к папке с TXT-файлами - покажет все таблицы из всех TXT-файлов.
Но по неск. таблицам нельзя сделать одно слияние. Но несколько таблиц можно объединить Запросом в одну таблицу, простым SQL-запросом и делать слияние уже по нему:
SELECT * FROM Table1
UNION ALL
SELECT * FROM Table2
Такой запрос можно превратить в Представление (View) - вирутальную таблицу, что м.б. удобнее.

2) Кнопка Данные в поля - д.б. доступна всегда, попробуйте все сохранить и вытащить поле в чистый DOC/ODT-файл. Был какой-то промежуточный релиз LO в котором кнопка не работала, но его быстро исправили. Обновите LO.

Кстати, оч. удобно иметь "план Б" в виде стабильного экз portable-LO с офсайта: https://www.libreoffice.org/download/portable-versions/  Он хорош тем что не требует прав админа, не мешает основному LO, не лезет в профиль пользователя, не ругается с системными папками где лютует UAC. Даже Java есть jPortable для такого LO (Java нужна для всяких интерактивных конструкторов таблиц/запросов итп).

3) с т. зр. целостности - номера нежелательно задавать через дефис, лучше пусть будет так: сколько строк - столько и сертификатов. Пропуски не имеют значения. Если будет строка без номера - при слиянии она выведется без номера.  
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

mikekaganski

Если в системе предусмотрено ведение базы, в которой указывается серийник, дата и состояние (скажем, "отбракован"), то можно просто использовать в рассылке фильтр (типа "дата после [предыдущей даты рассылки] и не отбракован").
С уважением,
Михаил Каганский

Lesovik

economist, эм, у меня "таблица" - синоним файлу.. Каюсь )
Поэтому переспрошу -
1. а можно ли к одному ODB подключить более одного ODS/XLS файла?
2.
ЦитироватьODB, подключенный к папке с TXT-файлами - покажет все таблицы из всех TXT-файлов.
Т.е. TXT-файл таки можно к ODB подключать? С каким синтаксисом? Серийники в столбец?
ODB как-то же должен догадываться, как интерпретировать *.txt-файл, в смысле признака последовательного перечисления или указания диапазона?
Версия LO распоследняя, скачивал и устанавливал с оф.сайта позавчера.. Еще поэкспериментирую, в т.ч. с portable-версией, да..
От SQL я сейчас очень далёк, но концептуально, кажется, понимаю, о чём Вы. Будет потребность - буду курить, всему свое время )

mikekaganski, серийники ведутся в 1С. Сейчас идея не актуальна, но м.б. и пригодится когда-нить, спасибо )

mikekaganski

Цитата: mikekaganski от 24 февраля 2020, 14:58mikekaganski, серийники ведутся в 1С. Сейчас идея не актуальна, но м.б. и пригодится когда-нить, спасибо )

1С - это не проблема сама по себе. В 1С такие данные разве нельзя вести? И выгружать в CSV, подключаемый к ЛО.
С уважением,
Михаил Каганский

Lesovik

#8
mikekaganski.
в целом - так и планирую, да.
В реализацию будут заноситься серийники, путем считывания штрихкодов с наклеек на приборах.
Из реализации - выгружать в табличный файл. Оттуда копипастить в табличный файл, подключенный к ODB.
Хотя можно даже не выгружать, а копипастить из предпечатного предпросмотра 1С.
Почему не выгружать напрямую в файл, подключенный к ODB?
Потому что у шаблона выгрузки серийников сложная "шапка", и сейчас я не представляю, как настроить так, чтобы игнорировалось всё лишнее:

Т.е., видимо, как-то можно фильтрами настроить, но как именно - я сейчас не представляю.. )

economist

К одному ODB несколько XLS/ODS - нельзя. А вот несколько TXT - в одном ODB увидеть можно (Соединиться - Текст - Путь - Выбор папки). Каждая строка в TXT становится строкой таблицы в ODB. Чтобы неск/ TXT соединить в одну вирт. таблицу для рассылки - см. ответ #4, правда там фигурируют конкретные имена таблиц (они же имена файлов). Если их очень много и они произвольные, скажем датавремя.txt - то можно написать простой BAT-файл для их объединения. Серийник может быть в любом столбце, и он м.б. единственным содержимым TXT-файла (хотя я писал про исполнителей итп полезную инфу).

1С 7/8 сохраняет все табличные документы в файл с разделителем полей/колонок -  {Tab} (табуляция), его и укажите в Мастере баз данных.

Но TXT-файлы в папке д.б. все с одинаковым разделителем и в одинаковой кодировке! Если они разные (например они из разных программ) - то или конвертировать, или использовать более мощный коннектор к TXT-файлам, который есть в любой Windows  - MS ISAM/JET/ADO (прямой и через ODBC). Он позволяет задать произвольную спецификацию каждого TXT-файла в файле schema.ini, записывать данные в файлы и многое другое. Похожие возможности есть еще в 2-х способах (HSQLDB, FireBird), но они посложнее.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

economist

Цитата: Lesovik от 24 февраля 2020, 17:29у шаблона выгрузки серийников сложная "шапка", и сейчас я не представляю, как настроить так, чтобы игнорировалось всё лишнее
- не парьтесь, пусть всё загружается с мусорными строками <Продавец>, <Покупатель> итп - их в рассылке можно игнорировать, если сделать Представление таблицы (однострочным SQL-запросом). 
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...