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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 02.10.2006, 22:21   #1  
zipo is offline
zipo
Участник
 
32 / 23 (1) +++
Регистрация: 16.05.2006
QueryTable
Добрый вечер, столкнулся с необходимостью импорта данных с веб'а.
Нашел тему на этом форуме о том как пользовать QueryTable через COM в экселе.
Импорт из html-файлов без использования внешнего парсера возможен?

Но никак не могу найти как проинициализировать QueryTable на исполнение с выбором источника данных из веб. Как это происходит в экселе при:
Данные -> Импорт внешних данных -> создать веб-запрос
Т.е. источник у меня не постоянный и необходимо пользователю дать его выбирать и потом обработывать данные.
Старый 03.10.2006, 09:19   #2  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от zipo Посмотреть сообщение
Добрый вечер, столкнулся с необходимостью импорта данных с веб'а.
Нашел тему на этом форуме о том как пользовать QueryTable через COM в экселе.
Импорт из html-файлов без использования внешнего парсера возможен?
Ну, во-первых, спасибо, что обратились к моим скромным наработкам
Цитата:
Сообщение от zipo Посмотреть сообщение
Но никак не могу найти как проинициализировать QueryTable на исполнение с выбором источника данных из веб. Как это происходит в экселе при:
Данные -> Импорт внешних данных -> создать веб-запрос
Т.е. источник у меня не постоянный и необходимо пользователю дать его выбирать и потом обработывать данные.
Во-вторых, можно чуть подробнее о самой задачке? Источник - не постоянный, но, надеюсь, набор возможно-доступных пользователю веб-страниц разумно ограничен?

В противном случае, не совсем понятно, получение какого рода информации предполагается и зачем это наворачивать в Axapta. И почему бы в этом случае не ограничиться использованием веб-браузера и простым ручным копированием нужной информации, например, в соответствующие поля форм Axapta.

В случае разумно ограниченного набора в общем случае Вам придется создать "шаблончики" QueryTable для каждой из страниц этого набора. Увы, это штучный товар, впрочем, так же как и сами веб-страницы. (Частные случаи различных сайтов на движках от одного производителя пока не рассматриваем )

Последний раз редактировалось Gustav; 03.10.2006 в 09:30.
Старый 03.10.2006, 10:14   #3  
zipo is offline
zipo
Участник
 
32 / 23 (1) +++
Регистрация: 16.05.2006
Задача построить линейные временные графики.
Например просто в аксапте вывести график зависимисти курса от времени, на фоне.
Т.е. пользователь выбирает сайт, выбирает нужную таблицу информации. Выбирает из этой информации данные на оси которые он бы хотел видеть в зависимости от времени. Выбирает период обновления информации.
И потом может наблюдать как изменялся к примеру курс валют за определенный период времени.
Источник данных не ограничен, поэтому шаблончиками не обойтись. Нужно предоставить возможность выбрать абсолютно любые данные для отображения.
Поэтому мне и нужно как-то запустить стандартное окно new web-query.
Как его запустить мне пока найти не удается. Везде используют или шаблончики на основе *.iqy файлов или прямой урл с параметрами.
Старый 03.10.2006, 10:37   #4  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от zipo Посмотреть сообщение
Поэтому мне и нужно как-то запустить стандартное окно new web-query.
Как его запустить мне пока найти не удается. Везде используют или шаблончики на основе *.iqy файлов или прямой урл с параметрами.
В Excel'е эта штука запускается такой командой VBA:

Application.Dialogs( xlDialogNewWebQuery ).Show

Оно?
Старый 03.10.2006, 11:46   #5  
zipo is offline
zipo
Участник
 
32 / 23 (1) +++
Регистрация: 16.05.2006
Да, оно.
Только при использовании в аксапте, выбивает стек трейс.
Говоря, что у метода Dialogs неправильное кол-во параметров.
Его можно исопльзовать только без параметров и у объекта Dialogs нету метода Show.

#define.xlDialogNewWebQuery(667)

xlApp = new COM('Excel.Application');

