powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / редактирование в гриде
13 сообщений из 13, страница 1 из 1
редактирование в гриде
    #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
редактирование в гриде
    #39041068
Фотография AngelOKES
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmitryKn, Приходит пока на ум только вариант, что указатель у вас не всегда на данной таблице, просто добавьте переход к таблице перед Replace и посмотрите как будет работать

Код: sql
1.
sele l_price



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



Ну по-крайней мере попробуйте, не факт конечно :)
...
Рейтинг: 0 / 0
редактирование в гриде
    #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
редактирование в гриде
    #39041170
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmitryKn,

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

То AngelOKES

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

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

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


То Dima T

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

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

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

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

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

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

грид на курсор завязан, т.е.view источник, в DE в этом свойстве для этого курсора можно только выбрать 1- use form setting
Тогда изучай что Дед Евгений написал. Ошибка связана с буферизацией, читай про нее.
...
Рейтинг: 0 / 0
редактирование в гриде
    #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
редактирование в гриде
    #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
редактирование в гриде
    #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
редактирование в гриде
    #39041990
Людмila
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в .Valid интересующей нас ячейки
IF NOT this.Value=OLDVAL('навание источника') &&произошли изменения
пишем в лог .......
ENDIF
...
Рейтинг: 0 / 0
редактирование в гриде
    #39042117
DmitryKn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Людмila,

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


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