Форум программистов, компьютерный форум, киберфорум
Microsoft Access
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.86/14: Рейтинг темы: голосов - 14, средняя оценка - 4.86
 Аватар для Silur
1370 / 290 / 16
Регистрация: 16.01.2014
Сообщений: 922

Access 2019 и параметрические запросы

07.10.2023, 12:30. Показов 4131. Ответов 86

Студворк — интернет-сервис помощи студентам
По указанию начальства организацию переводят на Office 2019
Пару недель работали нормально. Но подошло время писать отчёты. А там у меня всё на хранимых параметрических запросах.
Для тех, кто не знает. Это такие запросы, в которые передаются параметры при вызове (запуске) запроса.
В Access 2010 всё работало нормально, а сейчас отказывается

Пример хранимого параметрического запроса
SQL
1
2
3
4
5
6
PARAMETERS [cYear] Long, [cPeriod] Long;
INSERT INTO tbl_Temp12b ( КодСубъект, НаимСубъект, КодОбл )
SELECT Тб304РеСубъект.КодСубъект, Тб304РеСубъект.НаимСубъект, Тб304РеСубъект.КодОбл
FROM Тб304РеСубъект INNER JOIN Тб321КлПериод ON Тб304РеСубъект.[Код период] = Тб321КлПериод.КодПериод
WHERE (((Тб321КлПериод.pYear)=[cYear]) AND ((Тб321КлПериод.IdCodPeriod)=[cPeriod]))
WITH OWNERACCESS OPTION;
Вызов в программе выглядит так
Visual Basic
1
2
3
                strParameters = " " & intCurYear & ", " & 16 ' " 2023, 16"
' заполнение временной таблицы tbl_Temp12b начальными данными
        CurrentProject.Connection.Execute "qry_Tab12f" & strParameters
Если запрос запускается из программы то выдаётся сообщение - смотри рисунок

Но если запрос запустить из оболочки Access дважды щелкнув по нему То запрашиваются параметры и он нормально отрабатывает.

Первый рисунок - запрос запускается кодом из программы, второй и третий - из оболочки Access.

Что делать?!
Миниатюры
Access 2019 и параметрические запросы   Access 2019 и параметрические запросы   Access 2019 и параметрические запросы  

0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.10.2023, 12:30
Ответы с готовыми решениями:

Какие отзывы об Access 2019? Что лучше Access 2016 или Access 2019?
Здравствуйте! Подскажите, стоит ли использовать Access 2019 или лучше '16?

Не работают параметрические запросы
Создал БД, сделал запрос такой , но когда запускаю запрос, получаю и ничего он не спрашивает, так же не подсвечиваются подсказки вроде...

Параметрические запросы не работают
Вечер добрый. Не пойму в чем дело: параметрический запрос создан, но все запросы работают лишь раз. Даже если открываешь заново БД, то все...

86
 Аватар для Silur
1370 / 290 / 16
Регистрация: 16.01.2014
Сообщений: 922
11.10.2023, 10:22  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от alvk Посмотреть сообщение
Забудьте вы уже про 2013 офис, он никогда никому не нужен был. Зачем вы по всем версиям ходите? Был у вас 2010-й, а сейчас 2019-й. На нём и остановитесь.
Дело не во мне, а в клиентах. У каждого клиента своя организация, своя политика свои требования. У кого 2010, У кого 2013, у кого 2016, у кого 2019. Есть и 2021. У кого Офис х32, у кого - х64. И не мне диктовать им требования. Я обычный программист в обычной организации. Надо мной есть начальники.

Добавлено через 9 минут
Всё же Capi была права. Надо было перейти на DAO. Нашел, как это сделать. Теперь вместо
Visual Basic
1
        CurrentProject.Connection.Execute "qry_Tab12f" & strParameters
пишу
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Dim db As DAO.Database
Dim qry As DAO.QueryDef
 
Set db = CurrentDb
 
Set qry = db.QueryDefs("qry_Tab12f")
 
qry.Parameters(0) = intCurYear
qry.Parameters(1) = intPeriod
 
qry.Execute
и всё работает.

