Остлеживание изменений

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

Остлеживание изменений

Сообщение pstrkim » 10.02.2007 (Сб) 21:58

Как сделать, чтобы в многопользовательской среде в форме автоматически отслеживались чужие изменения без вызова метода Refresh и повторного открытия формы? Я установил для набора записей ADO LockType = adLockOptimistic, CursorType = adOpenDynamic и все равно чужие изменения не становятся видимыми.

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 10.02.2007 (Сб) 22:23

Никак.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 11.02.2007 (Вс) 5:00

Ennor писал(а):Никак.


Я бы не был так категоричен.

Берем, к примеру, Janus GridEx

Коннектим его к SQL-серверу (или MDB-шке) с опциями jgexRSADOStatic и adUseServer, подключаем к нужной табличке.

Далее кидаем на форму таймер с интервалом 100 и в его событии прописываем:

Код: Выделить всё
Private Sub Timer1_Timer()
    With GridEX1
        .Refresh
        If .Row > 0 And .EditMode = jgexEditModeOff Then .RefreshRowIndex .RowIndex(.Row)
    End With
End Sub


Замечу что Refresh в данном контексте не означает дополнительного запроса к базе данных, а лишь обновляет Grid в соответствии с актуальными значениями Recordset-a (на экране никаких дерганий при этом не заметил). Удаленные записи помечаются ####.

Только вот вновь добавленных записей не видно - тут уже надо более серьезно дернуть Recordset/Grid, а это практически поставит крест на редактировании в нем...

Вывод - мечта новичков вполне реализуема.
А насколько это надо - другой вопрос...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

pstrkim
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 03.01.2007 (Ср) 23:53

Сообщение pstrkim » 11.02.2007 (Вс) 18:12

Спасибо! В общем про таймер я тоже думал, правда непонятно тогда назначение свойства CursorType, предназначенное якобы для отслеживания изменений, получается никакой разницы между значениями Dynamic и Static нет

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 11.02.2007 (Вс) 18:41

Andrey Fedorov
В оригинале было "без вызова метода Refresh". Я понимаю, что ты обновляешь грид, а не рекордсет, но ведь последний у него, судя по всему, где-то внутри, его собственный. И с какими параметрами он цепляется к серверу? И как он залочит таблицу, когда начнет шевелиться? А когда 10 экземпляров, таких же как он, начнут одновременно шевелиться? Насколько он управляем, вообще?..

Так что твое решение скорее не подходит :).

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 11.02.2007 (Вс) 21:41

Ennor писал(а):Andrey Fedorov
В оригинале было "без вызова метода Refresh". Я понимаю, что ты обновляешь грид, а не рекордсет


Ну метод Refresh можно по разному понимать. Можно ведь самостоятельно дергать Recordset - т.е рефрешить его...

Ennor писал(а):, но ведь последний у него, судя по всему, где-то внутри, его собственный. И с какими параметрами он цепляется к серверу?


Думаешь они там велосипед изобретали? Открой обычный Recordset с теми параметрами что я сказал в своем первом письме и отследи его изменения. Ну хотя бы так:

Код: Выделить всё
Public Sub Main()
    Dim r As New ADODB.Recordset, cn As New ADODB.Connection

    cn.CursorLocation = adUseServer
    cn.Open "Provider=SQLOLEDB.1;Integrated Security=SSPI;Initial Catalog=Test"
   
    r.Open "SELECT * FROM Table_1", cn, adOpenStatic, adLockOptimistic
   
    Do
        Do Until r.EOF
            DoEvents
            Debug.Print r(0), r(1)
            r.MoveNext
        Loop
        If r.RecordCount Then r.MoveFirst
    Loop
End Sub


Ennor писал(а):И как он залочит таблицу, когда начнет шевелиться? А когда 10 экземпляров, таких же как он, начнут одновременно шевелиться? Насколько он управляем, вообще?..
Так что твое решение скорее не подходит :).


Можешь попробовать.

Насчет целесообразности - это совсем другой разговор - я же сразу сказал что данный случай это "мечта начинающих". Но это совсем не означает невозможность в принципе.
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 11.02.2007 (Вс) 21:44

pstrkim писал(а):Спасибо! В общем про таймер я тоже думал, правда непонятно тогда назначение свойства CursorType, предназначенное якобы для отслеживания изменений, получается никакой разницы между значениями Dynamic и Static нет


В данном случае большую роль играет то что курсор серверный.
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

pstrkim
Новичок
Новичок
 
Сообщения: 30
Зарегистрирован: 03.01.2007 (Ср) 23:53

Сообщение pstrkim » 12.02.2007 (Пн) 14:56

В данном случае (БД Access) получается что не играет роли. В любом случае стоит ли курсор - adUseClient или adUseServer нужно сначала обновить recordset а затем заново присоединить к нему DataGrid.

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

Сообщение alibek » 12.02.2007 (Пн) 16:32

Вообще-то, играет. Даже для Access.
Lasciate ogni speranza, voi ch'entrate.


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

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

Сейчас этот форум просматривают: Google-бот, Yandex-бот и гости: 104

    TopList