Гость
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Генерация документов но основе шаблонов / 11 сообщений из 11, страница 1 из 1
03.11.2006, 17:43
    #34105014
Nividimka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генерация документов но основе шаблонов
Hi, All!
Хотелось бы посоветоваться с обчеством.

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

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

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

С интересом прочитал про шаблоны на базе DW
/topic/141132&hl=

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


Слияние текста и шаблона на основе MailMerge - замечательная вещь, скорее всего, подойдёт (будем копать).
/topic/88015&hl=


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

/topic/121387&hl=


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

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

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

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

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

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

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

Если кто ходил по этим граблям, то посоветуйте, пожалуйста, проверенное решение.
...
Рейтинг: 0 / 0
03.11.2006, 23:02
    #34105371
alex108
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генерация документов но основе шаблонов
По этим граблям ходил лет пять назад. Было сделано простое и сердитое XML решение. На сервере хранимой процедурой формируется XML (можно сделать и на клиенте). Вид примерно такой

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
<?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 (примера пока нет, но если будет интересно сделаю).
...
Рейтинг: 0 / 0
07.11.2006, 14:11
    #34109122
Nividimka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генерация документов но основе шаблонов
От примера не откажусь. Шлите на адрес из профиля.
...
Рейтинг: 0 / 0
07.11.2006, 14:16
    #34109134
Nividimka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генерация документов но основе шаблонов
В догонку. Как я понял из описания, проблему прикреплённых списков это решение не охватывает, так?
...
Рейтинг: 0 / 0
07.11.2006, 14:41
    #34109213
alex108
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генерация документов но основе шаблонов
Проблему прикрепленных списков (так и быть!) сейчас решаю. Решение заброшу в эту тему.
...
Рейтинг: 0 / 0
08.11.2006, 12:06
    #34111609
alex108
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генерация документов но основе шаблонов
alex108Проблему прикрепленных списков (так и быть!) сейчас решаю. Решение заброшу в эту тему.

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

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

Удачи.
...
Рейтинг: 0 / 0
20.11.2006, 12:48
    #34140614
Локшин Марк
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генерация документов но основе шаблонов
Могу рассказать, как у нас реализована печать договоров.
1. Создаются файлы с запросами, вытягивающие данные по договорам. Например query1.sql, query2.sql,query3.sql
2. Создается HTML шаблон договора (хоть в notepad, хоть в MS Word - не важно).
Документ делится на секции, соответствующие запросам, секция повторяется столько раз, сколько строк в соответствующем запросе.
В качестве переменных в шаблон можно подставлять столбцы из данных запроса или любое другое выражение вычислимое через evaluate функцию DataWindow.
3. При создании документа парсится шаблон, находятся секции, на основе указанных запросов формируются DataStore и вычисляются значения переменных.
4. Все отображается в DHTML Edit Control
В результате получается что-то похожее на это (как выглялит в MS Word):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
\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{}
и запросы типа
Код: plaintext
1.
2.
3.
4.
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.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
19.05.2008, 12:29
    #35320309
Локшин Марк
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генерация документов но основе шаблонов
Выложил у себя на страничке визуальный редактор шаблонов документов . Все работает через DHTML Edit Control, так что можно посмотреть как с ним работать можно. Версия пока "сырая", но если задаться целью, то документ сделать можно .
...
Рейтинг: 0 / 0
19.05.2008, 12:40
    #35320353
quorus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генерация документов но основе шаблонов
А можно мне тоже на электронку рабочий пример скунуть очень уж понравилась мне тема!!! Плиззз!!!
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
25.06.2015, 12:54
    #38992505
_Drive_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генерация документов но основе шаблонов
Локшин Марк,

Большое спасибо за примеры работы с 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))
НЕТ таких методов!!!
Вопрос КАК УДАЛИТЬ элемент?

Заранее спасибо!
...
Рейтинг: 0 / 0
26.06.2015, 10:35
    #38993355
_Drive_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генерация документов но основе шаблонов
Всем привет,

Сам разобрался ...
надо вот так ...
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)
...
...
Рейтинг: 0 / 0
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Генерация документов но основе шаблонов / 11 сообщений из 11, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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