powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Подключение к SQL
9 сообщений из 59, страница 3 из 3
Подключение к SQL
    #38379123
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lbppb,

Я не прав, прошу прощения, отсутствие NOCOUNT действительно приведет к такой ошибке, а не к BOF/EOF

Правда автор говорит, что "не сработало", но может все-таки не туда или не так вставил.

Для проверки этой ситуации можно после
Код: vbnet
1.
Set oRs = oCmd.Execute

вставить
Код: vbnet
1.
Set oRs = oRs.NextRecordset
...
Рейтинг: 0 / 0
Подключение к SQL
    #38379486
mpkfa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВСЕ РАБОТАЕТ!!! Урааааа!!! lbppb и Shocker.Pro - Вам отдельное спасибо!!! Вот код полностью, который работает.
Код: vbnet
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.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
Option Explicit
Public S, U1, N1, N2 As String

Private Sub ComboBox1_Change()
U1 = " WHERE t.god =" + CStr(ComboBox1.Value)
End Sub


Private Sub ComboBox2_Change()
U1 = U1 & " AND t.mes = " + CStr(ComboBox2.Value)
End Sub

Private Sub Query()


Dim S1, S2, S3, S4, S5, S6, S7, S31 As String
S1 = " set nocount on Use B2 SELECT max(g1.akb_v_obl1) as 'akb1', g1.offtake1,g1.procentakb1, g1.kl1,"
N1 = " t.obl,"
S2 = " t.god FROM B2.dbo.T1 t Left Join( SELECT sum(t.kg) / count(distinct t.kodKl) as 'offtake1', vsekg.klobl1 as 'akb_v_obl1',100 * count(distinct t.kodKl) / vsekg.klobl1 as 'procentakb1', count(distinct t.kodKl) as 'kl1',"
S3 = " t.god FROM B2.dbo.T1 t join (SELECT count(distinct t.kodKl) as 'klobl1',t.obl FROM B2.dbo.T1 t "
S31 = " Group By t.obl ) AS vsekg on vsekg.obl = t.obl"
S4 = " Group By vsekg.klobl1,"
S5 = " t.god ) AS g1 on     g1.god = t.god"
N2 = " AND g1.obl = t.obl "
S6 = " GROUP BY  g1.offtake1,g1.procentakb1, g1.kl1,"
S7 = " t.god"

    If CheckBox1.Value = True Then

                              N1 = N1 & " t.kategory,"
                              N2 = N2 & " AND g1.kategory = t.kategory"
    End If

    If CheckBox2.Value = True Then
                          N1 = N1 & " t.GrKl,"
                          N2 = N2 & " AND g1.Grkl = t.Grkl"
    End If

    If CheckBox3.Value = True Then
                          N1 = N1 & " t.TipT,"
                          N2 = N2 & " AND g1.TipT = t.TipT"
    End If

    If CheckBox4.Value = True Then
                          N1 = N1 & " t.FormT,"
                          N2 = N2 & " AND g1.FormT = t.FormT"
    End If

    If CheckBox5.Value = True Then
                          N1 = N1 & " t.Brand,"
                          N2 = N2 & " AND g1.Brand = t.Brand"
    End If

    If CheckBox6.Value = True Then
                          N1 = N1 & " t.sku,"
                          N2 = N2 & " AND g1.sku = t.sku"
    End If
S = S1 + N1 + S2 + N1 + S3 + U1 + S31 + U1 + S4 + N1 + S5 + N2 + U1 + S6 + N1 + S7



End Sub



Private Sub Pusk_Click()
Query
TextBox5.Text = S
Dim oCn As ADODB.Connection
Dim oRs As ADODB.Recordset
Dim oCmd As ADODB.Command
Dim sCn As String
Dim sSql As String
Dim sRng As String

Set oCn = New ADODB.Connection
Set oRs = New ADODB.Recordset
Set oCmd = New ADODB.Command

oCn.ConnectionTimeout = 0
oCn.CommandTimeout = 0
oCmd.CommandTimeout = 0

sCn = "Provider=SQLOLEDB.1;Password=123;Persist Security Info=True;User ID=fg;Initial Catalog=B2;Data Source=MARKET6\M6" 'Your connection string
oCn.Open sCn

sSql = S '"select top 100 t.sku,t.brand, t.god,count(distinct t.kodkl) from B2.dbo.T1 t group by t.brand,t.sku,t.god" 'Your query

oCmd.CommandType = adCmdText
oCmd.CommandText = sSql
oCmd.ActiveConnection = oCn

Set oRs = oCmd.Execute
Set oRs = oRs.NextRecordset


