Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PowerBuilder Новый топик    Ответить
 Генерация документов но основе шаблонов  [new]
Nividimka
Member

Откуда:
Сообщений: 148
Hi, All!
Хотелось бы посоветоваться с обчеством.

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

Документ Word – овский (так нам проще).

Выбираем технологию, на которой лучше такую вещь реализовать.

С интересом прочитал про шаблоны на базе DW
https://www.sql.ru/forum/actualthread.aspx?bid=39&tid=141132&hl=

- не совсем то, это простой текст


Слияние текста и шаблона на основе MailMerge - замечательная вещь, скорее всего, подойдёт (будем копать).
https://www.sql.ru/forum/actualthread.aspx?bid=39&tid=88015&hl=


Тема про закладки, одноимённые названиям параметрам полей в БД тоже кажется перспективной

https://www.sql.ru/forum/actualthread.aspx?bid=39&tid=121387&hl=


Предполагается, что будет таблица, с большим набором полей, где будут храниться договора.

Каждое поле соответствует одному из параметров подстановки в шаблон.
Ссылка на сам шаблон так же хранится в поле записи этой таблице.

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

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

Смущает вот чего.
В договорах есть приложения в виде списков (например, список доверенных лиц).
Ничего умнее, чем хранить в полях, ссылающихся на такие списки, ссылки на другие таблицы БД, где и будут храниться значения этих списков, на ум не приходит.

Не исследовалось ещё, пережуёт ли такую встроенную таблицу MailMerge.

Есть некоторые соображения в пользу xml, который допускает внутри себя такие вложенные таблицы, но это не более чем мысли вслух.

Если кто ходил по этим граблям, то посоветуйте, пожалуйста, проверенное решение.
3 ноя 06, 17:43    [3355504]     Ответить | Цитировать Сообщить модератору
 Re: Генерация документов но основе шаблонов  [new]
alex108
Member

Откуда:
Сообщений: 59
По этим граблям ходил лет пять назад. Было сделано простое и сердитое XML решение. На сервере хранимой процедурой формируется XML (можно сделать и на клиенте). Вид примерно такой

<?xml version="1.0" encoding="windows-1251"?>
<vars>
<var id="orgname">Рога и Копыта</var>
<var id="no">888</var>
<var id="date">24/06/2006</var>
<var id="time">12:45</var>
<var id="kto">Иванов Семен Михайлович</var>
<var id="osnovan">без основания</var>
<var id="sumapr">Двадцать четыре рубля 56 коп.</var>
<var id="db">10010000</var>
<var id="cr">60606060</var>
<var id="kodpodr">71</var>
<var id="summa">24,56</var>
</vars>

Эти данные должны быть заброшены в шаблон договора (здесь квитанции).
Каждая переменная в шаблоне описывается стандартной word-переменной, например так {DOCVARIABLE "Name" \* MERGEFORMAT}.
Все это сливается vbscript-ом, который парсит XML и забрасывает данные через CreateObject("Word.Application").

Думаю идея понятна.
Если нужен работающий пример, то могу сбросить на email.

По этому же принципу работает генерация отчетов для excel (примера пока нет, но если будет интересно сделаю).
3 ноя 06, 23:02    [3356240]     Ответить | Цитировать Сообщить модератору
 Re: Генерация документов но основе шаблонов  [new]
Nividimka
Member

Откуда:
Сообщений: 148
От примера не откажусь. Шлите на адрес из профиля.
7 ноя 06, 14:11    [3363141]     Ответить | Цитировать Сообщить модератору
 Re: Генерация документов но основе шаблонов  [new]
Nividimka
Member

Откуда:
Сообщений: 148
В догонку. Как я понял из описания, проблему прикреплённых списков это решение не охватывает, так?
7 ноя 06, 14:16    [3363167]     Ответить | Цитировать Сообщить модератору
 Re: Генерация документов но основе шаблонов  [new]
alex108
Member

Откуда:
Сообщений: 59
Проблему прикрепленных списков (так и быть!) сейчас решаю. Решение заброшу в эту тему.
7 ноя 06, 14:41    [3363301]     Ответить | Цитировать Сообщить модератору
 Re: Генерация документов но основе шаблонов  [new]
alex108
Member

Откуда:
Сообщений: 59
alex108
Проблему прикрепленных списков (так и быть!) сейчас решаю. Решение заброшу в эту тему.


Как и обещал, доделал таблицы. Правда, на скорую руку.
Это рабочий пример с заполнением таблиц.
http://xpro.t35.com/xml2table.rar
(если не получится скачать, пишите - сброшу на email)

Решение открытое, так что можете дополнять и развивать его в любую cторону.
Если будут интересные доработки этого подхода - не забудьте поделиться :)

Удачи.

Сообщение было отредактировано: 19 май 08, 15:02
8 ноя 06, 12:06    [3367622]     Ответить | Цитировать Сообщить модератору
 Re: Генерация документов но основе шаблонов  [new]
Локшин Марк
Member

