AXForum  
Вернуться   AXForum > Microsoft Dynamics NAV > NAV: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 28.12.2009, 09:36   #1  
urnadm is offline
urnadm
Участник
 
37 / 10 (1) +
Регистрация: 02.09.2009
Доброго дня суток, товарищи. Приспичило мне договор печатать из навижена (v3.60) и сразу возник вопрос: можно ли приспособить для этих целей имеющийся файл MS Word с договором, сделав там нужные поля (ФИО, адрес, дата и т.п.), в которые будут подставляться значения из навижена? Где-то есть пример?
Что-то подсказывает мне, что должно быть, потому что забивать страницы текст в отчёт (построчно лейблами что-ли) мучение невероятное
Старый 28.12.2009, 12:29   #2  
morvan is offline
morvan
Участник
 
41 / 10 (1) +
Регистрация: 29.08.2009
Адрес: Москва
Пример должен быть на форуме. можно в поле Blob хранить шаблон. Открываете шаблон, сливаете его во временный файл и реплэйсом меняете код метки на нужное значение в созданном файле. Я пользуюсь этим способом.
Старый 28.12.2009, 12:38   #3  
morvan is offline
morvan
Участник
 
41 / 10 (1) +
Регистрация: 29.08.2009
Адрес: Москва
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  
urnadm is offline
urnadm
Участник
 
37 / 10 (1) +
Регистрация: 02.09.2009
Это мне очень поможет, спасибо, ещё бы в идеале узнать определения Global/Local переменных используемых в данном примере, а то перебирать, например, Word Automation, в поиске нужного, утомительно. Но если нету под рукой, то подбирать буду
Старый 28.12.2009, 13:35   #5  
morvan is offline
morvan
Участник
 
41 / 10 (1) +
Регистрация: 29.08.2009
Адрес: Москва
Цитата:
Сообщение от urnadm Посмотреть сообщение
Это мне очень поможет, спасибо, ещё бы в идеале узнать определения Global/Local переменных используемых в данном примере, а то перебирать, например, Word Automation, в поиске нужного, утомительно. Но если нету под рукой, то подбирать буду
Пожалуйста
Вложения
Тип файла: xls Variables.xls (18.0 Кб, 130 просмотров)
Старый 28.12.2009, 17:58   #6  
Raul is offline
Raul
Участник
 
35 / 10 (1) +
Регистрация: 15.03.2006
Еще один вариант настроить в шаблоне договора слияние с текстовым файлом, и выгружать данные из нава в файл и потом выполнять слияние ActiveDocument.MailMerge.OpenDataSource Name:=FileName. Удобная штука, апробована на договорах и ценниках
Старый 22.06.2011, 13:14   #7  
Predatore is offline
Predatore
Участник
 
163 / 17 (1) ++
Регистрация: 29.09.2010
Искал пример использования Вордовских шаблонов и вот нашёл вроде. Не совсем понятно, где выбирается и сохраняется сам шаблон? Но да с этим разберусь как-нибудь, проблема в другом. При объявлении Automation 'Microsoft Word 12.0 Object Library'.Application
выдаёт ошибку: "Переменная WORDAPP::MAILMERGEDATASOURCEVA определена более одного раза. Например 'File' существует как тип данных и как глобальная переменная."
Что с этим делать?
Старый 22.06.2011, 17:23   #8  
Шрэк is offline
Шрэк
Участник
Аватар для Шрэк
 
645 / 24 (2) +++
Регистрация: 09.02.2004
Адрес: Москва
Цитата:
Сообщение от Predatore Посмотреть сообщение
Искал пример использования Вордовских шаблонов и вот нашёл вроде. Не совсем понятно, где выбирается и сохраняется сам шаблон? Но да с этим разберусь как-нибудь, проблема в другом. При объявлении Automation 'Microsoft Word 12.0 Object Library'.Application
выдаёт ошибку: "Переменная WORDAPP::MAILMERGEDATASOURCEVA определена более одного раза. Например 'File' существует как тип данных и как глобальная переменная."
Что с этим делать?
Выгрузить объект в txt и посмотреть поиском по названию переменной, правда-ли так. Лишнее в файле удалить и загрузить обратно.
Возможно, по каким-то причинам активировались триггеры Automation криво.
__________________
MBS Certified Master in Navision Developer
Старый 22.06.2011, 19:37   #9  
Thrice is offline
Thrice
Участник
Аватар для Thrice
 
