powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Undo в подчиненной форме
16 сообщений из 41, страница 2 из 2
Undo в подчиненной форме
    #32324657
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так работает :)
---
А что "два"?
...
Рейтинг: 0 / 0
Undo в подчиненной форме
    #32324670
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм...
А если я вношу изменения только в подчиненной форме, то как тогда запустить транзакцию?
...
Рейтинг: 0 / 0
Undo в подчиненной форме
    #32324678
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И на Dirty подчиненной тоже запускай транзакцию. Это два
И заведи себе флаг, по которому будешь отслеживать, была ли уже запущена транзакция или нет. Это три
И нигде не видно Commit'а. Это четыре
И при закрытии формы надо транзакцию или завершать, или откатывать. Это пять.
...
Рейтинг: 0 / 0
Undo в подчиненной форме
    #32324699
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И на Dirty подчиненной тоже запускай транзакцию
Черт
Не понимаю, как начать транзакцию в модуле подчиненной, если рекордсеты присваиваются в модуле главнной формы?
...
Рейтинг: 0 / 0
Undo в подчиненной форме
    #32324709
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Не понимаю, как начать транзакцию в модуле подчиненной, если рекордсеты присваиваются в модуле главнной формы?

Дык вынеси в модуль. Можно и в модуль класса (если что-то универсально городить), но и обычного модуля в данном случае будет достаточно
...
Рейтинг: 0 / 0
Undo в подчиненной форме
    #32324742
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во-первых какая разница где начинать трнзакцию
Во-вторых событие Dirty от подчиненной лови в основной
В-третьих купил бы ты себе Гетца. Или нашел в инете исходники. Тут ссылку кто-то давал.
...
Рейтинг: 0 / 0
Undo в подчиненной форме
    #32324769
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во-вторых событие Dirty от подчиненной лови в основной
Да блин, и тут не понятно. Как это событие отловить?
...
Рейтинг: 0 / 0
Undo в подчиненной форме
    #32324777
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
см. в-третьих
...
Рейтинг: 0 / 0
Undo в подчиненной форме
    #32324785
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я знал что ты так ответишь :)
...
Рейтинг: 0 / 0
Undo в подчиненной форме
    #32324793
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По поводу "см. в-третьих":
Купить денег нету, а скачать инету... Уже было дело нащел даже эти исходники, но инет халявный кончился :(
...
Рейтинг: 0 / 0
Undo в подчиненной форме
    #32324804
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что непонятно? Как объект описать чтобы от него события ловить?
WithEvents Ф1
...
Рейтинг: 0 / 0
Undo в подчиненной форме
    #32324922
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему, когда запущена транзакция, не работает Me.Requery ?
Выдается ошибка: "Не удается найти поле Forms, указанное в выражении..."
...
Рейтинг: 0 / 0
Undo в подчиненной форме
    #32325346
Jura$$ic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Через транс
Все работает.
Если необходимо, скину mdb с примером.

ФОРМА

Код: 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.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
Private mwks As DAO.Workspace
Private mfInTrans As Boolean

Private Const adhcSource _
 As String =  "qrySubformTransactions" 

Private Sub Form_Unload(Cancel As Integer)

    'Предположим, что юзер захотел сохранить изменения,
    ' а не отменить их. Вы можете спросить его об этом
    ' здесь, использовав переменную mfInTrans.
    
    If mfInTrans Then
        mwks.CommitTrans
    End If
    Set mwks = Nothing
End Sub

Private Sub ResetData()
    Dim db As DAO.Database
    Dim qdf As DAO.QueryDef
    Dim rst As DAO.Recordset
    Dim prm As DAO.Parameter
    Dim strSource As String
        
    ' Отмена в подформе.
    
    ' Обратите внимание на намеренный недостаток обработки ошибок.
    ' Этот только пример.
    
    If mfInTrans Then
        mwks.CommitTrans
    End If
    
    Set mwks = DBEngine.CreateWorkspace( "mwks" ,  "Admin" , "")
    Set db = mwks.OpenDatabase(CurrentDb.Name)
    Set qdf = db.QueryDefs(adhcSource)
    
    For Each prm In qdf.Parameters
        prm.Value = Eval(prm.Name)
    Next prm
    
    Me.Painting = False
    Set rst = qdf.OpenRecordset
    rst.LockEdits = False
    Set subOrders.Form.Recordset = rst
    Me.Painting = True
    
    ' Начинаем новую транзакцию
    mwks.BeginTrans
    mfInTrans = True
    cmdRollbackSubform.Enabled = False
End Sub

Private Sub Form_Dirty(Cancel As Integer)
    cmdRollbackSubform.Enabled = True
End Sub

Private Sub cmdRollbackSubform_Click()
    Me.Undo
    If mfInTrans Then
        mwks.Rollback
        mfInTrans = False
        
        'передадим фокус на люб.контрол, т.к. эта кнопка блокируется
        txtFirstName.SetFocus
        Call ResetData
    End If
End Sub

Private Sub Form_Current()
    Call ResetData
End Sub



СУБформа


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
Private Sub Form_BeforeUpdate(Cancel As Integer)
    If IsSubForm(Me) Then
        If IsNull(Me.CustomerId) Then
            Me.CustomerId = Me.Parent.CustomerId
        End If
    End If
End Sub

Private Sub Form_Dirty(Cancel As Integer)
    If IsSubForm(Me) Then
        Me.Parent.cmdRollbackSubform.Enabled = True
    End If
End Sub

Private Function IsSubForm(frm As Form) As Boolean
    'Верно ли что, эта форма в настоящее время загруженном как субформа?
    'Проверим это через свойство Parent.
    Dim strName As String
    On Error Resume Next
    strName = frm.Parent.Name
    IsSubForm = (Err.Number =  0 )
    Err.Clear
End Function
...
Рейтинг: 0 / 0
Undo в подчиненной форме
    #32325479
OldPferd
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот пример из Гетца (Использование транзакций в связанных формах)

Код: 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.
Option Compare Database
Option Explicit

Private mfDirty As Boolean
Private mfPendingChanges As Boolean
Private mcnnMain As New ADODB.Connection
Private mrstCustomers As New ADODB.Recordset

Private Sub Form_AfterDelConfirm(Status As Integer)
    If Not mfPendingChanges Then
        mfPendingChanges = (Status = acDeleteOK)
    End If
End Sub

Private Sub Form_AfterUpdate()
    mfPendingChanges = True
End Sub

Private Sub Form_Delete(Cancel As Integer)
    If Not mfDirty Then
        mcnnMain.BeginTrans
        mfDirty = True
    End If
End Sub

Private Sub Form_Dirty(Cancel As Integer)
    If Not mfDirty Then
        mcnnMain.BeginTrans
        mfDirty = True
    End If
End Sub

Private Sub Form_Open(Cancel As Integer)
    mcnnMain.ConnectionString = CurrentProject.Connection
    mcnnMain.Open
    mrstCustomers.Open  "SELECT * FROM tblCustomer" , mcnnMain, adOpenKeyset, adLockOptimistic
    Set Me.Recordset = mrstCustomers
End Sub

Private Sub Form_Unload(Cancel As Integer)
    Dim intRet As Integer
    If mfPendingChanges Then
        intRet = MsgBox( "Commit all changes?" , vbYesNoCancel)
        If intRet = vbYes Then
            mcnnMain.CommitTrans
        ElseIf intRet = vbNo Then
            mcnnMain.RollbackTrans
        Else
            Cancel = True
        End If
    Else
        If mfDirty Then
            mcnnMain.RollbackTrans
        End If
    End If
    Set mrstCustomers = Nothing
    Set mcnnMain = Nothing
End Sub


Я как-то пробовал это, несколько усложнив (здесь для одной формы, а я делал для главной и подчиненной, отслеживая изменения и там, и там). В MA2000 все было нормально, но в МА2002 тот же код перестал работать (сделал новый adp 2002 и просто импортировал в него формы из adp 2000)
Может как-то и можно было добиться, но я день поковырялся и решил дальше не разбираться в очередных "приветах от Била", а сделал на временных таблицах.
Еще и потому, что возможность длинных по времени транзакций с клиента для сетевой работы как-то не очень хорошо

Мне, правда,. тогда не нужно было отслеживать остатки по табличной части, поэтому использовал просто #таблицу
Для решения подобной задачи с необходимостью подсчета остатков по товарам думаю использовать постоянные таблицы, где будет и идентификатор пользователя для фильтрации его записей. Это будет что-то типа Резервирования, которая должна участвовать в расчете остатков наравне с основными таблицами
А при сохранении документа - в одной транзакции переносить все в основые таблицы, и удалять из "временных"

PS Ну, если очень нужно - напиши, могу дать переписать CD из Гетца
...
Рейтинг: 0 / 0
Undo в подчиненной форме
    #32326538
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Jura$$ic
В этом примере Me.Undo работать не будет (в некоторых ситуациях)
...
Рейтинг: 0 / 0
Undo в подчиненной форме
    #32334405
Jura$$ic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Vsevolod V
Возможно. Но "некоторые случаи" зависят от частных случаев,
а точнее от того, что ещё в эти формы понапихано.
Хоть я далеко и не Дока, но уверенно могу сказать:
в "некоторых случаях" не работает абсолютно всё.
...
Рейтинг: 0 / 0
16 сообщений из 41, страница 2 из 2
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Undo в подчиненной форме
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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