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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 20.12.2004, 18:48   #1  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Пару вопросов по отчетам Excel
Привет, All
Пишу отчет. Вот пару вопросов

1. Можно ли программно определить версию (язык) Excel?
Потому что пишу в ячейки формулы, типа СУММ(), а на англ. оно будет SUM(). Нужно знать, что вставлять. Через А+В+С ... долго, бо цикл нужно гонять

2. Мне нужна функция, которая бы возвращала true/false, а на вход принимала 2 строки. Первое - значение текущее какого-то поля, а второе - значение фильтра на это поле. Типа ("Номенк1","Номенк1-Номенк8,Номенк11")

Мне нужно определить, подходит ли текущее значение. - сам думал уже писать, но решил сначало спросить. Может есть что-то типа в sysQuery или еще где-то
А фильтр именно наложить не представляется возможным.

3. В поиске посмотрел, но конкретно этого не нашел. Мне нужно закрасить задний фон строки в Excel. А метода у COM для этого не знаю. Кто может подсказать. И вообще, где можно почитать о том, какие методы есть у COM связанные к примеру, для конкретности с ExcelWorkSheet или Range?

Спасибо за ответы (будущие)

Кашперук Ваня
Старый 20.12.2004, 18:55   #2  
macklakov is offline
macklakov
NavAx
Аватар для macklakov
 
2,245 / 980 (37) +++++++
Регистрация: 03.04.2002
Справка по Microsoft Visual Basic, в Excel:
"LanguageSettings Property

Returns the LanguageSettings object, which contains information about the language settings in Microsoft Excel. Read-only"
__________________
Isn't it nice when things just work?
Старый 20.12.2004, 18:57   #3  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
А в Аксапте ты этого не пробовал? Как обратиться к нему? С VB просто давно очень работал, но справку посмотрю
Старый 20.12.2004, 19:18   #4  
macklakov is offline
macklakov
NavAx
Аватар для macklakov
 
2,245 / 980 (37) +++++++
Регистрация: 03.04.2002
К нему не пробовал, к другим функциям обращаюсь без проблем. Вряд ли этот метод уникален. А вообще, проще использовать шаблоны с готовыми формулами и форматированием.
__________________
Isn't it nice when things just work?
Старый 21.12.2004, 10:21   #5  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Вообще-то, работать с Excel достаточно просто, если уяснить его основную иерархию:

Application - WorkBook - WorkSheet - Range (Cell)

Application - это собственно тот COM-объект, который создается в памяти
WorkBook - это файл, открытый в этом COM-объекте
WorkSheet - это лист одного файла
Range - область листа (набор ячеек) к которому идет обращение

Если работа идет через класс ComExcelDocument_RU, то

Application - это переменная m_comApplication
WorkBook - это переменная m_comDocument

Чтобы вытащить эти переменные во вне надо создать специальные методы в этом классе, которые будут просто возвращать значение этих переменнх. Причем следует помнить, что для AXAPTA все эти переменные типа COM. Ну, что-то вроде

