Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Вытаскивание суммирующего значения через VBA+MS SQL, в одну ячейку / 21 сообщений из 21, страница 1 из 1
27.01.2008, 13:12:02
    #35089986
vitkru
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вытаскивание суммирующего значения через VBA+MS SQL, в одну ячейку
Уважаемые специалисты! Помогите консультанту по Scala построить отчет в Excel с использованием VBA из Excel + T-SQL. Я сообразительный, честно! Много времени не отниму.
Проблема в следующем:
Задача: вытянуть в ячеечки эксельные просуммированные данные в разрезе измерений учетных. Запросик сделал, он все, как надо суммирует:
---------------------------------
SELECT SUM(GL06004) AS SS
FROM dbo.GL06T808
WHERE (LEFT(GL06001, 6) = '501026' OR LEFT(GL06001, 6) = '501027'
OR LEFT(GL06001, 6) = '501520')
AND (SUBSTRING(GL06001, 7, 2) = 'ST' OR SUBSTRING(GL06001, 7, 2) = 'WA')
GROUP BY GL06004
---------------------------------

В тексте VBA он выглядит, как:
_______________________________________
Sel = "SELECT SUM(GL06004) AS SS " & _
"FROM dbo.GL06T808 " & _
"WHERE (LEFT(GL06001, 6) = '501026' OR LEFT(GL06001, 6) = '501027' " & _
"OR LEFT(GL06001, 6) = '501520') " & _
"AND (SUBSTRING(GL06001, 7, 2) = 'ST' OR SUBSTRING(GL06001, 7, 2) = 'WA') " & _
"GROUP BY GL06004"
______________________________________
Ошибок не возникает, всякие ADO в начале прописаны, проблема в следующем:
В ячейку не могу вставить суммированное значение, которое запрос возвращает. Так как чайник я жуткий, только начал учиться. Надеюсь, благодаря упорству и помощи коллег, на науку времени много не потрачу.
Так вот, можно было вот так, вставить данные:
______________________________________________

Range("C6").Select