Откуда: Воронеж
Сообщений: 3154
Могу рассказать, как у нас реализована печать договоров.
1. Создаются файлы с запросами, вытягивающие данные по договорам. Например query1.sql, query2.sql,query3.sql
2. Создается HTML шаблон договора (хоть в notepad, хоть в MS Word - не важно).
Документ делится на секции, соответствующие запросам, секция повторяется столько раз, сколько строк в соответствующем запросе.
В качестве переменных в шаблон можно подставлять столбцы из данных запроса или любое другое выражение вычислимое через evaluate функцию DataWindow.
3. При создании документа парсится шаблон, находятся секции, на основе указанных запросов формируются DataStore и вычисляются значения переменных.
4. Все отображается в DHTML Edit Control
В результате получается что-то похожее на это (как выглялит в MS Word):
\HTMLBandBegin{query1.sql}
Договор №\ExpR{DocNumber} от \ExpR{string(DocDate,"dd.mm.yyyy")}

Обязуемся поставить следующее количество продукции в срок до \ExpR{string(EndDate,"dd.mm.yyyy")}:
Наименование Количество
HTMLBandEnd{}
\HTMLBandBegin{query2.sql}
\ExpR{WareName},\ExpR{Quantity}
\HTMLBandEnd{}
\HTMLBandBegin{query3.sql}
Реквизиты сторон:
Покупатель Продавец
\ExpR{OrgName} \ExpR{OrgNameOur}
\HTMLBandEnd{}
и запросы типа
select DocDate,DocNumber,EndDate from contracts where cid = :id
select WareName,Quantity from contracts join contractitems 
                               on contracts.cid = contractitems.cid
                         where cid = :id
select OrgName,OrgNameOur from contracts where cid = :id
По удобству оформления шаблона - примерно тоже самое, зато на машине не нужен установленный Word, и документы можно посложнее генерировать и доступны все теже функции как и в DataWindow.
20 ноя 06, 12:48    [3423740]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Генерация документов но основе шаблонов  [new]
Локшин Марк
Member

Откуда: Воронеж
Сообщений: 3154
Выложил у себя на страничке визуальный редактор шаблонов документов . Все работает через DHTML Edit Control, так что можно посмотреть как с ним работать можно. Версия пока "сырая", но если задаться целью, то документ сделать можно .
19 май 08, 12:29    [5682032]     Ответить | Цитировать Сообщить модератору
 Re: Генерация документов но основе шаблонов  [new]
quorus
Member

Откуда:
Сообщений: 27
А можно мне тоже на электронку рабочий пример скунуть очень уж понравилась мне тема!!! Плиззз!!!
19 май 08, 12:40    [5682147]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Генерация документов но основе шаблонов  [new]
_Drive_
Member

Откуда: Москва
Сообщений: 170
Локшин Марк,

Большое спасибо за примеры работы с DHTML, хоть что то стало получаться, но
никак не могу справиться вот с такой задачей. Мне нужно в тексте (в HTML формате), хранящемся в БД определить некоторый текст как ссылку (HREF) и убрать ссылку если надо. С первой задачей я справился:
пользователь выделяет мышкой текст и жмет кнопку а там:
OLEObject Range,sel
Range = ole_1.HTMLEdit.object.DOM.body.createTextRange()
if Range.Text = "" then return
sel = ole_1.HTMLEdit.object.DOM.selection.createRange() // получили выделенный мышкой кусок
if ole_1.HTMLEdit.object.DOM.selection.type = "control" then return
.. далее формирую текст ссылки (тэга) по данным из БД, что-то вроде
<a data-title="%1" href="#" id="obj_%2" class="LinkToObject">' ... вместо %1 и %2 подставляю нужные мне данные и потом ...
string ls_new
ls_new = ls_tag_begin + sel.text + ls_tag_end
sel.PasteHTML(ls_new)
конечно по идее надо бы через DOM element create ... потом setattribute и т.д. но ... не знаю как

А вот как УДАЛИТЬ?
OLEObject rel
rel = ole_1.HTMLEdit.object.DOM.getElementsByTagName("A")
if rel.length > 0 then
int i
for i = 0 to rel.length - 1
string ls_id
ls_id = rel.item(i).getAttribute("id")
if PosA(ls_id, string(ССЫЛКА_НА_МОЙ_ОБЪЕКТ)) > 0 then -- УРА НАШЛИ!!!
пробовал - rel.parentNode.removeChild(rel.item(i));
и так пробовал- ole_1.HTMLEdit.object.DOM.documentElement.removeChild(rel.item(i))
НЕТ таких методов!!!
Вопрос КАК УДАЛИТЬ элемент?

Заранее спасибо!
25 июн 15, 12:54    [17815045]     Ответить | Цитировать Сообщить модератору
 Re: Генерация документов но основе шаблонов  [new]
_Drive_
Member

Откуда: Москва
Сообщений: 170
Всем привет,

Сам разобрался ...
надо вот так ...
col = ole_1.HTMLEdit.object.DOM.getElementsByTagName("A")

if col.length > 0 then
int i
for i = 0 to col.length - 1
string ls_id
ls_id = col.item(i).getAttribute("id")
if PosA(ls_id, string(il_rel_id)) > 0 then // ура нашли!!!
// если хотим удалить текст вместе со ссылкой то
col.item(i).removeNode(true)
// если хотим удалить только ссылку, а текст оставить то
col.item(i).removeNode(false)
...
26 июн 15, 10:35    [17818788]     Ответить | Цитировать Сообщить модератору
Все форумы / PowerBuilder Ответить