Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как отследить изменения в Grid / 7 сообщений из 7, страница 1 из 1
01.09.2004, 13:12
    #32675231
Sas_N
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отследить изменения в Grid
Доброго времени суток!
Подскажите уважаемые : Имеется форма с Gridом в котором интегрирован CheckBox, Grid построен на основе курсора созданного Selectом с опцией readwrite, используется табличная буферизация для курсора CURSORSETPROP("Buffering", 5, "имя курсора"), очень бы хотелось сделать доступной кнопку "Запись" на форме только в том случае, когда произошли изменения в Gridе
Пробовал отловить в InterActiveChange CheckBoxа - не получается значения oldval() и curval() совпадают - может кто подскажет куда надоть плыть - чтобы получить искомый эффект?
Заранее благодарен
...
Рейтинг: 0 / 0
01.09.2004, 14:06
    #32675409
sar99
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отследить изменения в Grid
ДОБРЫЙ ДЕНЬ!
ПРИ ОПТИМИСТИЧЕСКОЙ БУФЕРИЗАЦИИ ОПРЕДЕЛИТЬ -
ИЗМЕНИЛ ЛИ ДРУГОЙ ПОЛЬЗОВАТЕЛЬ ЗАПИСЬ МОЖНО ТОЛЬКО
СДЕЛАВ ЭТУ ПОПЫТКУ САМОМУ. ТОГДА VVV=TABLEUPDATE()
И ЕСЛИ VVV=.T. - НЕ БЫЛО ИЗМЕНЕНИЙ , ИНАЧЕ
КТО-ТО ОБНОВИЛ ЗАПИСЬ РАНЬШЕ ВАС.

В ЭТОМ СЛУЧАЕ ПОПЫТКА СИГНАЛИЗИРОВАТЬ ПОЛЬЗОВАТЕЛЮ
ДОСТУПНОСТЬЮ КНОПКИ НЕ ПРОХОДИТ.
...
Рейтинг: 0 / 0
01.09.2004, 14:08
    #32675413
sar99
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отследить изменения в Grid
ДОБРЫЙ ДЕНЬ!
ПРИ ОПТИМИСТИЧЕСКОЙ БУФЕРИЗАЦИИ ОПРЕДЕЛИТЬ -
ИЗМЕНИЛ ЛИ ДРУГОЙ ПОЛЬЗОВАТЕЛЬ ЗАПИСЬ МОЖНО ТОЛЬКО
СДЕЛАВ ЭТУ ПОПЫТКУ САМОМУ. ТОГДА VVV=TABLEUPDATE()
И ЕСЛИ VVV=.T. - НЕ БЫЛО ИЗМЕНЕНИЙ , ИНАЧЕ
КТО-ТО ОБНОВИЛ ЗАПИСЬ РАНЬШЕ ВАС.

В ЭТОМ СЛУЧАЕ ПОПЫТКА СИГНАЛИЗИРОВАТЬ ПОЛЬЗОВАТЕЛЮ
ДОСТУПНОСТЬЮ КНОПКИ НЕ ПРОХОДИТ.
...
Рейтинг: 0 / 0
01.09.2004, 14:23
    #32675458
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отследить изменения в Grid
Тебе надо сравнивать значение в таблице и значение в буфере:

OldVal() - это значение, которое было до того, как ты начал вносить изменения в буфер первый раз
CurVal() - это текущее значение в таблице. Имеет смысл использовать для проверки факта изменения той же записи другим пользователем. Но для курсора - это бессмысленно, поскольку курсор всегда создается на стороне клиента и другой пользователь его просто не видит

Чтобы прочитать значение в буфере, надо просто считать значение поля. Это собственно и будет содержимое буфера. Т.е. надо сравнивать

OldVal("MyTab.MyField")=MyTab.MyField

Еще почитай описание функций

GetFldState()
GetNextModified()
...
Рейтинг: 0 / 0
01.09.2004, 16:40
    #32675888
Sas_N
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отследить изменения в Grid
Благодарю за опреративные ответы
И опыт сын ошибок трудных ......
попытаюсь проанализировать и разобраться в предложенных решениях
...
Рейтинг: 0 / 0
02.09.2004, 13:16
    #32677364
Sas_N
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отследить изменения в Grid
Доброго времени суток!
Повесил код в InteractiveChange для CheckBoxa:
FOR nFieldNum = 1 TO FCOUNT("limit_cur")
IF GETFLDSTATE(nFieldNum,"limit_cur") =2
oform1.cmdCmndwr1.Enabled=.t.
oform1.cmdCmndwr1.Refresh()
EXIT
ENDIF
ENDFOR

Срабатывает на второй раз - хотя в отладчике все нормально срабатывает,
видимо проблема связана с передачей данных из интегрированного Checka в Grid, сделал сброс RecordSourse для Grid перед этой проверкой

oform1.Grid3.RecordSource=""
oform1.Grid3.RecordSource="limit_cur"

стало нормально - но .... Grid сдвигается вверх до той строки в которой были изменения
Может подскажет кто-нить - как это вылечить?
Заранее благодарен
...
Рейтинг: 0 / 0
02.09.2004, 15:35
    #32677806
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как отследить изменения в Grid
Проблема в том, что InteractiveChange срабатывает при изменении содержимого объекта . Но в этот момент содержимое собственно полей таблицы-источника еще не изменилось!

С другой стороны, я не совсем понимаю, зачем тебе проверять факт изменения содержимого? Ведь если сработало событие InteractiveChange, то это уже предполагает, что были внесены изменения. Ну и обновляй объекты сразу, без дополнительной проверки. При этом значение CheckBox.Value внутри InteractiveChange - это уже новое (измененное) значение

PS: Если в качестве порядкового номера поля для функции GetFldState() поставить "-1", то будет возвращена символьная строка со статусами всех полей. Причем первым будет идти статус Deleted(). Как следствие, если необходимо проверить было ли хоть какое-то изменение в любом поле текущей записи это можно сделать так:

IF LEN(CharTran(GetFldState(-1,"MyTab"),"1",""))>0
* была модификация
ENDIF
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как отследить изменения в Grid / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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