'открываем запрос
RST.Open Sel, CN, adOpenKeyset, adLockOptimistic
'вставляем в ячейку
1-й способ
ActiveCell.Value = Trim(RST!(Sum(GL06004)) 'не работает такой способ
2-й способ
ActiveCell.Value = Trim(RST!SS) 'тоже не работает
______________________________________________

Проблема, как раз в том, что поле GL06004 агрегированное, если просто выносить без суммирования:
ActiveCell.Value = Trim(RST!GL06004) - при соответствующем запросе, конечно, то все хорошо ( тестировал лично ), а как с суммированием быть не представляю и очень остро нуждаюсь в консультации.

Заранее благодарю!
на е-mail, получить ответ также был бы признателен lcoding@mail.ru
...
Рейтинг: 0 / 0
27.01.2008, 13:51:38
    #35090015
vbapro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вытаскивание суммирующего значения через VBA+MS SQL, в одну ячейку
попробуй так
Код: plaintext
    Range("C6").CopyFromRecordset
или так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
    With ActiveSheet
        On Error Resume Next
        .QueryTables( 1 ).Delete
        On Error GoTo  0 
        
        .Cells.Clear
    
        With .QueryTables.Add( _
                Connection:=rs, _
                Destination:=.Range("C6"))
            .Name = "MyQuery"
            .FieldNames = False
            .RowNumbers = False
            .FillAdjacentFormulas = False
            .PreserveFormatting = False
            .RefreshOnFileOpen = False
            .BackgroundQuery = True
            .RefreshStyle = xlInsertDeleteCells
            .SavePassword = True
            .SaveData = True
            .AdjustColumnWidth = True
            .RefreshPeriod =  0 
            .PreserveColumnInfo = True
            .Refresh BackgroundQuery:=False
        End With
    End With
...
Рейтинг: 0 / 0
27.01.2008, 15:22:15
    #35090079
KL (XL)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вытаскивание суммирующего значения через VBA+MS SQL, в одну ячейку
vbapro
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
    With ActiveSheet
        On Error Resume Next
        .QueryTables( 1 ).Delete
        On Error GoTo  0 
        
        .Cells.Clear
    
        With .QueryTables.Add( _
                Connection:=rs, _
                Destination:=.Range("C6"))
            .Name = "MyQuery"
            .FieldNames = False
            .RowNumbers = False
            .FillAdjacentFormulas = False
            .PreserveFormatting = False
            .RefreshOnFileOpen = False
            .BackgroundQuery = True
            .RefreshStyle = xlInsertDeleteCells
            .SavePassword = True
            .SaveData = True
            .AdjustColumnWidth = True
            .RefreshPeriod =  0 
            .PreserveColumnInfo = True
            .Refresh BackgroundQuery:=False
        End With
    End With


Я обычно сразу избавляюсь от QueryTable

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
Sub test()
    With ActiveSheet
        .Range("C6").CurrentRegion.ClearContents
        On Error Resume Next
        With .QueryTables.Add(Connection:=rs, Destination:=.Range("C6"))
            .Name = "MyQuery"
            .FieldNames = False
            .RowNumbers = False
            .FillAdjacentFormulas = False
            .PreserveFormatting = False
            .RefreshOnFileOpen = False
            .BackgroundQuery = True
            .RefreshStyle = xlInsertDeleteCells
            .SavePassword = True
            .SaveData = True
            .AdjustColumnWidth = True
            .RefreshPeriod =  0 
            .PreserveColumnInfo = True
            .Refresh BackgroundQuery:=False
            .Delete
        End With
    End With
End Sub
...
Рейтинг: 0 / 0
27.01.2008, 15:36:37
    #35090097
vitkru
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вытаскивание суммирующего значения через VBA+MS SQL, в одну ячейку
vbaproпопробуй так
Код: plaintext
    Range("C6").CopyFromRecordset
или так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
    With ActiveSheet
        On Error Resume Next
        .QueryTables( 1 ).Delete
        On Error GoTo  0 
        
        .Cells.Clear
    
        With .QueryTables.Add( _
                Connection:=rs, _
                Destination:=.Range("C6"))
            .Name = "MyQuery"
            .FieldNames = False
            .RowNumbers = False
            .FillAdjacentFormulas = False
            .PreserveFormatting = False
            .RefreshOnFileOpen = False
            .BackgroundQuery = True
            .RefreshStyle = xlInsertDeleteCells
            .SavePassword = True
            .SaveData = True
            .AdjustColumnWidth = True
            .RefreshPeriod =  0 
            .PreserveColumnInfo = True
            .Refresh BackgroundQuery:=False
        End With
    End With


Могу очень ошибаться, но .QueryTables.Add не понимаются в упор, да и должен быть способ намного проще, ну прямо интуиция подсказывает, почему значение, вычисленное не агрегированным запросом, т.е. попросту поле БД эскуэльной, присвоить ячейке, можно, как 2 пальца об асфальст, а с агрегированной столько кода? Уверен есть способ проще.
Спасибо тебе за ответ, конечно, огромный, но идея работы отчета, как мне показалось тебе была не очевидна. Не поленюсь, сам отчет выслать с приблизительным кодом. Ну или с примером где без агрегации все работает без проблем.
...
Рейтинг: 0 / 0
27.01.2008, 15:50:46
    #35090109
vitkru
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вытаскивание суммирующего значения через VBA+MS SQL, в одну ячейку
Уважаемые! Ну не нужны тут никакие querytable. Извините заранее, за такой "поучительный тон" от чайника по сути. Но мои коллеги скальцы пищут так (опишу просто, алгоритмически, вспомнив славные дизайнерско-пиэмские времена):

Соединиться с БД скала, указав базу, логин, пароль.
Написать запрос (любой сложности) к скальской БД
Запустить запрос на выполнение.
1. Если агрегаций нет, использовать размножение строк (вниз, вправо столбцы пусть тоже растут), с присваиванием ячейкам в активных листах значений из запроса-ов. (Такой пример у меня есть, и по его образу без проблем наваяю, что то типа "Книга продаж", "Книга покупок", "Прогноз платежей", "Исполнение обзательств покупателями" и тп.
2. НО!!! Тут агрегация по затратам за период, отраженным в бухгалтерских проводках (строка с положительной суммой и сторока с отрицательной суммной) и, как эту вычисленную в запросе с параметрами "дата начала" и "дата окончания" (причем параметры дат берутся тупо из листа старт", без всяких T-SQL-х премудростей) агрегацию запихнуть в конкретную ячейку, мне непонятно. На недели коллеги просветят, но уж, простите неправильно понятым быть не очень приятственно.
Всем огромное спасибо, в любом случае за небезразличность и участие!!!
...
Рейтинг: 0 / 0
27.01.2008, 16:01:50
    #35090117
vbapro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вытаскивание суммирующего значения через VBA+MS SQL, в одну ячейку
Дело не в том, какое поле в запросе: результат агрегированной функции, расчета или «сырое» значение, запрос есть запрос – возвращает набор значений.

У меня , как минимум три метода отлично сработали:

Код: plaintext
Range("A1").CopyFromRecordset rs

Код: plaintext
Range("A2").Value = rs!ss

Код: plaintext
ActiveSheet.QueryTables.Add(Connection:=rs, Destination:=Range("A3"))

покажи весь свой код
...
Рейтинг: 0 / 0
27.01.2008, 16:04:04
    #35090120
KL (XL)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вытаскивание суммирующего значения через VBA+MS SQL, в одну ячейку
Вопрос номер раз: Чем тебе
Код: plaintext
Range("C6").CopyFromRecordset 
не подошел?
Вопрос номер два: Ты про
Код: plaintext
rs.GetRows 
читал? Если нет, то поищи в этом форуме. Вот пример: http://www.sql.ru/forum/actualthread.aspx?tid=399289&hl=getrows#3824593

KL
[MVP - Microsoft Excel]
...
Рейтинг: 0 / 0
27.01.2008, 16:05:04
    #35090122
vbapro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вытаскивание суммирующего значения через VBA+MS SQL, в одну ячейку
PS рекордсет вот такой:
Код: plaintext
1.
   rs.Open "SELECT SUM([SubTotal]) As SS FROM [AdventureWorks].[Sales].[SalesOrderHeader]", cn
...
Рейтинг: 0 / 0
27.01.2008, 16:07:42
    #35090125
KL (XL)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вытаскивание суммирующего значения через VBA+MS SQL, в одну ячейку
KL (XL)Вопрос номер раз: Чем тебе
Код: plaintext
Range("C6").CopyFromRecordset 
не подошел?
Вопрос номер два: Ты про
Код: plaintext
rs.GetRows 
читал? Если нет, то поищи в этом форуме. Вот пример: http://www.sql.ru/forum/actualthread.aspx?tid=399289&hl=getrows#3824593

KL
[MVP - Microsoft Excel]

Мои вопросы есс-но не к vbapro :-)
...
Рейтинг: 0 / 0
27.01.2008, 16:39:02
    #35090152
vitkru
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вытаскивание суммирующего значения через VBA+MS SQL, в одну ячейку
vbaproPS рекордсет вот такой:
Код: plaintext
1.
   rs.Open "SELECT SUM([SubTotal]) As SS FROM [AdventureWorks].[Sales].[SalesOrderHeader]", cn


Как уже первым делом предупреждал, что именно, не так делаю, и как правильно пользоваться документацией и советами, мне еще предстоит научиться. Так что критикуйте, как хотите. Но сам пишу первый раз, поэтому немного сложновато, а по причине выходных, отряд, доступных не только в нете, но и в реале коллег, в чьем программистском профессионализме я не сомневаюсь (по причине многолетнего знакомства), а соответственно хороших друзей и советчиков недоступен.
Но, если у кого то из присутствующих есть желание помочь мне, то задам несколько вопросов:
1. Есть возможность поднять мою табличку на MS SQL (данных там кот наплакал), я бы её через, например access экспортнул. Естественено имя сервера и логин с паролем надо будет поменять в строке подключения из Excel VBA.
2. Вышлю и запрос, чтобы не было сомнений, что он рабочий.
3. Пришлю и сам лист с программой, для того, чтобы у желающих поучить меня уму-разуму, было чем развлечся.

Как вам уважаемые, таке варианты?
Жду адреса е-мылов и т.п. вещи для, того, чтобы я все это дело выложил.

Ну, а проблема моя Вам уважаемые уже известна.
...
Рейтинг: 0 / 0
27.01.2008, 16:58:00
    #35090181
vitkru
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вытаскивание суммирующего значения через VBA+MS SQL, в одну ячейку
KL (XL)Вопрос номер раз: Чем тебе
Код: plaintext
Range("C6").CopyFromRecordset 
не подошел?
Вопрос номер два: Ты про
Код: plaintext
rs.GetRows 
читал? Если нет, то поищи в этом форуме. Вот пример: http://www.sql.ru/forum/actualthread.aspx?tid=399289&hl=getrows#3824593

KL
[MVP - Microsoft Excel]

1. Не подошел, потому что ошибку выдает при выполнении.
2. Читал в хелпе эксельном, но по ссылке, также, возможно почитаю. На крайняк.
...
Рейтинг: 0 / 0
27.01.2008, 17:02:33
    #35090184
vbapro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вытаскивание суммирующего значения через VBA+MS SQL, в одну ячейку
1) еще раз опиши структуру таблицы, можно только те поля, которые используешь
2) опиши подробно и ясно задачу, что хочешь получить
3) можешь выложить дамп таблицы в виде xls или sql
этого будет достаточно чтоб тебе помочь
...
Рейтинг: 0 / 0
27.01.2008, 17:09:55
    #35090187
