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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 15.08.2013, 18:09   #1  
kair84 is offline
kair84
Участник
 
47 / 58 (2) ++++
Регистрация: 15.04.2010
Адрес: Belarus
Быстрый способ выгрузить данные из формы в Excel
Видел несколько тем на эту тему )), решения весьма громоздкие, и замороченные, нашел простой способ и решил поделиться.

В Ax 2009 и Ax 2012, это уже есть, но для 3й и 4й версии пригодится.
Не нужно перебирать объекты формы и париться с источниками данных, все просто !

X++:
#Task
void clicked()
{   TextBuffer TB = new TextBuffer();
    ComExcelDocument_RU Excel;
    Table Cursor;
    ;

    //super();

    if (!Table_ds.anyMarked())
    {
        cursor.data(Table);
        element.task(#taskSelectAll);
    }
    element.task(#taskCopy);
    TB.fromClipboard();

    if (cursor)
    {
        Table_ds.research();
        Table_ds.findRecord(cursor);
    }

    excel  = new COMExcelDocument_RU();
    excel.newFile("",false);

    excel.pasteSpecialFromTextBuffer("A1", TB);
    excel.setAutoFiler("A1");
    excel.visible(true);
    excel.finalize();

}
За это сообщение автора поблагодарили: lev (10), Jorj (1), Player1 (1).
Старый 19.08.2013, 08:05   #2  
Player1 is offline
Player1
Участник
Самостоятельные клиенты AX
 
306 / 137 (5) +++++
Регистрация: 21.04.2008
Ну а метод task() можно узреть? А заодно и pasteSpecialFromTextBuffer() с setAutoFiler() раз речь о dax3 и 4 зашла
Старый 19.08.2013, 09:20   #3  
kair84 is offline
kair84
Участник
 
47 / 58 (2) ++++
Регистрация: 15.04.2010
Адрес: Belarus
Task() не перекрыт, вставка данных в Excel с пом. буфера обмена - тема затертая до дыр, если еще не в курсе - поиск по форуму. или вот, автофильтр и прочие "штуки-дрюки" в Excel, если их нет в классе ComExcelDocument_RU, Я лично выцепляю с пом. записи макроса. потом добавляю соответствующий метод в класс
X++:
void setAutoFiler(BookMark _bookMark, int _workSheet = 1)
{
    COM     comRange;
    ;

    comRange = this.findRange(_bookMark, _workSheet);
    comRange.AutoFilter(1);
}
Старый 19.08.2013, 10:04   #4  
Player1 is offline
Player1
Участник
Самостоятельные клиенты AX
 
306 / 137 (5) +++++
Регистрация: 21.04.2008
Цитата:
Сообщение от kair84 Посмотреть сообщение
Task() не перекрыт[/XPP]
Можно тогда узнать Task ID макроса #taskSelectAll
Цитата:
Сообщение от kair84 Посмотреть сообщение
вставка данных в Excel с пом. буфера обмена - тема затертая до дыр, если еще не в курсе - поиск по форуму[/XPP]
вкурсе
Цитата:
Сообщение от kair84 Посмотреть сообщение
или вот[/XPP]
не нужно отсылать на другой форум, даже если мы тут продублируем какой-то вопрос, будет только лучше
Цитата:
Сообщение от kair84 Посмотреть сообщение
Я лично выцепляю с пом. записи макроса.[/XPP]
Вы - молодец.

Я не зря спросил про pasteSpecialFromTextBuffer(), мне вот непонятно зачем в него передается TB.
Старый 19.08.2013, 11:11   #5  
kair84 is offline
kair84
Участник
 
47 / 58 (2) ++++
Регистрация: 15.04.2010
Адрес: Belarus
Цитата:
Можно тогда узнать Task ID макроса #taskSelectAll
AOT\Macros\Task - об этом говорит первая строка #Task

Да, можно было обойтись и без TB, продублировать проверки. и вызвать comRange.PasteSpecial(), но Я сторонник подхода, максимально использовать код повторно, и не плодить дубли.
И я отправил Вас на форум к mazzy только потому, что там в одном месте собрано несколько полезных постов на эту тему, которые в свою очередь являются репостами инфы с данного форума.

Цитата:
Цитата:
вставка данных в Excel с пом. буфера обмена - тема затертая до дыр, если еще не в курсе - поиск по форуму
вкурсе
Цитата:
Я не зря спросил про pasteSpecialFromTextBuffer(), мне вот непонятно зачем в него передается TB.
Эти ответы противоречат друг другу

Судя по дате регистрации на форуме, с Ах Вы знакомы давно, и мне не понятно как у Вас могут возникать такие вопросы.
Если у Вас есть предложения как еще упростить/улучшить этот процесс, выкладывайте свой вариант, а не задавайте наводящие вопросы.
Старый 19.08.2013, 11:40   #6  
Player1 is offline
Player1
Участник
Самостоятельные клиенты AX
 
306 / 137 (5) +++++
Регистрация: 21.04.2008
Цитата:
Сообщение от kair84 Посмотреть сообщение
AOT\Macros\Task - об этом говорит первая строка #Task
У меня нет, не говорит.
X++:
// Task-ID values, to be used with formControl's
// return value from the method task()
//--------------------------------------------------------

#define.taskF1(257)
#define.taskEnter(288)
#define.taskShiftEnter(307)
#define.taskNew(260)...
Цитата:
Сообщение от kair84 Посмотреть сообщение
Да, можно было обойтись и без TB
Цитата:
Сообщение от kair84 Посмотреть сообщение
мне не понятно как у Вас могут возникать такие вопросы
Вот эти ответы действительно противоречат друг другу. Я не говорю что не правильно так, я хотел убедиться что в методе именно так, как я подумал и лишь поэтому попросил его.

Вариант свой выложить немогу - у меня не получается реализовать без некоторых вещей, о которых я и спрашиваю в данной ветке.
Старый 19.08.2013, 12:53   #7  
kair84 is offline
kair84
Участник
 
47 / 58 (2) ++++
Регистрация: 15.04.2010
Адрес: Belarus
Если нет кода нужного Вам, перекрываете на форме метод task(), добавляете точку останова, и ловите TaskID
X++:
#define.taskCopy(771)
#define.taskSelectAll(778)
Вот отличный пример вставки данных в Excel с пом. буфера обмена
X++:
public void insertText(BookMark _bookMark, TextBuffer _text, int _workSheet = 1)
{
    COM              XLSWorkSheet, XLSrange;
    TextBuffer       tempBuffer;                  // To store clipboard contents
    int              nextI,
                    maxI = 3;
    ;

    // Если содержимое TextBuffer вообще не введено, то PastSpecial даст ошибку,
    // а если заведена пустая строка, то нет смысла делать PastSpecial
    if (! _text.size())
    {
      return;
    }

    // Initializing XLSWorkSheet object
    XLSWorkSheet    = this.getWorkSheet(_workSheet);
    if (!XLSWorkSheet)
    {
       throw error("@DIS6043");
    }

    // Initializing XLSRange object
    XLSrange                = this.findRange(_bookMark,_workSheet);
    if (!XLSrange)
    {
       throw error("@SYS27391");
    }
    XLSrange.select();

    for (nextI = 1; nextI <= maxI; nextI++)
    {
        try
        {
            // Storing clipboard contents
            tempBuffer = new TextBuffer();
            tempBuffer.fromClipboard();

            // Preparing text to be inserted
            _text.toClipboard();

            // Inserting text from clipboard
            ///ГЛЮК XLSWorkSheet.pasteSpecial(1); // 1 - "Text only" mode
            XLSWorkSheet.pasteSpecial(0);

            // Restoring clipboard contents
            tempBuffer.toClipboard();

            // В случае успеха, прерываю цикл
        break;
        }
        catch(Exception::Error)
        {
                // в случае ошибки удаляю последнюю строку infolog,
                // которая генерится автоматически ошибкой COM
                if (infolog.line())
                {
                        infolog.clear(infolog.line()-1);
                }
                // предпринимаю очередную попытку сделать вставку через буфер
        }
    }   // for (nextI)

    // Если выход из цикла for произошел "штатно", то значение счетчика будет больше максимально допустимого значения
    if (nextI > maxI)
    {
            throw error("Ошибка при копировании данных через буфер обмена.");
    }
}
а это упрощенный его вариант
X++:
public void pasteSpecialFromTextBuffer(BookMark _bookMark, TextBuffer _buffer, int _workSheet = 1)
{
   COM  XLSWorkSheet, XLSrange;
   ;

    if (! _buffer.size())
        return;

    if (! m_comDocument)
        throw error(strfmt("@GEE6401", this.getApplicationName()));

    XLSWorkSheet    = this.getWorkSheet(_workSheet);
    if (!XLSWorkSheet)
        throw error("@DIS6043");

    XLSrange                = this.findRange(_bookMark,_workSheet);
    if (!XLSrange)
        throw error("@SYS27391");

    XLSrange.select();

    _buffer.toClipboard();
    XLSrange.pasteSpecial(0);
}
Теги
excel, grid, выгрузить данные

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Самый быстрый способ выгрузить данные из формы в CSV ? DTD DAX: Программирование 12 12.10.2010 11:17
Не отображаются данные при вызове меню айтема с формы zemius DAX: Программирование 3 21.10.2009 10:54
Быстрый способ вывода данных в Excel с картинками Zlojbarsuk DAX: Программирование 10 23.10.2008 20:13
Какой способ для связи Axapta с Excel вы предпочитаете? Gustav DAX: База знаний и проекты 37 09.06.2006 09:02
Русская локализация Axapta 3 ? SlavaK DAX: Администрирование 59 01.07.2003 22:38
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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