Страницы: 1
RSS
По заданному столбцу выгрузить данные из SQL, экспорт данных из Excel в SQl
 
Добрый день! Написала макрос, который по заданному ИНН (вводим его в ячейку d2) вытягивает все существующие телефоны из базы данных. Не получается переписать код. дабы макрос тянул не один ИНН а наприм по 10000 заданным вытягивал все возможные телефоны. Буду благодарна за помощь.
 
В макросе (см. вложенный файл) предполагается, что ИНН находятся в столбце D. Макрос в цикле двигается по столбцу D со строки 2 до последней и делает запрос с учетом текущего ИНН. Код я не тестировал, поэтому возможны опечатки.
 
Доброе время суток
Karataev, думаю, что всё же быстрее и правильнее для 10000 будет создать такой запрос
Код
if OBJECT_ID('tempdb..#needed_inn') is not null  drop table #needed_inn
Create table #needed_inn(inn nvarchar(32))
insert into #needed_inn (inn) values
('380646'),('380647'),('380648')
create index temp_inn_idx on #needed_inn (inn)
SELECT INN, PhoneNumber  from ugph.dbo.v_ClientPhone vc Inner Join #needed_inn ni On (vc.INN=ni.inn)

Сцепив значения ИНН, предварительно их транспонировав из массива столбца, через "('" & Join(array, "'),('") & "')"
 
Karataev, огромнейшее человеческое СПАСИБИЩЕ!!!! Я код немного исправлю, потому что он не выводил значения. Сброшу работающий)))))))))))))) :D
...сколько человеку для счастья то надо))))))))
Изменено: Yulikolove - 14.03.2016 10:55:18
 
Тут показывал как скрестить ужа и ежа. с MSSQL тоже самое
 
Что-то с циклом не так,  вытягивает не все телефоны, работает в таком виде-файл прилагаю.
Жёлтым выделила, что должно выгрузится, вообщем цикл скорей всего урезает телефоны.
Изменено: Yulikolove - 14.03.2016 17:04:32
 
Yulikolove, наверное с SQL-запросом что-то не так, но по SQL я не смогу помочь. Может кто-нибудь другой поможет.
Протестировать макрос не могу, т.к. у меня нет подключения к базе данных.

Удобно искать проблему с помощью F8, запустите макрос клавишей F8 и, нажимая ее, смотрите, что происходит.
Изменено: Karataev - 14.03.2016 17:18:22
 
Спасибо, в SQL-запросе ошибки скорей всего нет, самое интересное выгружаешь телефоны по 1 ИНН-все, только 3 хотя бы запускаешь-вытягивает не все номера)))Загадка))
 
Нашла ошибку, получается макрос копирует все телефоны, которые относятся к 1 ИНН, а потом со второй строки ставит телефоны другого ИНН.
Нужно организовать цикл так, чтоб телефоны 2 ИНН копировались ниже всех телефонов 1 ИНН.(посчитать кол-во телефонов 1 Инн и потом вставлять значения 2)
Код
For i = 2 To lrINN
    ' Extract the required records.
    rs.Open " SELECT INN, PhoneNumber  from ugph.dbo.v_ClientPhone WHERE INN = '" & Format(Sheets("Телефоны").Cells(i, "D").Value, "General Number") & "' ", cn
    ' Copy the records into cell A1 on Sheet1.
    lrTarget = Cells(Rows.Count, "A").End(xlUp).Row + 1
     ThisWorkbook.Sheets("Телефоны").Cells(i, "A").CopyFromRecordset rs
    ' Tidy up
    rs.Close
Next
Изменено: Yulikolove - 14.03.2016 18:59:23
 
вот так надо
Код
ThisWorkbook.Sheets("Телефоны").Cells(lrTarget, "A").CopyFromRecordset rs

P.S. я так и сделал в посте #2, а Вы неправильно переделали.
Изменено: Karataev - 14.03.2016 19:05:43
 
Переделала, поскольку не работал скрипт #2, буду дальше разбирать)
 
Доброе время суток
Yulikolove, а почему вы не рассматриваете вариант со временной таблицей? Быстрее же будет, чем в цикле открывать, запрашивать ИНН по одному и закрывать Recordset
Код
Public Sub test()
    'Явно подключить библиотеку Microsoft ActiveX Data Objects
    Dim pConn As New ADODB.Connection
    Dim vData As Variant
    'Настройте строку подключения    
    pConn.Open "DRIVER=SQL Server Native Client 11.0;SERVER=ServerName;Trusted_Connection=yes;DATABASE=DefaultDbName;"
    pConn.Execute "if OBJECT_ID('tempdb..#needed_inn') is not null  drop table #needed_inn"
    pConn.Execute "Create table #needed_inn(inn nvarchar(32))"
    'Укажите свой диапазон данных для ИНН
    vData = Application.Transpose(ThisWorkbook.ActiveSheet.Range("A1:A5").Value)
    pConn.Execute "insert into #needed_inn (inn) values " & "('" & Join(vData, "'),('") & "')"
    pConn.Execute "create index temp_inn_idx on #needed_inn (inn)"
    'Отредактируйте запрос под свой вариант
    ThisWorkbook.Worksheets.Add.Range("A2").CopyFromRecordset pConn.Execute("Select CheckId from dbo.Checks ch inner join #needed_inn ni On (ch.CheckId=ni.Inn)")
    pConn.Close
End Sub

Успехов.
 
Андрей VG, спасибо, интересное решение, обязательно применю к своей задачи.
Страницы: 1
Наверх