Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: MS ACCESS

Вопросы связанные с MS ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Изменение поля в таблице Access v.2003
 
 автор: User   (17.11.2010 в 22:21)   личное сообщение
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 записей, проверял, но редактирование не происходит при переходе по строкам. Помогите побороть беду

  Ответить  
 
 автор: kot_k_k   (18.11.2010 в 08:18)   личное сообщение
 
 

код работает правильно - это вы от него хотите совсем другое, что не знаю мелафона.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

  Ответить  
 
 автор: User   (18.11.2010 в 15:42)   личное сообщение
 
 

День добрый. Спасибо за внимание к моей беде. вопрос по оператору "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)" определяется ПРАВИЛЬНО(!) для первой
записи в таблице на которую установлен курсор и этим значением заполняется ВЕСЬ рекордсет.
Более понятно можно убедиться практически, скачав пример из начала поста.

  Ответить  
 
 автор: kot_k_k   (18.11.2010 в 16:07)   личное сообщение
 
 

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 

  Ответить  
 
 автор: User   (18.11.2010 в 16:41)   личное сообщение
50 Кб.
 
 

Почти понял. Спасибо. Осталось допонять следующее: значения Ме.Всего_гр , Ме.Детей и.т.д "ме" беруться из основной формы, а заполнение рекордсета происходит в подчинённой форме. Что надо доделать в синтаксисе, чтобы получилось верно. Второе, я то думал, что рекордсет работает с таблицей или с запросом и ему до балалайки, что происходит на форме, а потом, мы перечитаем таблицу и всё будет хорошо. Это заблуждение стоило несколько дней грусти. Рыба в студии

  Ответить  
 
 автор: kot_k_k   (19.11.2010 в 08:07)   личное сообщение
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


см. влож файл

  Ответить  
 
 автор: User   (19.11.2010 в 11:16)   личное сообщение
 
 

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


Как использовать "Recordset" для перемещения по записям в форме? http://forum.codenet.ru/archive/index.php/t-11525.html

  Ответить  
 
 автор: kot_k_k   (20.11.2010 в 10:02)   личное сообщение
 
 


Захотелось автоматизировать заполнение поля "количество" в заказе



для полной автоматизации можно эту процедуру повесить на событие "После обновления" для каждого поля, которое влияет на конечную суму - тогда кнопака Пересчитать не нужна и информация получается более наглядная

  Ответить  
 
 автор: User   (22.11.2010 в 20:13)   личное сообщение
 
 

Спасибо, не думал на таким вариантом. Спасибо ещё раз, воспользуюсь идеей обязательно.

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList