powered by simpleCommunicator - 2.0.54     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Recordset для формы
25 сообщений из 37, страница 1 из 2
Recordset для формы
    #39328869
Decabrist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.

В базе данных имеется форма с некоторыми полями. Хочу открыть эту форму из другой (по нажатию соответствующей кнопки) и присвоить открытой форме рекордсет сформированный на основе значений полей в первой форме.
Код для рекордсета довольно громоздкий получился - но проверенный - отдельно как запрос работает.
Привожу код по нажатию кнопки в первой форме полностью (в том виде как есть на текущий момент), сильно можно не вникать, главное что в конце:
Код: 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.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
  Private Sub btnCost_Click()
Dim rs As ADODB.Recordset
Dim dtDate As String
Dim strEquipment As String
Dim strCondition As String
Dim strSource As String
Dim strQry As String
strEquipment = Me.fldEquipment
dtDate = "#" & Month(Me.fldDate) & "/" & Day(Me.fldDate) & "/" & Year(Me.fldDate) & "#"
strCondition = "iEquipment =" & strEquipment & " And (dtDate <= " & dtDate & " Or IsNull(dtDate))"

If Me.gswMaxPriceDate = 1 Then
  Set rs = New ADODB.Recordset
  rs.CursorLocation = adUseClient
  rs.Open "SELECT iEquipment, QC.iComponent, iAssembly, dAmount, iItem, dKoef, iInvoice, dPrice, dCost, strNumber, dtDate, iSupplier " & _
  "FROM qryCost as QC INNER JOIN " & _
  "(SELECT iComponent, MAX(dtDate) as dt2Date " & _
  "FROM qryCost " & _
  "WHERE dtDate <= " & dtDate & _
  "AND iEquipment = " & Me.fldEquipment & _
  " GROUP BY iComponent " & _
  ")AS SQC " & _
  "ON QC.iComponent = SQC.iComponent And QC.dtDate = SQC.dt2Date " & _
  "UNION " & _
  "SELECT iEquipment, iComponent, iAssembly, dAmount, iItem, dKoef, iInvoice, dPrice, dCost, strNumber, dtDate, iSupplier " & _
  "FROM qryCost " & _
  "WHERE iEquipment = " & Me.fldEquipment, CurrentProject.Connection, adOpenDynamic, adLockOptimistic
    
  DoCmd.OpenForm "subCost", acFormDS, , , acFormReadOnly, acHidden
 
  Set Forms("subCost").Recordset = rs
  Forms("subCost").Visible = True
       
  Set rs = Nothing
  
End If

End Sub



После открытия второй формы при попытке присвоить ей рекордсет, на строке
Код: vbnet
1.
 Set Forms("subCost").Recordset = rs



Акцесс вылетает. Подскажите пожалуйста, что я делаю не так?
Спасибо
...
Рейтинг: 0 / 0
Recordset для формы
    #39328917
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Decabrist, на первый взгляд у тебя всё нормально.
Но!
Хотелось бы услышать версию акса.
Какой сакральный смысл в рекордсете? Почему строку запроса не сделать просто источником данных ( RecordSource )?
Ещё бы я изменил тип курсора - adOpenStatic и блокировку - adLockReadOnly

Попробуй пересоздать форму, могут быть в ней проблемы.
...
Рейтинг: 0 / 0
Recordset для формы
    #39328921
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Decabrist, да, а на строке запрос открывается в построителе?
...
Рейтинг: 0 / 0
Recordset для формы
    #39328987
Decabrist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Акс 2013. Сакрального смысла никакого, просто думал так проще будет (да и читал про подобный пример). Запрос очень сложный получился. В построителе все работает, с поправкой на то что вместо ссылок на контролы вбиваю конкретные данные. Перепроверить все смогу только завтра.
...
Рейтинг: 0 / 0
Recordset для формы
    #39329004
пробел
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
2.
  "WHERE dtDate <= " & dtDate & _
  " AND iEquipment = " & Me.fldEquipment & _

Поставить пробел перед AND и отформатировать дату.
...
Рейтинг: 0 / 0
Recordset для формы
    #39329143
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пробелотформатировать датуда дата у него отформатирована. Только он ея форматирует из под подвыподверта (не Format )
Код: vbnet
1.
dtDate = "#" & Month(Me.fldDate) & "/" & Day(Me.fldDate) & "/" & Year(Me.fldDate) & "#"
...
Рейтинг: 0 / 0
Recordset для формы
    #39329144
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А зачем Вы используете SET? Попробуйте его убрать и посмотреть, что получится.
...
Рейтинг: 0 / 0
Recordset для формы
    #39329154
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JossА зачем Вы используете SET? Ну как бэ положено при присвоении объекта. У меня только через Set присваивается.

