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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 09.09.2007, 19:59   #1  
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   #2  
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   #3  
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, время: 16:50.