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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 17.06.2014, 10:49   #1  
Xardas is offline
Xardas
Участник
 
28 / 13 (1) ++
Регистрация: 19.09.2012
ComDispFunction
Приветствую, знатоки!

Axapta 3.0 CIS SP3 Build 9.2

На предприятии сложилась такая ситуация, что мы переходим на Linux. Наши администраторы запустили клиент Axapta под Linux, и сейчас возникла необходимость перевести отчетность из Microsoft Office в OpenOffice. С этой целью были модернизированы классы ComOfficeDocument_RU, ComExcelDocument_RU и ComWordDocument_RU. Код прилагается.
OpenOffice.xpo

Под управлением Windows все работает замечательно. Однако при запуске под Linux наблюдается странное поведение: возникает ощущение, что свойства, создаваемые в методе OOo_CreateProperties, не передаются OpenOffice Calc.
X++:
protected ComVariant OOo_CreateProperties(container _list)
{
    Array             array;
    Com               comPropertyValue;
    ComDispFunction   comDispFunction;
    ComVariant        comVariant;

    container         property;
    int               i;



    void insertIntoComVariant(anytype _value)
    {
        Array   arrayLocal;
        int     iLocal;
        ;

        switch (typeOf(_value))
        {
            case Types::String, Types::RString:
                comVariant.bStr(_value);
                break;
            case Types::Integer:
                comVariant.int(_value);
                break;
            case Types::Real:
                comVariant.decimal(_value);
                break;
            case Types::Date:
                comVariant.date(_value);
                break;
            case Types::Enum:
                if (M_Func::getEnumId(_value) == enumnum(boolean))
                    comVariant.boolean(_value);
                else
                    comVariant.bStr(strfmt("%1", _value));
                break;
            case Types::Container:
                arrayLocal = new Array(Types::Integer);
                for (iLocal = 1; iLocal <= conlen(_value); iLocal++)
                {
                    arrayLocal.value(iLocal, conpeek(_value, iLocal));
                }
                comVariant = ComVariant::createFromArray(arrayLocal);
                break;
        }
    }



    ;

    comVariant = new ComVariant();
    array = new Array(Types::Class);

    for (i = 1; i <= conlen(_list); i++)
    {
        property = conpeek(_list, i);

        comPropertyValue = m_comApplication.Bridge_GetStruct("com.sun.star.beans.PropertyValue");

        comDispFunction = new ComDispFunction(comPropertyValue, "Name", COMDispContext::PropertyPut);
        insertIntoComVariant(conpeek(property, 1));
        comDispFunction.call(comVariant);

        comDispFunction = new ComDispFunction(comPropertyValue, "Value", COMDispContext::PropertyPut);
        insertIntoComVariant(conpeek(property, 2));
        comDispFunction.call(comVariant);

        array.value(i, comPropertyValue);
    }

    return ComVariant::createFromArray(array);
}
Подобное поведение в Windows возникает, если вместо кода
X++:
comDispFunction = new ComDispFunction(comPropertyValue, "Name", COMDispContext::PropertyPut);
insertIntoComVariant(conpeek(property, 1));
comDispFunction.call(comVariant);
использовать код
X++:
insertIntoComVariant(conpeek(property, 1));
comPropertyValue.Name(comVariant);
Я грешу на ComDispFunction. Есть у кого-нибудь идеи?

Еще немного информации к размышлению: у нашего предприятия имеется несколько самописных программ на Visual FoxPro, которые благополучно запустились под Linux и нормально выгружают данные в OpenOffice.

Последний раз редактировалось Xardas; 17.06.2014 в 11:03.
Старый 17.06.2014, 15:26   #2  
Link is offline
Link
Британский учённый
Аватар для Link
Соотечественники
 
568 / 523 (19) +++++++
Регистрация: 25.11.2005
Адрес: UK
Записей в блоге: 9
Цитата:
Сообщение от Xardas Посмотреть сообщение
Наши администраторы запустили клиент Axapta под Linux
OMG, не завидую вашей службе поддержки
__________________
Людям физического труда для восстановления своих сил нужен 7-8 часовой ночной сон. Людям умственного труда нужно спать часов 9-10. Ну а программистов будить нельзя вообще.
Старый 19.06.2014, 10:01   #3  
Xardas is offline
Xardas
Участник
 
28 / 13 (1) ++
Регистрация: 19.09.2012
Проведенное тестирование выявило, что проблема не в ComDispFunction. Свойства COM-объекта присваиваются и читаются в штатном режиме. Теперь подозрения на код
X++:
m_comDocument = m_comDesktop.LoadComponentFromUrl(this.OOo_TranslateFileName(_template), "_blank", 0, this.OOo_CreateProperties([["Hidden", true], ["AsTemplate", true]]));
а именно, на передачу массива ComVariant в качестве параметра.
Теги
comdispfunction, linux, openoffice

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
OpenOffice (Sheet orientation, cell format) Alexanderrrr DAX: Программирование 12 10.04.2013 07:20
OpenOffice (автофигуры) Alexanderrrr DAX: Программирование 1 01.07.2010 10:58
Нужно сделать выборку из нескольких таблиц (в данном случае из четырех). niktata DAX: Программирование 10 30.09.2008 09:42
как получить результат COMDispFunction.call belugin DAX: Программирование 0 18.09.2007 17:46
Вызов Item() для коллекций Excel Владимир Максимов DAX: Программирование 15 17.08.2006 19:47
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

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