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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 20.03.2002, 16:44   #1  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,374 / 454 (20) +++++++
Регистрация: 03.12.2001
Как вставить значение из Аксапты в Excel
Подскажите пожалуйста, как вставить какое нибудь значение в Excel из Аксапты ?

Пробовал, так:

X++:
    COM cn = new COM("Excel.Application");
    cn.ActiveCell.Value = "1"
Не работает.

Хотя вот это работает:

X++:
    COM cn = new COM("ADODB.Connection");
    COM rs = new COM("ADODB.Recordset");
    COM flds;
    COM fld;
    COMVariant cv1,cv2;
    ;
    cn.Provider("sqloledb");
    cn.Open("DSN=BMSDSM;DATABASE=Northwind;Trusted_Connection=Yes");

    rs.Open("SELECT * FROM Customers",cn);
    ........
Два вопроса:

1. Почему второй код работает ? Ведь у класса COM нет такого свойства Provider и метода Open тоже нет. Или у ком объекта можно вызывать методы напрямую ?

2. Если все таки можно, почему не работает первый код ? И как вставить значение в Excel ?


Заранее спасибо.
Старый 20.03.2002, 18:16   #2  
rkouznet is offline
rkouznet
Участник
 
4 / 10 (1) +
Регистрация: 20.03.2002
Адрес: Санкт-Петербург
1. Работает, потому что правильно.
У класса COM таких методов и свойств нет. Но они есть у объектов COM, классов соответсвенно ADODB.Connection и ADODB.Recordset. В этом и состоит концепция COM (ActiveCell - тоже ведь не свойство COM! а объекта COM-класса Excel.Application)

2. Не работает потому что неправильно. Axapta тут ни при чем. Если аналогичное написать в VBA напрмер в том же Word, то будет ошибка, т.к сразу после создания объекта ActiveCell не определено (Nothing). Соответственно и о его свойстве Value никто не знает.
Используйте чтонибудь ниже уровнем, например Excel.Worksheet, у которого есть Sheets, а у тех Cells
Старый 20.03.2002, 18:58   #3  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,374 / 454 (20) +++++++
Регистрация: 03.12.2001
Мда, поспешил.

X++:
    COM wb;
    COM cn

    cn = new COM("Excel.Application");
    cn.Visible = True;
    wb = cn.Workbooks.Add();
    cn.ActiveCell.Value = "1";
Вот этот код работает в Word'е, но не работает в Аксапте.

Говорит, что в строке ( cn.Visible = True; ) - "Таблица находится вне диапазона или не существует".

Непонятно также откуда Аксапта берет информацию о методах и свойствах СОМ сервера. В VB я подключаю соответсвующую библиотеку, в Delphi делаю импорт tlb, здесь же нет ничего подобного.
Старый 20.03.2002, 20:37   #4  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,038 / 3955 (190) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
1. Аксапта работает через позднее связывание. tlb нужны для раннего связывания. См. документацию на COM.

2. Может быть не в тему... Данные гораздо удобнее переносить не программированием, а через обычный буфер обмена.
= Выделяем несколько строк (или все строки) в любой таблице (гриде)
= копируем в буфе (Ctrl+C)
= в Excel-е вставляем из буфера (Ctrl+V)
__________________
GitHub, Facebook, mazzy.priot, mazzy.music, coub.
Старый 20.03.2002, 21:00   #5  
rkouznet is offline
rkouznet
Участник
 
4 / 10 (1) +
Регистрация: 20.03.2002
Адрес: Санкт-Петербург
Цитата:
Изначально опубликовано Андре

COM wb;
COM cn
cn = new COM("Excel.Application");
cn.Visible = True;
wb = cn.Workbooks.Add();
cn.ActiveCell.Value = "1";

