powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Заполнение подчиненной формы по нажатию кнопки
18 сообщений из 18, страница 1 из 1
Заполнение подчиненной формы по нажатию кнопки
    #39453917
MaKaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть формы: Главная, подчиненная 1-го уровня, в ней подчиненная 2-го уровня.

Пытаюсь создать кнопку, по нажатию которой, первые 3 записи в подчиненной форме заполняются определенным образом (в формулах участвуют поля с [Подчиненная У1]). При этом, если записи уже созданы и заполнены, после нажатия, они должны пересчитаться.

Записи заполняю так:
Forms![Главная]![Подчиненная У1]![Подчиненная У2].Form![Поле А] = Forms![Главная]![Подчиненная У1].Form![Поле 1]
Forms![Главная]![Подчиненная У1]![Подчиненная У2].Form![Поле Б] = Forms![Главная]![Подчиненная У1].Form![Поле 2] * Forms![Главная]![Подчиненная У1].Form![Поле 3]

Проблемы начинаются, когда начинаю проверять наличие записей и передвигаться по ним.
Делаю это через .Form.Recordset...
=Текущий код представляет собой мешанину проб и ошибок, часть его выглядит примерно так:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
 If Forms![Çàêàç]![ÁåãóùèåÑòðîêè]![ïîä÷èíåííàÿ ôîðìà ÑïèñàíèåÄÄ].Form.RecordsetClone.RecordCount > 0 Then
    Forms![Çàêàç]![ÁåãóùèåÑòðîêè]![ïîä÷èíåííàÿ ôîðìà ÑïèñàíèåÄÄ].Form.Recordset.MoveFirst
 End If
    Forms![Çàêàç]![ÁåãóùèåÑòðîêè]![ïîä÷èíåííàÿ ôîðìà ÑïèñàíèåÄÄ].Form![ÊîäÄÄ] = 1
    Forms![Çàêàç]![ÁåãóùèåÑòðîêè]![ïîä÷èíåííàÿ ôîðìà ÑïèñàíèåÄÄ].Form![Êîëè÷åñòâî] = 44 'Int(x) + IIf(x - Int(x) > 0, 1, 0)
 If Forms![Çàêàç]![ÁåãóùèåÑòðîêè]![ïîä÷èíåííàÿ ôîðìà ÑïèñàíèåÄÄ].Form.Recordset.RecordCount > 1 Then
    Forms![Çàêàç]![ÁåãóùèåÑòðîêè]![ïîä÷èíåííàÿ ôîðìà ÑïèñàíèåÄÄ].Form.Recordset.MoveNext
 Else
    Forms![Çàêàç]![ÁåãóùèåÑòðîêè]![ïîä÷èíåííàÿ ôîðìà ÑïèñàíèåÄÄ].Form.Recordset.AddNew
 End If
    Forms![Çàêàç]![ÁåãóùèåÑòðîêè]![ïîä÷èíåííàÿ ôîðìà ÑïèñàíèåÄÄ].Form![ÊîäÄÄ] = 2
    Forms![Çàêàç]![ÁåãóùèåÑòðîêè]![ïîä÷èíåííàÿ ôîðìà ÑïèñàíèåÄÄ].Form![Êîëè÷åñòâî] = Forms![Çàêàç]![ÁåãóùèåÑòðîêè].Form![ØèðèíàÌîäóëè] * Forms![Çàêàç]![ÁåãóùèåÑòðîêè].Form![ÂûñîòàÌîäóëè] * 4


тут заполнение 2-х записей

Постоянно возникающие ошибки заставляют думать, что я пошел не по тому пути.
Подскажите как реализовать задуманное?
...
Рейтинг: 0 / 0
Заполнение подчиненной формы по нажатию кнопки
    #39453932
MaKaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Что-то странное случилось с видом кодом, переписал.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
 If Forms![Главная]![Подчиненная У1]![Подчиненная У2].Form.RecordsetClone.RecordCount > 0 Then
    Forms![Главная]![Подчиненная У1]![Подчиненная У2].Form.Recordset.MoveFirst
 End If
    Forms![Главная]![Подчиненная У1]![Подчиненная У2].Form![Поле А] = 1
    Forms![Главная]![Подчиненная У1]![Подчиненная У2].Form![Поле Б] = 44 'Int(x) + IIf(x - Int(x) > 0, 1, 0)
 If Forms![Главная]![Подчиненная У1]![Подчиненная У2].Form.Recordset.RecordCount > 1 Then
    Forms![Главная]![Подчиненная У1]![Подчиненная У2].Form.Recordset.MoveNext
 Else
    Forms![Главная]![Подчиненная У1]![Подчиненная У2].Form.Recordset.AddNew
 End If
    Forms![Главная]![Подчиненная У1]![Подчиненная У2].Form![Поле А] = 2
    Forms![Главная]![Подчиненная У1]![Подчиненная У2].Form![Поле Б] = Forms![Главная]![Подчиненная У1].Form![Поле 1] * Forms![Главная]![Подчиненная У1].Form![Поле 2] * 4

...
Рейтинг: 0 / 0
Заполнение подчиненной формы по нажатию кнопки
    #39455986
MaKaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А если упростить:
Как удалить все записи в подчиненной форме?
...
Рейтинг: 0 / 0
Заполнение подчиненной формы по нажатию кнопки
    #39456050
Иожет так?
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
With Forms![Главная]![Подчиненная У1].Form
  Set rs = ![Подчиненная У2].Form.RecordsetClone
  v1 = ![Поле 1]
  v1 = ![Поле 2]
End With

If  rs.RecordCount > 0 Then rs.MoveFirst

For i = 1 To 3
  If rs.EOF Then rs.AddNew Else rs.Edit
  rs![Поле А] = i
  Select Case i
  Case 1: rs![Поле Б] = 44
  Case 2: rs![Поле Б] = v1 * v2 * 4
  Case 3: rs![Поле Б] = ...
  End Select
  rs.Update
  rs.MoveNext
Next i
...
Рейтинг: 0 / 0
Заполнение подчиненной формы по нажатию кнопки
    #39456416
MaKaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Анатолий ( Киев ),
Работает, если есть 3 или больше записей.

Если нет ни одной записи, ошибка "Текущая запись отсутствует" на
Код: vbnet
1.
rs.Edit


Если записей <3, ошибка "Текущая запись отсутствует" на
Код: vbnet
1.
rs.MoveNext


Что я упустил?
...
Рейтинг: 0 / 0
Заполнение подчиненной формы по нажатию кнопки
    #39457091
MaKaKЕсли нет ни одной записи, ошибка "Текущая запись отсутствует" на
Код: vbnet
1.
rs.Edit


Если записей <3, ошибка "Текущая запись отсутствует" на
Код: vbnet
1.
rs.MoveNext


Что я упустил? Странно! В коде есть проверка If rs.EOF Then rs.AddNew Else rs.Edit
Если rs.EOF = True, значит вы вышли за пределы набора записи. В этом случае должен выполняться метод AddNew, а не Edit.
...
Рейтинг: 0 / 0
Заполнение подчиненной формы по нажатию кнопки
    #39457160
MaKaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Анатолий ( Киев ),
Я мог что-нибудь неверно задать

Access 2010
Весь код кнопки
Код: 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.
Private Sub Кнопка103_Click()
Dim rs As Recordset
Dim i As Integer, v1 As Integer, v2 As Integer

With Forms![Заказ]![БегущиеСтроки].Form
  Set rs = ![подчиненная форма СписаниеДД].Form.RecordsetClone
  v1 = ![ШиринаМодули]
  v2 = ![ВысотаМодули]
End With

If rs.RecordCount > 0 Then rs.MoveFirst

For i = 1 To 3
  If rs.EOF Then rs.AddNew Else rs.Edit
  rs![КодДД] = i
  Select Case i
  Case 1: rs![Количество] = 111
  Case 2: rs![Количество] = 222 'v1 * v2 * 4
  Case 3: rs![Количество] = 333
  End Select
  rs.Update
  rs.MoveNext
Next i
End Sub

...
Рейтинг: 0 / 0
Заполнение подчиненной формы по нажатию кнопки
    #39457213
