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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 01.10.2010, 18:30   #1  
DTD is offline
DTD
Участник
 
183 / 18 (1) ++
Регистрация: 09.08.2005
Самый быстрый способ выгрузить данные из формы в CSV ?
Стоит задача выгрузить данные из формы (к примеру 20 полей из которых 5-7 display x 50000 строк) максимально быстро по отношению к стандартной функции выгруза данных в Эксель.

Пробовал передавать в класс QueryRun и писать в CSV -на этом обьеме выходит примерно тоже самое что и стандартный Export to Excel (5 мин / 7 мин):

X++:
itemTable = _queryRun.get(tablenum(ItemTable));
outputFileLine = conpoke(outputFileLine , 1, itemTable.ItemId);
          ...
fileCSV.write(outputFileLine);
На гораздо большем обьеме видно ускорение, но хотелось бы ускорить малые обьемы тоже, есть идеи дальнейшей оптимизации ? Я так понимаю от пересчета display полей никуда не деться в любом случае ..
__________________
_databaseTransDelete ... bl@$ !
Старый 01.10.2010, 19:39   #2  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,691 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Под "стандартной" понимается автоотчет? А зачем Вы в Excel выгружали? Выгружайте в TXT (файл ASCII), потом открывайте полученный файл в Excel.
Старый 01.10.2010, 20:30   #3  
DTD is offline
DTD
Участник
 
183 / 18 (1) ++
Регистрация: 09.08.2005
Под "стандартной" понимается кнопка выгруза в Эксель на форме (Ctrl+E).

Я не выгружал в Эксель, я выгружал в CSV а потом открывал полученный файл в Эксель, что подозреваю по скорости должно быть стравнимо с использованием TXT.

Автоотчет(Ctrl+P) занимает еще больше времени.
__________________
_databaseTransDelete ... bl@$ !
Старый 06.10.2010, 12:52   #4  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
647 / 350 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Можно использовать класс ComExcelDocument_RU. Я бы для удобства даже создал бы собственный класс для работы с CSV. Возможно это сократит выгрузку до 2-3 минут.
__________________
// no comments
Старый 06.10.2010, 20:21   #5  
DTD is offline
DTD
Участник
 
183 / 18 (1) ++
Регистрация: 09.08.2005
Цитата:
Сообщение от dech Посмотреть сообщение
даже создал бы собственный класс для работы с CSV.
Это как раз то что я сделал.

Доступа к *RU классам нет.
__________________
_databaseTransDelete ... bl@$ !
Старый 11.10.2010, 14:53   #6  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
DTD, попробуйте вот это Классы для генерации отчетов в Excel . Кстати, у нас этот класс довольно таки переработан, там по ссылке лежит старая версия, так что если заинтересуетесь, выложу новую.
Старый 11.10.2010, 15:46   #7  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,691 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Eldar9x

А Ваш класс можно адаптировать для работы с картинками?

Прайс по номенклатуре с картинками хотят. Вот и пытаюсь сообразить, как это лучше сделать.

У "обычного" Excel проблема в том, что картинка не привязана к ячейке (частичную привязку сделать можно, но это не совсем то). С XML просто не в курсе, как сделать. В идеале, конечно, хотелось бы вставлять не ссылку на картинку, а бинарную информацию из контейнерного поля Axapta, ну, или из файла. Чтобы полученный файл был самодостаточен. Без необходимости тащить набор файлов.
Старый 11.10.2010, 16:07   #8  
Zabr is offline
Zabr
Участник
Axapta Retail User
 
1,202 / 345 (14) ++++++
Регистрация: 26.06.2002
Адрес: Москва
Вот так для таблицы. А как из формы выгружать, думаю сами прикрутите...
X++:
    AsciiIo     txtFile;
    Inventtable Inventtable;
    ;
    txtFile = new AsciiIo( 'C:\\test.csv' ,"W");
    txtFile.outFieldDelimiter(  num2char(9) ); // разделитель = табуляция
    txtFile.writeExp(['ItemId', 'ItemName']);
    while select inventtable
    {
         txtFile.writeExp( [Inventtable.ItemId,inventtable.itemname] );
    }
Старый 11.10.2010, 16:11   #9  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Eldar9x

А Ваш класс можно адаптировать для работы с картинками?

Прайс по номенклатуре с картинками хотят. Вот и пытаюсь сообразить, как это лучше сделать.

У "обычного" Excel проблема в том, что картинка не привязана к ячейке (частичную привязку сделать можно, но это не совсем то). С XML просто не в курсе, как сделать. В идеале, конечно, хотелось бы вставлять не ссылку на картинку, а бинарную информацию из контейнерного поля Axapta, ну, или из файла. Чтобы полученный файл был самодостаточен. Без необходимости тащить набор файлов.
у нас сделано так...

картинки хранятся в табличке CompanyImage.