46 / 10 (1) +
Регистрация: 09.07.2008
Цитата:
Сообщение от Predatore Посмотреть сообщение
Искал пример использования Вордовских шаблонов и вот нашёл вроде. Не совсем понятно, где выбирается и сохраняется сам шаблон? Но да с этим разберусь как-нибудь, проблема в другом. При объявлении Automation 'Microsoft Word 12.0 Object Library'.Application
выдаёт ошибку: "Переменная WORDAPP::MAILMERGEDATASOURCEVA определена более одного раза. Например 'File' существует как тип данных и как глобальная переменная."
Что с этим делать?
была подобная бага при компиляции любых объектов Automation на 2010 офисе, приходилось создавать отчет/кодеюнит, добавлять нужные Automation и т.д... на компьютерах с Office 2003, потом переходил на свой компьютер и продолжал уже там
Старый 23.06.2011, 10:48   #10  
Predatore is offline
Predatore
Участник
 
163 / 17 (1) ++
Регистрация: 29.09.2010
Цитата:
Сообщение от Thrice Посмотреть сообщение
была подобная бага при компиляции любых объектов Automation на 2010 офисе, приходилось создавать отчет/кодеюнит, добавлять нужные Automation и т.д... на компьютерах с Office 2003, потом переходил на свой компьютер и продолжал уже там
Спасибо большое! Установка Офиса 2003 решила эту проблему.
Старый 23.06.2011, 16:29   #11  
Predatore is offline
Predatore
Участник
 
163 / 17 (1) ++
Регистрация: 29.09.2010
Уже почти всё сделал, осталось дело за малым. Подставлять в метки свои значения. Вот тут то у меня и случился затык. Вставляю в Ворде поле с типом DocVariable, даю этому полю имя Name, и как выше описанно пытаюсь его заменить. На выходе ничего не происходит Далее, создаю другое поле, с типом Formula, в нём пишу =Name. На выходе сначала идёт ругатьня: "!Неопределенная закладка", а следом идёт то, что я хочу подставить вместо Name.

Вроде как должно всё делаться через DocVariable, но почему-то не делается С формулой я пробовал для того что бы убедиться, что замена всё-таки работает.

Что я делаю не так?
Старый 23.06.2011, 17:53   #12  
Thrice is offline
Thrice
Участник
Аватар для Thrice
 
46 / 10 (1) +
Регистрация: 09.07.2008
Цитата:
Сообщение от Predatore Посмотреть сообщение
Уже почти всё сделал, осталось дело за малым. Подставлять в метки свои значения. Вот тут то у меня и случился затык. Вставляю в Ворде поле с типом DocVariable, даю этому полю имя Name, и как выше описанно пытаюсь его заменить. На выходе ничего не происходит Далее, создаю другое поле, с типом Formula, в нём пишу =Name. На выходе сначала идёт ругатьня: "!Неопределенная закладка", а следом идёт то, что я хочу подставить вместо Name.

Вроде как должно всё делаться через DocVariable, но почему-то не делается С формулой я пробовал для того что бы убедиться, что замена всё-таки работает.

Что я делаю не так?
прошу прощения, немного не понял про "Вставляю в Ворде поле с типом DocVariable, даю этому полю имя Name"

когда я делал выгрузку в 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  
Predatore is offline
Predatore
Участник
 
163 / 17 (1) ++
Регистрация: 29.09.2010
Цитата:
Сообщение от Thrice Посмотреть сообщение
Цитата:
Сообщение от Predatore Посмотреть сообщение
Уже почти всё сделал, осталось дело за малым. Подставлять в метки свои значения. Вот тут то у меня и случился затык. Вставляю в Ворде поле с типом DocVariable, даю этому полю имя Name, и как выше описанно пытаюсь его заменить. На выходе ничего не происходит Далее, создаю другое поле, с типом Formula, в нём пишу =Name. На выходе сначала идёт ругатьня: "!Неопределенная закладка", а следом идёт то, что я хочу подставить вместо Name.