KL (XL)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вытаскивание суммирующего значения через VBA+MS SQL, в одну ячейку
vitkru1. Не подошел, потому что ошибку выдает при выполнении.
Наверно было бы нелишним указать какую конкретно ошибку выдает этот метод и точно воспроизвести используемый код ;-)

И потом, ты к нужным библиотекам-то подсоединился? Ну там Microsoft ActiveX Data Objects #.# Library . А то я никогда не слышал, чтобы CopyFromRecordset выдавал ошибку если в рекордсете есть данные.
...
Рейтинг: 0 / 0
27.01.2008, 17:24:36
    #35090196
vitkru
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вытаскивание суммирующего значения через VBA+MS SQL, в одну ячейку
KL (XL) vitkru1. Не подошел, потому что ошибку выдает при выполнении.
Наверно было бы нелишним указать какую конкретно ошибку выдает этот метод и точно воспроизвести используемый код ;-)

И потом, ты к нужным библиотекам-то подсоединился? Ну там Microsoft ActiveX Data Objects #.# Library . А то я никогда не слышал, чтобы CopyFromRecordset выдавал ошибку если в рекордсете есть данные.

"Ругань" на неправильные библиотеки мне знакома, там было про агрумегты что то вроде... Остальное, точнее задачу сейчас опишу и выложу.
...
Рейтинг: 0 / 0
27.01.2008, 17:47:47
    #35090211
