AXForum  
Zurück   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Kennwort vergessen?
Registrieren Forum Rules Hilfe Benutzerliste Heutige Beiträge Suchen

 
 
Themen-Optionen Thema durchsuchen Ansicht
Alt 01.03.2007, 11:02   #1  
Владимир Максимов ist offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1.726 / 1208 (44) ++++++++
Registriert seit: 13.01.2004
Blog-Einträge: 3
Ошибки Word 2003 при работе в терминальном режиме
AXAPTA 2.5 SP3 + Word 2003

Через ComWordDocument_RU открываю заренее созданный файл шаблона, наполняю имеющиеся в нем FormField и показываю результат пользователю.

Если работа происходит в обычном сетевом режиме, т.е. экземпляр Word создается на машине клиента, то все в порядке.

Но если приложение запускается через терминал, то непредсказуемым образом, на самых разных командах выскакивают совершенно "идиотские" сообщения об ошибках. Ну, например, на команде

m_comApplication.version()

Может выскочить "неверное число параметров"!

Самое неприятное в том, что возникает не какая-то одна фиксированная ошибка, а ошибки возникают именно случайным образом. На случайной команде. Соответственно, иногда документ формируется вполне успешно и без ошибок.

Полное ощущение, что иногда теряются или перепутываются адреса памяти. Как будто вместо ссылки на один объект по тому же адресу оказалась ссылка на другой объект. Хотя и в области памяти отведенной для Word

В чем может быть причина подобного поведения?

AXAPTA 2.5 SP3 + Word 2003
Alt 01.03.2007, 11:20   #2  
Logger ist offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
4.004 / 3299 (118) ++++++++++
Registriert seit: 12.10.2004
Ort: Москва
Blog-Einträge: 2
Может быть причина в версии операционной системы ?

На клиенте у вас наверняка win2000 или XP
А при работе в терминалке наверняка серверная ось а-ля Win2003.
Alt 01.03.2007, 11:36   #3  
Владимир Максимов ist offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1.726 / 1208 (44) ++++++++
Registriert seit: 13.01.2004
Blog-Einträge: 3
Да. Ну и что? Каким образом это может влиять?

Насколько я понимаю, при работе в терминальном режиме я полностью работаю в Win2003. Есть конфликт Office 2003 и Win2003?
Alt 01.03.2007, 14:41   #4  
KiselevSA ist offline
KiselevSA
Злыдни
Benutzerbild von KiselevSA
Злыдни
Лучший по профессии 2015
 
958 / 333 (13) ++++++
Registriert seit: 25.01.2002
Ort: Москва
Zitat:
Zitat von Владимир Максимов Beitrag anzeigen
Да. Ну и что? Каким образом это может влиять?

Насколько я понимаю, при работе в терминальном режиме я полностью работаю в Win2003. Есть конфликт Office 2003 и Win2003?
А установку оffice на TerminalServer проводили с учетом рекомендаций? Там специальный ключик есть и последовательность установки
__________________
люди...считают, что если техника не ломается, то ее не нужно ремонтировать. Инженеры считают, что если она не ломается, то нуждается в совершенствовании.
Alt 01.03.2007, 15:01   #5  
Владимир Максимов ist offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1.726 / 1208 (44) ++++++++
Registriert seit: 13.01.2004
Blog-Einträge: 3
И чем отличается установка на сервер от установки на обычный ПК? Какие специальные ключи и последовательность установки?
Alt 01.03.2007, 16:04   #6  
somebody ist offline
somebody
Участник
 
128 / 30 (2) +++
Registriert seit: 30.04.2003
Ort: Москва
Володя,
посмотри по ссылке http://support.microsoft.com/kb/828955/

Возможно, при установке Office было нарушено следующее:
Zitat:
По умолчанию некоторые компоненты имеют состояние Недоступно. Не меняйте состояние таких компонентов на Запускать с моего компьютера. Это может привести к возникновению неполадок в работе приложений Office, которые используют данные компоненты.
Внимание! По умолчанию некоторые компоненты имеют состояние Недоступно. Это необходимо для оптимизации работы в среде служб терминалов, включая устранение непредвиденных ошибок. Не изменяйте состояние таких компонентов на значение «Запускать с моего компьютера».
Надо снести и заново поставить Office. Или, как положено, поставить на другую терминалку, где нет Office.
Alt 01.03.2007, 16:16   #7  
somebody ist offline
somebody
Участник
 
