Гость
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Как редактировать созданный RecordSet. / 20 сообщений из 20, страница 1 из 1
27.09.2019, 21:55
    #39868175
melihron
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как редактировать созданный RecordSet.
Всем привет.
Подскажите плиз кто знает, как редактировать созданный RecordSet на основе пары таблиц.
Если делать всё в одном запросе, то выполняется он почему-то минут 5, поэтому приходится извращаться...
MDB

Код: vbnet
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.
  Dim rs As Recordset
  Dim rs2 As Recordset
  Dim q As String
  
  q = ""
  q = q & "SELECT Код, Дата, Код_дилера, База_Опт, "
  q = q & "(select opc.id from order_price_change as opc where (opc.order_code=ord.код) and (opc.note='import')) as opc_id "
  q = q & "FROM [Заказы] as ord "
  q = q & "order by Дата,Код"

  
  Set rs = DBEngine(0)(0).OpenRecordset(q)
  rs.MoveFirst
  Do Until rs.EOF
    rs.Edit
      q = "select [data],amount from order_price_change as opc where (opc.id=" & rs!opc_id & ")"
      Set rs2 = CurrentProject.Connection.Execute(q)
      rs2!data = rs2("data").value
      rs2opc_amount = rs2("amount").value
    rs.Update
    rs.MoveNext
  Loop

  Set Me.Recordset = rs
  rs2.Close
  rs.Close
  Set rs2 = Nothing
  Set rs = Nothing



Валится на строчке
Код: vbnet
1.
    rs.Edit


пишет ошибку :
run-time error 3027
Обновление невозможно. База данных или объект доступны только для чтения.

пробовал в параметрах открытия рекордсета ставить adOpenDynamic и другие - не помогает.
...
Рейтинг: 0 / 0
27.09.2019, 22:09
    #39868181
melihron
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как редактировать созданный RecordSet.
Вобщем идея такая : на ленточной форме разместить нужные поля, источник записей не указывать, и собирать в неё нужные данные за несколько итераций. Сначала выбрать только коды и айдишники. Потом последовательным перебором рекордсета, добавлять уже всё остальное в оставшиеся поля.
...
Рейтинг: 0 / 0
27.09.2019, 22:23
    #39868190
vmag
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как редактировать созданный RecordSet.
melihronВалится на строчке
Код: vbnet
1.
    rs.Edit



наверное запрос не обновляемый.

melihronВобщем идея такая :

идея не очень... если уже есть бд, то лучше её использовать по максимуму... добавь галочки в таблицы, ходи по ним хоть вдоль, хоть поперек, помечай нужное галочками, а потом показывай помеченное, ну или делай буферную таблицу: очищай - заполняй - показывай...
...
Рейтинг: 0 / 0
27.09.2019, 22:45
    #39868199
Сергей Лалов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как редактировать созданный RecordSet.
melihronВобщем идея такая : на ленточной форме разместить нужные поля, источник записей не указывать, и собирать в неё нужные данные за несколько итераций. Сначала выбрать только коды и айдишники. Потом последовательным перебором рекордсета, добавлять уже всё остальное в оставшиеся поля.

У вас в случае успешного выполнения вашего приведенного кода даже необязательно потом что то добавлять посредством перебора рекордсета.
Если выражение:
Код: vbnet
1.
2.
3.
...
Set Me.Recordset = rs
...



выполнилось успешно, весь набор записей сам отрисуется на вашей ленточной форме, с нужным количеством строк и автоматически будет доступен для редактированию, как на обычной форме (то есть можно будет добавлять, редактировать,удалять записи, как в обычной форме, то есть руками к примеру.)

Да и программно тоже update,insert,delete доступен. Только учтите ,что при RIGHT JOIN обновление по логике вещей не для всех записей доступно в связанных таблицах, а только для тех, в которых есть связанные значения, то есть для строки в одной таблице, есть заполненное связанное поле из другой. У вас в запросе самом скорей всего при склейке пробел пропал, или поле неправильно обозвали итд итп (то есть ошибка на внимательность скорей всего.)

Вот по быстрому наклепал для вас пример.
Посмотрите во вложении. В формате DAO recordset. Канонический вариант. Можете нажать на кнопку и пробовать изменить значения записей (либо руками, либо дописать rs.edit...rs.update..все должно работать)

PS. А то у вас код одна часть в семантике DAO (DBEngine(0)(0).OpenRecordset(q) ) , во второй части вы тут же начинаете мучить ADO (CurrentProject.Connection.Execute(q)) Лучше писать либо в DAO,либо в ADO, в чем то одном)
...
Рейтинг: 0 / 0
27.09.2019, 22:49
    #39868200
Сергей Лалов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как редактировать созданный RecordSet.
А так , как выше уже vmag написал, идея с отвязанным рекордсетом плоха , но судя по всему у ТС еще начало пути, он потом еще восхитится качеству работы unbound recordset в разрезе сортировки и фильтрации))
...
Рейтинг: 0 / 0
27.09.2019, 23:31
    #39868212
