Гость
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / редактирование в гриде / 13 сообщений из 13, страница 1 из 1
01.09.2015, 21:27
    #39040968
DmitryKn
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
редактирование в гриде
Добрый день всем.

Возник вопрос по вроде уже решенной ранее проблеме http://www.sql.ru/forum/1170250-2/redaktirovanie-v-grid

Суть:
редактирую данные в гриде, при этом хочу получить возможность создавать что-то вроде лога - кто, что и когда.

С этой целью, с помощью уважаемых мемберов, в события был добавлен следующий код

в AfterRowColChange:
Код: sql
1.
2.
3.
4.
5.
6.
LPARAMETERS nColIndex
local loObj


	loObj=EVALUATE("This.Columns(nColIndex)."+This.Columns(nColIndex).CurrentControl)
	ThisForm.MyVar = loObj.Value



в BeforeRowColChange:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
LPARAMETERS nColIndex
local loObj
loObj=EVALUATE("This.Columns(nColIndex)."+This.Columns(nColIndex).CurrentControl)


IF thisform.isedit AND !thisform.isnew
	IF ThisForm.MyVar != loObj.Value
		*есть изменения
		REPLACE daregdate WITH Date() IN l_price
		REPLACE mreglog WITH gcLastName + ' ' + this.columns(ncolIndex).Header1.Caption + ' ' + DTOC(DATE()) + ' '+TIME()+' ;' + CHR(13) ADDITIVE IN l_price
	ENDIF
	
ENDIF 



Все вроде ничего, начал наполнять данными - вылезла такая штука - останавливает на выполнении
Код: sql
1.
REPLACE daregdate WITH Date() IN l_price



и выдает сообщение:

"Cursor cannot be modified because it contains an unsaved record"

Причем возникает это не на регулярной основе, а как-то произвольно. Методом шаманских танцев выявил, что когда указатель пробегает по строке и останавливается на одном определенном поле, не связанном ничем с редактируемыми, сбой не происходит и все сохраняет корректно. Если "пробежать" по строке полностью или дважды или просто встать на поле рядом - ошибка. И, при этом, всё это еще и не в каждой строке происходит.

Можно отказаться, конечно, от этого лога, это не смертельно, без него все работает, как часы, но тогда человечество так и не узнает причин этих событий )

Прошу совета.
...
Рейтинг: 0 / 0
02.09.2015, 06:37
    #39041068
AngelOKES
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
редактирование в гриде
DmitryKn, Приходит пока на ум только вариант, что указатель у вас не всегда на данной таблице, просто добавьте переход к таблице перед Replace и посмотрите как будет работать

Код: sql
1.
sele l_price



и тогда из кода можно убрать
Код: sql
1.
 IN l_price



Ну по-крайней мере попробуйте, не факт конечно :)
...
Рейтинг: 0 / 0
02.09.2015, 09:59
    #39041161
Дед Евгений
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
редактирование в гриде
Поделюсь своей разработкой. В Гриде, в поле Text, по InteractiveChange у меня прописана команда
Thisform.KontrolEdit(This.Value,This.ControlSource)
Так как у нас грид или курсор буферизированы, то в функции проверяется совпадения данных в буфере и в таблице. Если данные не совпали, значит внесены изменения, а там уже прописываем код обработки. У меня становиться асктивной кнопка записи. Можно и другое сочинить. Вот сама функция контоля:
PARAMETERS BaseKontrol, EditKontrol
WITH Thisform
IF EVALUATE(EditKontrol) # BaseKontrol
.Command2.Enabled = .T.
.Command3.Enabled = .T.
= TABLEUPDATE(.F.,.F.,"LoadVery")
.ComSave.Enabled = .T.
ENDIF
ENDWITH
Может кому прригоится этот способ, по нему можно вести и журнал изменений.
...
Рейтинг: 0 / 0
02.09.2015, 10:07
    #39041170
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
редактирование в гриде
DmitryKn,

