Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.98/55: Рейтинг темы: голосов - 55, средняя оценка - 4.98
0 / 0 / 1
Регистрация: 26.03.2011
Сообщений: 73

Записать результат SQL запроса в переменную

09.04.2015, 14:45. Показов 11386. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет.
Такой вопрос.

К примеру
Есть 2 таблицы в БД vks

Таблица people
|name| org |
------------
|boss | orp |
|lera | omj |


И

Таблица rasp
|org|mon1|
-----------
|orp| 1 |
|omj| 1 |

В определенную ячейку в таблице вводится ИМЯ (name). Код VBA должен забирать это имя, находить отправлять SQL запрос соответствие со столбцом org в таблице people. Затем для найденного значения ищется соответствие в таблице pasp и значение меняется на минус один.

Visual Basic
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
Sub UPDDown ()
Dim varConn As String   'объявление переменных
Dim varSQL1 As String
Dim varSQL2 As String
Dim m As String
Dim res As String
 
    Range("A1").CurrentRegion.ClearContents
  
    varConn = "ODBC;DBQ=test.mdb;Driver={Driver do Microsoft Access (*.mdb)}"
  
    name = Range("A3")   'Забирем имя человека из А3
     
    varSQL1 = "SELECT org FROM people WHERE name="   'запрос на поиск организации по соответствующему имени
          With ActiveSheet.QueryTables.Add(Connection:=varConn, Destination:=Range("A1"))
             .CommandText = varSQL1 & "'" & name & "'" 'конструирование запроса
             .Name = "_"    'магия 1
             .Refresh BackgroundQuery:=True      'магия 2
         End  
 
    varSQL2 = "UPDATE rasp SET mon1=mon1-1 WHERE org="   'запрос на изменение переменной в БД
          With ActiveSheet.QueryTables.Add(Connection:=varConn, Destination:=Range("O7"))
             .CommandText = varSQL & "'" & res & "'" 'КАК ЗАНЕСТИ РЕЗУЛЬТАТ ЗАПРОСА В ЭТУ ПЕРЕМЕННУЮ?
             .Name = "_" 'магия 1
             .Refresh BackgroundQuery:=True 'магия 2
         End With
End Sub
Как занести результат SQL запроса в переменную res, чтобы сработал второй запрос?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.04.2015, 14:45
Ответы с готовыми решениями:

Результат запроса записать в переменную
Подскажите выполняю запрос выборку, в результате получается строковое значение, которое необходимо записать в переменную, что предложите ...

Записать в переменную результат запроса
Подскажите, как записать результат запроса в массив. Запрос ниже возвращает 15 записей типа текст. Как их записать в переменную? Данный...

Результат SQL запроса в переменную
Есть переменная которая выводиться в файле который инклюдиться. Нужно в переменную $category засунуть результат с SQL запроса. Сам...

15
466 / 123 / 61
Регистрация: 04.03.2015
Сообщений: 325
09.04.2015, 19:27
Цитата Сообщение от st-kontora Посмотреть сообщение
Как занести результат SQL запроса в переменную res
У вас
Visual Basic
1
Destination:=Range("A1")
Соответственно пишем
Visual Basic
1
res = Range("A1").Value
0
0 / 0 / 1
Регистрация: 26.03.2011
Сообщений: 73
10.04.2015, 10:13  [ТС]
Написал, но теперь ругается на

Visual Basic
1
 .Refresh BackgroundQuery:=True 'магия 2
из первого запроса
Ошибка 1004
Общая ошибка ODBC

Ставил False, то же самое. Честно говоря вообще не понимаю что делает эта строчка. Вроде как не выводит название запроса в эксель.
В экселе в нужной ячейке имя стоит, хотя это не принципиально.
0
0 / 0 / 1
Регистрация: 26.03.2011
Сообщений: 73
10.04.2015, 10:55  [ТС]
Увидел что у меня переменная с именем name. Так не хорошо. Подправил. В итоге

