Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Поле-сумма в основной форме по подформе... / 8 сообщений из 8, страница 1 из 1
17.07.2004, 17:09:31
    #32609344
BAlex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поле-сумма в основной форме по подформе...
Вступление будет немного длинным.
Проект adp (Access 2000), данные на SQL-сервере.

1. Есть простая форма (т.е. показывается одна запись). Реально это путевые листы.
2. Подформа в виде таблицы .

В основной форме есть поле "ПробегСум". В подформе есть столбик "Пробег" (т.е. каждая строка подформы описывает маршрут). Хочу сделать так, чтобы при изменении поля "Пробег" в подформе сума по столбикам этой подформы записывалась в поле осн. формы "ПробегСум". Т.е. суммарный пробег хранить сразу в базе.
Пробовал два варинта:
1. В примечании подформы создал поле, назовем его [Пробег_сум], свойство "Данные" (ControlSource) для него установил
Код: plaintext
=Sum([Пробег])
В осн. форме создал поле, которое ссылается на предыдущее, т.е. свойство "Данные" (ControlSource) для него установил
Код: plaintext
=[подформа].[Form]![Пробег_сум]
Как теперь это значение мне сохранить в базе (т.е. запомнить в поле "ПробегСум" осн. формы)? Как я понял, для вычисляемого поля формы событие AfterUpdate не срабатывает: " BeforeUpdate and AfterUpdate macros and event procedures run only if you change the data in a control. These events don't occur when a value changes in a calculated control. "
2. Тогда попробовал второй вариант. Для события AfterUpdate для подформы повесил процедуру, которая просто обращается к базе и пересчитывает сумму по маршрутам для данного листа:
Код: plaintext
1.
2.
3.
4.
5.
...
strSQL = "SELECT Sum(Пробег) AS ПробегСум " & _
   "FROM Маршрути " & _
   "WHERE (КодЛиста = " & _
   Nz(Forms("ПутевыеЛисты").КодЛиста, "Null") & ") "
...
Полученное число уже записываю в поле осн. формы "ПробегСум". При изменении (update) имеющихся строк все работает. Но при удалении строк ничего не работает :-(. Событие формы Delete срабатывает ДО того, как реально строки будут удалены из базы.

Программка делается для себя, и вот надолго на такой мелочи застрял :-(.
Как это можно решить?
...
Рейтинг: 0 / 0
17.07.2004, 18:50:04
    #32609384
Quick_Yak
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поле-сумма в основной форме по подформе...
Можешь в подчиненной форме сделать события
AfterUpdate и Delete
и в них обратившись к форме - родителю через Me.Parent записать, например
Dim rst AS Recordset
Dim curSum As Currency

curSum = 0
Set rst = Me.RecordSetClone
With rst
Do Until .EOF
curSum = curSum + NZ(!Сумма)
.MoveNext
Loop
.Close
Set rst = Nothing
End With
Me.Parent!Сумма = curSum
...
Рейтинг: 0 / 0
17.07.2004, 19:13:21
    #32609394
BAlex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поле-сумма в основной форме по подформе...
2 Quick_Yak
После удаления записи в подформе все равно клон этой подформы содержит удаленную запись (т.е. на экране записи уже нет, а в клоне и в базе она еще существует при запуске события Delete), поэтому сумма снова получается неправильной. Только что проверил. Или я чего не понимаю :-(
...
Рейтинг: 0 / 0
17.07.2004, 23:53:19
    #32609472
Quick_Yak
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поле-сумма в основной форме по подформе...
Возможно, что у тебя стоит подтверждение удаления записей, тогда либо
1) отключи его (Сервис - Параметры - Правка/Поиск - Подтверждение: флажок Удаление документов)
2) либо поставь в событие
Private Sub Form_AfterDelConfirm

P.S. Если не получится пиши.
...
Рейтинг: 0 / 0
18.07.2004, 01:49:44
    #32609494
lobodava
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поле-сумма в основной форме по подформе...
Позволю себе слегка подредактировать код от Quick_Yak... :)

Как ни странно, но сумму лучше всего высчитывать по событию Form_Current у подчинённой, т.к. это событие происходит после редактирования, после удаления и после вставки, причём RecordSetClone имеет "правильный" набор записей и свойство Dirty = False. Но что бы не высчитывать сумму без необходимости, например при простом переходе с записи на запись, надо создать флаг IsMileageCalculated

Код в подчинённой форме
Код: plaintext
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.
Public IsMileageCalculated As Boolean