Decabrist, а источник у формы куда пихается рекордсет есть?
...
Рейтинг: 0 / 0
Recordset для формы
    #39329368
Фотография Ёжик`
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Decabrist,

Рекордсеты годятся для быстрых подсчетов, для форм не подходят на практике (особенно при смене версий акцеса весело).

Запрос кстати не сложный...

Можно использовать временную/рабочую табличку вместо рекордсета (как у меня везде)).
...
Рейтинг: 0 / 0
Recordset для формы
    #39329460
Decabrist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ёжик`Decabrist,

Запрос кстати не сложный...

Ну я понимаю что здесь монстры собрались которые подобные задачки в уме решают )))
Но я вчера на этот запрос цельный день потратил, пока получил что хотел. Да и то сегодня по утру просмотрев трезвым взглядом - обнаружил ошибку (не достающее условие в присоединяемой выборке, из-за которого запрос по факту бессмысленный был).
Но эту ошибку я исправил.

пробелПоставить пробел перед AND и отформатировать дату.
Исправил.

ПанургЕщё бы я изменил тип курсора - adOpenStatic и блокировку - adLockReadOnly

Исправил

Но как все вылетало так и вылетает. Источник у формы был. Его удалил. Но возможно здесь есть что-то вызывающее конфликт - буду копать в этом направлении.
...
Рейтинг: 0 / 0
Recordset для формы
    #39329463
Decabrist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Короче.
Перестал выпендриваться, сделал так:
Код: 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.
29.
30.
31.
32.
33.
34.
Private Sub btnCost_Click()
Dim rs As ADODB.Recordset
Dim dtDate As String
Dim strEquipment As String
Dim strCondition As String
Dim strSource As String
Dim strQry As String
strEquipment = Me.fldEquipment
dtDate = "#" & Month(Me.fldDate) & "/" & Day(Me.fldDate) & "/" & Year(Me.fldDate) & "#"
strCondition = "iEquipment =" & strEquipment & " And (dtDate <= " & dtDate & " Or IsNull(dtDate))"
strQry = "SELECT iEquipment, QC.iComponent as iComponent, iAssembly, dAmount, dPrice, dCost, strNumber, dtDate, iSupplier " & _
  "FROM qryCost as QC INNER JOIN " & _
  "(SELECT iComponent, MAX(dtDate) as dt2Date " & _
  "FROM qryCost " & _
  "WHERE dtDate <= " & dtDate & _
  " AND iEquipment = " & Me.fldEquipment & _
  " GROUP BY iComponent" & _
  ") AS SQC " & _
  "ON QC.iComponent = SQC.iComponent And QC.dtDate = SQC.dt2Date " & _
  "UNION " & _
  "SELECT iEquipment, iComponent, iAssembly, dAmount, dPrice, dCost, strNumber, dtDate, iSupplier " & _
  "FROM qryCost " & _
  "WHERE iEquipment = " & Me.fldEquipment & " And IsNull(dtDate)"

If Me.gswMaxPriceDate = 1 Then
   
  DoCmd.OpenForm "subCost", acFormDS, , , acFormReadOnly, acWindowNormal
 
  Forms("subCost").RecordSource = strQry
  Forms("subCost").Visible = True
   
End If

End Sub


Это конечно не законченная процедура, там еще другие варианты запросов могут быть, в зависимости от выбора на контролах первой формы, но суть одна.
Все работает.
...
Рейтинг: 0 / 0
Recordset для формы
    #39329464
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DecabristНо как все вылетало так и вылетает.Не знаю как 2013, а в 2010 нормально используется рекордсет как источник. Я его вместо временных таблиц использую.
Попробуй сделать тестовый вариант присвоения, в другой базке.
Пример у тебя работает?
...
Рейтинг: 0 / 0
Recordset для формы
    #39329465
