powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Редактирование в grid
29 сообщений из 29, показаны все 2 страниц
Редактирование в grid
    #39026915
DmitryKn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый всем день !

Подскажите, возможно ли осуществить такую процедуру:

Корректируем-вводим данные в Grid на таблице, потом записываем. При этом при сохранении происходит replace полей view, связанного с grid, с полями таблицы.
Replace происходит для всех записей, хотя редактируем мы, например, только две или три строки. Можно ли каким-либо образом сохранять данные в какое-либо поле строки, например текущую дату, когда произвели изменения, но только в тех строках, где изменения производились.

В идеале, конечно, создать текстовый файл в мемо-поле с отображением и последующим добавлением даты и пользователя, внесшего изменения в строке. Но поскольку replace для всех непустых строк, так он во все строки и пишет эти данные, а хотелось бы только в те, которые были изменены.

Или, в крайнем случае, как запретить редактировать более одной строки за раз, но какая это будет строка заранее мы не знаем.

В каком направлении пытаться искать решение, или выбросить такую идею вообще? поскольку для работы самого приложения это не так уж и важно, это скорее вопросы администрирования вообще.
...
Рейтинг: 0 / 0
Редактирование в grid
    #39026980
T1gRa_NT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmitryKnВ каком направлении пытаться искать решение, или выбросить такую идею вообще? поскольку для работы самого приложения это не так уж и важно, это скорее вопросы администрирования вообще.

Вы определитесь, Вам редактировать 1 запись или по условию много?
если 1 то сделайте редактирование через форму.
если много, то так-же через форму и меняйте значения у всех, кто подходит по условию и так же записывайте когда и кто сделал.
Простейший вариант:
Код: sql
1.
Replace table1.name with name1, kogda with date, kto with 'user' for table1.name=this.form.text1


Не уверен, что код работает, но мысль такая.
Он заменит все table1.name на name1, а так же проставит в поле kogda дату, в поле kto проставит user.
Но моё ИМХО у Вас потрутся старые данные, что есть не очень хорошо.
Старую запись куда-то сохранить в какую-нибудь архивную базу или поставить отметку об утрате актуальности, а в нормальную делать insert.
В любой момент времени вы должны видеть ВСЮ историю, с replace такого не будет.
В любом случае определитесь Вам менять много записей или 1. Если много то выбирайте критерии по которым Вам их выбирать из базы.
...
Рейтинг: 0 / 0
Редактирование в grid
    #39027026
DmitryKn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
T1gRa_NT,

T1gRa_NT,

Привет,

на форме grid, таблица с данными, что-то вроде прайса, сколько, когда и какие конкретно поля будут отредактированы - неизвестно. Это может быть и одна строка, и несколько различных, редактироваться могут несколько столбцов.

Если редактировать только одну запись, то при сохранении в текст в мемо-поле автоматически добавляется с накоплением юзер и дата. Так же просто организовать, когда в поле с датой перепишется текущая системная дата. Т.е. проблем не возникает.

Но редактироваться может не одна только строка. Если бы можно было ограничить редактирование одной любой строкой - можно было бы решить так.

А если мы редактируем 3 или 5 строк из, скажем, 100, то тогда можно либо записать в последнюю активную строку, либо во все сразу.

Вот я и спрашиваю - можно ли ограничить редактирование таблицы через grid любой одной строкой, избегая редактирование через текстбоксы, или какт-то определить строки, в которых редактирование уже было.

Или только через форму? Громоздко получится, полей много.
...
Рейтинг: 0 / 0
Редактирование в grid
    #39027057
Dag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmitryKn,

Ну и определяйте было ли изменено значение в поле таблицы при помощи методов BeforeRowColChange и AfterRowColChange - и если изменение зафиксировано - заполняйте поля с датой изменения в автоматическом режиме
...
Рейтинг: 0 / 0
Редактирование в grid
    #39027161
DmitryKn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dag,

Доброго дня,

