Видимо нужен запрос в запросе???

_Maverick

Друзья, столкнулся со следующей проблемой.Есть 5 серверов Oracle. Посредством программы VBA Excel, написан следующий макрос с инструкцией SQL
Sub macros()

endrow = <b>1</b>
sql_txt = "SELECT dept.ID_DEPARTMENT, cl.NAME, dept.NICKNAME, i.ID_ITEM, i.NAME, il.QTY " & _
 "FROM SDD.CLIENT cl, SDD.DEPARTMENT dept, SDD.ITEM i, SDD.ITEMLIST il " & _
 "WHERE cl.ID_COMPANY = dept.ID_COMPANY And cl.ID_CLIENT = dept.ID_CLIENT And il.ID_ITEM = i.ID_ITEM And il.ID_DEPARTMENT = dept.ID_DEPARTMENT And ((i.ID_ITEM = 3020))"

For row_str = <b>1</b> To <b>5</b>
server_nick = Sheets("serverlist").Cells(row_str, <b>1</b>)

source_txt = "ODBC;DRIVER={Microsoft ODBC for Oracle};UID=grabovskiyaa;PWD=avt231090;SERVER=ora" & server_nick & ".ntdomain.prk;"
destination_cell = "A" & endrow

Call sql_query

Cells(Rows.Count, <b>1</b>).Select
Selection.End(xlUp).Select
endrow = ActiveCell.Row + <b>1</b>

destination_cell = "A" & endrow
Range(destination_cell).Select
Next row_str


End Sub

Sub sql_query()
'
' Макрос1 Макрос
'

'
 With ActiveSheet.ListObjects.Add(SourceType:=<b>0</b>, Source:=source_txt, Destination:=Range(destination_cell)).QueryTable
 .CommandText = sql_txt
 .RowNumbers = False
 .FillAdjacentFormulas = False
 .PreserveFormatting = True
 .RefreshOnFileOpen = False
 .BackgroundQuery = True
 .RefreshStyle = xlInsertDeleteCells
 .SavePassword = False
 .SaveData = True
 .AdjustColumnWidth = True
 ' .ShowHeaders = False 'заголовки
 .RefreshPeriod = <b>0</b>
 .PreserveColumnInfo = False
 .ListObject.DisplayName = "Таблица_Запрос_из_Одинцово"
 .Refresh BackgroundQuery:=False
 End With
End Sub
Который ходит по серверам и собирает однотипные данные и помещает их на лист один за другим.Однако результат получается таким (см.вложение)Как сделать нормальную табличку с одним заголовком?Никак не могу сообразить. Спасайте!!!
10 ответов

_Maverick

вложения нет.но, если правильно понял, то могу предложить такой вариант с использованием ADODB:1) все объекты объявляем Connection, Recordset2) в цикле пробегаемся по всем Вашим серверам и выполняем запрос3) используем CopyFromRecordset для выдачи данных запроса на листпо поводу заголовков. Если у Вас запросы одни и теже, то проще самому прописать заголовкиесли запросы могут менятся, то в этом случае при первом прохождении цикла, пройтись по Resordset.Fields и вытащить от туда названия столюцовI Have Nine Lives You Have One OnlyTHINK!


_Maverick

HandKot,Какие объекты ты имеешь ввиду? Сами таблицы или сам запрос?


_Maverick

под объектами я понимаю ОБЪЕКТЫ доступа к данным из класса ADODB (ActiveX Data Object )I Have Nine Lives You Have One OnlyTHINK!


_Maverick

под объектами я понимаю ОБЪЕКТЫ доступа к данным из класса ADODB (ActiveX Data Object )I Have Nine Lives You Have One OnlyTHINK!
Сорри, конечно! Но ничего пока не понял..Можешь написать запрос скриптом....? Все перепробовал. Не получается Connection Recordset


_Maverick

_Maverick,Никогда не используй ActiveSheet, ActiveCell, Selection и подобные костыли когда пишешь для Экселя. Проще всего: создай один раз книгу с пятью листами, на каждый лист положи запрос.Потом либо тыкай в кнопку "обновить все", либо пробегай в макросе по всем листам и для всех имеющихся там запросов дергай метод refresh().


_Maverick

Проще всего: создай один раз книгу с пятью листами, на каждый лист положи запрос.
ему нужно в одном листевот подобный пример и вообще в поискI Have Nine Lives You Have One OnlyTHINK!


_Maverick

ему нужно в одном листе
Хорошо, исправляюсь: создай пять запросов на листе... дальше по тексту.


_Maverick

White Owl Никогда так не делал.А как эти запросы распределять по листу?I Have Nine Lives You Have One OnlyTHINK!


_Maverick

White Owl Никогда так не делал.А как эти запросы распределять по листу?
Да как угодно. QueryTable запоминает область куда она положила таблицу при первом запросе, а потом при нужде вставляет/удаляет строки и колонки при перезапросе данных с сервера.


_Maverick

Решил свой вопрос Сводной таблицей, которая ссылается на постоянный диапазон