попробуй буфферизацию отключить. Если таблица автоматом открывается (добавлена в DE формы), то там автоматом буферизация включается. Свойство "BufferModeOverride" поставь 0.
...
Рейтинг: 0 / 0
02.09.2015, 13:46
    #39041473
DmitryKn
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
редактирование в гриде
Здравствуйте всем,

То AngelOKES

так ведь грид привязан к таблице и действие в строке происходит. Но я честно попробовал - не помогло.

То Дед Евгений

углубляюсь в изучение, спасибо )


То Dima T

грид на курсор завязан, т.е.view источник, в DE в этом свойстве для этого курсора можно только выбрать 1- use form setting
...
Рейтинг: 0 / 0
02.09.2015, 13:48
    #39041479
DmitryKn
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
редактирование в гриде
Dima TDmitryKn,

попробуй буфферизацию отключить. Если таблица автоматом открывается (добавлена в DE формы), то там автоматом буферизация включается. Свойство "BufferModeOverride" поставь 0.

разве что в самом методе BeforeRowColChange выключить-включить?
...
Рейтинг: 0 / 0
02.09.2015, 13:54
    #39041488
DmitryKn
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
редактирование в гриде
DmitryKnDima TDmitryKn,

попробуй буфферизацию отключить. Если таблица автоматом открывается (добавлена в DE формы), то там автоматом буферизация включается. Свойство "BufferModeOverride" поставь 0.

разве что в самом методе BeforeRowColChange выключить-включить?

не, это глупости
...
Рейтинг: 0 / 0
02.09.2015, 13:56
    #39041493
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
редактирование в гриде
DmitryKnТо Dima T

грид на курсор завязан, т.е.view источник, в DE в этом свойстве для этого курсора можно только выбрать 1- use form setting
Тогда изучай что Дед Евгений написал. Ошибка связана с буферизацией, читай про нее.
...
Рейтинг: 0 / 0
02.09.2015, 20:28
    #39041900
DmitryKn
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
редактирование в гриде
Дед ЕвгенийПоделюсь своей разработкой. В Гриде, в поле Text, по InteractiveChange у меня прописана команда
Thisform.KontrolEdit(This.Value,This.ControlSource)
Так как у нас грид или курсор буферизированы, то в функции проверяется совпадения данных в буфере и в таблице. Если данные не совпали, значит внесены изменения, а там уже прописываем код обработки. У меня становиться асктивной кнопка записи. Можно и другое сочинить. Вот сама функция контоля:
PARAMETERS BaseKontrol, EditKontrol
WITH Thisform
IF EVALUATE(EditKontrol) # BaseKontrol
.Command2.Enabled = .T.
.Command3.Enabled = .T.
= TABLEUPDATE(.F.,.F.,"LoadVery")
.ComSave.Enabled = .T.
ENDIF
ENDWITH
Может кому прригоится этот способ, по нему можно вести и журнал изменений.

Если я что-нибудь понял, то получается, что сброс буфера происходит при каждом нажатии клавиши, например, если вводим 1000 - то 4 раза, на каждый символ. При этом окончательное сравнение с исходным значение уже когда произошло событие valid.

Параметры функции, это значения после и до ввода. Их как-то где-то определить надо или они из Thisform.KontrolEdit(This.Value,This.ControlSource) подтянуться?
...
Рейтинг: 0 / 0
02.09.2015, 20:41
    #39041908
DmitryKn
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
редактирование в гриде
Дед ЕвгенийПоделюсь своей разработкой. В Гриде, в поле Text, по InteractiveChange у меня прописана команда
Thisform.KontrolEdit(This.Value,This.ControlSource)
Так как у нас грид или курсор буферизированы, то в функции проверяется совпадения данных в буфере и в таблице. Если данные не совпали, значит внесены изменения, а там уже прописываем код обработки. У меня становиться асктивной кнопка записи. Можно и другое сочинить. Вот сама функция контоля:
PARAMETERS BaseKontrol, EditKontrol
WITH Thisform
IF EVALUATE(EditKontrol) # BaseKontrol
.Command2.Enabled = .T.
.Command3.Enabled = .T.
= TABLEUPDATE(.F.,.F.,"LoadVery")
.ComSave.Enabled = .T.
ENDIF
ENDWITH
Может кому прригоится этот способ, по нему можно вести и журнал изменений.