Очень прошу, можно хоть чуть подробней про эти свойства? А то примеров использования нет, в книжке про грид то же не особо распространяются, а helpa мне явно мало ((
...
Рейтинг: 0 / 0
Редактирование в grid
    #39027172
<>
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ищите сообщения Владимира Максимова.
...
Рейтинг: 0 / 0
Редактирование в grid
    #39027266
Dag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Создадим какую-нибудь промежуточную переменную
Например прилепим к форме дополнительное свойство MyVar, куда будем сохранять промежуточные данные

Тогда для грида в методе AfterRowColChange пропишем

Код: sql
1.
2.
3.
4.
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.
LPARAMETERS nColIndex
local loObj
loObj=EVALUATE("This.Columns(nColIndex)."+This.Columns(nColIndex).CurrentControl)

IF ThisForm.MyVar != loObj.Value
*есть изменение

REPLACE MyDateChage WITH Date() in MyTable
ENDIF 
...
Рейтинг: 0 / 0
Редактирование в grid
    #39027887
DmitryKn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dag,

Спасибо огромное, код работает.

Хотя, признаться, я его просто перенес, так и не осознав его смысл. Я даже не знаю, что записывается в MyVar, и почему такой синтаксис?

EVALUATE("This.Columns(nColIndex)."+This.Columns(nColIndex).CurrentControl)

Что здесь - что? Почему кавычки, почему первый аргумент на точку заканчивается, где вообще про это все можно почитать? Не передается же тайное знание от посвященного к ученику. У меня книга на бумаге и штуки три на гаджете, похоже все вообще, что по фоксу выходило, там вообще про грид нет нихрена, в helpe такого тоже нет, где мудрости набраться?
...
Рейтинг: 0 / 0
Редактирование в grid
    #39027904
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это для универсальности
Код: sql
1.
loObj=EVALUATE("This.Columns(nColIndex)."+This.Columns(nColIndex).CurrentControl)


This.Columns(nColIndex).CurrentControl возвращает имя текущего контрола, по умолчанию Text1, но может быть заменено на любое свое.
Т.к. нам нужен контрол, а не его имя, то генерится строка с именем контрола "This.Columns(nColIndex).Text1", а EVALUATE() возвращает ссылку на контрол, т.е. объект. Далее работаем с контролом через loObj

Если имена контролов не менял, то можно написать
Код: sql
1.
loObj=This.Columns(nColIndex).Text1
...
Рейтинг: 0 / 0
Редактирование в grid
    #39027933
DmitryKn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T,

Приветствую, Дмитрий.

CurrentСontrol еще понятно, но сам синтаксис выражения... т.е должны быть какие-то правила, почему в кавычки и такая именно последовательность.

И где можно почитать что-то? Вот ты на чем-то же учился? у Клепинина с Агафоновой про грид больше всего написано, но и то, как раскрасить строки только (но и за это тоже огромное спасибо).

Или вот как с вычислениями в гриде разобраться?
Предлагают так - заменить ControlSourse выражением, например, поле*поле+поле и т.д.

Тогда получается, что колонка не связана с таблицей, нужно как-то придумать, передать значение. Пока не придумал.
Всего три поля (столбца) для ввода и два результирующих в таблице. В метод valid при вводе записывал выражения для вычисления:
thisform.Grd1.Column5.text1.value=thisform.Grd1.Column1.text1.value*thisform.Grd1.Column2.text1.value и т.д.
потом в метод refresh это же писал, в обоих случаях получалось , что если пользователь курсор перемещает не горизонтально по строке, а скажем, изменяя по ходу значения одного столбца, вертикально вниз или вверх, то в выражение для вычисления подтягиваются значения предыдущей строки, если столбец не стоит первый в выражении.
...
Рейтинг: 0 / 0
Редактирование в grid
    #39027948
DmitryKn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T,

Вот еще вопрос, а что же мы именно записали в MyVar в примере выше? Text1.value столбца? или что другое?
...
Рейтинг: 0 / 0
Редактирование в grid
    #39027954
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Text1.value текущей "ячейки" грида. Т.е. при переходе на очередную клетку сначала запоминаем ее текущее значение (в BeforeRowColChange) при уходе с клетки (в AfterRowColChange) сравниваем текущее с тем что запомнили, если не совпадает, то значит было изменение.
...
Рейтинг: 0 / 0
Редактирование в grid
    #39027974
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmitryKnCurrentСontrol еще понятно, но сам синтаксис выражения... т.е должны быть какие-то правила, почему в кавычки и такая именно последовательность.

И где можно почитать что-то? Вот ты на чем-то же учился? у Клепинина с Агафоновой про грид больше всего написано, но и то, как раскрасить строки только (но и за это тоже огромное спасибо).
Читай хэлп на EVALUATE()
Изначально я на хэлпе от FPD 2.0 учился, ничего не было другого, просто тупо читал все функции подряд.
По VFP советую Базияна почитать. Мне эта книжка сильно помогла на VFP перейти.

DmitryKnИли вот как с вычислениями в гриде разобраться?
Предлагают так - заменить ControlSourse выражением, например, поле*поле+поле и т.д.
Не пользуюсь, но если не путаю то просто в скобках написать ControlSourse = (поле*поле+поле)
...
Рейтинг: 0 / 0
Редактирование в grid
    #39027998
DmitryKn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DmitryKnИли вот как с вычислениями в гриде разобраться?
Предлагают так - заменить ControlSourse выражением, например, поле*поле+поле и т.д.
Не пользуюсь, но если не путаю то просто в скобках написать ControlSourse = (поле*поле+поле)[/quot]

Да, именно так и есть. Но что тогда ControlSourse ? Грид вычисляет столбец, но с таблицей этот столбец уже не связан, надо куда-то вписывать какой-то replace, но если пользователь изменил значение в столбце1, результат, скажем, в столбце5, и пользователь просто туда не дошел и ушел на другую строку, то полученный результат мы только на экране и увидим, больше никуда он не попадет.


А чем пользуешься, если не секрет? Чем можно заменить вычисления в гриде, если грид, собственно, почти все, что на форме и есть, и ввод данных на нем.
...
Рейтинг: 0 / 0
Редактирование в grid
    #39028000
DmitryKn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T,

И, да, спасибо за совет по книжке.
...
Рейтинг: 0 / 0
Редактирование в grid
    #39028271
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmitryKnА чем пользуешься, если не секрет? Чем можно заменить вычисления в гриде, если грид, собственно, почти все, что на форме и есть, и ввод данных на нем.
Можно при выборке в курсор посчитать, затем в гриде посчитанное показывать.
...
Рейтинг: 0 / 0
Редактирование в grid
    #39028350
Dag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmitryKn
А чем пользуешься, если не секрет? Чем можно заменить вычисления в гриде, если грид, собственно, почти все, что на форме и есть, и ввод данных на нем.

1. Спасибо мемберу Dima T- в целом все верно разъяснил.

2. Fox - это интерпретатор, т.е. при желании можно написать программу, которая сама будет писать программы, компилировать их на ходу и запускать (это насчет текстовых строк и функции evaluate). Почитайте статьи на фоксклабе . Особенно разделы -макроподстановка и советы начинающим

3. Почитайте у Клепинина с Агафоновой раздел про отладку. Чтобы понять чужой (с свой тоже :-) код - команда SET STEP ON - наше все.

4. Скачайте с кодеплекса русский хелп - не помешает.

5.Опишите в теме собственно задачу, которая перед вами стоит, а не тот способ, которым вы пытаетесь ее решить.

Удачи
...
Рейтинг: 0 / 0
Редактирование в grid
    #39028419
DmitryKn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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.
LPARAMETERS nColIndex
local loObj
loObj=EVALUATE("This.Columns(nColIndex)."+This.Columns(nColIndex).CurrentControl)

IF ThisForm.MyVar != loObj.Value
*åñòü èçìåíåíèå

	REPLACE daregdate WITH Date() in l_price

	thisform.calc

ENDIF 


Код thisform.calc:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
LOCAL lnprice_out, lnprice_nds

lnprice_out=thisform.grdPrice.column6.text1.Value*thisform.grdPrice.column5.text1.Value*thisform.grdPrice.column4.text1.Value
lnprice_nds=thisform.grdPrice.column6.text1.Value*thisform.grdPrice.column5.text1.Value*thisform.grdPrice.column4.text1.Value*1.2

replace nprice_out WITH lnprice_out IN l_price
replace nprice_nds WITH lnprice_nds IN l_price

thisform.qrdPrice.refresh



в этом случае при переходе указателя по строке все работает, при переходе на другую строку вычисления неправильны, подтягиваются предыдущие значения.
Догадываюсь, что должен поместить в AfterRowColChange проверку свойства RowColChange, и если оно 1 или 3, то что-то должен сделать. Что - еще не определил.
...
Рейтинг: 0 / 0
Редактирование в grid
    #39028532
Dag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуй привязаться к полям своей таблицы, а не контролам, которые эти поля содержат,
Типа такого :

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

IF ThisForm.MyVar != loObj.Value
        
        lnOut=l_price.Field6*l_price.Field5*l_price.Field4
	REPLACE daregdate WITH Date(), nprice_out with lnOut, nprice_nds with lnOut*1.2  in l_price


*	thisform.calc

ENDIF 
...
Рейтинг: 0 / 0
Редактирование в grid
    #39028608
DmitryKn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dag,

нет, к полю в BeforeRowColchange не надо привызяваться. Наверное, сама идея не очень вычислять в этих событиях. Я тут еще раз почитал - это событие вроде как до события valid происходит, отсюда и ошибка, так как фокс берет значения из источника старое, до изменения, хотя фактически мы уже набрали число.

Поэтому проверить изменения можно, а вот вычислять в этих событиях, наверное , неправильно (

Куда же еще вычисления впихнуть можно?
...
Рейтинг: 0 / 0
Редактирование в grid
    #39028620
DmitryKn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dag, Dima T,

если поместить код с привязкой к полям в valid работает
Код: sql
1.
2.
3.
4.
5.
6.
7.
LOCAL lnOut

lnOut=l_price.nprice_in*l_price.nco*l_price.ncoterm

REPLACE nprice_out WITH lnOut, nprice_nds WITH lnOut*1.2 IN l_price

thisform.grdPrice.Refresh



интересно, почему с указанием контролов не хотело работать?

в любом случае - ура и еще один маленький шажок ))
...
Рейтинг: 0 / 0
Редактирование в grid
    #39028645
DmitryKn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в конечном итоге в valid контрола каждого столбца с изменяемой информацией получился код:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
LOCAL lnOut

lnOut=l_price.nprice_in*l_price.nco*l_price.ncoterm

thisform.grdPrice.column7.text1.Value=lnOut
thisform.grdPrice.column8.text1.Value=lnOut*1.2

RELEASE lnOut

thisform.grdPrice.Refresh



если при вычислении указывать контролы - работает некорректно, а если вычисления в полях добавлять через replace в другие поля - через раз сбоит и появляется сообщение "Cursor cannot be modified because it contains an unsaved record".

последний код вроде устойчиво работает.
...
Рейтинг: 0 / 0
Редактирование в grid
    #39028698
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmitryKnв конечном итоге в valid контрола каждого столбца с изменяемой информацией получился код: ...
Сделай лучше метод формы, вставь туда свой код, а в valid вставь вызов метода.
...
Рейтинг: 0 / 0
Редактирование в grid
    #39028737
DmitryKn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TDmitryKnв конечном итоге в valid контрола каждого столбца с изменяемой информацией получился код: ...
Сделай лучше метод формы, вставь туда свой код, а в valid вставь вызов метода.

Совет принят на веру безоговорочно - меняю.

А лучше - просто более гармонично в смысле общей организации и эстетичности - не нужно плодить одинаковый код в нескольких метсах, или кроме того есть какое-то функциональное значение ?
...
Рейтинг: 0 / 0
Редактирование в grid
    #39028765
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmitryKnDima Tпропущено...

Сделай лучше метод формы, вставь туда свой код, а в valid вставь вызов метода.

Совет принят на веру безоговорочно - меняю.

А лучше - просто более гармонично в смысле общей организации и эстетичности - не нужно плодить одинаковый код в нескольких метсах, или кроме того есть какое-то функциональное значение ?
Только ради удобства. Чтобы править код в одном месте. Ты вроде уже один раз поправил код valid() во всех контролах грида. Завтра решишь там что-то поменять - опять по всем контролам пробегать надо будет.

В valid() вообще можно не прописывать: сделать перебор контролов грида и привязать этот метод к valid() с помощью BINDEVENT()
...
Рейтинг: 0 / 0
Редактирование в grid
    #39028860
DmitryKn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T,

Ок, спасибо, за наводку, бегло прочитал - ну надо разбираться ))
...
Рейтинг: 0 / 0
Редактирование в grid
    #39028869