Private Sub Form_Current()
    If Not Me.IsMileageCalculated Then Me.CalculateTotalMileage            
End Sub

Private Sub Form_AfterInsert()    
    Me.IsMileageCalculated = False
End Sub

Private Sub Form_Delete(Cancel As Integer)
    Me.IsMileageCalculated = False
End Sub

Private Sub Form_Dirty(Cancel As Integer)
    Me.Parent!tboMileage =  Me.Parent!tboMileage
    Me.IsMileageCalculated = False
End Sub

Public Sub CalculateTotalMileage()
    Dim rst AS Recordset
    Dim varTotalMileage As Variant

    varTotalMileage = Null
    Set rst = Me.RecordSetClone

    With rst
        Do Until .EOF
             'порой бывает не очень удобно писать в сумму ноль при отсутсвии
 
             'записей в подчинённой форме или при отсутствии суммируемых значений
 
             'по мне, так лучше если есть числа, то и в сумму пишем число
 
             'ежели нечего складывать, то и поле суммы ставим Null.
 
             'Это более информативно (IMHO!)
 
             
            If IsNull(varTotalMileage) And IsNull(!Mileage) Then
                varTotalMileage = Null
            ElseIf IsNull(varTotalMileage) And Not IsNull(!Mileage) Then
                varTotalMileage = !Mileage
            Else
                varTotalMileage = varTotalMileage + Nz(!Mileage,  0 )
            End If
            .MoveNext
        Loop
        .Close
    End With

    Set rst = Nothing

    If IsNull(varTotalMileage) Then
        Me.Parent!tboMileage = Null
    ElseIf 
        Me.Parent!tboMileage = CInt(varTotalMileage)
    End If

    IsMileageCalculated = True    
End Sub

Единственная ситуация когда Form_Current у подчинённой не срабатывает и, соответственно, не вычисляет сумму для основной, это когда пользователь начал редактировать подчинённую запись и не сходя с нее жмёт на кнопку перехода на другую запись у основной формы. Вернее Form_Current у подчинённой срабатывает, но уже для другой основной записи, и получается что сумма осталась не обновлённой. Выход: начать редактировать основную форму по событию Form_Dirty у подчинённой (см. выше строку Me.Parent!tboMileage = Me.Parent!tboMileage), чтобы запустить код на событие BeforeUpdate у главной формы.

Код в главной форме:
Код: plaintext
1.
2.
3.
4.
5.
6.
Private Sub Form_BeforeUpdate(Cancel As Integer)
    Dim frm As Form
    Set frm = Me!subFrmControl.Form

    If Not frm.IsMileageCalculated Then frm.CalculateTotalMileage 
End Sub
Можно было бы сюда проверку ещё добавить
Код: plaintext
If frm.Dirty Then frm.Dirty = False 
но в этом месте и без того frm.Dirty почему-то всегда False

Сие есть плод двухдневных экспериментов. Может кто лучше придумал?
...
Рейтинг: 0 / 0
19.07.2004, 11:18:01
    #32610111
BAlex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поле-сумма в основной форме по подформе...
2 Quick_Yak
авторВозможно, что у тебя стоит подтверждение удаления записей, тогда либо
1) отключи его (Сервис - Параметры - Правка/Поиск - Подтверждение: флажок Удаление документов)
Забрал этот флажок. Подтверждения при удалении не просит. Но результат с сумой тот же самый, а именно: неправильный.
автор2) либо поставь в событие
Private Sub Form_AfterDelConfirm
Ничего не изменилось (флажок, который снял в предыдущем пункте, я поставил назад).

Хотя вот это многообещающе:
For example, you can use a macro or event procedure associated with the AfterDelConfirm event to recalculate totals affected by the deletion of records.
...
Рейтинг: 0 / 0
19.07.2004, 12:25:02
    #32610285
ищ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поле-сумма в основной форме по подформе...
по поводу удаления записей в adp
деййствительно в событии "после удаления" запись на сервере
еще есть.
лови реальное удаление на событие "текущая запись"
но там тоже есть минус: если удалить сразу все записи, то соьытие
"текущая запись" уже не возникает.
так что имей ввиду
...
Рейтинг: 0 / 0
19.07.2004, 12:38:06
    #32610332
BAlex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Поле-сумма в основной форме по подформе...
2 lobodava

Большое спасибо. Вроде все работает.
При удалении всех строк в подформе тоже все работает.

В подформу только добавил
Код: plaintext
1.
2.
Private Sub Form_Load()    
    IsMileageCalculated = True
End Sub
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Поле-сумма в основной форме по подформе... / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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