|
Редактирование в grid
|
|||
---|---|---|---|
#18+
Добрый всем день ! Подскажите, возможно ли осуществить такую процедуру: Корректируем-вводим данные в Grid на таблице, потом записываем. При этом при сохранении происходит replace полей view, связанного с grid, с полями таблицы. Replace происходит для всех записей, хотя редактируем мы, например, только две или три строки. Можно ли каким-либо образом сохранять данные в какое-либо поле строки, например текущую дату, когда произвели изменения, но только в тех строках, где изменения производились. В идеале, конечно, создать текстовый файл в мемо-поле с отображением и последующим добавлением даты и пользователя, внесшего изменения в строке. Но поскольку replace для всех непустых строк, так он во все строки и пишет эти данные, а хотелось бы только в те, которые были изменены. Или, в крайнем случае, как запретить редактировать более одной строки за раз, но какая это будет строка заранее мы не знаем. В каком направлении пытаться искать решение, или выбросить такую идею вообще? поскольку для работы самого приложения это не так уж и важно, это скорее вопросы администрирования вообще. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.08.2015, 11:45 |
|
Редактирование в grid
|
|||
---|---|---|---|
#18+
DmitryKnВ каком направлении пытаться искать решение, или выбросить такую идею вообще? поскольку для работы самого приложения это не так уж и важно, это скорее вопросы администрирования вообще. Вы определитесь, Вам редактировать 1 запись или по условию много? если 1 то сделайте редактирование через форму. если много, то так-же через форму и меняйте значения у всех, кто подходит по условию и так же записывайте когда и кто сделал. Простейший вариант: Код: sql 1.
Не уверен, что код работает, но мысль такая. Он заменит все table1.name на name1, а так же проставит в поле kogda дату, в поле kto проставит user. Но моё ИМХО у Вас потрутся старые данные, что есть не очень хорошо. Старую запись куда-то сохранить в какую-нибудь архивную базу или поставить отметку об утрате актуальности, а в нормальную делать insert. В любой момент времени вы должны видеть ВСЮ историю, с replace такого не будет. В любом случае определитесь Вам менять много записей или 1. Если много то выбирайте критерии по которым Вам их выбирать из базы. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.08.2015, 12:52 |
|
Редактирование в grid
|
|||
---|---|---|---|
#18+
T1gRa_NT, T1gRa_NT, Привет, на форме grid, таблица с данными, что-то вроде прайса, сколько, когда и какие конкретно поля будут отредактированы - неизвестно. Это может быть и одна строка, и несколько различных, редактироваться могут несколько столбцов. Если редактировать только одну запись, то при сохранении в текст в мемо-поле автоматически добавляется с накоплением юзер и дата. Так же просто организовать, когда в поле с датой перепишется текущая системная дата. Т.е. проблем не возникает. Но редактироваться может не одна только строка. Если бы можно было ограничить редактирование одной любой строкой - можно было бы решить так. А если мы редактируем 3 или 5 строк из, скажем, 100, то тогда можно либо записать в последнюю активную строку, либо во все сразу. Вот я и спрашиваю - можно ли ограничить редактирование таблицы через grid любой одной строкой, избегая редактирование через текстбоксы, или какт-то определить строки, в которых редактирование уже было. Или только через форму? Громоздко получится, полей много. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.08.2015, 13:49 |
|
Редактирование в grid
|
|||
---|---|---|---|
#18+
DmitryKn, Ну и определяйте было ли изменено значение в поле таблицы при помощи методов BeforeRowColChange и AfterRowColChange - и если изменение зафиксировано - заполняйте поля с датой изменения в автоматическом режиме ... |
|||
:
Нравится:
Не нравится:
|
|||
11.08.2015, 14:33 |
|
Редактирование в grid
|
|||
---|---|---|---|
#18+
Dag, Доброго дня, Очень прошу, можно хоть чуть подробней про эти свойства? А то примеров использования нет, в книжке про грид то же не особо распространяются, а helpa мне явно мало (( ... |
|||
:
Нравится:
Не нравится:
|
|||
11.08.2015, 16:05 |
|
Редактирование в grid
|
|||
---|---|---|---|
#18+
Ищите сообщения Владимира Максимова. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.08.2015, 16:16 |
|
Редактирование в grid
|
|||
---|---|---|---|
#18+
Создадим какую-нибудь промежуточную переменную Например прилепим к форме дополнительное свойство MyVar, куда будем сохранять промежуточные данные Тогда для грида в методе AfterRowColChange пропишем Код: sql 1. 2. 3. 4.
т.е. сохраним текущее значение поля В метод BeforeRowColChange пишем Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
... |
|||
:
Нравится:
Не нравится:
|
|||
11.08.2015, 17:20 |
|
Редактирование в grid
|
|||
---|---|---|---|
#18+
Dag, Спасибо огромное, код работает. Хотя, признаться, я его просто перенес, так и не осознав его смысл. Я даже не знаю, что записывается в MyVar, и почему такой синтаксис? EVALUATE("This.Columns(nColIndex)."+This.Columns(nColIndex).CurrentControl) Что здесь - что? Почему кавычки, почему первый аргумент на точку заканчивается, где вообще про это все можно почитать? Не передается же тайное знание от посвященного к ученику. У меня книга на бумаге и штуки три на гаджете, похоже все вообще, что по фоксу выходило, там вообще про грид нет нихрена, в helpe такого тоже нет, где мудрости набраться? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2015, 14:24 |
|
Редактирование в grid
|
|||
---|---|---|---|
#18+
Это для универсальности Код: sql 1.
This.Columns(nColIndex).CurrentControl возвращает имя текущего контрола, по умолчанию Text1, но может быть заменено на любое свое. Т.к. нам нужен контрол, а не его имя, то генерится строка с именем контрола "This.Columns(nColIndex).Text1", а EVALUATE() возвращает ссылку на контрол, т.е. объект. Далее работаем с контролом через loObj Если имена контролов не менял, то можно написать Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2015, 14:42 |
|
Редактирование в grid
|
|||
---|---|---|---|
#18+
Dima T, Приветствую, Дмитрий. CurrentСontrol еще понятно, но сам синтаксис выражения... т.е должны быть какие-то правила, почему в кавычки и такая именно последовательность. И где можно почитать что-то? Вот ты на чем-то же учился? у Клепинина с Агафоновой про грид больше всего написано, но и то, как раскрасить строки только (но и за это тоже огромное спасибо). Или вот как с вычислениями в гриде разобраться? Предлагают так - заменить ControlSourse выражением, например, поле*поле+поле и т.д. Тогда получается, что колонка не связана с таблицей, нужно как-то придумать, передать значение. Пока не придумал. Всего три поля (столбца) для ввода и два результирующих в таблице. В метод valid при вводе записывал выражения для вычисления: thisform.Grd1.Column5.text1.value=thisform.Grd1.Column1.text1.value*thisform.Grd1.Column2.text1.value и т.д. потом в метод refresh это же писал, в обоих случаях получалось , что если пользователь курсор перемещает не горизонтально по строке, а скажем, изменяя по ходу значения одного столбца, вертикально вниз или вверх, то в выражение для вычисления подтягиваются значения предыдущей строки, если столбец не стоит первый в выражении. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2015, 15:09 |
|
Редактирование в grid
|
|||
---|---|---|---|
#18+
Dima T, Вот еще вопрос, а что же мы именно записали в MyVar в примере выше? Text1.value столбца? или что другое? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2015, 15:16 |
|
Редактирование в grid
|
|||
---|---|---|---|
#18+
Text1.value текущей "ячейки" грида. Т.е. при переходе на очередную клетку сначала запоминаем ее текущее значение (в BeforeRowColChange) при уходе с клетки (в AfterRowColChange) сравниваем текущее с тем что запомнили, если не совпадает, то значит было изменение. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2015, 15:21 |
|
Редактирование в grid
|
|||
---|---|---|---|
#18+
DmitryKnCurrentСontrol еще понятно, но сам синтаксис выражения... т.е должны быть какие-то правила, почему в кавычки и такая именно последовательность. И где можно почитать что-то? Вот ты на чем-то же учился? у Клепинина с Агафоновой про грид больше всего написано, но и то, как раскрасить строки только (но и за это тоже огромное спасибо). Читай хэлп на EVALUATE() Изначально я на хэлпе от FPD 2.0 учился, ничего не было другого, просто тупо читал все функции подряд. По VFP советую Базияна почитать. Мне эта книжка сильно помогла на VFP перейти. DmitryKnИли вот как с вычислениями в гриде разобраться? Предлагают так - заменить ControlSourse выражением, например, поле*поле+поле и т.д. Не пользуюсь, но если не путаю то просто в скобках написать ControlSourse = (поле*поле+поле) ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2015, 15:40 |
|
Редактирование в grid
|
|||
---|---|---|---|
#18+
DmitryKnИли вот как с вычислениями в гриде разобраться? Предлагают так - заменить ControlSourse выражением, например, поле*поле+поле и т.д. Не пользуюсь, но если не путаю то просто в скобках написать ControlSourse = (поле*поле+поле)[/quot] Да, именно так и есть. Но что тогда ControlSourse ? Грид вычисляет столбец, но с таблицей этот столбец уже не связан, надо куда-то вписывать какой-то replace, но если пользователь изменил значение в столбце1, результат, скажем, в столбце5, и пользователь просто туда не дошел и ушел на другую строку, то полученный результат мы только на экране и увидим, больше никуда он не попадет. А чем пользуешься, если не секрет? Чем можно заменить вычисления в гриде, если грид, собственно, почти все, что на форме и есть, и ввод данных на нем. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2015, 16:13 |
|
Редактирование в grid
|
|||
---|---|---|---|
#18+
Dima T, И, да, спасибо за совет по книжке. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2015, 16:15 |
|
Редактирование в grid
|
|||
---|---|---|---|
#18+
DmitryKnА чем пользуешься, если не секрет? Чем можно заменить вычисления в гриде, если грид, собственно, почти все, что на форме и есть, и ввод данных на нем. Можно при выборке в курсор посчитать, затем в гриде посчитанное показывать. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.08.2015, 07:44 |
|
Редактирование в grid
|
|||
---|---|---|---|
#18+
DmitryKn А чем пользуешься, если не секрет? Чем можно заменить вычисления в гриде, если грид, собственно, почти все, что на форме и есть, и ввод данных на нем. 1. Спасибо мемберу Dima T- в целом все верно разъяснил. 2. Fox - это интерпретатор, т.е. при желании можно написать программу, которая сама будет писать программы, компилировать их на ходу и запускать (это насчет текстовых строк и функции evaluate). Почитайте статьи на фоксклабе . Особенно разделы -макроподстановка и советы начинающим 3. Почитайте у Клепинина с Агафоновой раздел про отладку. Чтобы понять чужой (с свой тоже :-) код - команда SET STEP ON - наше все. 4. Скачайте с кодеплекса русский хелп - не помешает. 5.Опишите в теме собственно задачу, которая перед вами стоит, а не тот способ, которым вы пытаетесь ее решить. Удачи ... |
|||
:
Нравится:
Не нравится:
|
|||
13.08.2015, 10:04 |
|
Редактирование в grid
|
|||
---|---|---|---|
#18+
Dag, Dima T, Привет всем, Dima TМожно при выборке в курсор посчитать, затем в гриде посчитанное показывать. нет, при выборке в курсор нельзя, потому как с формы в том самом гриде данные изменяю. Dag5.Опишите в теме собственно задачу, которая перед вами стоит, а не тот способ, которым вы пытаетесь ее решить. Удачи В приложении есть форма, практически целиком состоящая из грида. Источник грида - view. По замыслу изменение данных в форме должно происходить в самом гриде формы, там же вычисляться и обновлять при сохранении таблицы. При этом происходит контроль даты изменения, с твоей помощью это организуется с помощью AfterRowColChange и BeforeRowColChange - так пользователи смогут потом оценить актуальность данных. Вполне можно было, как уже раньше коллеги советовали, заводить данные через элементы формы, при этом редактироваться будет одна строка. Однако на мой взгляд, это, хотя и безусловно работающее, но не совсем идеальное решение с точки зрения именно удобства пользователя и наглядности, а так же упростит задачу, что не очень хорошо в смысле освоения мною фокса. В данном случае, важно не только выполнить задачу, но еще хоть чему научиться. В чем-то работа в грид должна быть похожа на работу в exel, имеем 4 поля данных, которые пользователи могут изменять, и два результирующих поля, где есть результат. Вот сейчас ломаю голову, куда засунуть вычисления. Если в controlsourse столбца - теряется связь с полем курсора. Если в методы valid редактируемых - есть риск, и он очень велик, что пользователь просто сменит строку не пройдя по всем полям. Пытался поместить в BeforeRowColChange - т.е. если есть имзменения - то вычисления. Или, как вариант, добавлял метод в форму и если есть изменения - то отсылал на него, а там вычислял. Некорректная работа получается при переходе на другую строку - так окрыл для себя RowColchange, но еще не знаю, как его правильно использовать. Код BeforeRowColChange : Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Код thisform.calc: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
в этом случае при переходе указателя по строке все работает, при переходе на другую строку вычисления неправильны, подтягиваются предыдущие значения. Догадываюсь, что должен поместить в AfterRowColChange проверку свойства RowColChange, и если оно 1 или 3, то что-то должен сделать. Что - еще не определил. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.08.2015, 11:15 |
|
Редактирование в grid
|
|||
---|---|---|---|
#18+
Попробуй привязаться к полям своей таблицы, а не контролам, которые эти поля содержат, Типа такого : Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
... |
|||
:
Нравится:
Не нравится:
|
|||
13.08.2015, 12:40 |
|
Редактирование в grid
|
|||
---|---|---|---|
#18+
Dag, нет, к полю в BeforeRowColchange не надо привызяваться. Наверное, сама идея не очень вычислять в этих событиях. Я тут еще раз почитал - это событие вроде как до события valid происходит, отсюда и ошибка, так как фокс берет значения из источника старое, до изменения, хотя фактически мы уже набрали число. Поэтому проверить изменения можно, а вот вычислять в этих событиях, наверное , неправильно ( Куда же еще вычисления впихнуть можно? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.08.2015, 13:27 |
|
Редактирование в grid
|
|||
---|---|---|---|
#18+
Dag, Dima T, если поместить код с привязкой к полям в valid работает Код: sql 1. 2. 3. 4. 5. 6. 7.
интересно, почему с указанием контролов не хотело работать? в любом случае - ура и еще один маленький шажок )) ... |
|||
:
Нравится:
Не нравится:
|
|||
13.08.2015, 13:38 |
|
Редактирование в grid
|
|||
---|---|---|---|
#18+
в конечном итоге в valid контрола каждого столбца с изменяемой информацией получился код: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
если при вычислении указывать контролы - работает некорректно, а если вычисления в полях добавлять через replace в другие поля - через раз сбоит и появляется сообщение "Cursor cannot be modified because it contains an unsaved record". последний код вроде устойчиво работает. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.08.2015, 14:05 |
|
Редактирование в grid
|
|||
---|---|---|---|
#18+
DmitryKnв конечном итоге в valid контрола каждого столбца с изменяемой информацией получился код: ... Сделай лучше метод формы, вставь туда свой код, а в valid вставь вызов метода. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.08.2015, 14:34 |
|
Редактирование в grid
|
|||
---|---|---|---|
#18+
Dima TDmitryKnв конечном итоге в valid контрола каждого столбца с изменяемой информацией получился код: ... Сделай лучше метод формы, вставь туда свой код, а в valid вставь вызов метода. Совет принят на веру безоговорочно - меняю. А лучше - просто более гармонично в смысле общей организации и эстетичности - не нужно плодить одинаковый код в нескольких метсах, или кроме того есть какое-то функциональное значение ? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.08.2015, 15:12 |
|
Редактирование в grid
|
|||
---|---|---|---|
#18+
DmitryKnDima Tпропущено... Сделай лучше метод формы, вставь туда свой код, а в valid вставь вызов метода. Совет принят на веру безоговорочно - меняю. А лучше - просто более гармонично в смысле общей организации и эстетичности - не нужно плодить одинаковый код в нескольких метсах, или кроме того есть какое-то функциональное значение ? Только ради удобства. Чтобы править код в одном месте. Ты вроде уже один раз поправил код valid() во всех контролах грида. Завтра решишь там что-то поменять - опять по всем контролам пробегать надо будет. В valid() вообще можно не прописывать: сделать перебор контролов грида и привязать этот метод к valid() с помощью BINDEVENT() ... |
|||
:
Нравится:
Не нравится:
|
|||
13.08.2015, 15:27 |
|
|
start [/forum/topic.php?fid=41&msg=39027954&tid=1582290]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
61ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
others: | 296ms |
total: | 448ms |
0 / 0 |