31.05.2011, 21:25 | #1 |
MS Dynamics AX 2012 R3
|
Помощь в построении кода по присоединению COM объектов в методы класса
Доброго времени суток, коллеги.
Система: MS Dynamics AX 4.0 Есть учебное задание у меня, построить генерируемый Аксаптой отчёт в MS Excel(не шаблон, к сожалению), в котором выводятся различные данные в столбцы. Данные я вывел, сделал шапки столбцов. А вот упёрся в то, что нужно ещё сделать: 1. Объединить ячейки с одинаковым значением номера ОС в одном столбце и отдельно Наименованием ОС в другом столбце; 2. Вывести в отчёт слово "Отчёт" и даты С___ По____, (в коде даты уже прописаны, и указываются при выборе в окне диалога); 3. Прорисовать границы таблицы отчёта; 4. Зафиксировать длину ячеек по столбцам этого отчёта. Я понимаю, что это почти всё делается через COM объекты, но даже как начать не знаю. На форуме видел примеры кода из тех пунктов, что я перечислил, но вот как интегрировать эти примеры в свой класс я не разобрался, тупой копи-паст мне не нужен ибо я так не научусь ни чему, но вот сейчас сроки сдачи моего задания подходят к концу, а я так и не продвинулся с этими COM объектами. Помогите примерами кода пожалуйста начинающему программисту, как начать прописывать COM в мой класс и подскажите немного как делать. В книгах я такой информации не нашёл. Во вложении прилагаю свой проект. Если кто может то примеры решения моего затруднения можно сделать прямо в нём или же в ответах на эту тему. Заранее благодарен, Алексей.
__________________
"Человек человеку волк, а зомби зомби зомби." (с) С Уважением, Алексей Кабанов Последний раз редактировалось ZornFire; 31.05.2011 в 21:30. |
|
31.05.2011, 22:20 | #2 |
северный Будда
|
Вы же наверняка умеете пользоваться макросами. Запишите макрос объединения несколько ячеек в одну. Это даст вам текст нужных манипуляций на Visual Basic. Перевести его в Х++ вам, думаю, труда не составит
__________________
С уважением, Вячеслав |
|
|
За это сообщение автора поблагодарили: ZornFire (1). |
31.05.2011, 22:20 | #3 |
Moderator
|
Что-то это не очень похоже на учебное задание, ибо нацелено оно на узкую конкретную задачу - взаимодействие с Excel и совсем не раскрывает внутреннюю архитектуру системы обучаемому.
А если по делу, то попробуйте в Excel записать макрос, выполняющий приведенные выше действия и переложить полученный VBA на X++ код. Последний раз редактировалось Андре; 31.05.2011 в 23:01. |
|
|
За это сообщение автора поблагодарили: ZornFire (1). |
31.05.2011, 22:23 | #4 |
Участник
|
Цитата:
X++: comWorkSheet = this.getWorkSheet(_workSheet); comApplication = m_comDocument.application(); |
|
|
За это сообщение автора поблагодарили: ZornFire (1). |
01.06.2011, 07:38 | #5 |
Administrator
|
Если бы это было бы не учебное задание - то я бы все-таки порекомендовал бы сделать шаблон с двумя макросами.
Первый макрос получает массив данных и кол-во столбцов, после чего "раскидывает" массив по ячейкам. Второй макрос получает перечень столбцов и диапазон с данными и пытается группировать (объединять по строкам) данные в порядке, представленном в перечне столбцов (например, 1, 3, 4, 2). Фраза "Дата С .. По.." хорошо выводится в именованную ячейку. Для этого можно воспользоваться методом findRange("ИмяЯчейки").value2("Значение"); А макрос вызывается с помощью класса ComDispFunction следующим образом: X++: dispFunction = new COMDispFunction(m_comDocument, #dispFunctionName, COMDispContext::Method);
dispFunction.call();
__________________
Возможно сделать все. Вопрос времени |
|
|
За это сообщение автора поблагодарили: ZornFire (1). |
02.06.2011, 16:32 | #6 |
MS Dynamics AX 2012 R3
|
Коллеги, есть ли у кого из Вас такой класс, где можно увидеть методы целиком, как присваиваются значения слияния ячеек(при чём если число значений AccountNum, например, не известно), метод с выводом простого текста, метод, где указывается длина столбцов в отчёте, метод где кодом которого наклабывается сетка на определённые координаты типа А1:А10?
На примере такого класса я смог бы научиться и полностью освоить программирование в построении отчётности с выводом в MS Excel. Благодаря ответам выше, я понял как начать и добавил методы в класс ComExcelDocument_RU. Затруднение вызвало не знание как прописывать присвоение параметров, вот, а дата сдачи моего отчёта в следующий понедельник, как бы очень уж хотелось бы уложиться в скроки без последствий для меня. Я так понимаю, что сам я не успею за оставшееся время разобраться. Копи-пастом я заниматься не собираюсь, хочеться увидеть на живую и научиться как самому строить аналоговый код. Заранее благодарен, Алексей.
__________________
"Человек человеку волк, а зомби зомби зомби." (с) С Уважением, Алексей Кабанов Последний раз редактировалось ZornFire; 02.06.2011 в 16:36. |
|
02.06.2011, 16:42 | #7 |
Ищущий знания...
|
заходишь в Excel. Записываешь макрос с нужными тебе действиями и потом смотришь в макросе код, затем перекидываешь его к себе в метод (для удобства анализа кода в макросе, записывай на каждое действие свой макрос).
P.S. конечно там надо будет код перевести из VB в X++, а не просто скопировать из макроса Но те методы которые надо дернуть у кома ты увидишь.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем Последний раз редактировалось lev; 02.06.2011 в 16:44. Причина: добавил P.S. |
|
03.06.2011, 08:41 | #8 |
Участник
|
Цитата:
Вот, специально для вас написал пример работы с Excel. Джоб выполняет те действия, о которых вы спрашивали. X++: static void JobTESTExcel20110603(Args _args) { ComExcelDocument_RU excelDocument; COM COMRange; ; excelDocument = new ComExcelDocumentExt_Ru(); if (!excelDocument.newFile()) return; //слияние ячеек COMRange = excelDocument.findRangePublic("A2:A4"); COMRange.merge(); // вывод простого текста excelDocument.insertValue(COMExceldocument_RU::numToNameCell(2, 5), "Hello, World!"); // указание ширины столбца COMRange = excelDocument.findRangePublic("C:C"); COMRange.ColumnWidth(100); excelDocument.visible(true); excelDocument.finalize(); } Цитата:
Форматирование на Excel P.S.: "— Вы, чего, и конфеты за меня есть будете?" (Вовка в Тридевятом царстве) |
|
|
За это сообщение автора поблагодарили: lev (2), ZornFire (1). |
06.06.2011, 21:40 | #9 |
MS Dynamics AX 2012 R3
|
Цитата:
Сообщение от S.Kuskov
Интегрируйте эти примеры не в класс отчёта, а непосредственно в класс ComExcelDocument ну или в его наследник ComExcelDocumentExt_RU, который включён в ваш проект. Просто добавьте туда нужные вам методы. Требуемые вам для начала COM объекты уже объявлены в этих классах. Посмотрите например метод ComExcelDocumentExt_RU.autoFit(), который уже есть в вашем проекте. Там есть пример доступа к COM объекту приложения и COM объекту рабочего листа Excel
X++: comWorkSheet = this.getWorkSheet(_workSheet); comApplication = m_comDocument.application();
__________________
"Человек человеку волк, а зомби зомби зомби." (с) С Уважением, Алексей Кабанов |
|
|
|