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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 05.01.2005, 10:31   #21  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,691 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Изначально опубликовано Alks

Вчера вот записывал макросы установки типа ячейки - в VB код для ячейки генерится с NumberFormat = "#,##0.00", а в X++ NumberFormat("#,##0.00") ругается "не могу мол установить такой бредовый формат ячейки. Путём проб и ошибок выяснилось что на самом деле надо использовать маску поля "# ##0,00".
Проблема в том, что Excel использует текущие региональные настройки системы (Windows). А на разных машинах, соответственно, могут быть разные настройки для символов разделителей целой и дробной части и для символов разделителей троек чисел.

Чтобы определить, какой же именно символ используется я написал в классе ComExcelDocument_RU такой метод

PHP код:
// Возвращает указанную региональную настройку
// Поскольку различные региональные настройки имеют разный тип, то используется контейнер из одного элемента
// Возвожные значения параметра параметра смотри в справке по Visual Basic в Excel на свойство International
// Наиболее нужные
/*
xlDecimalSeparator      = 3 - символ разделитель целой и дробной части
xlThousandsSeparator    = 4 - символ разделитель троек цифр
xlDateSeparator         = 17 - символ разделитель в датах
xlTimeSeparator         = 18 - символ разделитель часов и минут
xlGeneralFormatName     = 26 - строка имени основного формата данных (обычно General)
xl24HourClock           = 33 - true - если часы отображаются в 24 часовом формате, false - если в 12 часовом
xl4DigitYears           = 43 - true - если отображаются 4 знака года, false - если 2
xlDateOrder             = 32 - как отображается дата: 0 - месяц/день/год, 1 - день/месяц/год, 2 - год/месяц/день
*/
container International(int _international)
{
    
COMVariant  comInternational;
    
container   con connull();
    ;

    if (
m_comApplication)
    {
        try
        {
            
comInternational m_comApplication.International(_international);
            switch (
comInternational.variantType())
            {
                case 
COMVariantType::VT_BOOL:
                {
                    
con conIns(con,1,comInternational.boolean());
                    break;
                }
                case 
COMVariantType::VT_BSTR:
                {
                    
con conIns(con,1,comInternational.bStr());
                    break;
                }
                case 
COMVariantType::VT_DATE:
                {
                    
con conIns(con,1,comInternational.date());
                    break;
                }
                case 
COMVariantType::VT_DECIMAL:
                {
                    
con conIns(con,1,comInternational.decimal());
                    break;
                }
                case 
COMVariantType::VT_INT:
                {
                    
con conIns(con,1,comInternational.int());
                    break;
                }
            }

        }
        catch (
Exception::Error || Exception::Internal)
        {
            throw 
error("Ошибка в функции " funcname());
        }
    }
    return 
con;

Пример использования:

PHP код:
static void JOB_Excel_International(Args _args)
{
    
COMExcelDocument_RU     excel;

    
COM         comRange;

    
str         strPoint,               // Символ разделитель целой и дробной части в Excel
                
strSeparator;           // Символ разделитель тысяч
    
;
    
#define.xlDecimalSeparator(3)
    #define.xlThousandsSeparator(4)
    
    
excel = new ComExcelDocument_RU();
    
// Создаю чистый лист Excel
    
excel.newFile('',true);
    
excel.visible(true);

    
strPoint     conpeek(excel.rtg_International(#xlDecimalSeparator),1);
    
strSeparator conpeek(excel.rtg_International(#xlThousandsSeparator),1);

    // Форматирую весь столбец А
    
comRange excel.findRange('A:A');
    
comRange.numberFormat("#"+strSeparator+"##0"+strPoint+"00");
    
    
excel.insertValue('A1',123456.78);
    return;

Здесь я несколько сжульничал, поскольку метод ComExcelDocument_RU.findRange() имеет область видимости protected. Т.е. таким образом его вызвать нельзя, если не изменить область видимости на public. Но, идея, думаю, понятна.

Есть еще один "фокус". Если использовать для вставки в Excel не напрямую числа, а преобразовав его через strFmt(), то региональные настройки будут использованы автоматически без предварительного форматирования ячеек:

excel.insertValue('A1',strFmt('%1',123456.78));
Старый 02.06.2005, 18:50   #22  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Случайно наткнулся на то, что изначально искал. (вопрос № 2)
(AX 3.0 SP3)

в Global есть метод
PHP код:
static boolean inRange(str _rangeValueanytype _value
как раз то. что я искал.
Может кому-то пригодиться.
За это сообщение автора поблагодарили: MikeR (1), gl00mie (1).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Исследование скорости экспорта данных из Axapta в Excel (коллективный эксперимент) Gustav DAX: База знаний и проекты 79 13.02.2014 13:18
[Excel] - Несколько версий Excel на машине клиента Андре DAX: Программирование 11 07.08.2007 13:45
Вызов Item() для коллекций Excel Владимир Максимов DAX: Программирование 15 17.08.2006 19:47
Пару вопросов про АОС ZVV DAX: Администрирование 13 14.01.2005 12:01

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

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

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