128 / 30 (2) +++
Registriert seit: 30.04.2003
Ort: Москва
Да, забыл...
А сервиспак на офис установлен? Должен быть SP2. Сначала попробуй установить его.
Если уже установлен, то накати на новую установку офиса. Если будут проблемы, см. http://support.microsoft.com/kb/906323
Alt 01.03.2007, 16:50   #8  
Владимир Максимов ist offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1.726 / 1208 (44) ++++++++
Registriert seit: 13.01.2004
Blog-Einträge: 3
Дима, спасибо, попробуем переустановить Office. Хотя, конечно "найти другую терминалку, где нет Office" пока невозможно.

А SP2 уже накатили.
Alt 01.03.2007, 16:57   #9  
KiselevSA ist offline
KiselevSA
Злыдни
Benutzerbild von KiselevSA
Злыдни
Лучший по профессии 2015
 
958 / 333 (13) ++++++
Registriert seit: 25.01.2002
Ort: Москва
Zitat:
Zitat von Владимир Максимов Beitrag anzeigen
И чем отличается установка на сервер от установки на обычный ПК? Какие специальные ключи и последовательность установки?
Ключ относился к Office XP, это я промахнулся. Ссылку Вам кинули правильную.
Zitat:
Zitat von somebody Beitrag anzeigen
Володя,
посмотри по ссылке http://support.microsoft.com/kb/828955/

Возможно, при установке Office было нарушено следующее:

Надо снести и заново поставить Office. Или, как положено, поставить на другую терминалку, где нет Office.
В 2003 исправили "бяку" с установкой на терминал, где приходилось дополнительные шаманские действия делать.
__________________
люди...считают, что если техника не ломается, то ее не нужно ремонтировать. Инженеры считают, что если она не ломается, то нуждается в совершенствовании.
Alt 21.02.2008, 18:20   #10  
Владимир Максимов ist offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1.726 / 1208 (44) ++++++++
Registriert seit: 13.01.2004
Blog-Einträge: 3
Post
Если у кого-то возникнет похожая проблема, то решение найдено (не прошло и года ). Основные причины следующие:

1. При передаче значений, отличных от целочисленных, в методы объектов Word желательно оборачивать их в класс COMVariant(). Т.е. передавать в качестве параметра не строку, а объект.

Следует обратить внимание на методы создания нового документа на базе шаблона и работу с полями Word.

Например, создание документа на базе шаблона:

X++:
    COM         comDocuments;
    COMVariant  varTemlateName;
    ;

(...)

            if (_template)
            {
                varTemlateName = new COMVariant(COMVariantInOut::IN, COMVariantType::VT_BSTR);
                varTemlateName.bStr(_template);
                m_comDocument = comDocuments.Add(varTemlateName);
            }
            else
            {
                m_comDocument = comDocuments.Add();
            }

(...)

2. Следует избегать сложных "вложенных" функций с включением обращений к свойствам Com объектов.

Например, высока вероятность ошибки при использовании такого синтаксиса

X++:
if (str2num(m_comApplication.version()) >= 9)
Однако еще не было ошибок в таком синтаксисе

X++:
numVersion = str2num(m_comApplication.version());
if (numVersion >= 9)

Короче, на терминалке "халява" - не проходит. Необходимо более строго следить за синтаксисом.
This post has been rated by: russ (1), kashperuk (5), Logger (5), alex55 (1), plumbum (1).
Alt 21.02.2008, 18:28   #11  
kashperuk ist offline
kashperuk
Участник
Benutzerbild von kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4.361 / 2084 (78) +++++++++
Registriert seit: 30.05.2004
Ort: Atlanta, GA, USA
ага, получается, запустить и не дышать.
Но, спасибо за описание.
Alt 21.03.2011, 09:59   #12  
jkspb ist offline
jkspb
Участник
 
