На листе есть столбец "ID" "Наличие". А на sql server таблица тоже с "ID". Если id из экселя есть на сервере, то в столбец "Наличие" писать "да". В противном случае "нет".
решила начать с простого-попытаться хоть что нибудь вывести. Простое действие и то не получается. Сразу ругань на неопределенный тип ADODB.Connection
[vba]
Код
Public Sub Photo()
Dim Conn As String Dim strsql As String Dim cn As ADODB.Connection Dim rst As ADODB.Recordset
Set cn = New ADODB.Connection Set rst = New ADODB.Recordset
rst.Open "SELECT TOP 10 * FROM tbl_book_foto", cn ActiveSheet.Range("T2").CopyFromRecordset rst rst.Close cn.Close Set cn = Nothing End Sub
[/vba]
Здравствуйте,
Требуется написать макрос.
На листе есть столбец "ID" "Наличие". А на sql server таблица тоже с "ID". Если id из экселя есть на сервере, то в столбец "Наличие" писать "да". В противном случае "нет".
решила начать с простого-попытаться хоть что нибудь вывести. Простое действие и то не получается. Сразу ругань на неопределенный тип ADODB.Connection
[vba]
Код
Public Sub Photo()
Dim Conn As String Dim strsql As String Dim cn As ADODB.Connection Dim rst As ADODB.Recordset
Set cn = New ADODB.Connection Set rst = New ADODB.Recordset
Требуется макрос, чтоб находить соответствия столбца А в таблице Бд. Я часть сделала, но не могу получить результат запроса select. Если select что то вывел, то соответствует ячейка и в столбце Т написать слово "да" иначе "нет"
В коде я просто тестировала хоть какой нибудь вывод в ячейки. А так в if должно быть да или нет
'select @op=[PT_SHORTNAME] from [db_Partners]..[Partner] where [PT_ID]=@ptid
' Application.ScreenUpdating = False
For Each ACell In Range("A2", Cells(Rows.Count, 1).End(xlUp))
rst.Open "SELECT bookid FROM tbl_book_foto where bookid=" & ACell.Value, cn
If ACell.Value = ACell.Value Then
Cells(ACell.Row, 20).Value = ACell.Value
End If
Next
Application.ScreenUpdating = True
rst.Close
cn.Close
Set cn = Nothing
End Sub
[/vba]
[moder]Соединил две темы в одну[/moder]
Требуется макрос, чтоб находить соответствия столбца А в таблице Бд. Я часть сделала, но не могу получить результат запроса select. Если select что то вывел, то соответствует ячейка и в столбце Т написать слово "да" иначе "нет"
В коде я просто тестировала хоть какой нибудь вывод в ячейки. А так в if должно быть да или нет
'objRS.Open objCmd 'Set objRec = objConn.Execute(cmdString) End With
[/vba]
или [vba]
Код
RST.movelast
[/vba]
2. По идее надо ваш список загрузить во временную таблицу , связать их и чуть исправиви запрос получить уже нужный список, который уже просто выгрузить в нужную область. Это самый универсальный подход при любом количестве данных.
'objRS.Open objCmd 'Set objRec = objConn.Execute(cmdString) End With
[/vba]
или [vba]
Код
RST.movelast
[/vba]
2. По идее надо ваш список загрузить во временную таблицу , связать их и чуть исправиви запрос получить уже нужный список, который уже просто выгрузить в нужную область. Это самый универсальный подход при любом количестве данных.
я использую для таких случаев UDF(пользовательскую функцию) например такую: [vba]
Код
Public Function SQLto2CellSimple(sSQL As String, Optional ByVal ServerName$ = "MyServer", Optional ByVal DatabaseName$ = "MyBase", Optional ByVal UserID$ = "", Optional ByVal Password = "") 'simple Function to get results SQL request in cell. '"Microsoft ActiveX Data Objects ***" is require Dim oRecordset As ADODB.Recordset ' Object Dim oConnection As ADODB.Connection ' Object
Set oConnection = New ADODB.Connection 'CreateObject("ADODB.Connection") ' Set oRecordset = New ADODB.Recordset 'CreateObject("ADODB.Recordset") ' If InStr(1, sSQL, "set nocount on", vbTextCompare) = 0 Then sSQL = "set nocount on; " & vbLf & sSQL
я использую для таких случаев UDF(пользовательскую функцию) например такую: [vba]
Код
Public Function SQLto2CellSimple(sSQL As String, Optional ByVal ServerName$ = "MyServer", Optional ByVal DatabaseName$ = "MyBase", Optional ByVal UserID$ = "", Optional ByVal Password = "") 'simple Function to get results SQL request in cell. '"Microsoft ActiveX Data Objects ***" is require Dim oRecordset As ADODB.Recordset ' Object Dim oConnection As ADODB.Connection ' Object
Set oConnection = New ADODB.Connection 'CreateObject("ADODB.Connection") ' Set oRecordset = New ADODB.Recordset 'CreateObject("ADODB.Recordset") ' If InStr(1, sSQL, "set nocount on", vbTextCompare) = 0 Then sSQL = "set nocount on; " & vbLf & sSQL
SLAVICK, Не спорю, при единичных использованиях такое имеет место, разве что летучести надо добавить из расчета на динамичность данных в базе. Но если надо проверить сотни, то эта дерготня может сильно вредить быстродействию.
А вот это -oRecordset.EOF и правда лучше чем count.
SLAVICK, Не спорю, при единичных использованиях такое имеет место, разве что летучести надо добавить из расчета на динамичность данных в базе. Но если надо проверить сотни, то эта дерготня может сильно вредить быстродействию.
А вот это -oRecordset.EOF и правда лучше чем count.bmv98rus
Замечательный Временно просто медведь , процентов на 20.
Сообщение отредактировал bmv98rus - Среда, 20.12.2017, 11:54
SLAVICK, Проверяла работу функции на 800 строках. Просто подождать до окончания процесса нужно не более 5 сек. Так что не вижу минусов в этом. Притом пользователи будут в по одной новой записи добавлять в файл раз в день. Так что думаю, им будет норм пользоваться функцией, просто тянув вниз. SLAVICK, bmv98rus, спасибо вам за помощь!
SLAVICK, Проверяла работу функции на 800 строках. Просто подождать до окончания процесса нужно не более 5 сек. Так что не вижу минусов в этом. Притом пользователи будут в по одной новой записи добавлять в файл раз в день. Так что думаю, им будет норм пользоваться функцией, просто тянув вниз. SLAVICK, bmv98rus, спасибо вам за помощь!Aumi
Aumi, Только имейте в виду, за счет "нелетучести" функции , если вчера внесли строчку и она показала отсутствие, а сегодня в базе появилась нужная запись (или пропала), то значением не изменится . Даже если запустить перерасчет. Но все зависит от того , что вы контролируете этим.
Aumi, Только имейте в виду, за счет "нелетучести" функции , если вчера внесли строчку и она показала отсутствие, а сегодня в базе появилась нужная запись (или пропала), то значением не изменится . Даже если запустить перерасчет. Но все зависит от того , что вы контролируете этим.bmv98rus
Замечательный Временно просто медведь , процентов на 20.
например если искомое значение в A1 и в B1 формула и вчера она выдавала "нет", то открыв сегодня так "нет" и будет, даже если в базе что-то появилось и даже если пересчитать лист (F9). Для того чтоб пересчет произошел, надо изменить значение в A1 или перезаписать формулу в B1.
например если искомое значение в A1 и в B1 формула и вчера она выдавала "нет", то открыв сегодня так "нет" и будет, даже если в базе что-то появилось и даже если пересчитать лист (F9). Для того чтоб пересчет произошел, надо изменить значение в A1 или перезаписать формулу в B1.bmv98rus
Замечательный Временно просто медведь , процентов на 20.
bmv98rus, SLAVICK, Тут есть такой интересный случай. Записи идут с 2-194 строчке, потом пустая , потом опять записи идут дальше. И так несколько раз. Номера строк-разрывов логически не связаны. Если это делать ф-цией, то она просто напишет в разрыве #ЗНАЧ!
А если в цикле, то считается 194 заполнятся, а на 195 [vba]
Код
For Each ACell In Range("A2", Cells(Rows.Count, 1).End(xlUp))
[/vba]
[ODBC SQL Server Driver][SQL Server] Неправильный синтаксис около конструкции "="
Может знаете, как это решить?
bmv98rus, SLAVICK, Тут есть такой интересный случай. Записи идут с 2-194 строчке, потом пустая , потом опять записи идут дальше. И так несколько раз. Номера строк-разрывов логически не связаны. Если это делать ф-цией, то она просто напишет в разрыве #ЗНАЧ!
А если в цикле, то считается 194 заполнятся, а на 195 [vba]
Код
For Each ACell In Range("A2", Cells(Rows.Count, 1).End(xlUp))
[/vba]
[ODBC SQL Server Driver][SQL Server] Неправильный синтаксис около конструкции "="
знаем, но вопрос уже не по этой теме, хоте если честно и да простят меня модераторы или надо в функции просто проверят переданное значения sSQL и если оно пустое или не соотвтевует правильному синтаксису и выводить что-то . или просто
Код
=IFERROR(SQLto2CellSimple(A1);"")
Ну и с циклом естественно проверять что значением есть и смещать строку вывода.
знаем, но вопрос уже не по этой теме, хоте если честно и да простят меня модераторы или надо в функции просто проверят переданное значения sSQL и если оно пустое или не соотвтевует правильному синтаксису и выводить что-то . или просто
Код
=IFERROR(SQLto2CellSimple(A1);"")
Ну и с циклом естественно проверять что значением есть и смещать строку вывода.bmv98rus
Замечательный Временно просто медведь , процентов на 20.
Сообщение отредактировал bmv98rus - Четверг, 21.12.2017, 13:14