В принципе, в моем случае так же определение совпадения производится, проблема с тем, что потом.

Свой код
Код: sql
1.
2.
REPLACE daregdate WITH Date() IN l_price
REPLACE mreglog WITH gcLastName + ' ' + this.columns(ncolIndex).Header1.Caption + ' ' + DTOC(DATE()) + ' '+TIME()+' ;' + CHR(13) ; ADDITIVE IN l_price



по идее я могу вставить вместо в твой пример вместо кода активации кнопки save, но как это поможет с моей проблемой с буферизацией? Я попробовал вставить tableupdate в свой код так:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
LPARAMETERS nColIndex
local loObj
loObj=EVALUATE("This.Columns(nColIndex)."+This.Columns(nColIndex).CurrentControl)


IF thisform.isedit AND !thisform.isnew
	IF ThisForm.MyVar != loObj.Value
		*есть изменения
        =tableupdate(.t.)
		REPLACE daregdate WITH Date() IN l_price
		REPLACE mreglog WITH gcLastName + ' ' + this.columns(ncolIndex).Header1.Caption + ' ' + DTOC(DATE()) ;
                + ' '+TIME()+' ;'  + CHR(13) ADDITIVE IN l_price
	ENDIF
	
ENDIF 



Полагая, что вот, сбросил буфер и курсор может быть изменен, да только ничего не получилось. Варианты написания tableupdate перепробовал все, ну так чтоб уж на всякий случай.

Вот интуитивно ощущаю, что где-то совсем рядом решение, а ухватить не могу.
...
Рейтинг: 0 / 0
02.09.2015, 21:19
    #39041924
DmitryKn
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
редактирование в гриде
Пока вот нашел такой вариант решения

код в beforeRowColChange

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
LPARAMETERS nColIndex
local loObj , lmlog , lmoldlog
loObj=EVALUATE("This.Columns(nColIndex)."+This.Columns(nColIndex).CurrentControl)


IF thisform.isedit AND !thisform.isnew

	IF nColIndex != 1 AND nColIndex != 2 AND nColIndex != 3 AND nColIndex != 7 AND nColIndex != 8 AND nColIndex != 10 AND nColIndex != 12 ;
	AND nColIndex != 13

		IF ThisForm.MyVar != loObj.Value
		*есть изменения
		
			thisform.rlog = CHR(13) + gcLastName + ' ' + this.columns(ncolIndex).Header1.Caption + ' ' + DTOC(DATE()) ;
                         + ' '+TIME()+' ;'
			thisform.reglog()
			
		ENDIF
	ENDIF
	
ENDIF 



Мой метод формы rlog

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
LOCAL ldreg, lmlog

ldreg=DATE()
lmlog=thisform.rlog

SELECT l_price

thisform.grdPrice.column12.text1.Value=ldreg
thisform.grdPrice.column13.text1.Value=lmlog+l_price.mreglog

RELEASE ldreg, lmlog




Пока, вроде, работает. Может дайте какой-нить комментарий - можно мне жить и не умереть со стыда с таким решением, или искать другое?
...
Рейтинг: 0 / 0
03.09.2015, 04:18
    #39041990
Людмila
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
редактирование в гриде
в .Valid интересующей нас ячейки
IF NOT this.Value=OLDVAL('навание источника') &&произошли изменения
пишем в лог .......
ENDIF
...
Рейтинг: 0 / 0
03.09.2015, 10:24
    #39042117
DmitryKn
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
редактирование в гриде
Людмila,

Отлично, простое и красивое решение )
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / редактирование в гриде / 13 сообщений из 13, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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