wbks = xlApp.Workbooks();
wbk = wbks.Add();

wkss = wbk.Worksheets();

Dlg = xlApp.Dialogs(#xlDialogNewWebQuery);
Dlg.Show();
Старый 03.10.2006, 12:02   #6  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Код:
static void Job52(Args _args)
{
     COM xlApp, wbks, wbk, wkss;
     COM Dlgs, Dlg;
 
     #define.xlDialogNewWebQuery(667)
 
     xlApp = new COM('Excel.Application');
     xlApp.Visible(true);
     wbks = xlApp.Workbooks();
     wbk = wbks.Add();
     wkss = wbk.Worksheets();
 
     Dlgs = xlApp.Dialogs();
     Dlg = Dlgs.Item( #xlDialogNewWebQuery );
     Dlg.Show();
}
"Торопиться не надо, да!"
За это сообщение автора поблагодарили: zipo (1).
Старый 03.10.2006, 12:41   #7  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Честно говоря, очень интересно, что Вы собираетесь делать дальше после того как способ активации нужного диалога найден. Всё, что может вернуть диалог - это true или false в зависимости от того, какую кнопку в конце концов нажал пользователь. На каком worksheet будем ловить новый объект QueryTable? Пользователь же может выбрать любой имеющийся лист или создать новый... Ну да, в принципе нетрудно перебрать коллекцию Worksheets... А на одну новую рабочую книгу планируете один веб-запрос? У Вас есть план дальнейших действий после диалога?
Старый 03.10.2006, 12:58   #8  
zipo is offline
zipo
Участник
 
32 / 23 (1) +++
Регистрация: 16.05.2006
Спасиб!
Каким-то чудом нужно отменить второй диалог, который позволяет выбрать месторасположение данных на страницах экселя.
Перебрать конечно можно, но выскакивающий эксель будет не сильно красиво смотреться.

А где Вы черпаете информацию по методам и свойствам VB?
Старый 03.10.2006, 13:30   #9  
zipo is offline
zipo
Участник
 
32 / 23 (1) +++
Регистрация: 16.05.2006
Если сначало создать QueryTable, а потом на нем вызвать диалог Edit Query, что эксель позволяет, то выйдет так как нужно. Вопрос только в том как вызвать Edit Query на уже созданном QueryTable ?
Старый 03.10.2006, 13:34   #10  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от zipo Посмотреть сообщение
А где Вы черпаете информацию по методам и свойствам VB?
Ну, в первую очередь, в файлах справки. Поищите у себя на компьютере файлы по маске VBAXL*.CHM (найденная "звездочка" может быть 9, 10, 11 в зависимости от версии Excel)

Еще из книжек. Из относительно свежеизданных рекомендую
Профессиональное программирование на VBA в Excel 2003
и
Excel 2003 и VBA. Справочник программиста
Старый 03.10.2006, 13:46   #11  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от zipo Посмотреть сообщение
Если сначало создать QueryTable, а потом на нем вызвать диалог Edit Query, что эксель позволяет, то выйдет так как нужно. Вопрос только в том как вызвать Edit Query на уже созданном QueryTable ?
Надо покопаться в этом направлении:
? Application.CommandBars("External Data").Controls(1).Caption
&Edit Query...

Конкретно - нужно, стоя на области данных запроса, вызвать метод
Application.CommandBars("External Data").Controls(1).Execute

Только, чего-то пока он у меня не очень хочет запускаться... Хотя для других команд меню аналогичный подход, помнится, работал...

Ну в общем, "порыхлите почву" в этом направлении. Заставьте его сначала в самом Excel подняться.
Старый 03.10.2006, 15:18   #12  
zipo is offline
zipo
Участник
 
32 / 23 (1) +++
Регистрация: 16.05.2006
Или он не видит активную ячейку или не активен сам CommandBar.
Но мне кажется что, просто CommandBar рассматривается в этом случае без привязки к ячейке
Пробовал так
Range("A1").Application.CommandBars(10).Controls(1).SetFocus
Но видно, что нужная кнопка не активна, поэтому и ошибка выходит на Execute
Как только CommandBar External Data получает фокус, кнопка активируется.
Старый 04.10.2006, 11:22   #13  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Ну в общем народ в мире тоже мучается аналогичными проблемами: http://www.pcreview.co.uk/forums/thread-2274645.php

В качестве временного отладочного решения можно попробовать открывать это окошко через последовательность нажатий клавиш (а там, глядишь, может и сам бизнес-процесс поменяете )

При это Excel должен быть обязательно виден и иметь фокус, иначе кнопки сработают, например, в редакторе X++, откуда запускается джоб. В самом Excel должна быть активна ячейка, входящая в диапазон веб-запроса. В рамках джоба - эта ячейка А1 на первом листе файла TestWebQuery.xls, в котором уже должен присутствовать ранее сохраненный веб-запрос.
Код:
static void Job53(Args _args)
{   
    COM xlApp, wbks, wbk, wkss, wks;
    COM rng;
 
    xlApp = new COM('Excel.Application');
    xlApp.Visible(true);
 
    wbks = xlApp.Workbooks();
    wbk = wbks.Open(@'C:\TestWebQuery.xls');
 
    wkss = wbk.Worksheets();
    wks = wkss.Item(1);
    wks.Select();
 
    rng = wks.Range('A1');
    rng.Select();
 
    xlApp.SendKeys('+{F10}{UP}{UP}{UP}{UP}~');
}
Строковый параметр метода SendKeys означает такую реальную последовательность клавиш:
- Shift+F10 - вызов контекстного меню (как правый клик мышкой)
- 4 раза "стрелка вверх" - позиционирование в меню на пункте "Edit Query"
- Enter - активизация пункта "Edit Query" и отображение нашего желанного диалога
Изображения
 
Старый 11.10.2006, 11:14   #14  
zipo is offline
zipo
Участник
 
32 / 23 (1) +++
Регистрация: 16.05.2006
Этот вариант через COM работает, только всеравно эксель на время проскакиевает:

Application.CommandBars(10).Controls(1).Execute
PHP код:
#define.xlExternalDataToolbar(10)
COM             CmdBars,
                
CmdBar,
                
Controls,
                
Control;
;
CmdBars xlApp.CommandBars();
CmdBar CmdBars.Item(#xlExternalDataToolbar);
Controls CmdBar.Controls();
Control Controls.Item(1);

Control.Execute();
xlApp.Visible(False); 
За это сообщение автора поблагодарили: Gustav (7).
Старый 11.10.2006, 13:42   #15  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от zipo Посмотреть сообщение
Этот вариант через COM работает
Супер! Дожили! В Аксапте работает лучше, чем в самом Excel

Сейчас тоже немножко поковырялся. Выяснил, что оператор

Application.CommandBars(10).Controls(1).Execute

выдает ошибку,
а пара операторов (VBA)

Set xlApp = New Excel.Application
xlApp.CommandBars(10).Controls(1).Execute

работает! (я вызывал Excel из Access и даже "Excel из другого Excel")

Т.е. получается, что этот Execute программно срабатывает так, как мы этого хотим, только в новом инстансе Excel (что и происходит при вызове из Аксапты).

А вообще здорово. Спасибо, что не сдаетесь и продолжаете долбить эту тему, выясняя по ходу интересные подробности.

Цитата:
Сообщение от zipo Посмотреть сообщение
только всеравно эксель на время проскакиевает
да и фиг-то с ним или так критично, что мелькает?

Кстати, покажите, пожалуйста, потом Ваши дальнейшие шаги в этой задаче. Интересно-интересно. Благодарю заранее.


P.S.
Цитата:
Сообщение от Gustav Посмотреть сообщение
Ну в общем народ в мире тоже мучается аналогичными проблемами: http://www.pcreview.co.uk/forums/thread-2274645.php
Немного просветил "народ в мире"
http://www.pcreview.co.uk/forums/sho...54&postcount=6

Последний раз редактировалось Gustav; 11.10.2006 в 18:47.
 


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

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

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