PHP код:
public COM getApplication()
{
    ;

    return 
m_comApplication;

Далее, следует помнить, что AXAPTA не поодерживает косвенные ссылки COM-объектов. Если почитать HELP по VBA в Excel (Открыть Excel, далее Alt+F11, далее F1), то по объекту LanguageSettings надо поступить примерно так:

PHP код:
static void Job_Excel(Args _args)
{
    
COMExcelDocument_RU     excel;
    
Com                     m_comApplication;
    
Com                     comLanguageSettings;
    ;

    
excel = new COMExcelDocument_RU();
    
excel.newFile('',true);
    
excel.visible(true);

    
m_comApplication excel.getApplication();  // это созданный выше метод
    
comLanguageSettings m_comApplication.LanguageSettings();

    print 
comLanguageSettings.LanguageID(1);
    
pause;
    return;

Вот с константами беда Какое именно значение имеют константы msoLanguageIDExeMode, msoLanguageIDHelp, msoLanguageIDInstall, msoLanguageIDUI, or msoLanguageIDUIPrevious я не в курсе. Методом тыка поставил единицу.

С возвращаемым значением полегче. Есть список констант в Word

PHP код:
#DEFINE.wdLanguageNone(0)
#DEFINE.wdNoProofing(1024)
#DEFINE.wdDanish(1030)
#DEFINE.wdGerman(1031)
#DEFINE.wdSwissGerman(2055)
#DEFINE.wdEnglishAUS(3081)
#DEFINE.wdEnglishUK(2057)
#DEFINE.wdEnglishUS(1033)
#DEFINE.wdEnglishCanadian(4105)
#DEFINE.wdEnglishNewZealand(5129)
#DEFINE.wdEnglishSouthAfrica(7177)
#DEFINE.wdSpanish(1034)
#DEFINE.wdFrench(1036)
#DEFINE.wdFrenchCanadian(3084)
#DEFINE.wdItalian(1040)
#DEFINE.wdDutch(1043)
#DEFINE.wdNorwegianBokmol(1044)
#DEFINE.wdNorwegianNynorsk(2068)
#DEFINE.wdBrazilianPortuguese(1046)
#DEFINE.wdPortuguese(2070)
#DEFINE.wdFinnish(1035)
#DEFINE.wdSwedish(1053)
#DEFINE.wdCatalan(1027)
#DEFINE.wdGreek(1032)
#DEFINE.wdTurkish(1055)
#DEFINE.wdRussian(1049)
#DEFINE.wdCzech(1029)
#DEFINE.wdHungarian(1038)
#DEFINE.wdPolish(1045)
#DEFINE.wdSlovenian(1060)
#DEFINE.wdBasque(1069)
#DEFINE.wdMalaysian(1086)
#DEFINE.wdJapanese(1041)
#DEFINE.wdKorean(1042)
#DEFINE.wdSimplifiedChinese(2052)
#DEFINE.wdTraditionalChinese(1028)
#DEFINE.wdSwissFrench(4108)
#DEFINE.wdSesotho(1072)
#DEFINE.wdTsonga(1073)
#DEFINE.wdTswana(1074)
#DEFINE.wdVenda(1075)
#DEFINE.wdXhosa(1076)
#DEFINE.wdZulu(1077)
#DEFINE.wdAfrikaans(1078)
#DEFINE.wdArabic(1025)
#DEFINE.wdHebrew(1037)
#DEFINE.wdSlovak(1051)
#DEFINE.wdFarsi(1065)
#DEFINE.wdRomanian(1048)
#DEFINE.wdCroatian(1050)
#DEFINE.wdUkrainian(1058)
#DEFINE.wdByelorussian(1059)
#DEFINE.wdEstonian(1061)
#DEFINE.wdLatvian(1062)
#DEFINE.wdMacedonian(1071)
#DEFINE.wdSerbianLatin(2074)
#DEFINE.wdSerbianCyrillic(3098)
#DEFINE.wdIcelandic(1039)
#DEFINE.wdBelgianFrench(2060)
#DEFINE.wdBelgianDutch(2067)
#DEFINE.wdBulgarian(1026)
#DEFINE.wdMexicanSpanish(2058)
#DEFINE.wdSpanishModernSort(3082)
#DEFINE.wdSwissItalian(2064) 
Т.е. если приведенный выше Job вернет 1049, то язык русский, а если 1033 - то английский. Правда, надо все-таки как-то уточнить значение константы передаваемой в метод LanguageID().

Чтобы уточнить синтаксис какой-либо команды непосредственно в Excel, используют встроенный в Excel макрорекодер. Т.е. запись всех действий пользователя, совершаемых в Excel. Пункт меню Сервис -> Макрос -> Начать запись.

Выполняешь все необходимые действия, далее останавливаешь запись, открываешь макрос на редактирование и смотришь, какая именно команда была использована. Правда, переносить один-к-одному код макрорекодера не нужно. Все эти Selection() явно лишние. Но, думаю, сообразишь как там что перевести. Ничего сложного.
Старый 21.12.2004, 11:11   #6  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Спасибо, Володя.
Да, я вчера тоже посмотрел help, так вот я наоборот нашел, какие параметры передаются - возможные значения, а вот где ты нашел возвращаемые?

А передается одно из 5 значений: (по предположению первое - 1, и дальше по возростанию до 5):

msoLanguageIDExeMode, - этот не знаю, но тоже что-то близко к остальным
msoLanguageIDHelp, - хелп
msoLanguageIDInstall, - при установке
msoLanguageIDUI, - интерфейс с пользователем
msoLanguageIDUIPrevious - пред интерфейс ??

Вот. Спасибо еще раз за участие
Старый 21.12.2004, 11:41   #7  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
877 / 649 (23) +++++++
Регистрация: 14.10.2004
Цитата:
Вот с константами беда Какое именно значение имеют константы msoLanguageIDExeMode, msoLanguageIDHelp, msoLanguageIDInstall, msoLanguageIDUI, or msoLanguageIDUIPrevious я не в курсе. Методом тыка поставил единицу.
В Экселе в редакторе Visual Basic откройте броузер объектов (клавиша F2), встаньте на поле "поиск" и введите туда нужную Вам консатанту - получите ее значение и место в иерархии объектов.
Старый 21.12.2004, 15:14   #8  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Изначально опубликовано Ace of Database

В Экселе в редакторе Visual Basic откройте броузер объектов (клавиша F2), встаньте на поле "поиск" и введите туда нужную Вам консатанту - получите ее значение и место в иерархии объектов.
Вот ведь знал же! Но так редко этим пользовался, что успел забыть! Спасибо!
Старый 21.12.2004, 22:44   #9  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
А кто подскажет по второму и третьему пунктам вопроса?
Старый 22.12.2004, 09:36   #10  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
По третьему я же уже сказал, включай макрорекодер и смотри какой метод делает то, что тебе нужно. В частности, цает фона - это Range.Interior.ColorIndex или так (как метод ComExcelDocument_RU):

PHP код:
void setRangeColor(MSOfficeBookMark_RU _bookMark
                    
int _colorIndex,     // индекс нужного цвета
                    
int _workSheetNumber 1)
{
    
COM     comRangecomInterior;
    ;

    
comRange this.findRange(_bookMark,_workSheetNumber);
    if (
comRange)
    {
         
comInterior comRange.Interior();
         
comInterior.ColorIndex(_colorIndex);
    }

Здесь использван несколько модифицированный метод findRange() в который добавлен второй параметр для указания номера нужного листа.

bookMark - это адрес диапазона вроде "A1" или "A5:D10"

Какое значение colorIndex соответсвует какому цвету смотри в Help к Excel
Старый 22.12.2004, 09:44   #11  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
по поводу третьего вопроса: если я не знаю как через COM сделать что-то, что я знаю как сделать руками, я записываю макрос.


PS. с сайта майкрософт можно скачать утилиту OleView которая показывает что внутри библиотеки типов
Старый 22.12.2004, 10:26   #12  
db is offline
db
Роман Долгополов (RDOL)
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
 
393 / 692 (24) +++++++
Регистрация: 01.04.2004
Адрес: Москва
Ребята, а вам еще не надоело постоянно гадать как называется тот или иной метод экселе или какое значение имеет константа? Писать все эти методы SetЭтоТуда() и GetЭтоОттуда()?

Если надоело, то может проще все таки сгенерировать мастером оболочек для com-объектов классы-оболочки для всей объектной модели экселя (ворда, любой другой active-x хрени, с которой приходится работать). За мастером приходится малость подчищать, что требует некоторых минимальных знаний про COM как таковую и ее реализацию в Аксапте. Что в результате?
1. Типизированные классы, представляющие все объекты нужного приложения (проверка типов и параметров при компиляции, а не во время выполнения)
2. Список методов будет выпадать списком, как при работе с обычным классом аксапты
3. Нормальная объектная модель, являющаяся копией объектной модели поставщика active-x сервера, а не разработанная толпой разношерстных разработчиков библиотека ф-ий, каждый из которых норовит все методы назвать по своему и наделить их всеми мыслимыми и немыслимыми обязанностями.
4. Хелпом, поставляемый вместе с active-x сервером можно будет пользоваться один в один

Да, это потребует некоторых дополнительных усилий по сравненинию с написанием очередной супер-пупер функции-затычки, но по моему оно того стоит
Старый 27.12.2004, 17:22   #13  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 645 (26) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
А зачем? Оно есть. Неполное, конечно, но обычно хватает. Называется сие класс SysExcel.
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Старый 28.12.2004, 12:53   #14  
db is offline
db
Роман Долгополов (RDOL)
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
 
393 / 692 (24) +++++++
Регистрация: 01.04.2004
Адрес: Москва
Цитата:
Изначально опубликовано Maxim Gorbunov
А зачем? Оно есть. Неполное, конечно, но обычно хватает. Называется сие класс SysExcel.
ну значит Вам еще не надоело. С годами придет или пройдет
Старый 29.12.2004, 15:49   #15  
simply2double is offline
simply2double
Участник
Аватар для simply2double
 
556 / 19 (2) ++
Регистрация: 08.09.2004
Адрес: alfa cen
Цитата:
Изначально опубликовано db
Ребята, а вам еще не надоело постоянно гадать как называется тот или иной метод экселе или какое значение имеет константа? Писать все эти методы SetЭтоТуда() и GetЭтоОттуда()?

хм... можно вообще делать все проще...
включаешь в екселе запись макроса... делаешь в ручную все что тебе нужно... в результате получаешь готовый сценарий на VBA... затем переводишь в хе-плюс-плюс, объявляя каждый объект или коллецию иерархии за аксаптовский ком интерфейс... вот и все страдания...
Старый 30.12.2004, 05:44   #16  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
Цитата:
Изначально опубликовано simply2double


хм... можно вообще делать все проще...
включаешь в екселе запись макроса... делаешь в ручную все что тебе нужно... в результате получаешь готовый сценарий на VBA... затем переводишь в хе-плюс-плюс, объявляя каждый объект или коллецию иерархии за аксаптовский ком интерфейс... вот и все страдания...
И вот что хочу заметить - что ЭТО НЕ ВСЕГДА РАБОТАЕТ.
Вчера вот записывал макросы установки типа ячейки - в VB код для ячейки генерится с NumberFormat = "#,##0.00", а в X++ NumberFormat("#,##0.00") ругается "не могу мол установить такой бредовый формат ячейки. Путём проб и ошибок выяснилось что на самом деле надо использовать маску поля "# ##0,00".
Старый 30.12.2004, 08:54   #17  
simply2double is offline
simply2double
Участник
Аватар для simply2double
 
556 / 19 (2) ++
Регистрация: 08.09.2004
Адрес: alfa cen
Цитата:
Изначально опубликовано Alks


И вот что хочу заметить - что ЭТО НЕ ВСЕГДА РАБОТАЕТ.
Вчера вот записывал макросы установки типа ячейки - в VB код для ячейки генерится с NumberFormat = "#,##0.00", а в X++ NumberFormat("#,##0.00") ругается "не могу мол установить такой бредовый формат ячейки. Путём проб и ошибок выяснилось что на самом деле надо использовать маску поля "# ##0,00".
Согласен. КОМ сервер екселя не всегда отрабатывает так, как отрабатывает обработчик макросов. Что есть, то есть. Видимо ком интерфейс и обработчик макросов писали разные люди в разное время и вообще по разному, как это принято в микрософте. Иные подходы не позволят генерить ежегодно революционные решения.

Но в большинстве случаев все прокатывает. И сохраняет массу времени.
Старый 30.12.2004, 08:59   #18  
simply2double is offline
simply2double
Участник
Аватар для simply2double
 
556 / 19 (2) ++
Регистрация: 08.09.2004
Адрес: alfa cen
Цитата:
Изначально опубликовано db

Если надоело, то может проще все таки сгенерировать мастером оболочек для com-объектов классы-оболочки для всей объектной модели экселя (ворда, любой другой active-x хрени, с которой приходится работать). За мастером приходится малость подчищать, что требует некоторых минимальных знаний про COM как таковую и ее реализацию в Аксапте.
О чем идет речь??? Что есть такое "мастер оболочек" ???? Это из какой оперы... можно в двух словах.. или где об этом можно почитать
Старый 30.12.2004, 10:11   #19  
db is offline
db
Роман Долгополов (RDOL)
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
 
393 / 692 (24) +++++++
Регистрация: 01.04.2004
Адрес: Москва
Цитата:
Изначально опубликовано simply2double


О чем идет речь??? Что есть такое "мастер оболочек" ???? Это из какой оперы... можно в двух словах.. или где об этом можно почитать
"Сервис\Средства разработки\Мастера\Мастер оболочек для COM-объектов"
Есть только в 3.0, но с некоторыми доработками код можно "опустить" до версии 2.5.
Читать там нечего - надо запускать и смотреть результаты
Старый 30.12.2004, 10:50   #20  
simply2double is offline
simply2double
Участник
Аватар для simply2double
 
556 / 19 (2) ++
Регистрация: 08.09.2004
Адрес: alfa cen
Цитата:
Изначально опубликовано db


"Сервис\Средства разработки\Мастера\Мастер оболочек для COM-объектов"
Есть только в 3.0, но с некоторыми доработками код можно "опустить" до версии 2.5.
Читать там нечего - надо запускать и смотреть результаты
спасибо... видимо это приблуда читает .tlb файл и создает оболочки для COM интерфейсов. Надо попробывать поэксперементировать.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Исследование скорости экспорта данных из 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, время: 17:57.