|
редактирование в гриде
|
|||
---|---|---|---|
#18+
Добрый день всем. Возник вопрос по вроде уже решенной ранее проблеме http://www.sql.ru/forum/1170250-2/redaktirovanie-v-grid Суть: редактирую данные в гриде, при этом хочу получить возможность создавать что-то вроде лога - кто, что и когда. С этой целью, с помощью уважаемых мемберов, в события был добавлен следующий код в AfterRowColChange: Код: sql 1. 2. 3. 4. 5. 6.
в BeforeRowColChange: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Все вроде ничего, начал наполнять данными - вылезла такая штука - останавливает на выполнении Код: sql 1.
и выдает сообщение: "Cursor cannot be modified because it contains an unsaved record" Причем возникает это не на регулярной основе, а как-то произвольно. Методом шаманских танцев выявил, что когда указатель пробегает по строке и останавливается на одном определенном поле, не связанном ничем с редактируемыми, сбой не происходит и все сохраняет корректно. Если "пробежать" по строке полностью или дважды или просто встать на поле рядом - ошибка. И, при этом, всё это еще и не в каждой строке происходит. Можно отказаться, конечно, от этого лога, это не смертельно, без него все работает, как часы, но тогда человечество так и не узнает причин этих событий ) Прошу совета. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.09.2015, 21:27 |
|
редактирование в гриде
|
|||
---|---|---|---|
#18+
DmitryKn, Приходит пока на ум только вариант, что указатель у вас не всегда на данной таблице, просто добавьте переход к таблице перед Replace и посмотрите как будет работать Код: sql 1.
и тогда из кода можно убрать Код: sql 1.
Ну по-крайней мере попробуйте, не факт конечно :) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2015, 06:37 |
|
редактирование в гриде
|
|||
---|---|---|---|
#18+
Поделюсь своей разработкой. В Гриде, в поле 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 Может кому прригоится этот способ, по нему можно вести и журнал изменений. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2015, 09:59 |
|
редактирование в гриде
|
|||
---|---|---|---|
#18+
DmitryKn, попробуй буфферизацию отключить. Если таблица автоматом открывается (добавлена в DE формы), то там автоматом буферизация включается. Свойство "BufferModeOverride" поставь 0. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2015, 10:07 |
|
редактирование в гриде
|
|||
---|---|---|---|
#18+
Здравствуйте всем, То AngelOKES так ведь грид привязан к таблице и действие в строке происходит. Но я честно попробовал - не помогло. То Дед Евгений углубляюсь в изучение, спасибо ) То Dima T грид на курсор завязан, т.е.view источник, в DE в этом свойстве для этого курсора можно только выбрать 1- use form setting ... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2015, 13:46 |
|
редактирование в гриде
|
|||
---|---|---|---|
#18+
Dima TDmitryKn, попробуй буфферизацию отключить. Если таблица автоматом открывается (добавлена в DE формы), то там автоматом буферизация включается. Свойство "BufferModeOverride" поставь 0. разве что в самом методе BeforeRowColChange выключить-включить? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2015, 13:48 |
|
редактирование в гриде
|
|||
---|---|---|---|
#18+
DmitryKnDima TDmitryKn, попробуй буфферизацию отключить. Если таблица автоматом открывается (добавлена в DE формы), то там автоматом буферизация включается. Свойство "BufferModeOverride" поставь 0. разве что в самом методе BeforeRowColChange выключить-включить? не, это глупости ... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2015, 13:54 |
|
редактирование в гриде
|
|||
---|---|---|---|
#18+
DmitryKnТо Dima T грид на курсор завязан, т.е.view источник, в DE в этом свойстве для этого курсора можно только выбрать 1- use form setting Тогда изучай что Дед Евгений написал. Ошибка связана с буферизацией, читай про нее. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2015, 13:56 |
|
редактирование в гриде
|
|||
---|---|---|---|
#18+
Дед ЕвгенийПоделюсь своей разработкой. В Гриде, в поле 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) подтянуться? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2015, 20:28 |
|
редактирование в гриде
|
|||
---|---|---|---|
#18+
Дед ЕвгенийПоделюсь своей разработкой. В Гриде, в поле 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.
по идее я могу вставить вместо в твой пример вместо кода активации кнопки save, но как это поможет с моей проблемой с буферизацией? Я попробовал вставить tableupdate в свой код так: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Полагая, что вот, сбросил буфер и курсор может быть изменен, да только ничего не получилось. Варианты написания tableupdate перепробовал все, ну так чтоб уж на всякий случай. Вот интуитивно ощущаю, что где-то совсем рядом решение, а ухватить не могу. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2015, 20:41 |
|
редактирование в гриде
|
|||
---|---|---|---|
#18+
Пока вот нашел такой вариант решения код в beforeRowColChange Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
Мой метод формы rlog Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Пока, вроде, работает. Может дайте какой-нить комментарий - можно мне жить и не умереть со стыда с таким решением, или искать другое? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2015, 21:19 |
|
редактирование в гриде
|
|||
---|---|---|---|
#18+
в .Valid интересующей нас ячейки IF NOT this.Value=OLDVAL('навание источника') &&произошли изменения пишем в лог ....... ENDIF ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2015, 04:18 |
|
|
start [/forum/topic.php?fid=41&msg=39041900&tid=1582268]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
78ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
2ms |
others: | 267ms |
total: | 451ms |
0 / 0 |