MaKaKЯ мог что-нибудь неверно задать Да нет, все правильно, разве только Dim rs As DAO. Recordset (Если, конечно, у вас БД, а не проект).
Проверяйте в пошаговом режиме и контролируйте rs.EOF.
И еще. Если "подчиненная 1-го уровня, в ней подчиненная 2-го уровня." связаны по полям, то значение в поле здесь нужно вносить явно Хотя у вас на rs.Update никаких ошибок не возникает.
...
Рейтинг: 0 / 0
Заполнение подчиненной формы по нажатию кнопки
    #39457231
alecko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
немного подправил - может сработает?
Код: vbnet
1.
2.
3.
4.
5.
6.
...
If  rs.AbsolutePosition<>-1 Then rs.MoveFirst

...
  If rs.EOF or rs.BOF Then rs.AddNew Else rs.Edit
 ...
...
Рейтинг: 0 / 0
Заполнение подчиненной формы по нажатию кнопки
    #39457529
MaKaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Анатолий ( Киев ), alecko,
Нашел здесь , в описании свойств EOF и BOF:

"Вызов метода MoveNext или MovePrevious, когда, соответственно, свойство EOF или BOF имеет значение True, приводит к возникновению ошибки."

Добавил проверку перед rs.MoveNext:
Код: vbnet
1.
If rs.EOF = False Then rs.MoveNext

и, вроде бы, ошибка пропала. Значения заполняются.

Осталось заставить сохраняться внесенные кнопкой изменения.
...
Рейтинг: 0 / 0
Заполнение подчиненной формы по нажатию кнопки
    #39457898
alecko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaKaK,
если не сохраняются данные, то работать нужно с таблиц(ами)-(ей) а не с рекордсорсом формы-подформ. нужна база с формой.
и тут лучше поставить-
If rs.EOF AND rs.BOF Then rs.AddNew Else rs.Edit
это соответсвует отсутствию записей в рекордсете.
- хотя этому соответствует и rs.AbsolutePosition=-1

с другой стороны
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
For i = 1 To 3
  If rs.EOF Then rs.AddNew Else rs.Edit
  rs![Поле А] = i
  Select Case i
  Case 1: rs![Поле Б] = 44
  Case 2: rs![Поле Б] = v1 * v2 * 4
  Case 3: rs![Поле Б] = ...
  End Select
  rs.Update
  rs.MoveNext
Next i


что-то не понял логику кода - Вы создаете новую запись, потом выходите за пределы рекордсета, проверяете (а вы там точно после addnew и решаете снова добавить...), почему просто не добавить?
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
For i = 1 To 3
   rs.AddNew 
  rs![Поле А] = i
  Select Case i
  Case 1: rs![Поле Б] = 44
  Case 2: rs![Поле Б] = v1 * v2 * 4
  Case 3: rs![Поле Б] = ...
  End Select
  rs.Update
Next
...
Рейтинг: 0 / 0
Заполнение подчиненной формы по нажатию кнопки
    #39458075
MaKaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleckoчто-то не понял логику кода - Вы создаете новую запись, потом выходите за пределы рекордсета, проверяете (а вы там точно после addnew и решаете снова добавить...), почему просто не добавить?
Это на случай, если уже существуют записи. Пытаюсь сделать, чтобы нажатие кнопки пересчитывало значения первых 3-х записей.

Есть ли разница между
Код: vbnet
1.
rs.AbsolutePosition=-1

и
Код: vbnet
1.
rs.RecordCount > 0

для проверки наличия записей в рекордсете?
...
Рейтинг: 0 / 0
Заполнение подчиненной формы по нажатию кнопки
    #39458443
alecko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaKaK, разницы как бы нет(в нашем случае проверки наличия записей), но она как бы есть - свойство recordCount получает истинное значение спустя некоторое время, либо если оказаться на последней записи, а absolutePosition =-1 если записей нет - сразу.

"Это на случай, если уже существуют записи. Пытаюсь сделать, чтобы нажатие кнопки пересчитывало значения первых 3-х записей."
почему просто не очистить таблицу перед пересчетом? и заполнить её нужными значениями... - это как то привычнее и не надо городить огород с проверками.
...
Рейтинг: 0 / 0
Заполнение подчиненной формы по нажатию кнопки
    #39458739
MaKaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleckoПочему просто не очистить таблицу перед пересчетом? и заполнить её нужными значениями... - это как то привычнее и не надо городить огород с проверками.
Как в этом случае удалить все записи (очистить подчиненную форму) и обновить информацию о записях перед повторным нажатием?
Заполняю форму так:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
Private Sub Кнопка104_Click()
Dim x As Integer, i As Integer
With Forms![Заказ]![БегущиеСтроки]
If ![подчиненная форма СписаниеДД].Form.Recordset.AbsolutePosition <> -1 Then 'проверка на наличие записей
'If MsgBox("Таблицы будут очищены", vbOKCancel) = vbOK Then 'удаляем записи
 MsgBox "Таблицы будут очищены"
Else
![подчиненная форма СписаниеДД].SetFocus
![подчиненная форма СписаниеДД].Form![КодДД].SetFocus
For i = 1 To 3
 ![подчиненная форма СписаниеДД].Form.Recordset.AddNew
 ![подчиненная форма СписаниеДД].Form![КодДД] = i
  Select Case i
  Case 1: ![подчиненная форма СписаниеДД].Form![Количество] = 111
  Case 2: ![подчиненная форма СписаниеДД].Form![Количество] = 222
  Case 3: ![подчиненная форма СписаниеДД].Form![Количество] = 333
  End Select
Next i
End If
End With
End Sub


Кто бы знал, что .SetFocus поможет избавиться от ошибки на .Form.Recordset.AddNew...
...
Рейтинг: 0 / 0
Заполнение подчиненной формы по нажатию кнопки
    #39459147
alecko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaKaK,
ну как... CurrentDB.Execute "Delete * From tmptbl"
где tmptbl - временная таблица.-рекордсорс формы.
...
Рейтинг: 0 / 0
Заполнение подчиненной формы по нажатию кнопки
    #39459832
MaKaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Благодарю за помощь отписавшихся.
Получившийся код:
Код: 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.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
Private Sub Кнопка104_Click()
Dim i As Integer, v1 As Integer, v2 As Integer
Dim x As Single

With Forms![Заказ]![БегущиеСтроки]
If IsNull(.Form![Модуль]) = True Or IsNull(.Form![Контроллер]) = True Then
 MsgBox "Заполните поля Модуль и Контроллер"
Else
 x = Nz(.Form![ОбщееПотребление] / 200, 0) 'для блоков 200Вт
 v1 = .Form![ШиринаМодули]
 v2 = .Form![ВысотаМодули]
 If ![подчиненная форма СписаниеДД].Form.Recordset.RecordCount > 0 Or ![подчиненная форма СписаниеК].Form.Recordset.RecordCount > 0 Or ![подчиненная форма СписаниеМ1].Form.Recordset.RecordCount > 0 Then
  If MsgBox("Текущие записи будут удалены", vbOKCancel, "Внимание") = vbOK Then
   CurrentDb.Execute "DELETE * FROM СписаниеМ WHERE КодЗаказа=" & .Form![КодЗаказа]
   CurrentDb.Execute "DELETE * FROM СписаниеК WHERE КодЗаказа=" & .Form![КодЗаказа]
   CurrentDb.Execute "DELETE * FROM СписаниеДД WHERE КодЗаказа=" & .Form![КодЗаказа]
   ![подчиненная форма СписаниеМ1].Form.Requery
   ![подчиненная форма СписаниеК].Form.Requery
   ![подчиненная форма СписаниеДД].Form.Requery
  Else
   Exit Sub
  End If
 End If
 ![подчиненная форма СписаниеМ1].SetFocus
 ![подчиненная форма СписаниеМ1].Form![КодМодуля].SetFocus
 ![подчиненная форма СписаниеМ1].Form![КодМодуля] = .Form![Модуль]
 ![подчиненная форма СписаниеМ1].Form![Количество] = v1 * v2

 ![подчиненная форма СписаниеК].SetFocus
 ![подчиненная форма СписаниеК].Form![КодКонтроллера].SetFocus
 ![подчиненная форма СписаниеК].Form![КодКонтроллера] = .Form![Контроллер]
 ![подчиненная форма СписаниеК].Form![Количество] = 1

 ![подчиненная форма СписаниеДД].SetFocus
 ![подчиненная форма СписаниеДД].Form![КодДД].SetFocus
 For i = 1 To 4
  Select Case i
  Case 1
  ![подчиненная форма СписаниеДД].Form.Recordset.AddNew
  ![подчиненная форма СписаниеДД].Form![КодДД] = 1
  ![подчиненная форма СписаниеДД].Form![Количество] = Int(x) + IIf(x - Int(x) > 0, 1, 0)
  Case 2
  ![подчиненная форма СписаниеДД].Form.Recordset.AddNew
  ![подчиненная форма СписаниеДД].Form![КодДД] = 2
  ![подчиненная форма СписаниеДД].Form![Количество] = v1 * v2 * 4
  Case 3
  If .Form![USB] = True Then
  ![подчиненная форма СписаниеДД].Form.Recordset.AddNew
  ![подчиненная форма СписаниеДД].Form![КодДД] = 3
  ![подчиненная форма СписаниеДД].Form![Количество] = 1
  End If
  Case 4
  If .Form![Температура] = True Then
  ![подчиненная форма СписаниеДД].Form.Recordset.AddNew
  ![подчиненная форма СписаниеДД].Form![КодДД] = 4
  ![подчиненная форма СписаниеДД].Form![Количество] = 1
  End If
  End Select
 Next i