sRng = "A:AA"
ActiveSheet.Range(sRng).Clear
PutRecordsetInSheet oRs, ActiveSheet.Range("A1"), True

oRs.Close
oCn.Close
Set oCmd = Nothing
Set oRs = Nothing
Set oCn = Nothing

End Sub



Private Sub PutRecordsetInSheet(RS As Recordset, TopLeft As Range, Optional Headers As Boolean)
    Dim objField As ADODB.Field
    Dim i As Integer
    If Headers Then
        For Each objField In RS.Fields
            i = i + 1
            TopLeft.Cells(1, i).Value = objField.Name
            Next objField
        TopLeft.Cells(2, 1).CopyFromRecordset RS
    Else
        TopLeft.Cells(1, 1).CopyFromRecordset RS
    End If
End Sub


Мне осталось сделать чтобы вывод данных шел не просто на лист, а в сводную таблицу. Стыдно уже спрашивать, но может и это подскажите?)))
...
Рейтинг: 0 / 0
Подключение к SQL
    #38379505
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Странно, почему при set nocount on требуется еще и NextRecordset, я с таким не сталкивался.

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

И еще. При таком объявлении:
Код: vbnet
1.
Dim S1, S2, S3, S4, S5, S6, S7, S31 As String

как String объявляется только S31, все остальное как Variant. Почитайте F1 про Dim
...
Рейтинг: 0 / 0
Подключение к SQL
    #38379569
Фотография lbppb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mpkfa,

Супер, правда я не уверен, что SET NOCOUNT ON в самом начале что-то дает, его между USE и SELECT обычно пишут, поэтому может быть и требуется NextRecordset...
...
Рейтинг: 0 / 0
Подключение к SQL
    #38379578
mpkfa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lbppb, Так было после USE и без NextRecordset - не работало. А расскажите как
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Private Sub PutRecordsetInSheet(RS As Recordset, TopLeft As Range, Optional Headers As Boolean)
    Dim objField As ADODB.Field
    Dim i As Integer
    If Headers Then
        For Each objField In RS.Fields
            i = i + 1
            TopLeft.Cells(1, i).Value = objField.Name
            Next objField
        TopLeft.Cells(2, 1).CopyFromRecordset RS
    Else
        TopLeft.Cells(1, 1).CopyFromRecordset RS
    End If
End Sub


переделать чтобы создавалась сводная таблица с этими данными?
...
Рейтинг: 0 / 0
Подключение к SQL
    #38379656
mpkfalbppb, Так было после USE и без NextRecordset - не работало. А расскажите как
переделать чтобы создавалась сводная таблица с этими данными?
Есть у меня подозрение что никак не переделать.
Скорее всего в случае сводной таблицы тебе нужно менять св-во OLEDBConnection или ODBCConnection у объекта PivotCache существующей таблицы. Для Эксель 2007-2010.
-----
Не люблю Progress OpenEdge.
...
Рейтинг: 0 / 0
Подключение к SQL
    #38379662
mpkfa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я занялся созданием костыля) То есть данные на лист выгружаются а потом на отдельном листе формируется сводная с первого листа. Хотя бы так сделать...
...
Рейтинг: 0 / 0
Подключение к SQL
    #38379678
Фотография lbppb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mpkfalbppb, Так было после USE и без NextRecordset - не работало. А расскажите как

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Private Sub PutRecordsetInSheet(RS As Recordset, TopLeft As Range, Optional Headers As Boolean)
    Dim objField As ADODB.Field
    Dim i As Integer
    If Headers Then
        For Each objField In RS.Fields
            i = i + 1
            TopLeft.Cells(1, i).Value = objField.Name
            Next objField
        TopLeft.Cells(2, 1).CopyFromRecordset RS
    Else
        TopLeft.Cells(1, 1).CopyFromRecordset RS
    End If
End Sub



переделать чтобы создавалась сводная таблица с этими данными?

Тогда не могу не согласиться с уважаемым Shocker.Pro, действительно странно.

SQL умеет сразу возвращать сводные таблицы, посмотрите справку по SSMS - PIVOT.
...
Рейтинг: 0 / 0
Подключение к SQL
    #38379692
mpkfaЯ занялся созданием костыля) То есть данные на лист выгружаются а потом на отдельном листе формируется сводная с первого листа. Хотя бы так сделать...
Для 2003 можно обойтись
Код: vbnet
1.
2.
3.
ActiveSheet.PivotTables("ÑâîäíàÿÒàáëèöà1").PivotCache.CommandText = _
        "Select TOP 1000 * FROM tbl_Nachisleno0"
End Sub
...
Рейтинг: 0 / 0
9 сообщений из 59, страница 3 из 3
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Подключение к SQL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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