Visual Basic
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
Sub UPDDown()
Dim varConn As String   'îáúÿâëåíèå ïåðåìåííûõ
Dim varSQL1 As String
Dim varSQL2 As String
Dim res As String
Dim bname As String
 
    Range("A1").CurrentRegion.ClearContents
  
    varConn = "ODBC;DBQ=test.mdb;Driver={Driver do Microsoft Access (*.mdb)}"
  
    bname = Range("A3").Value
    'Çàáèðåì èìÿ ÷åëîâåêà èç À3
     
    varSQL1 = "SELECT org FROM people WHERE name="   'çàïðîñ íà ïîèñê îðãàíèçàöèè ïî ñîîòâåòñòâóþùåìó èìåíè
          With ActiveSheet.QueryTables.Add(Connection:=varConn, Destination:=Range("A1"))
             .CommandText = varSQL1 & "'" & bname & "'" 'êîíñòðóèðîâàíèå çàïðîñà
             .Name = "_"    'ìàãèÿ 1
             .BackgroundQuery = False
           
         
res = Range("A1").Value
 
    varSQL2 = "UPDATE rasp SET mon1=mon1-1 WHERE org="   'çàïðîñ íà èçìåíåíèå ïåðåìåííîé â ÁÄ
          With ActiveSheet.QueryTables.Add(Connection:=varConn, Destination:=Range("O7"))
             .CommandText = varSQL & "'" & res & "'" 'ÊÀÊ ÇÀÍÅÑÒÈ ÐÅÇÓËÜÒÀÒ ÇÀÏÐÎÑÀ Â ÝÒÓ ÏÅÐÅÌÅÍÍÓÞ?
             .Name = "_" 'ìàãèÿ 1
             .BackgroundQuery = False
         End With
         End With
End Sub
Никаких ошибок, НО ничего в базе не меняет!

Добавлено через 7 минут
Извиняюсь .Refresh BackgroundQuery = true не поставил. В общем ошибка та же.
0
4089 / 1469 / 401
Регистрация: 07.08.2013
Сообщений: 3,670
10.04.2015, 11:20
надо не запрос дергать а рекордсет
Visual Basic
1
2
3
4
5
6
7
Dim rs as adodb.recordset
Set rs=new adodb.recordset
rs.Open "SELECT a1.org FROM people as a1 WHERE a1.name='" & Range("A3").Value & "'",varConn,3,3
if rs.eof and rs.bof Then exit sub
rs.movefirst
res=rs.fields("org")
set rs=nothing

Не по теме:

ps Написано на коленке - могут быть ошибки



Добавлено через 7 минут
во втором запросе - ошибка
не указано в какой табле менять данные
1
0 / 0 / 1
Регистрация: 26.03.2011
Сообщений: 73
10.04.2015, 11:24  [ТС]
Вложение 512906

0
4089 / 1469 / 401
Регистрация: 07.08.2013
Сообщений: 3,670
10.04.2015, 11:25
не прикрепилось
1
0 / 0 / 1
Регистрация: 26.03.2011
Сообщений: 73
10.04.2015, 11:27  [ТС]
Run time error 3001
Аргументы имеют неверный тип, выходят за пределы допустимого диапазона или вступают в конфликт друг с другом.
0
4089 / 1469 / 401
Регистрация: 07.08.2013
Сообщений: 3,670
10.04.2015, 11:27
в какой строке
1
0 / 0 / 1
Регистрация: 26.03.2011
Сообщений: 73
10.04.2015, 11:28  [ТС]
rs.Open "SELECT a1.org FROM people as a1 WHERE a1.name='" & Range("A3").Value & "'",varConn,3,3

Извиняюсь. Не написал сразу. Затупил.
0
4089 / 1469 / 401
Регистрация: 07.08.2013
Сообщений: 3,670
10.04.2015, 11:30
создайте базку
и файлик excel
и выложите
будем их мучать
1
0 / 0 / 1
Регистрация: 26.03.2011
Сообщений: 73
10.04.2015, 11:34  [ТС]
Готово.

