28.12.2009, 09:36 | #1 |
Участник
|
Доброго дня суток, товарищи. Приспичило мне договор печатать из навижена (v3.60) и сразу возник вопрос: можно ли приспособить для этих целей имеющийся файл MS Word с договором, сделав там нужные поля (ФИО, адрес, дата и т.п.), в которые будут подставляться значения из навижена? Где-то есть пример?
Что-то подсказывает мне, что должно быть, потому что забивать страницы текст в отчёт (построчно лейблами что-ли) мучение невероятное |
|
28.12.2009, 12:29 | #2 |
Участник
|
Пример должен быть на форуме. можно в поле Blob хранить шаблон. Открываете шаблон, сливаете его во временный файл и реплэйсом меняете код метки на нужное значение в созданном файле. Я пользуюсь этим способом.
|
|
28.12.2009, 12:38 | #3 |
Участник
|
Wind.OPEN(Text50001);
Wind.UPDATE(1,text50002); GLSetup.GET; CompanyInfo.GET; IF NOT GLSetup.GET THEN ERROR(text50003); // saving template txtPath := ''; bExitFlag := FALSE; InitNo := 0; REPEAT txtPath := ENVIRON('TEMP')+'\AgentAct'+FORMAT(InitNo)+'.doc'; IF NOT FILE.EXISTS(txtPath) THEN bExitFlag := TRUE; InitNo+=1; UNTIL bExitFlag=TRUE; GLSetup.CALCFIELDS("Agent Act Template"); GLSetup."Agent Act Template".EXPORT(txtPath); // ==================================================================================================================== // INITIALIZING WORD // ==================================================================================================================== CREATE(wordApp,TRUE); wordApp.Documents.Open(txtPath); wordDoc := wordApp.ActiveDocument; wordDoc.ActiveWindow.Caption := CaptionName; //wordApp.Visible := TRUE; // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! // НЕПОСРЕДСТВЕННОЕ ЗАПОЛНЕНИЕ DocReplace('#CompanyName#',CompanyInfo.Name); DocReplace('#CompanyINN#',CompanyInfo."VAT Registration No."); DocReplace('#CompanyKPP#',CompanyInfo."KPP Code"); txt := StdRepMgt.GetLegalAddress(); DocReplace('#CompanyAddress#',txt); DocReplace('#CompanyFullName#',CompanyInfo."FUll Name"); DocReplace('#CompanyCEOShort#',CompanyInfo."Director Name"); Agreement.GET(AgrCode); txt := '№ '+FORMAT(AgrCode); IF Agreement."Starting Date" <> 0D THEN BEGIN MonthText := LOWERCASE(FORMAT(Agreement."Starting Date",0,'<Month Text>')); IF STRLEN(MonthText) > 1 THEN CASE COPYSTR(MonthText,STRLEN(MonthText),1) OF 'т': MonthText := MonthText + 'а'; 'ь','й': MonthText := COPYSTR(MonthText,1,STRLEN(MonthText) - 1) + 'я'; END; txt := txt + ' от '+ FORMAT(DATE2DMY(Agreement."Starting Date",1)) + ' '+MonthText + ' ' + FORMAT(DATE2DMY(Agreement."Starting Date",3))+'г.'; END; DocReplace('#Agreement#',txt); // on Post Report Wind.CLOSE(); wordApp.Visible := TRUE; CLEAR(wordApp); функция DocReplace(txtFrom: text 1024; txtTo: text 1024) var2 := FALSE; // for filling parameters var4 := 2; // means ReplaceAll - var1 := txtFrom; var3 := txtTo; // Replacement bol := wordApp.ActiveDocument.Content.Find.Execute(var1,var2,var2,var2,var2,var2,var2,var2,var2,var3,var4); |
|
28.12.2009, 13:22 | #4 |
Участник
|
Это мне очень поможет, спасибо, ещё бы в идеале узнать определения Global/Local переменных используемых в данном примере, а то перебирать, например, Word Automation, в поиске нужного, утомительно. Но если нету под рукой, то подбирать буду
|
|
28.12.2009, 13:35 | #5 |
Участник
|
Пожалуйста
|
|
28.12.2009, 17:58 | #6 |
Участник
|
Еще один вариант настроить в шаблоне договора слияние с текстовым файлом, и выгружать данные из нава в файл и потом выполнять слияние ActiveDocument.MailMerge.OpenDataSource Name:=FileName. Удобная штука, апробована на договорах и ценниках
|
|
22.06.2011, 13:14 | #7 |
Участник
|
Искал пример использования Вордовских шаблонов и вот нашёл вроде. Не совсем понятно, где выбирается и сохраняется сам шаблон? Но да с этим разберусь как-нибудь, проблема в другом. При объявлении Automation 'Microsoft Word 12.0 Object Library'.Application
выдаёт ошибку: "Переменная WORDAPP::MAILMERGEDATASOURCEVA определена более одного раза. Например 'File' существует как тип данных и как глобальная переменная." Что с этим делать? |
|
22.06.2011, 17:23 | #8 |
Участник
|
Цитата:
Сообщение от Predatore
Искал пример использования Вордовских шаблонов и вот нашёл вроде. Не совсем понятно, где выбирается и сохраняется сам шаблон? Но да с этим разберусь как-нибудь, проблема в другом. При объявлении Automation 'Microsoft Word 12.0 Object Library'.Application
выдаёт ошибку: "Переменная WORDAPP::MAILMERGEDATASOURCEVA определена более одного раза. Например 'File' существует как тип данных и как глобальная переменная." Что с этим делать? Возможно, по каким-то причинам активировались триггеры Automation криво.
__________________
MBS Certified Master in Navision Developer |
|
22.06.2011, 19:37 | #9 |
Участник
|
Цитата:
Сообщение от Predatore
Искал пример использования Вордовских шаблонов и вот нашёл вроде. Не совсем понятно, где выбирается и сохраняется сам шаблон? Но да с этим разберусь как-нибудь, проблема в другом. При объявлении Automation 'Microsoft Word 12.0 Object Library'.Application
выдаёт ошибку: "Переменная WORDAPP::MAILMERGEDATASOURCEVA определена более одного раза. Например 'File' существует как тип данных и как глобальная переменная." Что с этим делать? |
|
23.06.2011, 10:48 | #10 |
Участник
|
Спасибо большое! Установка Офиса 2003 решила эту проблему.
|
|
23.06.2011, 16:29 | #11 |
Участник
|
Уже почти всё сделал, осталось дело за малым. Подставлять в метки свои значения. Вот тут то у меня и случился затык. Вставляю в Ворде поле с типом DocVariable, даю этому полю имя Name, и как выше описанно пытаюсь его заменить. На выходе ничего не происходит Далее, создаю другое поле, с типом Formula, в нём пишу =Name. На выходе сначала идёт ругатьня: "!Неопределенная закладка", а следом идёт то, что я хочу подставить вместо Name.
Вроде как должно всё делаться через DocVariable, но почему-то не делается С формулой я пробовал для того что бы убедиться, что замена всё-таки работает. Что я делаю не так? |
|
23.06.2011, 17:53 | #12 |
Участник
|
Цитата:
Сообщение от Predatore
Уже почти всё сделал, осталось дело за малым. Подставлять в метки свои значения. Вот тут то у меня и случился затык. Вставляю в Ворде поле с типом DocVariable, даю этому полю имя Name, и как выше описанно пытаюсь его заменить. На выходе ничего не происходит Далее, создаю другое поле, с типом Formula, в нём пишу =Name. На выходе сначала идёт ругатьня: "!Неопределенная закладка", а следом идёт то, что я хочу подставить вместо Name.
Вроде как должно всё делаться через DocVariable, но почему-то не делается С формулой я пробовал для того что бы убедиться, что замена всё-таки работает. Что я делаю не так? когда я делал выгрузку в Word, сделал следующее: 1)взял код из этой темы (агромный респект автору) 2)создал шаблон документа Word, в местах которые требуется заполнять из NAV вставил текст для замены. К примеру Договор компании #CompanyInfo# с #CustomerName# 3)в NAV создал текстовые переменные CompanyInfo = '#CompanyInfo#', CustomerName = '#CustomerName#' 4)вызвал функцию DocReplace(CompanyInfo,CompInfo.Name); DocReplace(CustomerName, Customer.Name); как то так, пишу по памяти, в данный момент далеко от работы. почему делал еще дополнительное присваивание текстовым переменным, уже не помню, вроде без этого не отрабатывало. Но данный вариант работает на практике, жаль что он не сыскал в компании популярности |
|
23.06.2011, 22:35 | #13 |
Участник
|
Цитата:
Сообщение от Thrice
Цитата:
Сообщение от Predatore
Уже почти всё сделал, осталось дело за малым. Подставлять в метки свои значения. Вот тут то у меня и случился затык. Вставляю в Ворде поле с типом DocVariable, даю этому полю имя Name, и как выше описанно пытаюсь его заменить. На выходе ничего не происходит Далее, создаю другое поле, с типом Formula, в нём пишу =Name. На выходе сначала идёт ругатьня: "!Неопределенная закладка", а следом идёт то, что я хочу подставить вместо Name.
Вроде как должно всё делаться через DocVariable, но почему-то не делается С формулой я пробовал для того что бы убедиться, что замена всё-таки работает. Что я делаю не так? когда я делал выгрузку в Word, сделал следующее: 1)взял код из этой темы (агромный респект автору) 2)создал шаблон документа Word, в местах которые требуется заполнять из NAV вставил текст для замены. К примеру Договор компании #CompanyInfo# с #CustomerName# 3)в NAV создал текстовые переменные CompanyInfo = '#CompanyInfo#', CustomerName = '#CustomerName#' 4)вызвал функцию DocReplace(CompanyInfo,CompInfo.Name); DocReplace(CustomerName, Customer.Name); как то так, пишу по памяти, в данный момент далеко от работы. почему делал еще дополнительное присваивание текстовым переменным, уже не помню, вроде без этого не отрабатывало. Но данный вариант работает на практике, жаль что он не сыскал в компании популярности |
|
24.06.2011, 12:21 | #14 |
Участник
|
Как и обещал, другое решение, через переменные. В нём нам понадобится ещё один Automation
'Microsoft Word 11.0 Object Library'.Variable, назовём его WordVar. А функцию ReplaceText перепишем так: ReplaceText(Str : Text[1024];VName : Text[1024]) WordVar := WordDoc.Variables.Item(VName); IF Str <> '' THEN WordVar.Value := Str ELSE WordVar.Value := ' '; Всё, осталось только вставить в Ворде переменные в нужных местах. Делается так, Вставка->Поле, в Категории выбираем "Автоматизация", так быстрее искать, и выбираем DocVariable. Этой переменной даём имя, по которому мы будем к ней обращаться из Нава (VName). Вот и всё. Осталось только после того как будут заполнены все переменные, вызвать функцию WordDoc.Fields.Update; |
|
27.06.2011, 13:17 | #15 |
Участник
|
Возник ещё один вопрос по работе с Вордом. Если у меня в шаблоне есть табличная часть и естесственно зранее не извсетно, сколько будет строк в таблице. Как в таком случае быть? Как работать с табличной частью в Ворде?
|
|
28.06.2011, 15:05 | #16 |
Участник
|
Через переменную 'Microsoft Word 12.0 Object Library'.Selection.
Например: wdSelection := wdApp.Selection; wdSelection.GoTo(...,...,...) Переход к таблице wdSelection.MoveDown(...) Перемещение вниз по строкам wdSelection.InsertRowsBelow(...) Вставка строки в таблицу wdSelection.MoveLeft(...) позиционирование на начало строки wdSelection.TypeText(...) пишем текст wdSelection.MoveRight(...) перемещаемся в следующую ячейку в строке И т.д., и т.п. Лучше еще посмотреть синтаксис хелпе к VB.
__________________
MBS Certified Master in Navision Developer |
|
29.06.2011, 13:12 | #17 |
Участник
|
Цитата:
Через переменную 'Microsoft Word 12.0 Object Library'.Selection.
Например: wdSelection := wdApp.Selection; wdSelection.GoTo(...,...,...) Переход к таблице wdSelection.MoveDown(...) Перемещение вниз по строкам wdSelection.InsertRowsBelow(...) Вставка строки в таблицу wdSelection.MoveLeft(...) позиционирование на начало строки wdSelection.TypeText(...) пишем текст wdSelection.MoveRight(...) перемещаемся в следующую ячейку в строке И т.д., и т.п. Лучше еще посмотреть синтаксис хелпе к VB. |
|
29.06.2011, 13:42 | #18 |
Участник
|
Должно.
Метод selection.goto это аналог если я в ворде нажму cntr+F и в форме на закладке GOTO выберу таблица и введу номер 1. Можно повторить эти действия в ворде, записать макрос и посмотреть текст. (тоже и с остальными методами) Главное потом правильно определить метод selection в НАВ, как я писал ранее: wdSelection := wdApp.Selection
__________________
MBS Certified Master in Navision Developer |
|