DmitryKn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А пока что решил с регистрацией изменений в форме:

в BeforeRowColChange добавил:

Код: sql
1.
REPLACE mreglog WITH this.columns(ncolIndex).Header1.Caption + ' ' + DTOC(DATE()) + ' '+TIME()+' ;  ' ADDITIVE IN l_price



Теперь мы будем видеть в мемо-поле когда и что поменяли. Позже, когда я разберусь и сделаю форму для входа пользователя, и как-то раздам даже права, наверное, добавлю сюда и логин юзера. Тогда будем знать еще и кто вносил изменения.
...
Рейтинг: 0 / 0
Редактирование в grid
    #39028882
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У тебя БД какая? DBF-ки или SQL-Сервер?
На сервере можно организовать контроль изменений его средствами. Почитай http://www.infocity.kiev.ua/db/content/db277.phtml
...
Рейтинг: 0 / 0
Редактирование в grid
    #39028985
DmitryKn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T,

dbf, я сначала думал SQL начать разбирать, но побоялся, что слишком сложно будет. А фокс - у меня готовое действующее приложение есть на конторе, довольно-таки сложное, не 1С, конечно, но многоплановый учет серьезный есть, я его использую как учебное пособие )
Так что принял решение слегка разобраться с основами FoxPro, если опыт удачный будет, тогда возможно посмотрю в сторону SQL.

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


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