Вот этот код работает в Word'е, но не работает в Аксапте.
Навряд ли. Word на попытке выполнить здесь Workbooks.Add оно свалится, т.к. на момент связывания Workbooks будет не иметь определнных свойств. Лучше обращаться напрямую к объекту класса ExcelWorksheet, или Execl.Workspace
Второе, - присвоение может и не поддердживаться. Попытайтесь так -
сn.Visible(True);
Это такое же свойство как и Provider для ADODB.Connection

Цитата:

Непонятно также откуда Аксапта берет информацию о методах и свойствах СОМ сервера. В VB я подключаю соответсвующую библиотеку, в Delphi делаю импорт tlb, здесь же нет ничего подобного.
Это если вы делаете статическое связываение.
А можно ведь ничего и не импортировать. - Смысл использования COM в том, что приложение может и не знать заранее объект какого приложения, какого класса вы создаете, а определять это в момент выполнения. Так и здесь - Аксапта(Delphi-приложение, Word что угодно) обращается к библиотекам COM инетерфейса (ole), та в registry смотрит id класса имеющего нимаенование Excel.Application, находит сервер-приложение, активизирует его, опрашивает и т.д.....
Старый 21.03.2002, 15:20   #6  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,374 / 454 (20) +++++++
Регистрация: 03.12.2001
Цитата:
rkouznet

Навряд ли. Word на попытке выполнить здесь Workbooks.Add оно свалится, т.к. на момент связывания Workbooks будет не иметь определнных свойств.
У меня это работало. В Word'е.