Добавлено через 14 минут
Цитата Сообщение от alvk Посмотреть сообщение
Почему у вас запросы ADO?
Программа начинала писаться лет 15 назад. Потом потихоньку дорабатывалась под новые требования. Сейчас уже 127 модификация программы. Если помните, одно время MS говорила, что DAO - это вчерашний день, а будущее за ADO. Даже в Access по умолчанию в референсах был подключен ADO, а DAO надо было подключать отдельно. (кажется это было в 2000, 2002, 2003 Офисах) потом они отыграли назад. И стали развивать DAO, но обозвали его по другому. Кроме того, одно время начальство собиралось перевести базу на MS SQL Server. Но не срослось. Вот в программах и чехарда. Одни запросы на DAO, другие на ADO. Всё работает - значит трогать не надо. Вот перестаёт работать, как сейчас, тогда и приходится разбираться.

Добавлено через 1 час 16 минут
Цитата Сообщение от Панург Посмотреть сообщение
почему бы не сделать нормально - через объект Command?
Здесь делается через Command? Simple parameterized queries using ADO in VBA но всё равно не выходит.
2
509 / 163 / 22
Регистрация: 04.10.2015
Сообщений: 646
11.10.2023, 10:40
Цитата Сообщение от Silur Посмотреть сообщение
Всё же Capi была права. Надо было перейти на DAO. Нашел, как это сделать. Теперь вместо... и всё работает.
С самого начала появления ADO у меня почему-то интуитивно возникло неприятие к нему.
И до сих пор использую DAO... "и это правильно " ©
0
 Аватар для alecko5
885 / 148 / 35
Регистрация: 05.08.2022
Сообщений: 681
11.10.2023, 11:32
Цитата Сообщение от Silur Посмотреть сообщение
всё равно не выходит.
быть того не может, это штатная ситуация. причем работает довольно гибко - параметры можно менять на лету, (параметризованные динамические запросы).
Кликните здесь для просмотра всего текста
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
32
33
34
35
36
37
38
39
40
41
42
43
Dim rstPrice As ADODB.Recordset,  cnn As ADODB.Connection, cmdCommand As New ADODB.Command, prmParam As ADODB.Parameter, rstZay As ADODB.Recordset, 
 
strsql = "..."
With rstClient
 .CursorLocation = adUseServer
.Open strsql, cnn, adOpenKeyset, adLockReadOnly
End With
Set cnn = CurrentProject.Connection
strsql = "Parameters ID1 long, ID2 long; " & _
"SELECT * " & _
"FROM tblPrice " & _
"WHERE (((tip)=" & tipPrice & ") AND ((ida)=[ID1]) AND ((idt)=[ID2]));"
 With cmdCommand
      Set .ActiveConnection = cnn
      .CommandText = strsql
      .CommandType = adCmdText
      Set prmParam = .CreateParameter("ID1", adNumeric, adParamInput, , rstClient.Fields("ida"))
      Set prmParam = .CreateParameter("ID2", adNumeric, adParamInput, , 0)
      .Parameters.Append prmParam
End With
' ...
strsql = "..."
Set rstZay = New ADODB.Recordset
With rstZay
.Open strsql, cnn, adOpenKeyset, adLockReadOnly
   Do Until .EOF
' меняем параметр и снова в бой!
      With cmdCommand
         .Parameters("ID2") = rstZay.Fields("idTov")
         Set rstPrice = .Execute
      End With
  If rstPrice.EOF Then
            rstPrice2.AddNew
'...
rstPrice2.update
    Else
         rstPrice2.Find "[ID]=" & rstPrice.Fields("ID"), , , 1
'...
end if
' ...
   .MoveNext
   Loop
End With
0
Эксперт MS Access
 Аватар для Eugene-LS
