powered by simpleCommunicator - 2.0.48     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Как редактировать созданный RecordSet.
20 сообщений из 20, страница 1 из 1
Как редактировать созданный RecordSet.
    #39868175
melihron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет.
Подскажите плиз кто знает, как редактировать созданный 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
Как редактировать созданный RecordSet.
    #39868181
melihron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вобщем идея такая : на ленточной форме разместить нужные поля, источник записей не указывать, и собирать в неё нужные данные за несколько итераций. Сначала выбрать только коды и айдишники. Потом последовательным перебором рекордсета, добавлять уже всё остальное в оставшиеся поля.
...
Рейтинг: 0 / 0
Как редактировать созданный RecordSet.
    #39868190
Фотография vmag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
melihronВалится на строчке
Код: vbnet
1.
    rs.Edit



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

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

идея не очень... если уже есть бд, то лучше её использовать по максимуму... добавь галочки в таблицы, ходи по ним хоть вдоль, хоть поперек, помечай нужное галочками, а потом показывай помеченное, ну или делай буферную таблицу: очищай - заполняй - показывай...
...
Рейтинг: 0 / 0
Как редактировать созданный RecordSet.
    #39868199
Фотография Сергей Лалов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как редактировать созданный RecordSet.
    #39868200
Фотография Сергей Лалов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А так , как выше уже vmag написал, идея с отвязанным рекордсетом плоха , но судя по всему у ТС еще начало пути, он потом еще восхитится качеству работы unbound recordset в разрезе сортировки и фильтрации))
...
Рейтинг: 0 / 0
Как редактировать созданный RecordSet.
    #39868212
melihron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нет, я совсем не новичок, просто шеф такие задания иногда даёт, из серии пришить хобот к заднице и чтоб в серую полосочку и трактор ещё туда чтобы сбоку был тоже прилеплен... и чтобы быстро всё, а почему так долго, он думает, что за блин 5 минут это всё делается .... что хочется на этот раз потянуть время и поискать ещё варианты кроме добавочных полей и временных таблиц, которых и так уже полно базе...) сорри за оффтоп...

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

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

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

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

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

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

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


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

это поля на форме... предполагалось туда данные запхать...пример конечно недоделанный
...
Рейтинг: 0 / 0
Как редактировать созданный RecordSet.
    #39868228
melihron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[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
Как редактировать созданный RecordSet.
    #39868289
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
melihron, запрос выполняется долго из-за подчинённых запросов. Из-за них он не является обновляемым.
Форма не получится на отвязанном запросе дао, потому-что таких нет. Это прерогатива адо.
Да и закрываются оба набора в конце процедуры.

sdkuдолжно быть: нет, у ТС правильно написано.
melihronТо есть сам рекордсет нельзя использовать как буферную/временную редактируемую таблицу без привязки к реальным таблицам ?чёйта?
...
Рейтинг: 0 / 0
Как редактировать созданный RecordSet.
    #39868378
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Панургsdkuдолжно быть: нет, у ТС правильно написано.
Пардоньте,был не прав-не знаю почему это ляпнул
...
Рейтинг: 0 / 0
Как редактировать созданный RecordSet.
    #39868466
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sdku, да фигня, сам иногда такую х..ню несёшь, особенно злоупотребив... как щас...
...
Рейтинг: 0 / 0
Как редактировать созданный RecordSet.
    #39868468
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
эт про мну...
...
Рейтинг: 0 / 0
Как редактировать созданный RecordSet.
    #39868538
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Панург,
не только про тебя-про меня тоже
...
Рейтинг: 0 / 0
Как редактировать созданный RecordSet.
    #39871082
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Как редактировать созданный RecordSet.
    #39871140
melihron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Как редактировать созданный RecordSet.
    #39871205
Фотография sdku
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Предельно понятно" только Вам.
Я,например, не понял :
получили Вы в RS набор записей с полями перечисленными в SELECT из таблицы "заказы" + еще одно поле [opc_id](кстати,если в тбл.[order_price_change]больше одной записи отвечающей условиям отбора в подчиненном запросе и подчиненный возвращает больше 1 записи главный работать не будет)
Допустим все заработало и Вы получили набор записей в котором каждому коду таблицы "заказы" соответствует ряд записей таблицы [order_price_change] и чё?.. При нормальной организации данных ([order_price_change] подч [заказы])это и так известно.
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Как редактировать созданный RecordSet.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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