vitkru
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вытаскивание суммирующего значения через VBA+MS SQL, в одну ячейку
vbapro1) еще раз опиши структуру таблицы, можно только те поля, которые используешь
2) опиши подробно и ясно задачу, что хочешь получить
3) можешь выложить дамп таблицы в виде xls или sql
этого будет достаточно чтоб тебе помочь

1. Сделал скрипт создания таблицы проводок
2. Данные выгрузил в эксель
3. Привел пример своего кода
4. Описал задачу

На все доп. вопросы, естественно, готов ответить в любой подробности.
...
Рейтинг: 0 / 0
27.01.2008, 18:25:19
    #35090246
vbapro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вытаскивание суммирующего значения через VBA+MS SQL, в одну ячейку
у меня твоя программа работает: в С7 помещает значение 4000. Какая у тебя ошибка и в каком месте кода?
...
Рейтинг: 0 / 0
27.01.2008, 18:28:51
    #35090251
vitkru
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вытаскивание суммирующего значения через VBA+MS SQL, в одну ячейку
vbaproу меня твоя программа работает: в С7 помещает значение 4000. Какая у тебя ошибка и в каком месте кода?

как не смешно никакой, но данные не проставляются
вот думаю с нуля сделать лист, может пойму в чем дело, глаза чтоле уже устали.
...
Рейтинг: 0 / 0
27.01.2008, 18:42:37
    #35090272
