powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Undo в подчиненной форме
41 сообщений из 41, показаны все 2 страниц
Undo в подчиненной форме
    #32319438
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Случайно наткнулся на жестокий баг в своей программе :(
На форме кнопка "Отмена" (Me.Undo) не отменяет изменения в подчиненной форме.
Пробовал добавить Me!SubForm.Form.Undo результат тот же :(
...
Рейтинг: 0 / 0
Undo в подчиненной форме
    #32319443
igor603
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно попробовать Forms!Customers!AmountPaid.OldValue
...
Рейтинг: 0 / 0
Undo в подчиненной форме
    #32319444
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тобишь цикл по всем контролам?!
Я надеюсь есть более простые пути :)
...
Рейтинг: 0 / 0
Undo в подчиненной форме
    #32319452
Фотография Geo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Когда входишь в подчиненную форму - автоматом сохраняется (если она есть) запись главной. Когда выходишь из подчиненной формы в главную - сохраняется (опять же, если есть) запись подчиненной. А унду работает только до сохранения.
...
Рейтинг: 0 / 0
Undo в подчиненной форме
    #32319453
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То есть заморачиваться с oldvalue?
...
Рейтинг: 0 / 0
Undo в подчиненной форме
    #32319517
igor603
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще есть пример у Гетца в 1 томе через транзакции.
...
Рейтинг: 0 / 0
Undo в подчиненной форме
    #32320633
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробовал сделать так:
Код: plaintext
1.
2.
3.
4.
5.
6.
Dim c As Control
    
    For Each c In Me.Controls
        If c.ControlType = acTextBox Or c.ControlType = acComboBox Then
            c.Value = c.OldValue
        End If
    Next


Ошибка: "Операция не поддерживается для объектов этого типа"
...
Рейтинг: 0 / 0
Undo в подчиненной форме
    #32320638
Фотография Владимир Саныч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Всеволод, на чем кричит-то?
...
Рейтинг: 0 / 0
Undo в подчиненной форме
    #32320851
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ошибка: "Операция не поддерживается для объектов этого типа"
На форме было поле, в котором было включено свойство "Блокировка".

======
OldValue тоже не помогает - оно работает также как и Undo :(
...
Рейтинг: 0 / 0
Undo в подчиненной форме
    #32320857
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В этом случае можно создавать массив старых и новых значений, но что-то это меня сильно пугает :) Должны же быть более простые выходы! Или никто с этим не сталкивался? :)
...
Рейтинг: 0 / 0
Undo в подчиненной форме
    #32320986
Фотография Senin Viktor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Самый простой способ и об нем уже писали - транзакции. Все остальное - от лукавого (особенно массив - попробуй без ошибок отследить удаленные, добавленные записи. Да если даже и отследишь - окажется придумал собственную реализацию тразакций - а нифига, если они уже есть и ими просто пользоваться?)
...
Рейтинг: 0 / 0
Undo в подчиненной форме
    #32321106
incold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насколько мне известно способов реализации такой проблемы несколько и они уже обсуждались, только немного с другой стороны.\r
Это называется многострочный документ, т.е. есть заголовок документа и по нему строки, сохранять или отменять нужно весь документ целиком.\r
\r
Решения (в зависимости от постановки задачи и условий у каждого свои "+" и "-"):\r
- главная и подчиненная форма открываются в одной транзакции (уже сказали - пример у Гетца)\r
- использование временных таблиц для записей подчиненной формы\r
- использование флага в документе (ввод закончен или нет) - во всех отчетах и выборках используются только завершенные документы, отдельный журнал по незавершенным.\r
\r
Обсуждалось здесь
...
Рейтинг: 0 / 0
Undo в подчиненной форме
    #32321942
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пример у Гетца
Нету его у меня :(
...
Рейтинг: 0 / 0
Undo в подчиненной форме
    #32321970
incold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пример у Гетца


Хоть он (Гетц) есть у многих, но я не помню, чтобы на этом форуме кто-нибудь сказал, что сделал эту штуку и сказал, что она у него реально работает.

Лучше спросить/попросить не пример из Гетца, а пример (если такой есть) из рабочей программы. У меня такого нет.
...
Рейтинг: 0 / 0
Undo в подчиненной форме
    #32321974
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
incold
ОК :)
--------

ДАЙТЕ, ПОЖАЛУЙСТА, ПРИМЕР ИЗ РАБОЧЕЙ ПРОГРАММЫ :)
...
Рейтинг: 0 / 0
Undo в подчиненной форме
    #32321986
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Товарищи гиганты мысли, неужели никто не делает кнопочку "Отмена" на своих формах???
...
Рейтинг: 0 / 0
Undo в подчиненной форме
    #32322003
zz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну я делаю... Но я предварительно копирую запись в резерв, а если жмется отмена - то достаю из резерва... Вот так вот по рабоче-крестьянски...
...
Рейтинг: 0 / 0
Undo в подчиненной форме
    #32322012
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 zz
У тебя что, база однопользовательская? Или как?
Пользователь начал править строки документа (в общих данных), а другой пользователь преспокойненько видит все незавершенные изменения, сам что-нибудь может подправить... Причем первый пользователь жмет отмену и все изменения второго идут лесом...
...
Рейтинг: 0 / 0
Undo в подчиненной форме
    #32322013
zz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня - однопользовательская :))
...
Рейтинг: 0 / 0
Undo в подчиненной форме
    #32322029
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лох Позорный
предложи что-нибудь, пожалуйста
...
Рейтинг: 0 / 0
Undo в подчиненной форме
    #32322213
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так тут же уже предлогалось про транзакции....
поищи, не ленись
довольно подробно описывалось..
...
Рейтинг: 0 / 0
Undo в подчиненной форме
    #32323794
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попытался разобраться в транзакциях. Вот что получилось :)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Dim W As DAO.Workspace
    Dim R As DAO.Recordset
    Dim R2 As DAO.Recordset


Private Sub Form_Dirty(Cancel As Integer)
On Error Resume Next
Set W = DBEngine.Workspaces( 0 )
    Set R = CurrentDb.OpenRecordset( "select * from calc" )
    Set R2 = CurrentDb.OpenRecordset( "select * from cash" )
    
    Set Me.Recordset = R
    Set Me!f2.Form.Recordset = R2
    
    W.BeginTrans

End Sub

Private Sub Btn1_Click()
    W.Rollback
End Sub

Что здесь неправильно?
...
Рейтинг: 0 / 0
Undo в подчиненной форме
    #32323798
Фотография Axeleron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А откомпилировалось это? И нормально?
...
Рейтинг: 0 / 0
Undo в подчиненной форме
    #32324630
Фотография Vsevolod V
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А откомпилировалось это? И нормально?
То есть код составлен правильно?
-----

Работает мягко говоря через жопу. :(
Например, начинаю редактировать какое-либо из полей главной формы и сразу же это поле отчищается, т.е. мне нужно изменить строку, а в итоге я ввожу новую
...
Рейтинг: 0 / 0
Undo в подчиненной форме
    #32324639
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да ни хрена не правильно
ты на открытии формы рекордсеты присваивай. а на Dirty только транзакцию начинай.
это раз.
...
Рейтинг: 0 / 0
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
41 сообщений из 41, показаны все 2 страниц
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Undo в подчиненной форме
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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