1. при заполнении строк отчета сохраняется номер строки, куда будет вставляться картинка, и ItemId.
2. когда уже весь отчет заполнен и выведен выполняется вставка картинок. пробегаемся по контейнеру, заполненному в пункте 1, и для каждой строки вставляем картинку. вот пример кода вставки картинки:
X++:
    Image           pictureImage;
    CompanyImage    companyImage;
    COM             Range;
    ExcelRange   rng;
    Image           Image   = new Image();
    ;

    companyImage = inventTable::find(_ItemID).CompanyImage();

    try
    {

        if (CompanyImage.Image)
        {
            Image.setData(CompanyImage.Image);
            Image.resize(128,96,3); // тут нужный размер подгоняется
            Range = excel.Range(i,j); // i - номер строки, j - столбец
            Range.select();
            Image.clipboardCopy();
            excel.WorkSheetCur().pasteSpecial(0); // 1 - "Text only" mode
       }

    }
    catch (EXCEPTION::Warning)
    {
        error(StrFmt("@SYS19312",CompanyImage.Image));
    }
получается не плохо
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем

Последний раз редактировалось lev; 11.10.2010 в 17:39. Причина: подредактировал код
За это сообщение автора поблагодарили: Zabr (3).
Старый 11.10.2010, 16:20   #10  
sukhanchik is offline
sukhanchik
Administrator
Аватар для sukhanchik
MCBMSS
Злыдни
Лучший по профессии 2015
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,309 / 3546 (125) ++++++++++
Регистрация: 13.06.2004
Адрес: Москва
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
У "обычного" Excel проблема в том, что картинка не привязана к ячейке (частичную привязку сделать можно, но это не совсем то)
Это можно решить - путем установки картинки в левый верхний угол ячейки, после чего картинку уменьшить в масштабе.
Собственно - стояла такая же задача. Что делал:
а) Воспользовался семейством классов SysExcelApplication* чтобы не заморачиваться между 2007-м и 2003-м офисом.
б) Использовал шаблон, в который вставлял данные. Ориентировался на ширину ячеек, заданную в шаблоне.
в) Ячейки заполнял как обычно - циклом - т.е. безо всяких там массивов и буферов обмена.
г) Картинки брал из аттачей. Там штатный код распаковывает во временную папку файл. Что удобно - этот код сразу анализирует как хранится файл. Т.е. немного понадергав строчек кода - получил путь к файлу (постоянному или временно распакованному)
д) Через объект Picture (Excel-ный) вставлял картинку (при вставке скармливается путь к файлу)
е) Получал координаты вставленной картинки. Получал координаты конкретного столбца текущей строки (т.е. текущей ячейки)
ж) Через методы Picture.ShapeRange().Scale* масштабировал картинку до нужной ширины (высота автоматически изменялась) с учетом существования (и очень небольшого) предела по высоте ячейки (по ширине предел тоже существует - но я смотрел на ширину из шаблона)

Собсно все...
Скорость конечно не ахти... Но дождаться можно. Эффектно. Но бестолково . Потому что следующее - с чем столкнулись манагеры - это с тем - что этот прайс (фактически - коммерческое предложение) очень много весит в мегабайтах. А если они и могут отправить такой прайс - то получатель (особенно в регионах) с интернетом со скоростью диалапа утомляется получать данный файл.
В результате - они его уже ручками урезают (удаляя картинки) и уже шлют
__________________
Возможно сделать все. Вопрос времени
Старый 12.10.2010, 11:17   #11  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Eldar9x

А Ваш класс можно адаптировать для работы с картинками?

Прайс по номенклатуре с картинками хотят. Вот и пытаюсь сообразить, как это лучше сделать.

У "обычного" Excel проблема в том, что картинка не привязана к ячейке (частичную привязку сделать можно, но это не совсем то). С XML просто не в курсе, как сделать. В идеале, конечно, хотелось бы вставлять не ссылку на картинку, а бинарную информацию из контейнерного поля Axapta, ну, или из файла. Чтобы полученный файл был самодостаточен. Без необходимости тащить набор файлов.
ух ты, отличная идея, вообще не думал об этом, если честно ). Попробую добавить такую функциональность в этот класс.
Старый 11.10.2010, 18:46   #12  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,691 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Спасибо, конечно, только ведь картинка в Excel находится "поверх" самого листа. Т.е. изменение размер ячеек не приводит к изменению картинки. Частично, это решается через

ActiveSheet.Shapes("Picture 1").Placement = xlMoveAndSize

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

Вот я и спрашиваю, может через XML можно интегрировать картинку в лист Excel ? Т.е. действительно интегрировать, а не "сделать вид".
Старый 12.10.2010, 10:57   #13  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Можно использовать защиту листа (картинка, как защищаемый объект, а ячейки - нет) - картинку нельзя будет двигать мышью, но при изменениях смежных ячеек она будет изменять положение.

К сожалению, задать картинку, как фон для ячейки нельзя даже в 2010-м офисе, по-этому и через xml это сделать тоже нельзя
__________________
Axapta v.3.0 sp5 kr2
Теги
ax2009, csv, excel, экспорт

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Не отображаются данные при вызове меню айтема с формы zemius DAX: Программирование 3 21.10.2009 10:54
Быстрый способ вывода данных в Excel с картинками Zlojbarsuk DAX: Программирование 10 23.10.2008 20:13
Помогите выгрузить данные maag DAX: Функционал 0 30.11.2006 12:06
Как передать в отчет отфильтрованные данные из формы? ArturK DAX: Программирование 7 23.04.2004 13:59
Русская локализация Axapta 3 ? SlavaK DAX: Администрирование 59 01.07.2003 22:38

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

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

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