vbapro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вытаскивание суммирующего значения через VBA+MS SQL, в одну ячейку
добавь Option Explicit первой строкой модуля, введи промежуточные переменные и при отладке следи за значениями. При отладке убери On Error Resume Next ...
Запрос нормальный, без ошибок, так что пробуй :)
...
Рейтинг: 0 / 0
27.01.2008, 18:46:10
    #35090277
vitkru
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вытаскивание суммирующего значения через VBA+MS SQL, в одну ячейку
vbaproдобавь Option Explicit первой строкой модуля, введи промежуточные переменные и при отладке следи за значениями. При отладке убери On Error Resume Next ...
Запрос нормальный, без ошибок, так что пробуй :)

попробую, не сдамся...
только, что профайлером посмотрел, читает ли он вообще что-либо, так как значение переменной, которую добавил чтобы проверить a = Range("C7").Value, равно 0 блин, а не 4000. И профайлер ничего не показал, если я логины, пароли и каталоги неправильно написал, то убью себя, наверное
...
Рейтинг: 0 / 0
27.01.2008, 18:51:44
    #35090285
vitkru
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вытаскивание суммирующего значения через VBA+MS SQL, в одну ячейку
vitkru vbaproдобавь Option Explicit первой строкой модуля, введи промежуточные переменные и при отладке следи за значениями. При отладке убери On Error Resume Next ...
Запрос нормальный, без ошибок, так что пробуй :)

попробую, не сдамся...
только, что профайлером посмотрел, читает ли он вообще что-либо, так как значение переменной, которую добавил чтобы проверить a = Range("C7").Value, равно 0 блин, а не 4000. И профайлер ничего не показал, если я логины, пароли и каталоги неправильно написал, то убью себя, наверное

так и есть!!!! я осел!!!
но мош простить себя, все таки первый раз, на чужих правда исходниках, но со своим запросом кодю, блин..
хорошо и переменные вспомнил, что и про профайлер не забыл....
мош еще чо из меня получицо.....

ВСЕМ ОГРОМНОЕ СПАСИБО ЗА ПОДДЕРЖКУ!!! НАДЕЮСЬ НА ДАЛЬНЕЙШЕЕ СОТРУДНИЧЕСТВО!!!
...
Рейтинг: 0 / 0
28.01.2008, 18:09:30
    #35092810
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вытаскивание суммирующего значения через VBA+MS SQL, в одну ячейку
vitkru
Код: plaintext
1.
2.
3.
4.
5.
Sel = "SELECT     SUM(GL06004) AS SS " & _
    "FROM dbo.GL06T808 " & _
    "WHERE (LEFT(GL06001, 6) = '501026' OR LEFT(GL06001, 6) = '501027' " & _
    "OR LEFT(GL06001, 6) = '501520') " & _
    "AND (SUBSTRING(GL06001, 7, 2) = 'ST' OR SUBSTRING(GL06001, 7, 2) = 'WA') " & _
    "GROUP BY GL06004"
Код: plaintext
1.
RST.Open Sel, CN
Range("C6") = RS("SS")
...
Рейтинг: 0 / 0
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Вытаскивание суммирующего значения через VBA+MS SQL, в одну ячейку / 21 сообщений из 21, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]