End If
End With
End Sub

Вроде работает...
...
Рейтинг: 0 / 0
Заполнение подчиненной формы по нажатию кнопки
    #39460138
alecko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кстати можно облагородить код таким...
Dim frm2 as form
set frm2=Forms![Главная]![подчиненная форма СписаниеДД].form

...
и выкинуть все эти длинные конструкции...
и цикл и Select выкинуть - идет же последовательное наполнение
For i = 1 To 4
Select Case i
Case 1
![подчиненная форма СписаниеДД].Form.Recordset.AddNew
![подчиненная форма СписаниеДД].Form![КодДД] = 1
![подчиненная форма СписаниеДД].Form![Количество] = Int(x) + IIf(x - Int(x) > 0, 1, 0)
Case 2
![подчиненная форма СписаниеДД].Form.Recordset.AddNew
![подчиненная форма СписаниеДД].Form![КодДД] = 2
![подчиненная форма СписаниеДД].Form![Количество] = v1 * v2 * 4
Case 3
If .Form![USB] = True Then
![подчиненная форма СписаниеДД].Form.Recordset.AddNew
![подчиненная форма СписаниеДД].Form![КодДД] = 3
![подчиненная форма СписаниеДД].Form![Количество] = 1
End If
Case 4
If .Form![Температура] = True Then
![подчиненная форма СписаниеДД].Form.Recordset.AddNew
![подчиненная форма СписаниеДД].Form![КодДД] = 4
![подчиненная форма СписаниеДД].Form![Количество] = 1
End If
End Select
Next i

можно записать как

end with
with frm2
.Recordset.AddNew: ![КодДД] = 1:![Количество] = Int(x) + IIf(x - Int(x) > 0, 1, 0)
.Recordset.AddNew: ![КодДД] = 2:![Количество] = v1 * v2 * 4
If Forms![Заказ]![БегущиеСтроки].Form![USB] Then .Recordset.AddNew:![КодДД] = 3:![Количество] = 1
If Forms![Заказ]![БегущиеСтроки].Form![Температура] Then .Recordset.AddNew: ![КодДД] = 4:![Количество] = 1
end with

типа такого сделать-читается получше
...
Рейтинг: 0 / 0
Заполнение подчиненной формы по нажатию кнопки
    #39460395
MaKaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleckoкстати можно облагородить код и выкинуть все эти длинные конструкции...
и цикл Select выкинуть - идет же последовательное наполнение
Верно...
Сделал отдельными действиями .Form![КодДД] = 1, чтобы можно было управлять присваиваемым кодом, и .Form.Recordset.AddNew потому что есть условия на добавления, а цикл убрать забыл.
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Заполнение подчиненной формы по нажатию кнопки
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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