Вроде как должно всё делаться через DocVariable, но почему-то не делается С формулой я пробовал для того что бы убедиться, что замена всё-таки работает.

Что я делаю не так?
прошу прощения, немного не понял про "Вставляю в Ворде поле с типом DocVariable, даю этому полю имя Name"

когда я делал выгрузку в Word, сделал следующее:
1)взял код из этой темы (агромный респект автору)
2)создал шаблон документа Word, в местах которые требуется заполнять из NAV вставил текст для замены. К примеру
Договор компании #CompanyInfo# с #CustomerName#
3)в NAV создал текстовые переменные CompanyInfo = '#CompanyInfo#', CustomerName = '#CustomerName#'
4)вызвал функцию DocReplace(CompanyInfo,CompInfo.Name); DocReplace(CustomerName, Customer.Name);

как то так, пишу по памяти, в данный момент далеко от работы. почему делал еще дополнительное присваивание текстовым переменным, уже не помню, вроде без этого не отрабатывало. Но данный вариант работает на практике, жаль что он не сыскал в компании популярности
Я кажется понял в чём засада. В способе замены Дело в том, что раньше я уже делал подобное и сейчас, пытаясь делать по этому примеру, невольно наложил на это решение свои воспоминания. А там использовались переменные в Вордовском документе, те самые DocVariables, способ, между прочим, более надёжный. И естественно подстановка в эти переменные делается по другому, нежели в примере выше. Я уже достал пример работы через переменные, но он у меня в fob-ке, так что выложить тот способ смогу только завтра.
Старый 24.06.2011, 12:21   #14  
Predatore is offline
Predatore
Участник
 
163 / 17 (1) ++
Регистрация: 29.09.2010
Как и обещал, другое решение, через переменные. В нём нам понадобится ещё один 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  
Predatore is offline
Predatore
Участник
 
163 / 17 (1) ++
Регистрация: 29.09.2010
Возник ещё один вопрос по работе с Вордом. Если у меня в шаблоне есть табличная часть и естесственно зранее не извсетно, сколько будет строк в таблице. Как в таком случае быть? Как работать с табличной частью в Ворде?
Старый 28.06.2011, 15:05   #16  
Шрэк is offline
Шрэк
Участник
Аватар для Шрэк
 
645 / 24 (2) +++
Регистрация: 09.02.2004
Адрес: Москва
Через переменную '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  
Predatore is offline
Predatore
Участник
 
163 / 17 (1) ++
Регистрация: 29.09.2010
Цитата:
Через переменную 'Microsoft Word 12.0 Object Library'.Selection.

Например:
wdSelection := wdApp.Selection;

wdSelection.GoTo(...,...,...) Переход к таблице
wdSelection.MoveDown(...) Перемещение вниз по строкам
wdSelection.InsertRowsBelow(...) Вставка строки в таблицу
wdSelection.MoveLeft(...) позиционирование на начало строки
wdSelection.TypeText(...) пишем текст
wdSelection.MoveRight(...) перемещаемся в следующую ячейку в строке

И т.д., и т.п.
Лучше еще посмотреть синтаксис хелпе к VB.
Спасибо! А в хелпе к VBA это будет? Если да, то как искать? Я что-то не соображу.
Старый 29.06.2011, 13:42   #18  
Шрэк is offline
Шрэк
Участник
Аватар для Шрэк
 
645 / 24 (2) +++
Регистрация: 09.02.2004
Адрес: Москва
Должно.
Метод selection.goto это аналог если я в ворде нажму cntr+F и в форме на закладке GOTO выберу таблица и введу номер 1. Можно повторить эти действия в ворде, записать макрос и посмотреть текст. (тоже и с остальными методами)

Главное потом правильно определить метод selection в НАВ, как я писал ранее:
wdSelection := wdApp.Selection
__________________
MBS Certified Master in Navision Developer
 


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 06:52.