melihron
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как редактировать созданный RecordSet.
Нет, я совсем не новичок, просто шеф такие задания иногда даёт, из серии пришить хобот к заднице и чтоб в серую полосочку и трактор ещё туда чтобы сбоку был тоже прилеплен... и чтобы быстро всё, а почему так долго, он думает, что за блин 5 минут это всё делается .... что хочется на этот раз потянуть время и поискать ещё варианты кроме добавочных полей и временных таблиц, которых и так уже полно базе...) сорри за оффтоп...

to Сергей Лалов: спасибо за пример
То есть сам рекордсет нельзя использовать как буферную/временную редактируемую таблицу без привязки к реальным таблицам ? эх, а я так надеялся...
...
Рейтинг: 0 / 0
27.09.2019, 23:45
    #39868214
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как редактировать созданный RecordSet.
О том что идея с отвязанным рекордсетом плоха уже говорилось.
Еще "мелочь":
У Вас:
Код: vbnet
1.
"...opc.order_code=ord.код...."

должно быть:
Код: vbnet
1.
"....opc.order_code=" & ord.код & "..."
...
Рейтинг: 0 / 0
27.09.2019, 23:57
    #39868216
Сергей Лалов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как редактировать созданный RecordSet.
melihronto Сергей Лалов: спасибо за пример
То есть сам рекордсет нельзя использовать как буферную/временную редактируемую таблицу без привязки к реальным таблицам ? эх, а я так надеялся...

да можно ,почему, только в вашем примере попытка скрестить два рекордсета написана неверно. С позиции кода, и с позиции самого способа решения задачи. Зачем скрещивать результат двух рекордсетов, в коде VBA делать изменение значения полей, а потом выводить это изменение на форму? Вам шеф сказал пришить всего один хобот к штанам, а вы решили еще один, с другой стороны, для симметрии)

Тут и без временной таблицы и без VBA можно сделать за минуту обычный аксесовский запрос, со связями из нужных таблиц и сохранить его под определенным именем. А потом открывать его когда надо, и смотреть результат, и менять где нужно. Задача со стороны шефа, но реализация то за вами)) Гораздо комфортней согласитесь, когда зубы сверлят через рот с анестезией, а не пытаются пролезть к челюсти через задницу, пусть даже с той же анестезией)

Пример по сути то вам в общем приложил, там все есть. Вместо двух рекордсетов сделайте один (только в строке SQL напишите нужный вам запрос из нескольких таблиц, используя Inner,Right,Left join по вкусу, вкусу вашей бизнес логики.) И обновляйтесь/изменяйтесь на здоровье один объект recordset.
...
Рейтинг: 0 / 0
28.09.2019, 00:06
    #39868218
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как редактировать созданный RecordSet.
melihronНет, я совсем не новичок....
тогда поясните как должна выполняться эта строка(какому полю присваивается и какое значение)
Код: vbnet
1.
rs2!data = rs2("data").value

и эта довольно интересна
Код: vbnet
1.
rs2opc_amount = rs2("amount").value
...
Рейтинг: 0 / 0
28.09.2019, 00:11
    #39868221
melihron
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как редактировать созданный RecordSet.
sdkumelihronНет, я совсем не новичок....
тогда поясните как должна выполняться эта строка(какому полю присваивается и какое значение)
Код: vbnet
1.
rs2!data = rs2("data").value

и эта довольно интересна
Код: vbnet
1.
rs2opc_amount = rs2("amount").value


ну тут кагбе полёт творческой мысли и фантазии и ещё не обрёл нужную и понятную форму : )
...
Рейтинг: 0 / 0
28.09.2019, 00:15
    #39868223
melihron
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как редактировать созданный RecordSet.
sdkuтогда поясните как должна выполняться эта строка(какому полю присваивается и какое значение)

это поля на форме... предполагалось туда данные запхать...пример конечно недоделанный
...
Рейтинг: 0 / 0
28.09.2019, 00:27
    #39868228
melihron
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как редактировать созданный RecordSet.
[quot Сергей Лалов]melihronto Сергей Лалов: спасибо за пример
Вместо двух рекордсетов сделайте один (только в строке SQL напишите нужный вам запрос из нескольких таблиц, используя Inner,Right,Left join по вкусу, вкусу вашей бизнес логики.) И обновляйтесь/изменяйтесь на здоровье один объект recordset.

как я писал в самом начале, нужный запрос пачемута выполняется ооччень долго... ну минут 5 может.. а должен пулей
вот этот запрос выполняется быстро:
Код: sql
1.
2.
3.
4.
5.
SELECT a.Код, a.Дата, a.Код_дилера, a.База_Опт, a.opc_id
FROM (SELECT Код, Дата, Код_дилера, База_Опт,
(select opc.id from order_price_change as opc where (opc.order_code=ord.код) and (opc.note="import") ) as opc_id
  FROM [Заказы] as ord) AS a