Цитата:
Лучше обращаться напрямую к объекту класса ExcelWorksheet, или Execl.Workspace
Извините, но я не понял :-(.

Excel.Worksheet у меня не существует, так как в момент создания Excel.Application у меня нет ни Worbook, ни Worksheet. Что такое Excel.WorkSpace я вообще не нашел.

Цитата:
А можно ведь ничего и не импортировать. - Смысл использования COM в том, что приложение может и не знать заранее объект какого приложения, какого класса вы создаете, а определять это в момент выполнения. Так и здесь - Аксапта(Delphi-приложение, Word что угодно) обращается к библиотекам COM инетерфейса (ole), та в registry смотрит id класса имеющего нимаенование Excel.Application, находит сервер-приложение, активизирует его, опрашивает и т.д.....
Это я понял. Но почему, когда я набираю
cn.
у меня не появляется список доступных методов. Например как в других средах разработки. Разработчики Аксапты не предусмотрели ?

А каким образом я могу узнать, что я могу указать после точки. Я бы мог посмотреть это в любой другой среде разработки, но что толку то: приведенный выше код работает в Word (работает - я проверял !!!), но не работает в Аксапте. :-((

Как узнать какие методы сервер-приложения я могу вызывать в Аксапте ?????
Старый 21.03.2002, 21:48   #7  
rkouznet is offline
rkouznet
Участник
 
4 / 10 (1) +
Регистрация: 20.03.2002
Адрес: Санкт-Петербург
Цитата:
У меня это работало. В Word'е.
Только если tlb импортировано

Цитата:
Что такое Excel.WorkSpace я вообще не нашел
Это надо смотреть в доке на Excel

Цитата:
Это я понял. Но почему, когда я набираю
cn.
у меня не появляется список доступных методов. Например как в других средах разработки. Разработчики Аксапты не предусмотрели ?
А каким образом я могу узнать, что я могу указать после точки. Я бы мог посмотреть это в любой другой среде разработки, но что толку то: приведенный выше код работает в Word (работает - я проверял !!!), но не работает в Аксапте. :-((
Как узнать какие методы сервер-приложения я могу вызывать в Аксапте ?????
какие методы сервер-приложения доступны можно узнать читая документацию по конкретному приложению- серверу.

При позднем связывании не будет никакой подсказки. Какие методы/свойства становится известно в момент выполнения, т.е. в данном случае после создания объекта COM-класса ( не класса COM что в Axapta, а COM-класса.)


Цитата:
Извините, но я не понял
Excel.Workspace - рабочее пространство Excel со всеми workbooks и их worksheets. Это отдельный COM-класс, такой же как Excel.Application или ExcelWorksheet. Все это не существует кончно, пока не создать. <i> = new COM(".... </i>
Старый 21.03.2002, 21:59   #8  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,038 / 3955 (190) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
И все таки...

Разрешите еще раз высказать, что:
1. данные можно перенести через clipboard
2. для переноса в эксель можно воспользоваться документооборотом (Разное \ Управление документооборотом \ Типы документов)

У меня еще не ни разу возникало необходимости писать руками выгрузку данных из Аксапты в Эксель.

Андре, мне кажется (я, конечно, могу ошибаться), что ты влезаешь в низкоуровневое программирование совершенно напрасно. Что у тебя за задача то?
__________________
GitHub, Facebook, mazzy.priot, mazzy.music, coub.
Старый 21.03.2002, 23:42   #9  
Эдуард Киселев is offline
Эдуард Киселев
Участник
 
7 / 10 (1) +
Регистрация: 27.12.2001
Адрес: Москва
Цитата:
У меня еще не ни разу возникало необходимости писать руками выгрузку данных из Аксапты в Эксель.
Сергей, боюсь в этой теме тебя не поймут, а может даже и не заметят. По моим наблюдениям программисты даже простейших бытовых операций(не говоря уже об использовани ERP-системы) не могут совершать без использования красивого програмного кода и при этом еще желательно собственноручно написанного.

С уважением,
__________________
Эдуард Киселев, сотрудник Группы Компаний "Счастливый Кроха"
Старый 22.03.2002, 09:34   #10  
Maxim Gorbunov is offline
Maxim Gorbunov
Administrator
Соотечественники
Лучший по профессии 2009
 
2,483 / 627 (25) +++++++
Регистрация: 27.11.2001
Адрес: Dubai, UAE
Цитата:
Изначально опубликовано mazzy
...Данные гораздо удобнее переносить не программированием, а через обычный буфер обмена.
Сергей, перенос данных через буфер обмена реализован в Axapta не очень удачно. Основная проблема, которая возникает при его использовании в том, что в буфер копируется не строчка FormGridControl, а именно строчка FormDataSource (в буфер попадают все колонки таблицы, а не только колонки, отображаемые в Grid).

У нас когда-то тоже возникала такая задача. В итоге появилось решение, которое можно использовать в качестве альтернативы двум, предложенным выше: было решено использовать автоотчет с выводом в текстовый файл. В итоге получается CSV-файл, в котором в качестве разделителя выступает символ табуляции. Excel такие файы прекрасно понимает. Разумеется, возникает проблема с выбором нужных строчек для включения в этот отчет (придется создавать query). В общем и это решение, и решение с буфером обмена не достаточно гибкие, для того, чтобы решить задачу по переносу данных в Excel в полном объеме. Можно попытаться довести до ума решение с отчетом (формировать query в зависимости от выбора пользователя), но идеологически решение по связи с Excel через COM Connector более правильное.
__________________
Not registered yet? Register here!
Have comments, questions, suggestions or anything else regarding our web site? Don't hesitate, send them to me
Старый 22.03.2002, 09:40   #11  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,374 / 454 (20) +++++++
Регистрация: 03.12.2001
Спасибо всем за советы. Постараюсь с COM разобраться за выходные. Надеюсь получится, а нет - ждите новых вопросов.

Цитата:
mazzy
Андре, мне кажется (я, конечно, могу ошибаться), что ты влезаешь в низкоуровневое программирование совершенно напрасно. Что у тебя за задача то?
В принципе и задачи то конкретной нет. Хочется попробовать и разобраться, так как это скорее всего мне еще понадобится.

Насчет документооборота - не уверен, что он мне всегда поможет. Например - подготовка договора. Договор составляется на основании заказа (Таблица 1 - Заказы), какие-то данные берутся из Таблицы 2 - Клиенты, плюс еще нужен счет из Таблицы 3 - Банковские счета.
Документооборот помогает выводить данные из двух связанных таблиц, но заставить его делать это из цепочки трех связанных таблиц у меня не получилось.

Документооборот выручает тогда, когда нужно взять какие-то данные из какой-то таблицы вывести их в документ. А если их предварительно надо как-то обработать, то боюсь он уже не поможет.

Мне кажется возможность посчитать что-то в тексте своей программы и вывести результат в определенное место в Excel или Word будет очень полезной.
Старый 22.03.2002, 17:11   #12  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,038 / 3955 (190) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
max, точно!
Я забыл про этот способ.

Про датасорс. Есть такая партия. Но! После переноса записи обработать в Екселе нормальными формулами гораздо легче, чем заниматься программированием. Не так ли?

Будем ждать view...


Андре, понял.

Просто мне казалось, что гораздо проще выгрузить данные в Ексель как есть, а затем обрабатываеть их в Екселе.

Причем: на обработку в Ексель можно посадить менеджера, а не программиста со знанием СОМ
__________________
GitHub, Facebook, mazzy.priot, mazzy.music, coub.
Старый 25.03.2002, 08:57   #13  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,374 / 454 (20) +++++++
Регистрация: 03.12.2001
Все. Проблема решена.

X++:
    COM ExApp,Wbs,Wb,Wss,Ws,Rng;

    ExApp = new COM("Excel.Application");
    ExApp.Visible(True);
    Wbs = ExApp.Workbooks();
    Wb = Wbs.Add();
    Wss = Wb.WorkSheets();
    Ws = Wss.Add();
    Rng = Ws.Range("A1");
    Rng.Value2(1);
Вот так - работает. Похоже все оказалось гораздо проще.

Как я понял:

1. Аксапта не допускает использовать конструкции такого вида "%.%.%" с объектами типа COM, то есть такое выражение следует разбить на два таких "%.%". Если мы нарушаем это правило, то Аксапта ругается - "Таблица находится вне диапазона или не существует".
2. При этом Аксапта на этапе компиляции не проверяет корректность вызываемых методов. То есть мы можем написать: ExApp.ProsoMetod() и Аксапта это откомпилирует, а ошибка появится только во время выполнения.

P.S.

Если последнюю строку заменить на:

Rng.Value(1);

то этот вариант перестанет работать в Аксапте, хотя он прекрасно работает в Worde, Delphi и т.д.

Не понятно.

P.S.

Цитата:
rkouznet
Только если tlb импортировано.
Я конечно могу ошибаться, но по-моему это не так. По крайне мере в Tools/References напротив пункта Microsoft Word.. галочка не стоит. Кроме того, следующий код:

X++:
procedure TForm1.Button1Click(Sender: TObject);
var ExcelApp, Workbook, Range, Cell1, Cell2, ArrayData  : Variant;
begin
  ExcelApp := CreateOleObject('Excel.Application');
  Workbook := ExcelApp.WorkBooks.Add;
  WorkBook.WorkSheets[1].Cells[1, 1]:='11';
  ExcelApp.Visible:=true;
end;
прекрасно работает в Delphi без импортирования tlb.
Старый 26.01.2005, 21:56   #14  
Antidot is offline
Antidot
Участник
Аватар для Antidot
 
65 / 10 (1) +
Регистрация: 16.12.2004
2 Mazzy:
Не подскажете каким образом через Разное \ Управление документооборотом \ Типы документов можно экспортировать данные в Excel?
Через администрирование \ Периодические операции \ Экспорт импорт понятно, но сделать так чтобы при создании листа COM лист заполнялся данными из текущей формы или таблиц (доступных через кнопку Настройки) не получилост.
Старый 09.02.2005, 17:31   #15  
malex is offline
malex
Участник
 
164 / 19 (1) ++
Регистрация: 10.08.2004
Адрес: Тверь, Москва
?
2All

Не подскажете как в Axatpe реализовать такую строчку VB:

Worksheets("Лист1").Range("B7").Borders(7).LineStyle = 1
Старый 09.02.2005, 17:36   #16  
kashperuk is offline
kashperuk
Senior SDE, Dynamics AX
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,353 / 2066 (77) +++++++++
Регистрация: 30.05.2004
Адрес: Копенгаген, Дания
Это метод класса COM_ExcelDocument_RU
Здесь есть все, что тебе нужно.

PHP код:
void setRangeBorder(MSOfficeBookMark_RU _bookMark,
                    
int _lineStyle 1// xlContinuous
                    
int _lineWeight 1// xlContinuous
                    
boolean _inside False// нужно ли рисовать границы для внутренних клеток
                    
int _workSheetNumber 1)
{
    
COM     comRangecomBorderscomBorder;
    ;

    
comRange this.findRange(_bookMark,_workSheetNumber);
    if (
comRange)
    {
         
comBorders comRange.Borders();

         
comBorder comBorders.Item(7); // left
         
comBorder.Weight(_lineWeight);
         
comBorder.LineStyle(_lineStyle);

         
comBorder comBorders.Item(8); // top
         
comBorder.Weight(_lineWeight);
         
comBorder.LineStyle(_lineStyle);

         
comBorder comBorders.Item(9); // bottom
         
comBorder.Weight(_lineWeight);
         
comBorder.LineStyle(_lineStyle);

         
comBorder comBorders.Item(10); // right
         
comBorder.Weight(_lineWeight);
         
comBorder.LineStyle(_lineStyle);

         if (
_inside)
         {
             
comBorder comBorders.Item(2); // inside
             
comBorder.Weight(_lineWeight);
             
comBorder.LineStyle(_lineStyle);
         }
    }

За это сообщение автора поблагодарили: VKUR (1).
Старый 09.02.2005, 18:06   #17  
malex is offline
malex
Участник
 
164 / 19 (1) ++
Регистрация: 10.08.2004
Адрес: Тверь, Москва
kashperuk
Большое спасибо за ответ.

Правда в ComExcelDocument_RU я такого метода (setRangeBorder) не нашел (3.0 SP3 CU1), поэтому пришлось делать без обертки:

PHP код:
    #define.xlEdgeLeft(7)
    #define.xlContinuous(1)

    
COM ExcelAppWorkBooksWorkBookWorkSheetsWorkSheetRngBordersBorder;
;
    
ExcelApp = new COM("Excel.Application");
    
ExcelApp.Visible(True);
    
WorkBooks ExcelApp.Workbooks();
    
WorkBook WorkBooks.Add();
    
WorkSheets WorkBook.WorkSheets();
    
WorkSheet WorkSheets.Add();
    
Rng WorkSheet.Range("B7");
    
Borders Rng.Borders();
    
Border Borders.Item(#xlEdgeLeft);
    
Border.lineStyle(#xlContinuous); 
Старый 09.02.2005, 18:13   #18  
kashperuk is offline
kashperuk
Senior SDE, Dynamics AX
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,353 / 2066 (77) +++++++++
Регистрация: 30.05.2004
Адрес: Копенгаген, Дания
Не нашел?? Странно.
Может правда это я сам добавлял, и уже не помню.
Всегда рад помочь.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Как передать значение переменной Аксапты COM-объекту AxaptaUser DAX: Программирование 2 11.07.2007 18:03
Свертка строк при выводе из Аксапты в Excel Zabr DAX: Программирование 20 21.02.2006 15:21
Как вставить в Excel имя из аксапты? Prof DAX: Программирование 2 23.09.2005 13:50
Импорт из Excel через шаблон стандартными средствами аксапты NV DAX: Функционал 5 20.01.2005 12:26
как считать значение из Excel - файла Miktel DAX: Программирование 5 01.10.2004 10:24
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 03:53.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.