Russian Qt Forum

Qt => ActiveX => Тема начата: CroCIV от Декабрь 01, 2009, 17:34



Название: Excel + MS SQL, заполнение формы данными с сервера напрямки
Отправлено: CroCIV от Декабрь 01, 2009, 17:34
делаю так:
Код:
sheet = shablon->querySubObject("Worksheets(const QVariant&)",QVariant(1)); // страница 1
QAxObject *qts = sheet->querySubObject("QueryTables"); //таблицы запросов страницы 1
qts->dynamicCall("Add(const QVariant&, IDispatch*, const QVariant&)",QVariant("ODBC;DSN=<имя_сервера>;UID=<пользователь>;PWD=<пароль>;Database=<имя_бд>"),sheet->querySubObject("Range(const QVariant&)", QVariant("левая_верхняя_ячейка_для_начала_вставки"))->asVariant(),QVariant("select ..."))); // создаем новую таблицу запроса (тут все работает как надо, проверено отладчиком)
QAxObject *qt = qts->querySubObject("Item(1)"); //указатель на вновь созданную таблицу запроса
QVariant qv = qt->dynamicCall("Refresh (const QVariant&)", QVariant(true)); // а вот тут ошибка мол такой функции (Refresh) у обьекта qt нет !!! :-\
QString s = qv.toString(); // ну разумеется из-за ошибки тут пусто, а дб тру/фалс
Хотя если мы заглянем в МСДН или сделаем qt->generateDocumentation(), то увидим примерно следующее:
Цитировать
QueryTable.Refresh Method
Updates an external data range (QueryTable).
Syntax

expression.Refresh(BackgroundQuery)

expression   A variable that represents a QueryTable object.
...

и ссно

Цитировать
Interfaces
_QueryTable
Event Interfaces
RefreshEvents
Public Slots:
void CancelRefresh();
void Delete();
bool Refresh(QVariant BackgroundQuery = 0);
void ResetTimer();
...


Вопрос, а чо происходит? Маловероятно, но мб кто сталкивался?


Название: Re: Excel + MS SQL, заполнение формы данными с сервера напрямки
Отправлено: CroCIV от Декабрь 03, 2009, 12:06
Разобрался, мой косяк был.
Вот рабочий вариант, метод достаточно быстрый, удобный и грамотный, пользуйтесь, люди.

Код:
...
QAxWidget *excel = new QAxWidget("Excel.Application");
//указатель на экель
Код:
excel->setProperty("DisplayAlerts", "0");
//отключение предупреждений (не обязательно)
Код:
excel->setProperty("Visible", "true");
//делаем видимым (совсем не обязательно  ::) )
Код:
QAxObject *workbooks = excel->querySubObject( "Workbooks" );
//указатель на колеекцию книг
Код:
QAxObject *shab = workbooks->querySubObject("Open(const QString&)", "<путь_к_файлу_кот._необходимо_заполнить>");
//указатель на конкретную книгу, в данном случае берем готовую по указанному пути
Код:
QAxObject *sheet = shab->querySubObject("Worksheets(const QVariant&)",QVariant(<номер_листа_для_заполнения>));
//указатель на страницу в книге которую хотим заполнить
Код:
QAxObject *cell = sheet->querySubObject("Range(const QVariant&)", QVariant("ячейка_начала_вставки_результата"));
//указатель на начало вставки результата (левая верхняя ячейка предполагаемого диапазона результата) на этом листе
Код:
QAxObject *qts = sheet->querySubObject("QueryTables");
//указатель на список таблиц внешних данных листа
Код:
QAxObject *qt = qts->querySubObject(
"Add(const QVariant&, IDispatch*, const QVariant&)",
QVariant("ODBC;DRIVER=SQL Server;SERVER=<ваш_сервер>;UID=<логин>;PWD=<пароль>;DATABASE=<имя_БД>"),
cell->asVariant(),
QVariant("select ..")
);
//указатель на вновь созданную таблицу внешних данных, в параметрах команды вызова: 1. строка подключения к источкику одбц; 2. вот такой адрес ячейки начала вставки результата; 3. сам запрос.
Код:
QString s = qt->dynamicCall("Refresh (const QVariant&)", QVariant(true)).toString();
//команда однократного выполнения запроса (еще можно обновление по таймеру запустить)
s вернет тру, если запрос выполнился, ну это вы и так увидите  ;D
------------------
с уважением для тех на ком держится http://www.prog.org.ru  ;)