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

В базе данных имеется форма с некоторыми полями. Хочу открыть эту форму из другой (по нажатию соответствующей кнопки) и присвоить открытой форме рекордсет сформированный на основе значений полей в первой форме.
Код для рекордсета довольно громоздкий получился - но проверенный - отдельно как запрос работает.
Привожу код по нажатию кнопки в первой форме полностью (в том виде как есть на текущий момент), сильно можно не вникать, главное что в конце:
Код: 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
18.10.2016, 12:58
    #39328917
Панург
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Recordset для формы
Decabrist, на первый взгляд у тебя всё нормально.
Но!
Хотелось бы услышать версию акса.
Какой сакральный смысл в рекордсете? Почему строку запроса не сделать просто источником данных ( RecordSource )?
Ещё бы я изменил тип курсора - adOpenStatic и блокировку - adLockReadOnly

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

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

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

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

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

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

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

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

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

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

Исправил

Но как все вылетало так и вылетает. Источник у формы был. Его удалил. Но возможно здесь есть что-то вызывающее конфликт - буду копать в этом направлении.
...
Рейтинг: 0 / 0
19.10.2016, 04:21
    #39329463
Decabrist
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Recordset для формы
Короче.
Перестал выпендриваться, сделал так:
Код: 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
19.10.2016, 04:24
    #39329464
Панург
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Recordset для формы
DecabristНо как все вылетало так и вылетает.Не знаю как 2013, а в 2010 нормально используется рекордсет как источник. Я его вместо временных таблиц использую.
Попробуй сделать тестовый вариант присвоения, в другой базке.
Пример у тебя работает?
...
Рейтинг: 0 / 0
19.10.2016, 04:47
    #39329465
Decabrist
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Recordset для формы
Да пример работает. (интересный пример)
Я вот тут чего подумал. У тебя присвоение рекордсета происходит в одной форме, и в ее же коде. А у меня рекордсет подготавливается в отдельной форме, затем из ее же кода открывается вторая, и идет присвоение подготовленных данных открытой форме. Может в этом проблема? Может форма еще не успевает загрузиться до присвоения рекордсета, или еще что то в этом плане. После чего возникает конфликт и Акцесс вылетает.
...
Рейтинг: 0 / 0
19.10.2016, 05:16
    #39329468
Панург
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Recordset для формы
Decabrist, сомневаюсь, что проблема в DecabristМожет форма еще не успевает загрузиться до присвоения рекордсета Поставь в конце концов DoEvents после запуска формы. Даже, в порядке эксперимента, можно открыть форму, а потом в неё загрузить набор.
Возможно форма просто "поломалась", такое бывает.
...
Рейтинг: 0 / 0
19.10.2016, 05:20
    #39329469
Панург
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Recordset для формы
DecabristМожет в этом проблема?в Access один поток (thread), поэтому выполняется всё последовательно.

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

Код: vbnet
1.
Set Forms("subCost2").Recordset = rs
...
Рейтинг: 0 / 0
19.10.2016, 08:42
    #39329511
Decabrist
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Recordset для формы
Исправил.
Код: 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
19.10.2016, 08:44
    #39329512
ROI
ROI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Recordset для формы
DecabristПри том ошибка ровно на той же строке:

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


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


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