Проверка на наличие изменений

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Лексей
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 121
Зарегистрирован: 03.08.2004 (Вт) 6:50
Откуда: Екатеринбург

Проверка на наличие изменений

Сообщение Лексей » 30.05.2006 (Вт) 6:53

Доброе время суток!
Посоветуйте? плиз!
Есть форма VB с txt полями, данными при открытии заполняется из рекордсета (который потом закрывается), пользователь чего то изменяет (или просто любуется на данные), а потом кликает Ок
Как лучше, оптимальнее и правильнее организовать проверку вносились ли изменения для дальнейшего сохранения в БД, если>>
1 - пофигу какие поля изменялись
2 - необходимо знать данные каких полей измнялись
3 - а не идентичны ли изменения открытым данным (сначала изменили? потом стерли и внесли то же самое)????
Благодарен всем за участие!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 30.05.2006 (Вт) 7:13

Поля привязаны к источнику данных или заполняются вручную?
Lasciate ogni speranza, voi ch'entrate.

Nicky
Постоялец
Постоялец
 
Сообщения: 519
Зарегистрирован: 12.08.2004 (Чт) 12:14

Сообщение Nicky » 30.05.2006 (Вт) 7:19

2 alibek:
Лексей писал(а):...заполняется из рекордсета (который потом закрывается)...

2 Лексей: 1

Лексей
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 121
Зарегистрирован: 03.08.2004 (Вт) 6:50
Откуда: Екатеринбург

Сообщение Лексей » 30.05.2006 (Вт) 7:20

не привязаны, при открытии заполняются данными из рекордсета (который потом закрывается - есть ли смысл держать его открытым при мнеогопользовательской работе?), при сохранении данных - обратно в рекордсет

Лексей
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 121
Зарегистрирован: 03.08.2004 (Вт) 6:50
Откуда: Екатеринбург

Сообщение Лексей » 30.05.2006 (Вт) 7:21

примеч - в вопросе 1,2,3 - варианты прроверок (если они м/б различные) для этих условий

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 30.05.2006 (Вт) 7:57

Ну раз не привязаны, то готовыми средствами ты этого учитывать не сможешь. Учитывай сам, например проставляя метку в свойстве Tag.
Lasciate ogni speranza, voi ch'entrate.

Лексей
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 121
Зарегистрирован: 03.08.2004 (Вт) 6:50
Откуда: Екатеринбург

Сообщение Лексей » 30.05.2006 (Вт) 7:59

Хорошо, а если привяжу?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 30.05.2006 (Вт) 9:06

Тогда свойство DataChanged.
Lasciate ogni speranza, voi ch'entrate.

Лексей
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 121
Зарегистрирован: 03.08.2004 (Вт) 6:50
Откуда: Екатеринбург

Сообщение Лексей » 30.05.2006 (Вт) 9:14

Тогда несколько иной вопрос -
оптимальней ли несвязанные формы (рекордсеты живут только в моменты заполнения данными форм и сохранения измененнных данных) при работе в многопользовательском режиме (в плане доступа к данным, снижения объема хранимой оперативной памяти и загрузки трафика)?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 30.05.2006 (Вт) 9:25

Оптимальней, но неудобней.
Используй связанные контролы и пакетное обновление.
Lasciate ogni speranza, voi ch'entrate.

Лексей
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 121
Зарегистрирован: 03.08.2004 (Вт) 6:50
Откуда: Екатеринбург

Сообщение Лексей » 30.05.2006 (Вт) 9:34

пакетное обновление - это что? Можно малость разьяснить? спасибо

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 30.05.2006 (Вт) 10:37

Пакетное обновление - обновление отвязанного рекордсета. Как получить такой рекордсет:
Код: Выделить всё
Dim cn as New ADODB.Connection
Dim rs as New ADODB.Recordset
cn.CursorLocation = adUseClient
cn.Open
rs.Open "select ...", cn, adOpenStatic, adLockBatchOptimistic
Set rs.ActiveConnection = Nothing
'рекордсет уходит клиенту
'изменяются значения, добавляются и удаляются записи

'пакетное  обновление сразу всех сделанных изменений
Set rs.ActiveConnection = cn
rs.Updatebatch

Если на момент обновления данные в базе были изменены другим клиентом, выскочит соответствующая ошибка. В этом случае можно сделать rs.Resync и опять UpdateBatch.
Лучший способ понять что-то самому — объяснить это другому.

Лексей
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 121
Зарегистрирован: 03.08.2004 (Вт) 6:50
Откуда: Екатеринбург

Сообщение Лексей » 30.05.2006 (Вт) 10:44

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

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 30.05.2006 (Вт) 12:43

Я прав?
Абсолютно. Непонятно только что значит это: "пользуемся стандартными средствами проверки изменений". :roll:
А какой код ошибки возвратиться?
-2147217864
Лучший способ понять что-то самому — объяснить это другому.

Лексей
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 121
Зарегистрирован: 03.08.2004 (Вт) 6:50
Откуда: Екатеринбург

Сообщение Лексей » 30.05.2006 (Вт) 13:01

DataChanged

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 30.05.2006 (Вт) 13:45

Сомнительный способ. Я пользуюсь таким:
Код: Выделить всё
Public Function IsDataSetChanged(rc() As Long, ParamArray rs()) As Boolean
Dim x As Integer
Dim rrs As ADODB.Recordset
    For x = 0 To UBound(rs)
        Set rrs = rs(x)
        If IsRecordsetChanged(rrs) Or rrs.RecordCount <> rc(x) Then
            IsDataSetChanged = True
            Exit Function
        End If
    Next x
End Function

Public Function IsRecordsetChanged(rs As ADODB.Recordset) As Boolean
Dim rrs As ADODB.Recordset
    Set rrs = rs.Clone
    While Not rrs.EOF
        If IsRecordChanged(rrs) Then
            IsRecordsetChanged = True
            Exit Function
        End If
        rrs.MoveNext
    Wend
End Function

Public Function IsRecordChanged(rs As ADODB.Recordset) As Boolean
Dim x As Integer
    For x = 0 To rs.Fields.Count - 1
        If rs(x).Value <> rs(x).UnderlyingValue Or IsNull(rs(x).UnderlyingValue) And Not IsNull(rs(x).Value) Then
            IsRecordChanged = True
            Exit Function
        End If
    Next x
End FunctionМассив
rc() содержит значения RecordCount соответствующих рекордсетов rs() и заполняется при открытии рекордсетов.
Лучший способ понять что-то самому — объяснить это другому.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot, SemrushBot и гости: 131

    TopList