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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 19.09.2008, 13:56   #1  
zZ_TOP_Zz is offline
zZ_TOP_Zz
int 20h
Аватар для zZ_TOP_Zz
 
143 / 24 (1) +++
Регистрация: 26.02.2007
Адрес: Санкт -Петербург
Еще проблема с Excel при построении диаграмм
Добрый день.

Пытаясь построить диаграмму программно на Х++ столкнулся с затруднением. Как вывести содержимое объедененных ячеек в легенду. Диаграмма строится на отдельном листе. Лист с данными называется свод.

Методом проб выяснил что передать в xValue можно только форматом RC колонок.
ячейки с R2C5 по R2C23 являются объедененными по принципу
R2C5 объеденена R2C6
R2C7 объеденена R2C9 и тд
Данные содержатся для легенды содержатся в R2C5, R2C7 то есть каждой нечетной до 23 столбца включительно.


пытаясь передать в метод ComExcelDocument_RU
содержимое

X++:
outputRangeHeader ="=\свод\'\!R2C5\:R2C23";
и при вызове метода из ComExcelDocument_RU

X++:
SeriesCollection.xValue(_outputRangeHeader);
выдается сообщение об ошибке

Метод "range" в COM-объекте класса "_Application" возвратил код ошибки 0x800A03EC (<неизвестно>), который означает: <неизвестно>.


Подскаджите пожалуйста, как можно передать такой Range
__________________
It's just my Unhopelessnessabilityerism
Trying to debug my mind

Последний раз редактировалось zZ_TOP_Zz; 19.09.2008 в 15:09.
Старый 19.09.2008, 14:19   #2  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
"За сколько времени сможете подготовиться и сдать экзамен по китайскому языку? - Конспект есть? Щас докурю и пойдём сдавать!"

Если руками в Excel делать, то это в каком месте? Во-первых, SeriesCollection.XValues, наверное, всё-таки, а не .xlValue?
Старый 19.09.2008, 14:58   #3  
zZ_TOP_Zz is offline
zZ_TOP_Zz
int 20h
Аватар для zZ_TOP_Zz
 
143 / 24 (1) +++
Регистрация: 26.02.2007
Адрес: Санкт -Петербург
Ну да опечатался...что же теперь ....по существу есть что то?...

Там же между строк написано, что строится отчет в неком классе, Из него вызывается метод класса ComExcelDocument_RU

Вызывается вот этой командой со значениями указанными в начале поста
X++:
exceldocument.addXlPieChart(1,outputRange,'Отчет за месяц','Диаграмма',outputRangeHeader );
Сам метод
X++:
#define.xlPie(5)
void addXlPieChart(int _workSheet,

                  BookMark _bookMark,
                  str _title,
                  str _newSheetName,
                  str _outputLegendRange,
                  boolean _reverse = false)
{
    COM Charts, Chart, comRange;
    COM ChartTitle, Characters, SeriesCollection,Border, Legend;
    COM ActiveSheet;
    int i;
    str bookmark;
    ;

    if (! m_comDocument)
        throw error(strFmt("@DIS6401", this.getApplicationName()));

    Charts = m_comDocument.charts();
    Charts.Add();

    Chart = m_comDocument.ActiveChart();

    comRange = this.findRange(_bookMark, _workSheet);
    Chart.SetSourceData(comRange, 1);
    Chart.ChartType(#xlPie);

    SeriesCollection = Chart.SeriesCollection(1);
    SeriesCollection.ApplyDataLabels(1,0,0,0,0,0,1);  
    SeriesCollection.XValues(_outputLegendRange);            
    Border = SeriesCollection.Border();
    Border.Weight(1);

    Chart.HasTitle(True);
    ChartTitle = Chart.ChartTitle();
    Characters  = ChartTitle.Characters();
    Characters.Text(_title);

    ChartTitle.AutoScaleFont(false);

    Chart.Name(_newSheetName);

    
}
Ошибка валится на строке
X++:
    SeriesCollection.XValues(_outputLegendRange);
__________________
It's just my Unhopelessnessabilityerism
Trying to debug my mind
Старый 19.09.2008, 16:02   #4  
zZ_TOP_Zz is offline
zZ_TOP_Zz
int 20h
Аватар для zZ_TOP_Zz
 
143 / 24 (1) +++
Регистрация: 26.02.2007
Адрес: Санкт -Петербург
Вопрос снимается.
__________________
It's just my Unhopelessnessabilityerism
Trying to debug my mind
Старый 19.09.2008, 16:09   #5  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Получилось? Расскажете? У меня, честно говоря, с наскока не получилось, поэтому и затих
Старый 19.09.2008, 16:20   #6  
zZ_TOP_Zz is offline
zZ_TOP_Zz
int 20h
Аватар для zZ_TOP_Zz
 
143 / 24 (1) +++
Регистрация: 26.02.2007
Адрес: Санкт -Петербург
Конечно расскажу

Не совсем красиво, но это работает передал не как Range, а как перечисление всех нужных ячеек вот такую строчку
X++:
outputRangeHeader  = "=\'свод\'\!R2C5\;\'свод\'\!R2C7\;\'свод\'\!R2C9\;\'свод\'\!R2C11\;\'свод\'\!R2C13\;\'свод\'\!R2C15\;\'свод\'\!R2C17\;\'свод\'\!R2C19";

exceldocument.addXlPieChart(1,outputRange,'Отчет за месяц','Диаграмма',outputRangeHeader );
__________________
It's just my Unhopelessnessabilityerism
Trying to debug my mind
Старый 20.09.2008, 17:37   #7  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Спасибо. А вот мой рассказ

Я собирался попробовать подсунуть такой диапазон, как если бы в Excel, держа Ctrl, щелкать мышкой по ячейкам через одну:
Код:
 
'код - Excel VBA

SeriesCollection.XValues = Worksheets("свод").Range("E2,G2,I2,K2,M2,O2,Q2,S2,U2")
Но это не сработало. Выяснилось, что диапазон для XValues должен быть непрерывным типа "E2:U2".

Далее я попытался "где-то сбоку" в той же строке, в подряд идущих ячейках AA2:AI2 написать формулы, ссылающиеся на разрозненные ячейки исходного диапазона:

Код:
 
Set cell = Worksheets("свод").Range("AA2")
For i = 22 To 15 Step -1
    cell.FormulaR1C1 = "=RC[-" & i & "]"
    Set cell = cell.Offset(0, 1)
Next i

SeriesCollection.XValues = Worksheets("свод").Range("AA2:AJ2")
И это получилось. В Excel на VBA.

При попытке же переноса в Аксапту происходили какие-то странные вещи с FormulaR1C1. В ячейку AA2 по этому моему алгоритму должна была попасть формула =RC[-22], которая в ячейке преображалась в формулу A1-стиля: =E2. И при прогоне в Excel всё так и происходило.

При попытке же задать формулы из Аксапты в ячейке AA2 вместо ожидаемого =E2 оказалось =IA1, что в R1C1-стиле соответствует =R1C235. Интересно, что 235 - это 257-22 (взгляните на исходную формулу =RC[-22] ). Ну, а 257 - это нечто рядом с 256. Есть ощущение, что значение в квадратных скобках, внешнее напоминающее контейнер или индекс массива, каким-то таинственным образом преображается. В общем, хочу всё это на досуге поисследовать.

НО! Даже если это наконец заработает, всё равно необходим дополнительный код, объем которого будет явно не меньше кода, формирующего строку outputRangeHeader.

Так что оставим в покое вопросы красивости. Ваше решение - простое, экономное и, самое главное, уже работающее.
Старый 22.09.2008, 10:16   #8  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
В общем, формулы оказались ни при чем. Точнее, "при чем", но как бы не по своей воле.

Всему "виной" программное построение диаграммы, которое, как выяснилось, весьма капризно, и успешное завершение этого процесса зависит даже от последовательности операторов. Например, поменяйте местами два самых последних оператора (казалось бы, абсолютно независимых) в нижеследующем демонстрационном джобе и вы получите сообщение об ошибке.

Что касается формул, то всё получилось, как хотелось, после помещения кода по их созданию перед кодом для создания диаграммы. Опять-таки, если хотите увидеть, какие с ними были проблемы, перенесите код по "организации непрерывного диапазона" в место перед оператором series.XValues (см. комментарии).
X++:
{
    ComExcelDocument_RU doc = new ComExcelDocument_RU();

    COM     xlApp;
    COM     wbook;
    COM     activeSheet;
    int     i;
    COM     charts;
    COM     activeChart;
    COM     rangeOutputHeader;
    COM     range;
    COM     seriesCollection;
    COM     series;
    ;

    doc.NewFile();
    wbook = doc.getComDocument();

    xlApp = wbook.Parent();
    activeSheet = xlApp.ActiveSheet();

    // генерация тестовых данных для примера
    for (i=1; i<=10; i++)
        doc.insertValue(ComExcelDocument_RU::numToNameCell(i,1), i*10);

    // тестовые значения для XValues
    for (i=5; i<=23; i+=2)
        doc.insertValue(ComExcelDocument_RU::numToNameCell(i,2), strFmt('Категория %1', i));

    // организация непрерывного диапазона в AA2:AJ2
    range = activeSheet.Range('AA2');
    for (i=22;i>=13;i--)
    {
        range.FormulaR1C1(strFmt('=RC[-%1]', i));
        range = range.Offset(0, 1);
    }
    rangeOutputHeader = activeSheet.Range('AA2:AJ2');

    // построение диаграммы
    charts = wbook.Charts();
    activeChart = charts.Add();

    activeChart.ChartType(5); // 5 = xlPie
    activeChart.SetSourceData(activeSheet.Range('A1:J1'));

    series = activeChart.SeriesCollection(1); // немного странно, что это работает, не требуя промежуточного series = seriesCollection.Item(1);

    // если организацию непрерывного диапазона перенести сюда,
    // то будут описанные выше проблемы с формулами

    series.XValues(rangeOutputHeader); // и, как хотелось, здесь Range, а не стринг

    activeChart.Location(2, activeSheet.Name()); // 2 = xlLocationAsObject
}
P.S. Можно попробовать при "организации непрерывного диапазона" использовать формулу массива и тогда компактность кода уже может поспорить даже с перечислением адресов через запятую:
X++:
// организация непрерывного диапазона в AA2:AJ2
rangeOutputHeader = activeSheet.Range('AA2:AJ2');
rangeOutputHeader.FormulaArray('=INDEX(RC[-22]:RC[-4],{1,3,5,7,9,11,13,15,17,19})');

// построение диаграммы
За это сообщение автора поблагодарили: G.Menshikh (1), kornix (1).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Исследование скорости экспорта данных из Axapta в Excel (коллективный эксперимент) Gustav DAX: База знаний и проекты 79 13.02.2014 13:18
Проблема с импортом из Excel через COM Romsrs DAX: Программирование 18 10.06.2008 10:34
Экспорт в Excel. Проблема с '\n' axaLearner DAX: Программирование 12 17.04.2006 18:43
Проблема при построении отчетов George Nordic DAX: Программирование 17 24.03.2004 13:46
Проблема с созданием шаблона импорта Excel в 3.0 AK-76 DAX: Администрирование 1 25.07.2003 22:21

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

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

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