13262 / 5940 / 1528
Регистрация: 05.10.2016
Сообщений: 16,617
11.10.2023, 11:42
Цитата Сообщение от alecko5 Посмотреть сообщение
параметры можно менять на лету
Это понятно, а почему на 2 параметра только один запуск метода .Parameters.Append?
(Пост #43, строки #17 - 19)
0
509 / 163 / 22
Регистрация: 04.10.2015
Сообщений: 646
11.10.2023, 11:56
Столько мнений по поводу такого простого вопроса
А почему бы не вставить в стандартный модуль общедоступную функцию, которая возвращает нужный параметр, типа Get_Param(paramName)?
И эту функцию в дальнейшем можно использовать в любых запросах. Запрос будет очень простым и компактным.
Это оправдано, если параметр используется довольно часто, например дата или временной период.
1
 Аватар для alecko5
885 / 148 / 35
Регистрация: 05.08.2022
Сообщений: 681
11.10.2023, 11:57
Цитата Сообщение от Eugene-LS Посмотреть сообщение
только один запуск метода
первый параметр создан с начальным значением, так и остается.
0
Эксперт MS Access
 Аватар для Eugene-LS
13262 / 5940 / 1528
Регистрация: 05.10.2016
Сообщений: 16,617
11.10.2023, 12:07
Цитата Сообщение от andris2 Посмотреть сообщение
И эту функцию в дальнейшем можно использовать в любых запросах.
Кстати я ВСЕГДА примерно так и делаю ...
Запросы с параметрами не испольную вообще и никогда, ибо без них жить проще.

Но в топик не про это, а про: что делать когда "боржоми пить уже поздно" ...
1
509 / 163 / 22
Регистрация: 04.10.2015
Сообщений: 646
11.10.2023, 12:10
Цитата Сообщение от Eugene-LS Посмотреть сообщение
ибо без них жить проще
"...и это правильно" ©
0
Эксперт MS Access
 Аватар для Eugene-LS
13262 / 5940 / 1528
Регистрация: 05.10.2016
Сообщений: 16,617
11.10.2023, 12:11
Цитата Сообщение от alecko5 Посмотреть сообщение
первый параметр создан с начальным значением, так и остается.
Создан в объектной переменной: Set prmParam = ...
И в коллекцию Command.Parameters - добавление не прошло - это что то новенькое (для меня).
0
 Аватар для alecko5
885 / 148 / 35
Регистрация: 05.08.2022
Сообщений: 681
11.10.2023, 12:24
Цитата Сообщение от Eugene-LS Посмотреть сообщение
И в коллекцию Command.Parameters - добавление не прошло
да, Вы правы - строку пропустил.
после
Visual Basic
1
Set prmParam = .CreateParameter("ID1", adNumeric, adParamInput, , rstClient.Fields("ida"))
нужно вставить
Visual Basic
1
 .Parameters.Append prmParam
хотел коммент добавить и удалил вместе с ним.
0
 Аватар для Silur
1370 / 290 / 16
Регистрация: 16.01.2014
Сообщений: 922
11.10.2023, 16:09  [ТС]
Бьюсь 6 день.
Чтобы не было разночтений - склепал пример. В модуле 2 теста. В первом - как предлагают, во втором - как делал я.
Сейчас у меня оба не работают. До обеда Test2 работал - сейчас отказался. Что случилось - непонятно.
Вложения
Тип файла: zip TestADO.zip (42.4 Кб, 13 просмотров)
0
 Аватар для Silur
1370 / 290 / 16
Регистрация: 16.01.2014
Сообщений: 922
11.10.2023, 16:12  [ТС]
Цитата Сообщение от alecko5 Посмотреть сообщение
быть того не может, это штатная ситуация. причем работает довольно гибко - параметры можно менять на лету, (параметризованные динамические запросы).
Попробуйте на моём примере. если что-то не так, подскажите, где ошибка.
0
509 / 163 / 22
Регистрация: 04.10.2015
Сообщений: 646
11.10.2023, 16:16
Цитата Сообщение от Silur Посмотреть сообщение
Бьюсь 6 день.
Для чего вы ломитесь в окно, когда двери открыты?
Создайте глобальную переменную, которой в нужном месте и в нужное время будут присваиваться различные значения.
И в стандартном модуле, как я уже писал, создайте функцию ее возвращающую. Можно в любой запрос эту функцию запихнуть.
И забудьте про всякие "параметрические" запросы.
0
 Аватар для Silur
1370 / 290 / 16
Регистрация: 16.01.2014
Сообщений: 922
11.10.2023, 17:03  [ТС]
Есть у меня и такие функции. Причём несколько. Но хотелось бы решить вопрос с параметрами...

Теперь другое. Запустил программу на сервере - она отработала, запустил у себя на компьютере - она вылетела по ошибке. Запускаю на сервере - работает, запускаю у себя - нет.
Установлены из одной и той же сборки.

На домашнем компьютере вылетает по такой же ошибке.

Попробую переставить ОС и Офис
0
Эксперт MS Access
 Аватар для Eugene-LS
13262 / 5940 / 1528
Регистрация: 05.10.2016
Сообщений: 16,617
11.10.2023, 17:19
Цитата Сообщение от Silur Посмотреть сообщение
Но хотелось бы решить вопрос с параметрами...
Да - не работали

Подправил - теперь оба варианта работают (у меня).
Вложения
Тип файла: zip TestADO_v01.zip (34.2 Кб, 5 просмотров)
1
Эксперт MS Access
 Аватар для Eugene-LS
13262 / 5940 / 1528
Регистрация: 05.10.2016
Сообщений: 16,617
11.10.2023, 17:27
Цитата Сообщение от Silur Посмотреть сообщение
Попробую переставить ОС и Офис
Перед этим сравните размеры полей:
- табл. "Тб304РеСубъект" - поле "НаимСубъект" (откуда) = 255
- табл. "tbl_Temp12b" - поле "НаимСубъект" (куда) = 112 !!!
...
Внимательнее надо ...
1
 Аватар для alecko5
885 / 148 / 35
Регистрация: 05.08.2022
Сообщений: 681
11.10.2023, 17:31
insert into - нужно исключить
.CommandText = sqlString' имя запроса не видит, хочет только текст
в архиве работающий тест1.
Вложения
Тип файла: zip TestADO.zip (60.1 Кб, 3 просмотров)
1
Эксперт MS Access
 Аватар для Eugene-LS
13262 / 5940 / 1528
Регистрация: 05.10.2016
Сообщений: 16,617
11.10.2023, 17:38
Цитата Сообщение от alecko5 Посмотреть сообщение
в архиве работающий тест1
А это:
Visual Basic
1
2
3
4
5
6
With ExecuteParameters
   Do Until .EOF
   Debug.Print .Fields(0)
   .MoveNext
   Loop
End With
Зачем оставили?

И .... запрос текстом в коде это не решение проблемы топика
Я брал так:
Visual Basic
1
2
' Берём команду (SQL строку) из сохранённого запроса:
    sSQL = CurrentDb.QueryDefs("qry_Tab12f").SQL
0
 Аватар для alecko5
885 / 148 / 35
Регистрация: 05.08.2022
Сообщений: 681
11.10.2023, 17:46
Цитата Сообщение от Eugene-LS Посмотреть сообщение
- табл. "tbl_Temp12b" - поле "НаимСубъект" (куда) = 112 !!!
вот почему не стреляло(!)
Цитата Сообщение от Eugene-LS Посмотреть сообщение
Я брал так:
это детали, нужно было понять почему не работает, грешил на параметры.
благодаря тому, что нашли эту ошибку, думаю ничего менять уже не надо . все заработает как раньше.
0
Эксперт MS Access
 Аватар для Eugene-LS
13262 / 5940 / 1528
Регистрация: 05.10.2016
Сообщений: 16,617
11.10.2023, 17:49
Цитата Сообщение от alecko5 Посмотреть сообщение
вот почему не стреляло(!)
Ну и из за этого в том числе - был "букетик" причин.
Обработчик ошибок помог.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.10.2023, 17:49

Как запускать из PHP кода параметрические запросы Access...
Как запускать из PHP кода параметрические запросы Access?... Или это невозможно...

Параметрические запросы
Здравствуйте! Задание такое : Клиент вводит запрос , в котором указывает требуемый ему пункт назначения и интервал возможного времени...

Параметрические запросы в TADODataSet
Доброе время суток. Пару-тройку лет назад, когда я плотно занимался Interbase и обращался к нему с помощью компонент прямого доступа,...

Как в Access объединить запросы в один или вывести эти запросы в одном отчете и рассчитать по ним коэффициент?
Добрый день! Помогите разобраться. Есть у меня 5 запросов access, которые через долгие манипуляции все же вывели мне суммы, которые...

Проблема с отчетом MS Access 2019
Задача по базе печать договоров, в отчет скопировал 2 листа из вордового договора- больше не лезет (там 4 листа). Как мне сделать отчет...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
Запись в регистр сведений независимо от заполненности табличной части
Maks 25.08.2026
Реализация из решения ниже выполнена на нетиповом документе с несколькими табличными частями, разработанного в КА2. Задача: Обеспечить запись документа в регистр сведений независимо от. . .
Ноутбук Альфария
kumehtar 24.08.2026
Встретился тут в сети ноутбук Альфария, примарха Альфа-Легиона. Хотя возможно, это ноутбук Омегона, разумеется. Ну как вам?
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания источниках данных и элементов формы(текстовые поля и метки), опирается все это на технологию событий и мета. . .
Цена ошибки
DevAlt 23.08.2026
Человек я беспокойный и потому заинтересовался OCaml, в чате форсили функторы модулей как суперфичу. Пытаясь отдуплить концепт, наткнулся на тутор с простым примером. А главный принцип обучения от. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru