powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Recordset для формы
37 сообщений из 37, показаны все 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
Recordset для формы
    #39329520
Decabrist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ROIИ вообще поставте обработчик ошибок.

А здесь можно поподробнее?

ROIУ вас полная безграмотность.

Так я ни на что и не претендую. Как есть так есть.
...
Рейтинг: 0 / 0
Recordset для формы
    #39329522
Decabrist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ROIУ гетца таких как ваш примеров нет не передергивайте.
А в чем принципиальная разница?
...
Рейтинг: 0 / 0
Recordset для формы
    #39329528
ROI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DecabristROIУ гетца таких как ваш примеров нет не передергивайте.
А в чем принципиальная разница?


Я и говорю сначала надо форму открыть (смотрите пост выше)
...
Рейтинг: 0 / 0
Recordset для формы
    #39329529
Decabrist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нет, подождите. Возможно вы с самого начала не читали, но я там форму открывал через DoCmd, ровно как в примере Гетца (ну если не учитывать что у него DAO)
А в крайних примерах, я создаю отдельный экземпляр формы. Чем это плохо?
Акцесс и в том и в другом случае вылетает в одном и том же месте. Когда пытаюсь присвоить данные форме.
...
Рейтинг: 0 / 0
Recordset для формы
    #39329532
ROI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DecabristНет, подождите. Возможно вы с самого начала не читали, но я там форму открывал через DoCmd, ровно как в примере Гетца (ну если не учитывать что у него DAO)
А в крайних примерах, я создаю отдельный экземпляр формы. Чем это плохо?
Акцесс и в том и в другом случае вылетает в одном и том же месте. Когда пытаюсь присвоить данные форме.
В какой версии Accessa вы это делаете.
...
Рейтинг: 0 / 0
Recordset для формы
    #39329534
Decabrist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Акцесс 2013
...
Рейтинг: 0 / 0
Recordset для формы
    #39329539
Decabrist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я не знаю, может у меня с формой что не так.
Вот форма. На комбобоксах привязка к отдельным таблицам и запросом базы. Сама по себе форма работает нормально. Но при попытке подцепить рекордсет - вылетает полностью акс. Без каких либо соообщений об ошибках.
...
Рейтинг: 0 / 0
Recordset для формы
    #39329543
Decabrist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ладно мужики, не парьтесь. Все с RecordSource работает и ладно. А работать с отдельным рекордсетом и присоединять его к форме может в особых случаях понадобится (вероятно там где "простым" запросом не обойдесся, с какими-нибудь дополнительными вычислениями и вывертами). У меня не тот случай. А будет тот, тогда и можно будет этим заморочиться.
Спасибо всем!
Панург мое почтение!
...
Рейтинг: 0 / 0
Recordset для формы
    #39329558
MrShin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да не должен Акцесс вылетать ни при каких условиях, если вы не используете кривые вызовы API или не пытаетесь работать с памятью через них. Еще проблемы создают русские символы на машинах без русской кодовой страницы.
Попробуйте для начала скопировать форму в другую, удалить изначальную и переименовать копию в старое название. Не поможет - копируйте все объекты в новую базу.
...
Рейтинг: 0 / 0
Recordset для формы
    #39329559
MrShin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DecabristЛадно мужики, не парьтесь
Рекомендую все-таки проделать предложенную выше операцию, т.к. если форма повреждена, это вылезет боком в другом месте.
...
Рейтинг: 0 / 0
Recordset для формы
    #39329570
Decabrist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Форму я новую создал. Чистую без всего. На нее скопировал контролы из первой. В крайних своих сообщениях я уже работаю с новой формой. Все так же вылетает.
Ну а полностью базу переформатировать это не просто сделать сейчас.
...
Рейтинг: 0 / 0
Recordset для формы
    #39329643
MrShin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DecabristНу а полностью базу переформатировать это не просто сделать сейчас
Ну на самом деле это занимает пару минут на базах практически любой сложности. Просто выделяем все объекты, импортируем их и добавляем недостающие референсы на использованные библиотеки. Настройки текущей тазы уже не так критичны, можно оставить по умолчанию.

Вообще очень странное поведение.
...
Рейтинг: 0 / 0
37 сообщений из 37, показаны все 2 страниц
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Recordset для формы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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