ORDER BY a.Дата, a.Код;



а вот этот уже минут 5, хз почему, индексы проставил на числовых полях...
Код: sql
1.
2.
3.
4.
5.
SELECT a.Код, a.Дата, a.Код_дилера, a.База_Опт, a.opc_id, order_price_change.data, order_price_change.amount
FROM (SELECT Код, Дата, Код_дилера, База_Опт,
(select opc.id from order_price_change as opc where (opc.order_code=ord.код) and (opc.note="import") ) as opc_id
  FROM [Заказы] as ord) AS a LEFT JOIN order_price_change ON a.opc_id = order_price_change.id
ORDER BY a.Дата, a.Код;


незнаю... можт я чёта туплю...
собственно из-за этого я и начал за несколько итераций его собрать... На SQL-сервере, с прилинкованными mdb такой запрос выполняется пулей.
...
Рейтинг: 0 / 0
28.09.2019, 07:23
    #39868289
Панург
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как редактировать созданный RecordSet.
melihron, запрос выполняется долго из-за подчинённых запросов. Из-за них он не является обновляемым.
Форма не получится на отвязанном запросе дао, потому-что таких нет. Это прерогатива адо.
Да и закрываются оба набора в конце процедуры.

sdkuдолжно быть: нет, у ТС правильно написано.
melihronТо есть сам рекордсет нельзя использовать как буферную/временную редактируемую таблицу без привязки к реальным таблицам ?чёйта?
...
Рейтинг: 0 / 0
28.09.2019, 13:18
    #39868378
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как редактировать созданный RecordSet.
Панургsdkuдолжно быть: нет, у ТС правильно написано.
Пардоньте,был не прав-не знаю почему это ляпнул
...
Рейтинг: 0 / 0
28.09.2019, 19:31
    #39868466
Панург
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как редактировать созданный RecordSet.
sdku, да фигня, сам иногда такую х..ню несёшь, особенно злоупотребив... как щас...
...
Рейтинг: 0 / 0
28.09.2019, 19:39
    #39868468
Панург
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как редактировать созданный RecordSet.
эт про мну...
...
Рейтинг: 0 / 0
29.09.2019, 00:44
    #39868538
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как редактировать созданный RecordSet.
Панург,
не только про тебя-про меня тоже
...
Рейтинг: 0 / 0
03.10.2019, 12:39
    #39871082
AndrF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как редактировать созданный RecordSet.
melihronа вот этот уже минут 5, хз почему, индексы проставил на числовых полях...

Запросы кривовато написаны - трудно понять что хотите получить.

Не это ли, случаем:

Код: sql
1.
2.
3.
4.
5.
SELECT ord.Код, ord.Дата, ord.Код_дилера, op.База_Опт, opc.id, opc.data, opc.amount
	FROM [Заказы] as ord
		LEFT JOIN order_price_change AS op ON ord.код = op.order_code AND 'import'= op.note
		LEFT JOIN order_price_change AS opc ON ord.opc_id = order_price_change.id
	ORDER BY 2, 1
...
Рейтинг: 0 / 0
03.10.2019, 13:33
    #39871140
melihron
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как редактировать созданный RecordSet.
AndrFmelihronа вот этот уже минут 5, хз почему, индексы проставил на числовых полях...

Запросы кривовато написаны - трудно понять что хотите получить.

Не это ли, случаем:

Код: sql
1.
2.
3.
4.
5.
SELECT ord.Код, ord.Дата, ord.Код_дилера, op.База_Опт, opc.id, opc.data, opc.amount
	FROM [Заказы] as ord
		LEFT JOIN order_price_change AS op ON ord.код = op.order_code AND 'import'= op.note
		LEFT JOIN order_price_change AS opc ON ord.opc_id = order_price_change.id
	ORDER BY 2, 1


Мой токсичный друг. В моём запросе всё предельно понятно, что я хочу получить - он довольно простой, но вы его не поняли, и поэтому решили меня немножко погнобить - это не красиво. Учите матчасть, коллега, поля ord.opc_id нету в таблице, а opc_id добывается из подзапроса. И не надо быть токсичным.
...
Рейтинг: 0 / 0
03.10.2019, 15:48
    #39871205
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как редактировать созданный RecordSet.
"Предельно понятно" только Вам.
Я,например, не понял :
получили Вы в RS набор записей с полями перечисленными в SELECT из таблицы "заказы" + еще одно поле [opc_id](кстати,если в тбл.[order_price_change]больше одной записи отвечающей условиям отбора в подчиненном запросе и подчиненный возвращает больше 1 записи главный работать не будет)
Допустим все заработало и Вы получили набор записей в котором каждому коду таблицы "заказы" соответствует ряд записей таблицы [order_price_change] и чё?.. При нормальной организации данных ([order_price_change] подч [заказы])это и так известно.
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Как редактировать созданный RecordSet. / 20 сообщений из 20, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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