powered by simpleCommunicator - 2.0.37     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / sql vba excel проверка наличия данных по дате
19 сообщений из 19, страница 1 из 1
sql vba excel проверка наличия данных по дате
    #39547684
kovax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Форумчане, прошу помощи, ибо не могу придумать код для следующей ситуации:
Есть БД, которая раз в сутки заполняется данными с приборов учёта. Каждому числу месяца соответствуют определённые данные. С помощью макроса эти показания попадают в определённый столбец экселя, так чтобы они соответствовали дате в соседнем столбце.
Если в БД есть данные за все дни месяца, то заполняется ексель правильно, А если, например, за 15е нет данных, а запрашиваются с 1 по 20, то вместо того, чтобы ячейку напротив 15-го числа оставить пустой, она заполняется за 16-е, 16 за 17 и т.д.
В этом всё и дело: как сделать, чтобы при недостающих данных в БД в соответствующих клетках экселя было тоже пусто, или 0, или НЕТ ДАННЫХ...
Мой скрипт запроса:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
'Паропровод 2. Масса'
Sub LoadData_id10()

Dim cn As ADODB.Connection
Dim rst As ADODB.Recordset

Set cn = New ADODB.Connection
Set rst = New ADODB.Recordset
cn.ConnectionString = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=PowerPlant;Data Source=ROCON" 'Параметры строки подключения
cn.Open
rst.Open "SELECT VALUE FROM SPNetArchive Where (RequestID=10)AND(DateTime BETWEEN '09-01-2017 00:00:00'AND'09-30-2017 00:00:00') Order By DateTime", cn 'SQL-запрос, подключение, получение из колонки VALUE, по ID и по дате-времени
ActiveSheet.Range("B72").CopyFromRecordset rst 'Извлекаем данные на лист
rst.Close
cn.Close
Set rst = Nothing
Set cn = Nothing
End Sub

Модератор: Учимся использовать тэги оформления кода - FAQ
...
Рейтинг: 0 / 0
sql vba excel проверка наличия данных по дате
    #39548741
Фотография Nik_Kurta
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я так понял, что на листе Excel, в определённой колонке проставлены даты статически? А не пробовали выводить через запрос и дату и данные?
...
Рейтинг: 0 / 0
sql vba excel проверка наличия данных по дате
    #39549261
kovax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да не, то, что Вы предлагаете, частично решит, конечно, вопрос, но основному требованию не удовлетворит - интерфейс не трогать - только макрос подрихтовать. Требование начальника отдела. Сейчас вот добился, чтобы RecordCount корректно показывал содержание рекордсета, ну и всё, пока не знаю дальше что с ним делать. Опыта в программировании нет, сейчас вот на старости лет приходится вникать
...
Рейтинг: 0 / 0
sql vba excel проверка наличия данных по дате
    #39549263
kovax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На SQL-сервере довольно редко бывает нехватка данных, но в такие моменты хочется, чтоб прога корректно отрабатывала. В конце концов - вопрос профессионального честолюбия.
...
Рейтинг: 0 / 0
sql vba excel проверка наличия данных по дате
    #39549317
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kovax, Вам надо допилить запрос так, чтобы он всегда возвращал все дни
не знаю какая у Вас версия скуля, но можно примерно так (кто-то и поправит при желании)

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT 
	VALUE 
FROM (
	select 
		dateadd(dd, d.dt, '20170901 00:00:00') dt 
	from (values 
		(0), (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)
		) d(dt)
	where 
		dateadd(dd, d.dt, '20170901 00:00:00') BETWEEN '20170901 00:00:00'AND'20170930 00:00:00') x(dt)
left join (select * from SPNetArchive where RequestID=10) s on datetime = x.dt
Order By x.dt



ЗЫЖ
1. плохо назвать поля зарезервированными словами,
2. дату лучше писать в каноническом виде YYYMMDD HH:MM:SS
3. в запросе лучше заменить даты в условии на параметры
...
Рейтинг: 0 / 0
sql vba excel проверка наличия данных по дате
    #39549942
kovax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Долго, чувствую, буду "переваривать" Ваш код, HandKot. Во всяком случае, на данный момент отладчик ругается за синтаксис, пока не могу разобраться, в чём дело. Скул у меня 2008R2, формат даты он "ест" такой - mm-dd-yyyy, проверено.
...
Рейтинг: 0 / 0
sql vba excel проверка наличия данных по дате
    #39549946
kovax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
HandKot, а не могли бы Вы привести пример кода для записи числа из ячейки, например А1, листа "Лист1" в SQL-сервер, таблицу SPNetArchive, столбец RequestID и присвоить этому значению, например RequestID=100. Строка подключения та же, что в первом вопросе.
...
Рейтинг: 0 / 0
sql vba excel проверка наличия данных по дате
    #39549989
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kovaxпример кода для записи числа из ячейки, например А1, листа "Лист1" в SQL-сервер, таблицу SPNetArchive, столбец RequestID и присвоить этому значению, например RequestID=100. Строка подключения та же, что в первом вопросе.
если правильно понял, то пишите простой UPDATE
примерно так (не проверял)