test.7z
0
4089 / 1469 / 401
Регистрация: 07.08.2013
Сообщений: 3,670
10.04.2015, 11:59
Лучший ответ Сообщение было отмечено st-kontora как решение

Решение

Visual Basic
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
Sub UPDDown()
Dim varConn As String   'объявление переменных
Dim varSQL1 As String
Dim varSQL2 As String
Dim res As String
Dim bname As String
 
    Range("A1").CurrentRegion.ClearContents
  
    varConn = "ODBC;DBQ=F:\Users\snipe\Downloads\test\test\test.mdb;Driver={Driver do Microsoft Access (*.mdb)}"
  Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
rs.Open "SELECT a1.Поле2 FROM people as a1 WHERE a1.Поле1='" & Range("A3").Value & "'", varConn, 3, 3
If rs.EOF And rs.bof Then Exit Sub
rs.movefirst
res = rs.fields("Поле2")
Set rs = Nothing
 
         
 
    varSQL2 = "UPDATE rasp SET rasp.поле2=rasp.поле2 + 1 WHERE rasp.поле1="   'запрос на изменение переменной в БД
          With ActiveSheet.QueryTables.Add(Connection:=varConn, Destination:=Range("O7"))
             .CommandText = varSQL2 & "'" & res & "'" 'КАК ЗАНЕСТИ РЕЗУЛЬТАТ ЗАПРОСА В ЭТУ ПЕРЕМЕННУЮ?
             .Name = "_" 'магия 1
             .Refresh BackgroundQuery:=True
         End With
'
End Sub
Добавлено через 45 секунд
это для той базы что вы создали
путь пропишите свой
1
0 / 0 / 1
Регистрация: 26.03.2011
Сообщений: 73
10.04.2015, 12:08  [ТС]
На строку rs.Open "SELECT a1.Поле2 FROM people as a1 WHERE a1.Поле1='" & Range("A3").Value & "'", varConn,


run time error -2147467259 (80004005)

[Microsoft][Драйвер ODBC Microsoft Access] Общий сбой
Не удается открыть раздел реестра 'Temporary (volatile) Jet DSN for process
0x980 Thread 0x13c0 DBC 0x4489 Jet'

я так понимаю это техническая ошибка и дело не в коде?

В гугле что то все совсем плохо.
0
4089 / 1469 / 401
Регистрация: 07.08.2013
Сообщений: 3,670
10.04.2015, 12:20
я не зря просил базку
код проверил - работает
1
0 / 0 / 1
Регистрация: 26.03.2011
Сообщений: 73
10.04.2015, 12:21  [ТС]
Я понимаю. Просто может сталкивались. Хорошо. На домашнем проверю компе. СПАСИБО ОГРОМНОЕ за помощь!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.04.2015, 12:21
Помогаю со студенческими работами здесь

Результат запроса SQL в переменную
Помогите пожалуйста Есть таблица в access (Sloti) в ней несколько столбцов, один из них числительные (ObiomSlota), другой столбец с...

Результат SQL запроса в переменную
В принципе заголовок Как записать результат выборки SQL запроса в переменную, заведомо известно что результат может быть только один ...

Передать результат sql-запроса в переменную
Всем привет. Столкнулся с такой штукой. Вот какому-нить элементу управления я могу присвоить результат запроса SQL. А вот как его...

Записать результат запроса в переменную и вывести в TextBox
Здравствуйте, мне нужно при помощи C# послать уже созданной в Access базе данных запрос и присвоить результат переменной, чтобы потом...

Записать результат MySql запроса в переменную php
Здравствуйте с: есть код: $result3 = mysql_query ("SELECT `idPCCode` FROM `PCCode` WHERE `PCompCode` = '$cod'"); $perem =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru