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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 07.09.2007, 21:48   #1  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Кстати, попробовал только что запустить JOB отсюда
Вызов Item() для коллекций Excel
Та же ошибка.
хм... вот это уже интересно... это уже принципиальный момент... может, какие-нить региональные настройки Виндов мешают? Например, поиграться разделителем списка: запятая или точка с запятой. Я смогу у себя проверить только в понедельник.
Старый 09.09.2007, 19:59   #2  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Конечно, интересно разобраться до конца с этим SHOW.DETAIL, но находятся и другие варианты решения. Например, можно попробовать переложить на X++ следующие команды VBA:
Код:
'Скрыть детали (нажатие на "минусик")
Application.CommandBars("PivotTable").Controls( 5 ).Execute

'Отобразить детали (нажатие на "плюсик")
Application.CommandBars("PivotTable").Controls( 6 ).Execute
Можно еще попробовать воплотить в X++ такую универсальную процедуру на VBA:
Код:
Sub RunExcelMenu(ByVal menuID As Long)

    'в Аксапте все переменные будут типа COM
    Dim cmdBars As CommandBars
    Dim newCmdBar As CommandBar
    Dim ctrls As CommandBarControls
    Dim newCtrl As CommandBarControl
    
    Set cmdBars = Application.CommandBars
    Set newCmdBar = cmdBars.Add
    Set ctrls = newCmdBar.Controls
    Set newCtrl = ctrls.Add(1, menuID)
    
    newCtrl.Execute
    newCmdBar.Delete
    
End Sub

'Скрыть детали (нажатие на "минусик")
    RunExcelMenu( 464 )

'Отобразить детали (нажатие на "плюсик")
    RunExcelMenu( 462 )
А коды команд меню Excel можно узнать, например, в окне отладки:
Код:
? Application.CommandBars("PivotTable").Controls( 5 ).Id
 464 
? Application.CommandBars("PivotTable").Controls( 6 ).Id 
 462
Подпрограмма RunExcelMenu - адаптированная для последующего перевода на X++ версия подпрограммы RunMenu, заимствованная со стр. 418 из книги: Excel 2003 и VBA. Справочник программиста
За это сообщение автора поблагодарили: Stainless (1).
Старый 10.09.2007, 11:34   #3  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Понедельник. Сваял джобик. Все три способа прекрасно работают у меня...
Предлагаю призвать заинтересованную общественность прогнать джоб на своих компах и сравнить настройки Виндов, Экселя и т.п.
X++:
#define.xlListSeparator( 5 )
static void TestShowDetail(Args _args)
{
    COM xlApp, wbks, wbk, wkss, currSheet;
    COM rng, rows, currRows;
    int i;
    COMVariant dummy    = new COMVariant();
    COM cmdBars, cmdBar, ctrls, ctrl;

    str listSeparator;
    COMVariant varListSeparator;

    void runExcelMenu(int menuID)
    {
        cmdBars = xlApp.CommandBars();
        cmdBar = cmdBars.Add();
        ctrls = cmdBar.Controls();
        ctrl = ctrls.Add(1, menuID);

        ctrl.Execute();
        cmdBar.Delete();
    }
;
    xlApp = new COM('Excel.Application');
    xlApp.Visible(true);

    // определение разделителя списка
    varListSeparator = xlApp.International(#xlListSeparator);
    listSeparator = varListSeparator.bStr();
    info( listSeparator );

    wbks = xlApp.Workbooks();
    wbk = wbks.Add();

    wkss = wbk.WorkSheets();
    currSheet = wkss.Item(1);

    rng = currSheet.Range('A1');

    for (i=1; i<= 10; i++)
    {
        rng.Value2(i);
        rng = rng.Offset(1,0);
    }

    rows = currSheet.Rows();
    currRows = COM::createFromVariant(rows.Item('4:7'));
    currRows.Select();
    currRows.Group();
    xlApp.ExecuteExcel4Macro('ALERT("Пауза 1")');

    // xlApp.ExecuteExcel4Macro('SHOW.DETAIL(1,7,FALSE)'); //Скрыть детали
    xlApp.ExecuteExcel4Macro(strfmt('SHOW.DETAIL(1 %1 7 %1 FALSE)', listSeparator)); //Скрыть детали
    xlApp.ExecuteExcel4Macro('ALERT("Пауза 2")');

    // xlApp.ExecuteExcel4Macro('SHOW.DETAIL(1,7,TRUE)'); //Отобразить детали
    xlApp.ExecuteExcel4Macro(strfmt('SHOW.DETAIL(1 %1 7 %1 TRUE)', listSeparator));  //Отобразить детали
    xlApp.ExecuteExcel4Macro('ALERT("Пауза 3")');

    cmdBars = xlApp.CommandBars();
    cmdBar = cmdBars.Item('PivotTable');
    ctrls = cmdBar.Controls();

    ctrl = ctrls.Item( 5 );
    ctrl.Execute(); //Скрыть детали
    xlApp.ExecuteExcel4Macro('ALERT("Пауза 4")');

    ctrl = ctrls.Item( 6 );
    ctrl.Execute(); //Отобразить детали
    xlApp.ExecuteExcel4Macro('ALERT("Пауза 5")');

    runExcelMenu( 464 ); //Скрыть детали
    xlApp.ExecuteExcel4Macro('ALERT("Пауза 6")');

    runExcelMenu( 462 ); //Отобразить детали
}

Последний раз редактировалось Gustav; 10.09.2007 в 14:39. Причина: добавил определение разделителя списка
За это сообщение автора поблагодарили: kashperuk (10), aidsua (1).
Старый 10.09.2007, 11:53   #4  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Короче, всё ясно. Дело в разделителе списка в региональных настройках Windows. Если он установлен как "точка с запятой", то и в SHOW.DETAIL параметры должны перечисляться через точку с запятой:
X++:
xlApp.ExecuteExcel4Macro('SHOW.DETAIL(1;7;FALSE)'); //Скрыть детали
Это что касается использования именно SHOW.DETAIL. Если не заморачиватсья с определением текущего разделителя списка, то можно просто пойти другим путем и сделать через CommandBars (см. выше).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Kurt Hatlevik: Sneak preview of the WMS E&E Blog bot DAX Blogs 0 20.11.2008 01:10
не получается экспорт в excel через COM Dimk DAX: Программирование 2 16.02.2007 19:37
"Functions" через COM Connector murad DAX: Программирование 4 13.04.2006 16:21
Взаимодействие с Аксаптой через COM+ banbery DAX: Программирование 21 25.06.2005 23:49
связь с 1С через COM rinugun DAX: Программирование 9 03.12.2004 11:28
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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