Decabrist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да пример работает. (интересный пример)
Я вот тут чего подумал. У тебя присвоение рекордсета происходит в одной форме, и в ее же коде. А у меня рекордсет подготавливается в отдельной форме, затем из ее же кода открывается вторая, и идет присвоение подготовленных данных открытой форме. Может в этом проблема? Может форма еще не успевает загрузиться до присвоения рекордсета, или еще что то в этом плане. После чего возникает конфликт и Акцесс вылетает.
...
Рейтинг: 0 / 0
Recordset для формы
    #39329468
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Decabrist, сомневаюсь, что проблема в DecabristМожет форма еще не успевает загрузиться до присвоения рекордсета Поставь в конце концов DoEvents после запуска формы. Даже, в порядке эксперимента, можно открыть форму, а потом в неё загрузить набор.
Возможно форма просто "поломалась", такое бывает.
...
Рейтинг: 0 / 0
Recordset для формы
    #39329469
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DecabristМожет в этом проблема?в Access один поток (thread), поэтому выполняется всё последовательно.

О! Это мечта многих запускать несколько безбажных thread'ов!
...
Рейтинг: 0 / 0
Recordset для формы
    #39329481
Decabrist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В твоем примере на форме свободные контролы. На которые потом последовательно устанавливаются названия, источники.
Я же форму делал не как свободную, а на основе существующей таблице. (название и количество полей приведены в соответствие с запросом). Контролы привязаны к полям этой таблицы.
Затем удалил RecordSource формы, а на контролах все как было так и осталось. Вероятно проблема кроется здесь. Чуть позже проверю.
...
Рейтинг: 0 / 0
Recordset для формы
    #39329484
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DecabristВ твоем примере на форме свободные контролы.Они там потому свободные, что запрос там перекрёстный и задавать заранее источники полям формы не имеет смысла.
...
Рейтинг: 0 / 0
Recordset для формы
    #39329486
Фотография Панург
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Decabrist, да, я тут подумал - попробуй открывать форму не через DoCmd.OpenForm ... , а Set frmMyForm = New Form_subCost
...
Рейтинг: 0 / 0
Recordset для формы
    #39329508
Decabrist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сделал копию формы - опыты на ней делаю. Выдает такую вот ошибку:
...
Рейтинг: 0 / 0
Recordset для формы
    #39329509
Decabrist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
При том ошибка ровно на той же строке:

Код: vbnet
1.
Set Forms("subCost2").Recordset = rs
...
Рейтинг: 0 / 0
Recordset для формы
    #39329511
Decabrist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Исправил.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
 Set rs = New ADODB.Recordset
  rs.CursorLocation = adUseClient
  rs.Open strQry, CurrentProject.Connection, adOpenStatic, adLockReadOnly
  Set frm = New Form_subCost2
    
  'DoCmd.OpenForm "subCost2", acFormDS, , , acFormReadOnly, acHidden
 
  Set frm.Recordset = rs
  'Set Forms("subCost2").Recordset = rs
  'Forms("subCost2").Visible = True
  
  Set rs = Nothing



Вылетает там же.
...
Рейтинг: 0 / 0
Recordset для формы
    #39329512
ROI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DecabristПри том ошибка ровно на той же строке:

Код: vbnet
1.
Set Forms("subCost2").Recordset = rs


Если форма не загружена будет ошибка.
Но вообщето так не делается.
Передовайте в форму строку запроса и подключение делайте внутри формы.
...
Рейтинг: 0 / 0
Recordset для формы
    #39329514
ROI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DecabristИсправил.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
 Set rs = New ADODB.Recordset
  rs.CursorLocation = adUseClient
  rs.Open strQry, CurrentProject.Connection, adOpenStatic, adLockReadOnly
  Set frm = New Form_subCost2
    
  'DoCmd.OpenForm "subCost2", acFormDS, , , acFormReadOnly, acHidden
 
  Set frm.Recordset = rs
  'Set Forms("subCost2").Recordset = rs
  'Forms("subCost2").Visible = True
  
  Set rs = Nothing




Вылетает там же.
И вообще поставте обработчик ошибок.
У вас полная безграмотность.
...
Рейтинг: 0 / 0
Recordset для формы
    #39329516
Decabrist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имеете ввиду RecordSource?
Я так и сделал в конце концов. И все работает. Тут уже просто интересно, а почему с рекордсетом то не пошло?
Не знаю как правильно делается, но примеры с рекордсетом есть и на сайте у мелкомягких, и у Геца.
...
Рейтинг: 0 / 0
Recordset для формы
    #39329518
ROI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DecabristИмеете ввиду RecordSource?
Я так и сделал в конце концов. И все работает. Тут уже просто интересно, а почему с рекордсетом то не пошло?
Не знаю как правильно делается, но примеры с рекордсетом есть и на сайте у мелкомягких, и у Геца.
У гетца таких как ваш примеров нет не передергивайте.
...
Рейтинг: 0 / 0
25 сообщений из 37, страница 1 из 2
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Recordset для формы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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