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

Дано:
Таблица на сервере 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
18.05.2017, 10:54
    #39455209
Игортан
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Редактирование в запросе Access, созданном как запрос к серверу Sql, запускающем хранимку
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
18.05.2017, 10:58
    #39455216
Kapitonius
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Редактирование в запросе Access, созданном как запрос к серверу Sql, запускающем хранимку
Есть. Первичный суррогатный ключ.
...
Рейтинг: 0 / 0
18.05.2017, 11:01
    #39455221
Kapitonius
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Редактирование в запросе Access, созданном как запрос к серверу Sql, запускающем хранимку
Игортан,

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

Запрос сделан больше для примера, нежели для практических целей. Ну и запрос предполагается создать в Access через конструктор, мне, как чайнику, так проще.
...
Рейтинг: 0 / 0
18.05.2017, 11:05
    #39455226
studieren
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Редактирование в запросе Access, созданном как запрос к серверу Sql, запускающем хранимку
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
18.05.2017, 11:09
    #39455229
Игортан
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Редактирование в запросе Access, созданном как запрос к серверу Sql, запускающем хранимку
Kapitonius,

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

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

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

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

В вашем случае проще использовать прилинкованный view вместо хранимки, если вопрос в дополнительной безопасности или преобразовании данных. Естественно, вьюшка должна быть редактируемой.
...
Рейтинг: 0 / 0
18.05.2017, 12:17
    #39455320
Kapitonius
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Редактирование в запросе Access, созданном как запрос к серверу Sql, запускающем хранимку
MrShin, спасибо за Ваш ответ. Я подозревал, что хочу невозможного, но в силу отсутствия достаточного опыта и знаний не мог себе это правильно сформулировать. "Вьюшка" для моих целей, к сожалению, тоже не подходит, потому что составлять формы для пользователя предполагается на основе представлений, содержащих явно больше одной базовой таблицы. Хотя и связаны они все будут через одно ключевое поле, но связи будут один-ко-многим... Так что, видимо, придется, оставить все как есть: в проект access подключены связанные таблицы с сервера Sql, на основе которых уже в access конструируются запросы с Динамическим набором несогласованных записей. Это, с точки зрения нормального разработчика, не очень хорошо, но пока других вариантов не вижу.
...
Рейтинг: 0 / 0
18.05.2017, 14:09
    #39455406
MrShin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Редактирование в запросе Access, созданном как запрос к серверу Sql, запускающем хранимку
Kapitonius,
Я обычно, если требуется редактирование данных на базе сложных запросов и еще в нескольких случаях использую временные локальные таблицы для редактирования. Грузим туда данные откуда угодно, после редактирования отсылаем назад либо по кнопке сохранения, либо в событии Form_AfterUpdate формирую запросы на обновление для каждой записи. В этом случае можно использовать что угодно, включая хранимые процедуры для апдейта данных. Правда, с блокировкой редактируемых записей придется поизвращаться, если требуется многопользовательская работа.
...
Рейтинг: 0 / 0
18.05.2017, 14:45
    #39455438
AndrF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Редактирование в запросе Access, созданном как запрос к серверу Sql, запускающем хранимку
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
18.05.2017, 14:47
    #39455442
AndrF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Редактирование в запросе Access, созданном как запрос к серверу Sql, запускающем хранимку
>>> Если сам по себе запрос во вьюшке, конечно, редактируемый.

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

В Access-е с формой так, возможно, не получится. В том числе в ADP. Дюже крив он...
...
Рейтинг: 0 / 0
18.05.2017, 16:14
    #39455505
AndrF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Редактирование в запросе Access, созданном как запрос к серверу Sql, запускающем хранимку
Хотя на скорую руку попробовал - похоже в 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
18.05.2017, 16:20
    #39455511
Kapitonius
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Редактирование в запросе Access, созданном как запрос к серверу Sql, запускающем хранимку
AndrF, спасибо!
...
Рейтинг: 0 / 0
18.05.2017, 16:22
    #39455513
AndrF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Редактирование в запросе Access, созданном как запрос к серверу Sql, запускающем хранимку
Возможно будут проблемы с обработкой ошибок ввода.

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


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