powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Редактирование в запросе Access, созданном как запрос к серверу Sql, запускающем хранимку
23 сообщений из 23, страница 1 из 1
Редактирование в запросе Access, созданном как запрос к серверу Sql, запускающем хранимку
    #39455193
Kapitonius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Честно искал ответ на свой вопрос в сети, что-то похожее находил на этом форуме, но, к сожалению, так и не смог ответить на свой вопрос.

Дано:
Таблица на сервере Sql, Microsoft SQL Server 2014, зовут ее Opers в схеме dbo. Мой проект предполагает размещение таблиц на сервере Sql, а оболочку мне удобнее писать в Access 2010. На сервере создана хранимая процедура без параметров:
Код: plaintext
1.
2.
3.
4.
5.
CREATE PROCEDURE Experience3
AS
BEGIN
SELECT * FROM [dbo].[Opers]
END

В среде access через конструктор запросов создаю запрос к серверу sql, вызывающий мою хранимку:
Код: plaintext
1.
2.
USE [AgVoy_Data]
EXECUTE Experience3;

Там же, в конструкторе, указываю свойства подключения:
Код: plaintext
1.
ODBC;DRIVER=SQL Server;SERVER=C440\SQLEXPRESS;UID=kapitonovvs;Trusted_Connection=Yes;DATABASE=AgVoy_Data

При запуске в режиме таблицы мой запрос, как и ожидается, выдает мне всю таблицу dbo.Opers, как она есть, но только запрос в режиме таблицы в access не позволяет изменять значения записей , строка состояния показывает: "Объект recordset не является обновляемым"

Собственно, вопрос: можно ли создать запрос к серверу, вызывающий хранимую процедуру, чтобы в режиме таблицы можно было бы изменять значение полей в записях напрямую? Я понимаю, что можно всякий раз предлагать пользователю редактировать запись во временной таблице и изменять значение при помощи запроса на обновление, но очень хотелось бы, чтобы все это было попроще.

Заранее спасибо.
...
Рейтинг: 0 / 0
Редактирование в запросе Access, созданном как запрос к серверу Sql, запускающем хранимку
    #39455209
Игортан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kapitonius,

Ключевое поле есть в таблице Opers?
Код: vbnet
1.
2.
3.
4.
5.
Dim rst As New ADODB.Recordset
    rst.CursorLocation = adUseClient
    rst.Open "Exec CustomerAll_sub " & strSQL, MyConnect, adOpenKeyset, adLockOptimistic
'
    Set Me.Form.Recordset = rst


я всегда так поднимаю Recordset
strSQL - передаю параметры в хранимку для отбора. Зачем вытягивать всю таблицу, если пользуетесь хранимкой?
Так со строками работаю, как хочу.
...
Рейтинг: 0 / 0
Редактирование в запросе Access, созданном как запрос к серверу Sql, запускающем хранимку
    #39455216
Kapitonius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть. Первичный суррогатный ключ.
...
Рейтинг: 0 / 0
Редактирование в запросе Access, созданном как запрос к серверу Sql, запускающем хранимку
    #39455221
Kapitonius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Игортан,

Есть первичный суррогатный ключ.

Запрос сделан больше для примера, нежели для практических целей. Ну и запрос предполагается создать в Access через конструктор, мне, как чайнику, так проще.
...
Рейтинг: 0 / 0
Редактирование в запросе Access, созданном как запрос к серверу Sql, запускающем хранимку
    #39455226
studieren
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kapitonius,

А почему не хотите работать с линкованной таблицей? Ну или хотя бы обычным запросом на выборку данных на подобие этого?
Код: sql
1.
SELECT * FROM [ODBC;DRIVER=SQL Server;SERVER=C440\SQLEXPRESS;UID=kapitonovvs;Trusted_Connection=Yes;DATABASE=AgVoy_Data].dbo.Opers AS O


Можете и фильтр добавить в текст запроса. Если есть первичный ключ, то по идее запрос должен быть обновляемым.
...
Рейтинг: 0 / 0
Редактирование в запросе Access, созданном как запрос к серверу Sql, запускающем хранимку
    #39455229
Игортан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kapitonius,

Без обид, если есть доступ к серверу - там пишите запросы. Там визуализация конструктора (в 2014) точно будет не хуже. Будет легко, различий в SQl не много.
Плюсов, потом, от этого ощутите на много больше, чем просто привычным способом решать проблему. Особенно, если это не разовая и не первая поделка.
По крайней мере, я относительно легко мигрировал в хранимки.
...
Рейтинг: 0 / 0
Редактирование в запросе Access, созданном как запрос к серверу Sql, запускающем хранимку
    #39455231
Kapitonius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
studieren, спасибо, хотелось бы основную часть процедур разместить все же на сервере, но запросы до этого создавать в конструкторе access, чтобы их было проще подключать при конструировании форм. А если запрос будет на с одной таблицей, а со связанными таблицами, завязанными на один первичный ключ, то объект тоже будет редактируемым?
...
Рейтинг: 0 / 0
Редактирование в запросе Access, созданном как запрос к серверу Sql, запускающем хранимку
    #39455235
Kapitonius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Игортан, да какие обиды, я вообще боялся, что меня тут закидают экскрементами, потому что чувствую, что вопрос по сути глупый, и что мне буквально какой-то мелочи не хватает, чтобы понять. Наверное, к исполнению хранимок напрямую я и приду в итоге, только все равно вопрос остался. Я попробовал запустить хранимку напрямую, из-под SQL Management Studio, та же картина - записи не редактируются.
...
Рейтинг: 0 / 0
Редактирование в запросе Access, созданном как запрос к серверу Sql, запускающем хранимку
    #39455268
Игортан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если честно, выполненные запросы и у меня не редактируются прям вот в открывшемся результате запроса. Я сейчас на 2000 вообще, может чего сам не знаю, или нету такой возможности в принципе.
Для редактирования строк на сервере - открываем в наглую таблицу или запросом на изменение.

KapitoniusЕсть первичный суррогатный ключ.

Что вы под этим понимаете?
По моему разумению, в таблице должен быть первичный ключ. Обозначается так же как и в Аксе, ключиком.
...
Рейтинг: 0 / 0
Редактирование в запросе Access, созданном как запрос к серверу Sql, запускающем хранимку
    #39455278
Игортан
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kapitonius,

вот еще может быть ответом
20492387
...
Рейтинг: 0 / 0
Редактирование в запросе Access, созданном как запрос к серверу Sql, запускающем хранимку
    #39455302
Kapitonius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Игортан, в таблице Opers есть ключевое поле OPER_ID, которое является первичным ключом, имеет тип int и заполняется с приростом +1 при добавлении новых записей. Короче, ключ есть.
...
Рейтинг: 0 / 0
Редактирование в запросе Access, созданном как запрос к серверу Sql, запускающем хранимку
    #39455307
MrShin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kapitonius,
Честно говоря, не представляю, как может запрос через хранимку быть редактируемым. В общем случае внутри хранимой процедуры могут быть очень сложные вычисления, о которых Акцесс ничего не знает и, естественно, ему не известно, какого вида должен бать INSERT или UPDATE для изменения данных. Даже если процедура возвращает рекордсет, должен быть механизм обратного преобразования данных в таблицы. Так что, думаю, форма на базе как pathtrough запроса, так и на базе процедуры (что почти одно и то же) не может быть редактируемой ни при каких условиях.

В вашем случае проще использовать прилинкованный view вместо хранимки, если вопрос в дополнительной безопасности или преобразовании данных. Естественно, вьюшка должна быть редактируемой.
...
Рейтинг: 0 / 0
Редактирование в запросе Access, созданном как запрос к серверу Sql, запускающем хранимку
    #39455320
Kapitonius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MrShin, спасибо за Ваш ответ. Я подозревал, что хочу невозможного, но в силу отсутствия достаточного опыта и знаний не мог себе это правильно сформулировать. "Вьюшка" для моих целей, к сожалению, тоже не подходит, потому что составлять формы для пользователя предполагается на основе представлений, содержащих явно больше одной базовой таблицы. Хотя и связаны они все будут через одно ключевое поле, но связи будут один-ко-многим... Так что, видимо, придется, оставить все как есть: в проект access подключены связанные таблицы с сервера Sql, на основе которых уже в access конструируются запросы с Динамическим набором несогласованных записей. Это, с точки зрения нормального разработчика, не очень хорошо, но пока других вариантов не вижу.
...
Рейтинг: 0 / 0
Редактирование в запросе Access, созданном как запрос к серверу Sql, запускающем хранимку
    #39455406
