|
50 Кб. |
|
| Захотелось автоматизировать заполнение поля "количество" в заказе. Создал для этого процедуру.
Dim rs As DAO.Recordset 'использем для доступа к таблице заказов
Dim db As Database
Dim a As Long 'суток
Dim k As Long 'количество
Dim c As Long 'категория
Dim d As Long 'документ
Dim e As Long 'количество
Dim w As Long 'Возраст
Dim strSql As String
Set db = CurrentDb()
a = Forms![Заказпрог]![Список76] ' число суток
c = Forms!Заказпрог!SubZak!id_kat_zak
d = Forms!Заказпрог!SubZak!Тип_док 'документ 1-билет 2-наряд
w = Forms!Заказпрог!SubZak!Id_Vozr 'Возраст 1- шк 2- взр 5 - всё
strSql = _
"SELECT tabZak.id_Prog_zak, tabZak.id_kat_zak, tabZak.Id_Vozr, tabZak.Тип_док, tabZak.Kol " & _
"FROM tabZak " & _
"WHERE tabZak.id_Prog_zak=" & Me.id_Закпрог
If c = 2 Then
k = Me.Всего_гр
e = a * k
ElseIf c = 3 Then
e = Me.Всего_гр
ElseIf (c = 4 Or 5 Or 10) And (d = 1 And w = 2) Then
e = Me.Всего_взр
ElseIf (c = 4 Or 5 Or 10) And (d = 1 And w = 1) Then
e = Me.Детей
Else
e = 0
End If
Set rs = db.OpenRecordset(strSql)
rs.MoveLast
rs.MoveFirst
Do Until rs.EOF ' начало цикла
rs.Edit ' редактирование
rs.Fields(4) = e ' присваение значению переменной нужной мне расчётной величины
rs.Update
rs.MoveNext
Loop 'конец цикла
rs.Close
Set rs = Nothing
Me.SubZak.Requery
|
Один недостаток. Не работает. Значение поля "кол" принимается правильно, но по значению, которое должно быть в строке, где стоит курсор и заполняет всю таблицу. Рекордсет имеет 8 записей, проверял, но редактирование не происходит при переходе по строкам. Помогите побороть беду | |
|
| |
|
|
|
| код работает правильно - это вы от него хотите совсем другое, что не знаю мелафона.net
если хотим чтобы значение rs.Fields(4) = e - менялось - а оно из формы то нужен синхронный переход в форме по ёё записям, а яго из эпсент.
поэтому
Dim rs_ФОРМА As DAO.Recordset
Set rs = db.OpenRecordset(strSql)
set rs_ФОРМА=me.recordsetclone
'rs.MoveLast - на фиг с пляжа
'rs.MoveFirst - и это тоже
Do Until rs.EOF ' начало цикла
If rs_ФОРМА!id_kat_zak = 2 Then ' а на кой придумали оператор Select case
k = Me.Всего_гр
e = a * k
ElseIf c = 3 Then
e = Me.Всего_гр
ElseIf (c = 4 Or 5 Or 10) And (d = 1 And w = 2) Then
e = Me.Всего_взр
ElseIf (c = 4 Or 5 Or 10) And (d = 1 And w = 1) Then
e = Me.Детей
Else
e = 0
End If
rs.Edit ' редактирование
rs.Fields(4) = e ' присваение значению переменной нужной мне расчётной величины
rs.Update
rs_ФОРМА.MoveNext
rs.MoveNext ' а вот тута по логике нужно переходить на поле которое соотвествует ФОРМЕ - не факт что они синхронны
Loop
|
| |
|
| |
|
|
|
| День добрый. Спасибо за внимание к моей беде. вопрос по оператору "Select case" вместо использованного мною If - Then, а куда можно деть
дополнительные условия "And (d = 1 And w = 2)" насколько я понял,
их в Selekt не засунешь. Возможно я ошибаюсь.
Если не очень трудно, напишите, как должно быть записано моё выражение от и до.
Вопрос по поводу рекордсета.
strSql = _
"SELECT tabZak.id_Prog_zak, tabZak.id_kat_zak, tabZak.Id_Vozr, tabZak.Тип_док, tabZak.Kol " & _
"FROM tabZak " & _
"WHERE tabZak.id_Prog_zak=" & Me.id_Закпрог
|
и запрос, определяющий данные формы(источник записей)
SELECT tabZak.id_Zak, tabZak.id_Prog_zak, tabZak.Дата, tabZak.Время, tabZak.id_post_zak,
tab_post.Название, tabZak.id_Usl_zak, tab_Uslugi.Услуги_подробно, tabZak.id_kat_zak, tabZak.Id_Vozr, tab_Vozr.Кат_туриста, tabZak.Тип_док, tab_TipDoc.Doc, tabZak.cena, tabZak.Id_seson, tab_sezon.Тип_Сез, tabZak.Kol, tabZak.закр, tabZak.Стоимость,
* FROM tab_Vozr INNER JOIN (tab_Uslugi INNER JOIN (tab_post INNER JOIN ((tabZak INNER JOIN tab_TipDoc ON tabZak.Тип_док=tab_TipDoc.Id_doc) INNER JOIN tab_sezon ON
tabZak.Id_seson=tab_sezon.idSez) ON tab_post.Id_post=tabZak.id_post_zak) ON
tab_Uslugi.id_Usl=tabZak.id_Usl_zak) ON tab_Vozr.idV=tabZak.Id_Vozr ORDER BY tabZak.Дата,
tabZak.Время, tabZak.id_kat_zak;
| практически одинаковы. число строк на форме и в рекордсете одинаково. Вот тут и возникает главный вопрос ПОЧЕМУ значение "е" или "rs.Fields(4)" определяется ПРАВИЛЬНО(!) для первой
записи в таблице на которую установлен курсор и этим значением заполняется ВЕСЬ рекордсет.
Более понятно можно убедиться практически, скачав пример из начала поста. | |
|
| |
|
|
|
| 1. Пример в студию.
2. Эту хрень
ElseIf (c = 4 Or 5 Or 10) And (d = 1 And w = 2) Then
e = Me.Всего_взр
ElseIf (c = 4 Or 5 Or 10) And (d = 1 And w = 1) Then
|
я не досмотрел до конца - наверно еще один Select Case лепить хуже.
3.
Вот тут и возникает главный вопрос ПОЧЕМУ значение "е" или "rs.Fields(4)" определяется ПРАВИЛЬНО(!) для первой
записи в таблице на которую установлен курсор и этим значением заполняется ВЕСЬ рекордсет.
|
исчё раз:
движение по рекордсету происходит
вот тут - rs.MoveNext (твой пример кода)
а движения по ФОРМЕ НЕТ, т.е. одно и тоже значения тулится всей табле - результат который имеем.
нужно двигаться по Форме (Me.RecordsetClone) и перемещаться в по табле исходя из формы.
т.е.
Dim rs_ФОРМА As DAO.Recordset
Set rs = db.OpenRecordset(strSql)
set rs_ФОРМА=me.recordsetclone
a = Forms![Заказпрог]![Список76] - судя по всему из другой формы и оно постоянно
Do Until rs_ФОРМА.EOF ' начало цикла
If rs_ФОРМА!id_kat_zak = 2 Then
k = rs_ФОРМА!Всего_гр
e = a * k
ElseIf rs_ФОРМА!id_kat_zak = 3 Then
e = rs_ФОРМА!Всего_гр
ElseIf (rs_ФОРМА!id_kat_zak = 4 Or 5 Or 10) And (rs_ФОРМА!Тип_док = 1 And rs_ФОРМА!Id_Vozr = 2) Then
e = rs_ФОРМА!Всего_взр
ElseIf (rs_ФОРМА!id_kat_zak = 4 Or 5 Or 10) And (rs_ФОРМА!Тип_док = 1 And rs_ФОРМА!Id_Vozr = 1) Then
e = rs_ФОРМА!Детей
Else
e = 0
End If
rs.Edit ' редактирование
rs.Fields(4) = e ' присваение значению переменной нужной мне расчётной величины
rs.Update
rs_ФОРМА.MoveNext
rs.moveFist ' вот не помню это нужно делать или нет для тго чтобы FindFist сработал правильно
rs.FindFist "id_Prog_zak=" & rs_ФОРМА.id_Prog_zak
Loop
|
| |
|
| |
|
50 Кб. |
|
| Почти понял. Спасибо. Осталось допонять следующее: значения Ме.Всего_гр , Ме.Детей и.т.д "ме" беруться из основной формы, а заполнение рекордсета происходит в подчинённой форме. Что надо доделать в синтаксисе, чтобы получилось верно. Второе, я то думал, что рекордсет работает с таблицей или с запросом и ему до балалайки, что происходит на форме, а потом, мы перечитаем таблицу и всё будет хорошо. Это заблуждение стоило несколько дней грусти. Рыба в студии | |
|
| |
|
50 Кб. |
|
|
меня терзают смутные сомненья.
ларчик открывался просто!!!!
Private Sub Кнопка150_Click() 'Заполнить столбец "Количество"
Dim rs As DAO.Recordset 'использем для доступа к таблице заказов
Dim db As Database
Dim a As Long 'суток
Dim k As Long 'количество
Dim c As Long 'категория
Dim d As Long 'документ
Dim e As Long 'количество
Dim w As Long 'Возраст
Dim strSql As String
Set db = CurrentDb()
a = Forms![Заказпрог]![Список76] ' число суток
c = Forms!Заказпрог!subZak!id_kat_zak
d = Forms!Заказпрог!subZak!Тип_док 'документ 1-билет 2-наряд
w = Forms!Заказпрог!subZak!Id_Vozr 'Возраст 1- шк 2- взр 5 - всё
strSql = _
"SELECT tabZak.id_Prog_zak, tabZak.id_kat_zak, tabZak.Id_Vozr, tabZak.Тип_док, tabZak.Kol " & _
"FROM tabZak " & _
"WHERE tabZak.id_Prog_zak=" & Me.id_Закпрог
Set rs = db.OpenRecordset(strSql) 'db.OpenRecordset (sSQL)Открываем рекордсет
Do Until rs.EOF ' начало цикла
If rs.Fields(1) = 2 Then
k = Me.Всего_гр
e = a * k
ElseIf rs.Fields(1) = 3 Then
e = Me.Всего_гр
ElseIf (rs.Fields(1) = 4 Or 5 Or 10) And (rs.Fields(3) = 1 And rs.Fields(2) = 2) Then
e = Me.Всего_взр
ElseIf (rs.Fields(1) = 4 Or 5 Or 10) And (rs.Fields(3) = 1 And rs.Fields(2) = 1) Then
e = Me.Детей
Else
e = 0
End If
rs.Edit ' редактирование
rs.Fields(4) = e ' присваение значению переменной нужной мне расчётной величины
rs.Update
rs.MoveNext
Loop 'конец цикла
rs.Close
Set rs = Nothing
Me.subZak.Requery
End Sub
|
см. влож файл | |
|
| |
|
|
|
| Спасибо преогромное. Я всегда испытывал чуство уважения к кошачьим. Я был смутно озадачен тем как связать правила выбота с таблицей, а не формой. Еще раз большое спасибо за конкретную помощь, а для остальных, попадающих в подобные ситуации (рекордсет-форма) предлагаю ознакомиться с постом
Как использовать "Recordset" для перемещения по записям в форме? http://forum.codenet.ru/archive/index.php/t-11525.html
|
| |
|
| |
|
|
|
|
Захотелось автоматизировать заполнение поля "количество" в заказе
|
для полной автоматизации можно эту процедуру повесить на событие "После обновления" для каждого поля, которое влияет на конечную суму - тогда кнопака Пересчитать не нужна и информация получается более наглядная | |
|
| |
|
|
|
| Спасибо, не думал на таким вариантом. Спасибо ещё раз, воспользуюсь идеей обязательно. | |
|
| |