18 / 20 (1) +++
Registriert seit: 03.03.2009
Аналогичная проблема возникает и при создании отчетов в ексель.

По утверждению EMEA Dynamics AX Support, одной из причин может быть фишка операционки - ghost window.
Они предлагают следующие варианты решения проблем:
Zitat:
Workaround 1:
Disable Window Ghosting as described in this post.

Workaround 2:
Debug the X++ code down to the line that is causing the error. Once identified, insert one line before this statement a call to the yield method of the xInfo class.

Example:
infolog.yield();
namespace = outlook.getNamespace(#mapidef);

Workaround 3:
Debug the X++ code down to the line that is causing the error. Once identified, place the statement inside a try / catch block. In the catch block simply retry the operation.

Example:
int retryCount = 3;
//...
try
{
namespace = outlook.getNamespace(#mapidef);
}
catch(Exception::Error)
{
retryCount--;

if(retryCount > 0)
retry;
else
throw(Exception::Error);
}
В моем случае, при массовой печати в ексель, помогает только добавление команды
X++:
infolog.yield();
перед каждой командой обращения к COM объекту.

Geändert von jkspb (21.03.2011 um 10:05 Uhr)
Alt 27.09.2011, 10:41   #13  
spidolo ist offline
spidolo
Участник
 
1 / 10 (1) +
Registriert seit: 27.09.2011
Пробуй Microsoft Office 2003 Русская версия, там всё норм должно работать
Alt 01.11.2012, 06:36   #14  
Fizik ist offline
Fizik
Участник
 
26 / 10 (1) +
Registriert seit: 07.07.2005
Ort: Владивосток
Подниму старую тему
Волею судеб сейчас мы работаем на Axapta 3.0 SP4 Build #11.0
При том корпоративный MS Office уже 2007 SP1

При передаче данных в Excel стала все чаще появляться ошибка "неверное число параметров". Прочитала эту тему, но в том проблема, что у нас нет возможности воспользоваться добавлением команды infolog.yield(); для устранения проблемы. Такого метода на infolog у нас просто нет.
Есть ли смысл написать его самим? Кто может поделиться этим волшебным кодом?
Alt 01.11.2012, 11:09   #15  
Владимир Максимов ist offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1.726 / 1208 (44) ++++++++
Registriert seit: 13.01.2004
Blog-Einträge: 3
Перепешите метод класса ComOfficeDocument_RU.visible() следующим образом

X++:
// Show / hide application
public void visible(boolean _bVisible = true)
{
    ComVariant      comVariant;
    COMDispFunction funcDisp;
    ;

    if (!m_comApplication)
        throw error(StrFmt("@DIS100406", this.GetApplicationName()));

    this.activate(_bVisible); // Activate application, if necessary

    comVariant = ComVariant::createFromBoolean(_bVisible);
    // RTG, 05.08.2010, МВБ -->
    // По непонятным причинам в Excel 2007 следующая команда ИНОГДА приводит к ошибке
    // Метод был вызван с неверным числом параметров.
    // Чтобы ее обойти необходимо сделать присвоение свойству через COMDispFunction
//    m_comApplication.Visible(comVariant);

    funcDisp = new COMDispFunction(m_comApplication, "Visible", COMDispContext::PROPERTYPUT);
    funcDisp.call(comVariant);
    funcDisp.finalize();
    // RTG, 05.08.2010, МВБ <--

}
После этого сделайте инкрементную компиляцию класса ComOfficeDocument_RU
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
This post has been rated by: Antonuch (1).
Alt 30.06.2017, 04:46   #16  
Fizik ist offline
Fizik
Участник
 
26 / 10 (1) +
Registriert seit: 07.07.2005
Ort: Владивосток
Прошло время. Волею судеб сейчас мы все еще работаем на Axapta 3.0 SP4 Build #11.0
При том корпоративный MS Office уже 2013.
Ошибка работы с Excel снова появилась, причем метод visible() уже переделан.
Обращение к Excel происходит вот таким образом:

excel = new COMExcelDocument_RU();
excel.newFile(#ReportTemplatePath_FileServer + "ApplicationFSS.xltx", false);

excel.insertValue(bookmark, substr(_content, i, 1));

Подскажите, как все же еще можно переделать.
Alt 30.06.2017, 07:35   #17  
Fizik ist offline
Fizik
Участник
 
26 / 10 (1) +
Registriert seit: 07.07.2005
Ort: Владивосток
Zitat:
Zitat von Fizik Beitrag anzeigen
Прошло время. Волею судеб сейчас мы все еще работаем на Axapta 3.0 SP4 Build #11.0
При том корпоративный MS Office уже 2013.
Ошибка работы с Excel снова появилась, причем метод visible() уже переделан.
Обращение к Excel происходит вот таким образом:

excel = new COMExcelDocument_RU();
excel.newFile(#ReportTemplatePath_FileServer + "ApplicationFSS.xltx", false);

excel.insertValue(bookmark, substr(_content, i, 1));

Подскажите, как все же еще можно переделать.
Добавлю, что в классе ComExcelDocument_RU уже переделаны методы getWorkSheet и getWorkSheets, как указано на странице Как правильно обернуть в ComVariant метод getWorkSheets() класса ComExcelDocument_RU
Alt 03.07.2017, 13:42   #18  
dech ist offline
dech
Участник
Benutzerbild von dech
Самостоятельные клиенты AX
 
650 / 352 (13) ++++++
Registriert seit: 25.06.2009
Ort: Омск
Blog-Einträge: 3
Zitat:
Zitat von Fizik Beitrag anzeigen
Прошло время. Волею судеб сейчас мы все еще работаем на Axapta 3.0 SP4 Build #11.0
При том корпоративный MS Office уже 2013.
Ошибка работы с Excel снова появилась, причем метод visible() уже переделан.
Обращение к Excel происходит вот таким образом:

excel = new COMExcelDocument_RU();
excel.newFile(#ReportTemplatePath_FileServer + "ApplicationFSS.xltx", false);

excel.insertValue(bookmark, substr(_content, i, 1));

Подскажите, как все же еще можно переделать.
У нас зарубежный клиент, так что вместо COMExcelDocument_RU мы используем свои кастомные наработки. Офис 2013, Аксапта версии 4.0.
Вставить значение можно так:
X++:
public void insertValue(BookMark _bookMark, anyType _anyVal, int _workSheet = 1)
{
    COM comRange;
    ;

    this.checkExistDocument();

    comRange = this.findRange(_bookMark, _workSheet);

    this.insertValueInRange(comRange, _anyVal);
}
X++:
// Creates object range type named the same way as Excel bookmark
// bookMark -> Excel bookmark name
public COM findRange(PPO_MSOfficeBookMark bookMark, int _workSheet = 1) // was protected
{
    COM comRange,
        comWorkSheet;
    COM comApplication;
    ;

    if (m_comDocument)
    {
        comWorkSheet   = this.getWorkSheet(_workSheet);
        comApplication = m_comDocument.application();
        comWorkSheet.activate();

        if (comWorkSheet && comApplication)
        {
            comRange = comApplication.range(bookMark);
        }
    }
    return comRange;
}
X++:
// Exporting value in Range object
// comRange -> Range object
// anyVal -> Varible for export to Range object
protected void insertValueInRange(COM _comRange, anyType _anyVal)
{
    _comRange.value2(_anyVal);
}
Думаю, преобразовать код под свои нужды сможете без проблем.
__________________
// no comments
This post has been rated by: Logger (1).
Stichworte
документация, com-объект

 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Ошибки при работе Axapta fPtr DAX: Администрирование 1 23.08.2007 10:40
Ошибки при работе в трехзвенке tolstjak DAX: Администрирование 3 29.03.2007 12:01
[ANN] WordSL - использование Word 2003 в качестве визуального редактора xsl... belugin DAX: База знаний и проекты 0 26.09.2006 09:12
Вопрос по работе с таблицей в word Protey DAX: Программирование 2 24.08.2006 09:30
Как импортировать из Word chuf DAX: Программирование 4 21.06.2003 15:33

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Gehe zu

Рейтинг@Mail.ru
Alle Zeitangaben in WEZ +3. Es ist jetzt 02:33 Uhr.
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.