MrShin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kapitonius,
Я обычно, если требуется редактирование данных на базе сложных запросов и еще в нескольких случаях использую временные локальные таблицы для редактирования. Грузим туда данные откуда угодно, после редактирования отсылаем назад либо по кнопке сохранения, либо в событии Form_AfterUpdate формирую запросы на обновление для каждой записи. В этом случае можно использовать что угодно, включая хранимые процедуры для апдейта данных. Правда, с блокировкой редактируемых записей придется поизвращаться, если требуется многопользовательская работа.
...
Рейтинг: 0 / 0
Редактирование в запросе Access, созданном как запрос к серверу Sql, запускающем хранимку
    #39455438
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MrShinKapitonius,
Честно говоря, не представляю, как может запрос через хранимку быть редактируемым.

А чего бы и нет? Если сам по себе запрос во вьюшке, конечно, редактируемый.

Другое дело - кривизна самого Access-a. Давненько с ним не пробовал, но в ADP, возможно, вполне будет работать. Но ADP уже само по себе отмерло...

А так в том же древнем VB6 вполне себе работает код:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
Private Sub Form_Load()
    Dim cn As New ADODB.Connection, r As New ADODB.Recordset
    
    cn.CursorLocation = adUseClient
    cn.Open "Provider=SQLOLEDB.1;Password=kenga;Persist Security Info=True;User ID=sa;Initial Catalog=Test;Data Source=MyServer", "sa", "MyPwd"
    
    r.Open "TestSP('17/5/2017')", cn, adOpenStatic, adLockOptimistic
    Set Grid.ADORecordset = r
End Sub



Где запрос на сервере выглядит как:

Код: sql
1.
2.
3.
CREATE PROCEDURE TestSP(@sp AS smalldatetime)
AS
	SELECT Код, Имя, @Sp AS Дата FROM TestTable 



Само-собой поле Дата в данном случае нередактируемое...
...
Рейтинг: 0 / 0
Редактирование в запросе Access, созданном как запрос к серверу Sql, запускающем хранимку
    #39455442
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>>> Если сам по себе запрос во вьюшке, конечно, редактируемый.

Пардон, я про хранимку, конечно, писал...
...
Рейтинг: 0 / 0
Редактирование в запросе Access, созданном как запрос к серверу Sql, запускающем хранимку
    #39455457
Kapitonius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AndrF, понятно, спасибо. Видимо, так и нужно делать.
...
Рейтинг: 0 / 0
Редактирование в запросе Access, созданном как запрос к серверу Sql, запускающем хранимку
    #39455500
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KapitoniusAndrF, понятно, спасибо. Видимо, так и нужно делать.

В Access-е с формой так, возможно, не получится. В том числе в ADP. Дюже крив он...
...
Рейтинг: 0 / 0
Редактирование в запросе Access, созданном как запрос к серверу Sql, запускающем хранимку
    #39455505
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя на скорую руку попробовал - похоже в MDB-шке все работает:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Option Compare Database
Option Explicit

Private Sub Form_Open(Cancel As Integer)
    Dim cn As New ADODB.Connection, r As New ADODB.Recordset
    
    cn.CursorLocation = adUseClient
    cn.Open "Provider=SQLOLEDB.1;Password=MyPvd;Persist Security Info=True;User ID=MyLogin;Initial Catalog=MyBase;Data Source=MyServer"
    
    r.Open "TestSP('17/5/2017')", cn, adOpenStatic, adLockOptimistic
    
    Set Me.Recordset = r
End Sub



Записи формы добавляются, редактируются и удаляются нормально!
...
Рейтинг: 0 / 0
Редактирование в запросе Access, созданном как запрос к серверу Sql, запускающем хранимку
    #39455511
Kapitonius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AndrF, спасибо!
...
Рейтинг: 0 / 0
Редактирование в запросе Access, созданном как запрос к серверу Sql, запускающем хранимку
    #39455513
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможно будут проблемы с обработкой ошибок ввода.

Так в поле с NOT NULL я смог сохранить пустую строку. Но это легко можно сделать проверку в программе. В общем, пробуйте дальше сами.
...
Рейтинг: 0 / 0
Редактирование в запросе Access, созданном как запрос к серверу Sql, запускающем хранимку
    #39455520
Kapitonius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AndrF, я уже в процессе :) !!! Спасибо за реальную помощь!
...
Рейтинг: 0 / 0
Редактирование в запросе Access, созданном как запрос к серверу Sql, запускающем хранимку
    #39455537
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И еще - одна процедура может возвращать набор Recordset-ов. Это тоже можно использовать. Скажем один для самой формы, а другие для ее ComboBox-ов или подчиненной формы. Ну это так - на предмет поиграться в будущем...
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Редактирование в запросе Access, созданном как запрос к серверу Sql, запускающем хранимку
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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