Dim cmd As New ADODB.Command
Dim cn As New ADODB.Connection

cn.ConnectionString = ""
cn.Open

set cmd.Connection = cn
cmd.Execute "update SPNetArchive set RequestID = " & ThisWorkbiik.Worksheets("Лист1"),Range("A1").Value & " where тут условие для конкретной строки"
.

kovaxВо всяком случае, на данный момент отладчик ругается за синтаксис, пока не могу разобраться, в чём дело
что за ошибка? указанный запрос на 2008 должен работать
...
Рейтинг: 0 / 0
sql vba excel проверка наличия данных по дате
    #39550020
kovax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ошибка выскакивает следующая: "Невозможно использовать подключение для выполнения операции. Оно закрыто или не допускается в данном контексте". Я тогда добавил в конце Вашей строки cn, ошибка после этого изменилась на "Incorrect syntax near nthe keyword 'values'"
...
Рейтинг: 0 / 0
sql vba excel проверка наличия данных по дате
    #39550055
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kovax, мы сейчас о чём говорим?

по поводу запроса на выборку. Он у Вас в том виде, который я написал, через Management Studio работает?
...
Рейтинг: 0 / 0
sql vba excel проверка наличия данных по дате
    #39550172
kovax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
HandKot, скрин приложил в качестве аргумента.
...
Рейтинг: 0 / 0
sql vba excel проверка наличия данных по дате
    #39550596
Казанский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kovax,
можно вывести 2 столбца
Код: vbnet
1.
rst.Open "SELECT DateTime, VALUE FROM SPNetArchive ...

, вставить недостающие записи, ориентируясь по дате-времени, удалить столбец с датами, примерно так
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
  Dim i&, d As Date
  For i = Cells(Rows.Count, "B").End(xlUp).Row To 73 Step -1
    d = Int(Cells(i, "B"))
    While d - Int(Cells(i - 1, "B")) > 1
      Cells(i, "B").Resize(, 2).Insert xlShiftDown
      d = d - 1
      Cells(i, "B") = d 'необязательно
      Cells(i, "C") = "НЕТ ДАННЫХ"
    Wend
  Next
  Range("B72", Cells(Rows.Count, "B").End(xlUp)).Delete xlShiftToLeft
...
Рейтинг: 0 / 0
sql vba excel проверка наличия данных по дате
    #39550648
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kovaxHandKot, скрин приложил в качестве аргумента.
MS Query конечно же не понимает данный синтаксис. Он остался, я думаю, на уровне SQL 7
Запрос надо вставить вместо Вашего в строке
Код: vbnet
1.
rst.Open "SELECT VALUE 
...
Рейтинг: 0 / 0
sql vba excel проверка наличия данных по дате
    #39550672
kovax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Наверно, сейчас глупость спрошу...
Казанский, чёт не соображу - а куда вставить CopyFromRecordset rst?
...
Рейтинг: 0 / 0
sql vba excel проверка наличия данных по дате
    #39550746
Казанский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kovax,
оставьте его на месте. Мой код вставьте перед End Sub, подправьте строку запроса.
Чтобы убедиться в правильности работы, пройдите код по шагам - F8.
Требуется, чтобы столбец С был изначально свободен, иначе запрос затрет его. Если это невозможно, надо перед CopyFromRecordset вставить столбец, или вообще выгружать рекордсет на новый лист и там обрабатывать.
...
Рейтинг: 0 / 0
sql vba excel проверка наличия данных по дате
    #39550786
kovax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Казанский, сделал, как Вы сказали. Выкладываю результат выполнения.
В БД нет данных за 1 и 9 ноября. За 9.11.2017 всё верно - нет данных, а за 01.11.2017 не отработал алгоритм.
За 10 данные "съехали" почему-то в колонку с датами
...
Рейтинг: 0 / 0
sql vba excel проверка наличия данных по дате
    #39550790
kovax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А если ещё раз нажать кнопку, то...
...
Рейтинг: 0 / 0
sql vba excel проверка наличия данных по дате
    #39550861
Казанский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kovax,
выложите лист после вставки двух столбцов (файл Excel, не картинку!). Еще для правильной работы алгоритма нужны начальная и конечная даты, используемые в запросе - откуда берутся эти даты?
...
Рейтинг: 0 / 0
sql vba excel проверка наличия данных по дате
    #39550993
kovax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Даты в строке запроса к БД.
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / sql vba excel проверка наличия данных по дате
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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