Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
 Сохранение  [new]
МашкоБ.В.
Member

Откуда: Минск
Сообщений: 131
На Grid1.Column2.Header1.Text1 прописал такой код
LPARAMETERS nKeyCode, nShiftAltCtrl
SELECT disp1
ON ERROR *
IF nKeyCode = 13
NODEFAULT
IF this.ReadOnly = .T.
this.ReadOnly = .F.
this.BackColor= RGB(104,166,179)
this.ForeColor= RGB(128,0,128)
this.FontBold = .T.
ELSE
If MESSAGEBOX("Сохранить изменения?",4+32,"Сохранение") = 6
= TABLEUPDATE(.T.)
IF TABLEUPDATE()=.T.
MESSAGEBOX('сохранено')
endif
this.BackColor= RGB(255,255,255)
this.ForeColor= RGB(0,0,0)
ENDIF
this.ReadOnly = .T.
ENDIF
endif

Чтобы по нажатию на enter вводились или изменялись данные ,по второму нажатию они сохранялись. Но проблема в том что пока форма открыта изменнённые данные видны ,если закрыть и открыть форму то изменённые данные иногда сохраняются , а иногда нет,т.е. ячейка остаётся пустой.
8 ноя 06, 09:47    [3366399]     Ответить | Цитировать Сообщить модератору
 Re: Сохранение  [new]
PaulWist
Member

Откуда:
Сообщений: 2236
= TABLEUPDATE(.T.)

Вот здесь надо проверить, что вернула ф-ия, а так же хорошо использовать все параметры ф-ии включая алиас.
8 ноя 06, 09:55    [3366449]     Ответить | Цитировать Сообщить модератору
 Re: Сохранение  [new]
Владимир СА
Member

Откуда:
Сообщений: 7881
1. Если хочешь изменять содержимое ячейки Grid-а, то зачем выдумывать велосипед. Прямо в Grid-е и изменяй. И обновляешь данные.
2. Если изменяются все записи этого поля, то лучше наверное вызывать новую форму при Click-е на заголовок колонки Grid-а. И при нажатии OK этой новой формы производишь изменения в таблице и соответственно в Grid-е.
8 ноя 06, 10:00    [3366478]     Ответить | Цитировать Сообщить модератору
 Re: Сохранение  [new]
МашкоБ.В.
Member

Откуда: Минск
Сообщений: 131
А как именно проверить, я понимаю что через Debuger, но как ?
8 ноя 06, 10:08    [3366533]     Ответить | Цитировать Сообщить модератору
 Re: Сохранение  [new]
Sergey Sizov
Member

Откуда:
Сообщений: 1547
А при чем тут дебагер? Это обычная функция, возвращающая огическое значение.
8 ноя 06, 10:55    [3366852]     Ответить | Цитировать Сообщить модератору
 Re: Сохранение  [new]
МашкоБ.В.
Member

Откуда: Минск
Сообщений: 131
PaulWist
= TABLEUPDATE(.T.)

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

Я проверяю
IF TABLEUPDATE()=.T.
MESSAGEBOX('сохранено')
endif
и всегда при выполнении возникает надпись ('сохранено').Но после нового открытия формы новых значений нет.
8 ноя 06, 11:02    [3366910]     Ответить | Цитировать Сообщить модератору
 Re: Сохранение  [new]
Станислав С
Guest
МашкоБ.В.
PaulWist
= TABLEUPDATE(.T.)

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

Я проверяю
IF TABLEUPDATE()=.T.
MESSAGEBOX('сохранено')
endif
и всегда при выполнении возникает надпись ('сохранено').Но после нового открытия формы новых значений нет.

Так это уже совсем другая проверка...
Вот если бы Вы проверили:
IF TABLEUPDATE(.T.)
MESSAGEBOX('сохранено')
endif
тогда было бы совсем другое дело....
8 ноя 06, 11:13    [3367015]     Ответить | Цитировать Сообщить модератору
 Re: Сохранение  [new]
МашкоБ.В.
Member

Откуда: Минск
Сообщений: 131
Станислав С
МашкоБ.В.
PaulWist
= TABLEUPDATE(.T.)

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

Я проверяю
IF TABLEUPDATE()=.T.
MESSAGEBOX('сохранено')
endif
и всегда при выполнении возникает надпись ('сохранено').Но после нового открытия формы новых значений нет.

Так это уже совсем другая проверка...
Вот если бы Вы проверили:
IF TABLEUPDATE(.T.)
MESSAGEBOX('сохранено')
endif
тогда было бы совсем другое дело....


Да я и так проверил выскакивает ('сохранено') но значение после перезапуска не появляется
8 ноя 06, 11:20    [3367090]     Ответить | Цитировать Сообщить модератору
 Re: Сохранение  [new]
alex11100
Guest
выхожу на асфальт в лыжи обутая,
то ли лыжи не едут, то ли ....


= TABLEUPDATE(.T.)
IF TABLEUPDATE()=.T.


это че за тайное шаманство?

один разочек это делать нужно

да и что за тайный смысл отслеживать
количество нажатий ентера?
наверное азбука морзе пишется
8 ноя 06, 11:37    [3367275]     Ответить | Цитировать Сообщить модератору
 Re: Сохранение  [new]
Solmyr
Member

Откуда: город К. -> город М.
Сообщений: 538
= TABLEUPDATE(0,.F.,"Data_head").
Он вам изменения может не в той таблице сохраняет. Вот и все. Укажите алиас. И второй параметр тоже поставьте какой надо.
А вообще действительно, прямо в гриде редактировать не пробовали?
8 ноя 06, 14:41    [3368997]     Ответить | Цитировать Сообщить модератору
 Re: Сохранение  [new]
МашкоБ.В.
Member

Откуда: Минск
Сообщений: 131
Solmyr
= TABLEUPDATE(0,.F.,"Data_head").
Он вам изменения может не в той таблице сохраняет. Вот и все. Укажите алиас. И второй параметр тоже поставьте какой надо.
А вообще действительно, прямо в гриде редактировать не пробовали?


Послушав советов написал я такое Grid1.Column2.Header1.text1.keypress=
LPARAMETERS nKeyCode, nShiftAltCtrl
SELECT disp1
ON ERROR *
IF nKeyCode = 13
NODEFAULT
IF this.ReadOnly = .T.
this.ReadOnly = .F.
this.BackColor= RGB(104,166,179)
this.ForeColor= RGB(128,0,128)
this.FontBold = .T.
ELSE
If MESSAGEBOX("Сохранить изменения?",4+32,"Сохранение") = 6
= TABLEUPDATE(0,.T.,"disp1.name")

this.BackColor= RGB(255,255,255)
this.ForeColor= RGB(0,0,0)
ENDIF
this.ReadOnly = .T.
ENDIF
endif


Но вводимые данные то отображаются, то нет.
А насчет прямого обращения через Grid, я что-то не понял, а я как обращаюсь?
9 ноя 06, 00:52    [3372397]     Ответить | Цитировать Сообщить модератору
 Re: Сохранение  [new]
PaulWist
Member

Откуда:
Сообщений: 2236
Читай посты внимательнее и синтаксис посмотри ф-ии TableUpdate

If MESSAGEBOX("Сохранить изменения?",4+32,"Сохранение") = 6
 IF TABLEUPDATE(0,.T.,"disp1")
       MESSAGEBOX('OK')
 ELSE
       MESSAGEBOX('BAD')
 ENDID
.......
ENDIF
9 ноя 06, 09:34    [3372852]     Ответить | Цитировать Сообщить модератору
 Re: Сохранение  [new]
МашкоБ.В.
Member

Откуда: Минск
Сообщений: 131
PaulWist
Читай посты внимательнее и синтаксис посмотри ф-ии TableUpdate

If MESSAGEBOX("Сохранить изменения?",4+32,"Сохранение") = 6
 IF TABLEUPDATE(0,.T.,"disp1")
       MESSAGEBOX('OK')
 ELSE
       MESSAGEBOX('BAD')
 ENDID
.......
ENDIF

Спасибо , я переписал так
LPARAMETERS nKeyCode, nShiftAltCtrl
SELECT disp1
ON ERROR *
IF nKeyCode = 13
NODEFAULT
IF this.ReadOnly = .T.
this.ReadOnly = .F.
this.BackColor= RGB(104,166,179)
this.ForeColor= RGB(128,0,128)
this.FontBold = .T.
ELSE
If MESSAGEBOX("Сохранить изменения?",4+32,"Сохранение") = 6
IF TABLEUPDATE(0,.T.,"disp1")
MESSAGEBOX('OK')
ELSE
MESSAGEBOX('BAD')
endif
this.BackColor= RGB(255,255,255)
this.ForeColor= RGB(0,0,0)
ENDIF
this.ReadOnly = .T.
ENDIF
endif

Не помогло, я просмотрел таблицу после закрытия формы данные в ней присутствуют, но если занова запустить форму то данных втаблице нет.
Если кому несложно посмотрите (создайте несколько строк и заполните их через enter)

К сообщению приложен файл (test.rar - 67Kb) cкачать
9 ноя 06, 19:05    [3378618]     Ответить | Цитировать Сообщить модератору
 Re: Сохранение  [new]
PaulWist
Member

Откуда:
Сообщений: 2236
1. Восстановить ON ERROR без всяких звездочек

2. Сюда, результаты
?Cursorgetprop('Buffering','disp1')

3. Зачем эта конструкция
IF this.ReadOnly = .T.
10 ноя 06, 10:02    [3380194]     Ответить | Цитировать Сообщить модератору
 Re: Сохранение  [new]
МашкоБ.В.
Member

Откуда: Минск
Сообщений: 131
PaulWist
1. Восстановить ON ERROR без всяких звездочек

2. Сюда, результаты
?Cursorgetprop('Buffering','disp1')

3. Зачем эта конструкция
IF this.ReadOnly = .T.


?Cursorgetprop('Buffering','disp1') возвращает 5 т.е таблица в режиме оптимистической буферизации. Может надо как-то по другому вводить данные.

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

Помогите очень срочно надо.
11 дек 06, 10:25    [3516948]     Ответить | Цитировать Сообщить модератору
 Re: Сохранение  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
У любого визуального объекта FoxPro есть собственный буфер. Т.е., хотя и кажется, что введенная информация сразу попадает в поле таблицы, но на самом деле это не так.

Сначала, ты набираешь текст в объекте на форме. Далее, по определенному событию, происходит сброс набранного текста из буфера объекта в связанное с этим объектом поле таблицы.

Применительно к ячейке Grid этим событием является, в том числе, и нажатие клавиши Enter.

Однако первой же командой NODEFAULT ты говоришь FoxPro: оставь этот буфер где он есть. В самой ячейке. Не надо его переписывать в поле таблицы.

Дальнейший TableUpdate() уже ничего не меняет. Просто потому, что в буфер таблицы содержимое экранной ячейки просто не попало. Нечего сбрасывать из буфера таблицы.

В данном случае тебе надо озаботится принудительной записью текста, введенного в экранной ячейке в поле таблицы. Это можно сделать прямой командой REPLACE примерно так:

If MESSAGEBOX("Сохранить изменения?",4+32,"Сохранение") = 6

	select disp1
	REPLACE name with This.Value

	IF TABLEUPDATE(0,.T.,"disp1")
		MESSAGEBOX('OK')
	ELSE
	MESSAGEBOX('BAD')
	endif
endif

А почему все-таки иногда информация попадала? Потому, что не только нажатие Enter приводит к записи информации из буфера экранной ячейки в поле таблицы. Собственно, любой способ выхода из ячейки (почти) приводит к подобному сбросу. Повторное нажатие Enter как раз и приводило к записи информации.

Хотя, сама концепция организации редактирования не очень хорошая. Слишком не очевидная.
11 дек 06, 12:45    [3518123]     Ответить | Цитировать Сообщить модератору
 Re: Сохранение  [new]
МашкоБ.В.
Member

Откуда: Минск
Сообщений: 131
ВладимирМ

Хотя, сама концепция организации редактирования не очень хорошая. Слишком не очевидная.

Я полностью согласен . Но Программа пишется для диспетчира(женщина)45-50лет. И ей надо как было в старой DOS-программе , я чтобы ввести что-то новое более удобное полдня ей объясняю , показываю что-так лучше.
12 дек 06, 04:06    [3521622]     Ответить | Цитировать Сообщить модератору
 Re: Сохранение  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
МашкоБ.В.
ВладимирМ

Хотя, сама концепция организации редактирования не очень хорошая. Слишком не очевидная.

Я полностью согласен . Но Программа пишется для диспетчира(женщина)45-50лет. И ей надо как было в старой DOS-программе , я чтобы ввести что-то новое более удобное полдня ей объясняю , показываю что-так лучше.

С моей точки зрения, простое решение для пользоватиеля - что ввел в Grid, то и записалось. Никаких "дурацких" вопросов и сообщений. Никаких "подсветок". Глупости это все. Никто на них внимания не обращает, особенно "45-50 лет".

С точки зрения пользователя, что он видит на экране, то и должно быть сохранено в таблице. Это логично и понятно. А когда начинается: нажмите эту клавишу, дождитесь сообщения, прочтите сообщение, примите решение - у пользователя голова кругом и он не знает что делать. Просто в ступор впадает.

Для этой логики все проще. В событии BeforRowColChange, если переход на другую строку (свойство InList(Grid.RowColChange,1,3)=.T. ), то просто предпринимаем попытку сброса буфера по TableUpdate() безо всяких "дурацких" вопросов. А вот если НЕ удалось сбросить буфер, то NODEFAULT и "плакат" с сообщением об ошибке.
12 дек 06, 12:01    [3523097]     Ответить | Цитировать Сообщить модератору
 Re: Сохранение  [new]
МашкоБ.В.
Member

Откуда: Минск
Сообщений: 131
[quot ВладимирМС моей точки зрения, простое решение для пользоватиеля - что ввел в Grid, то и записалось. Никаких "дурацких" вопросов и сообщений. Никаких "подсветок". Глупости это все. Никто на них внимания не обращает, особенно "45-50 лет".
Для этой логики все проще. В событии BeforRowColChange, если переход на другую строку (свойство InList(Grid.RowColChange,1,3)=.T. ), то просто предпринимаем попытку сброса буфера по TableUpdate() безо всяких "дурацких" вопросов. А вот если НЕ удалось сбросить буфер, то NODEFAULT и "плакат" с сообщением об ошибке.[/quot]
Наверное вы правы, если я правильно понял
то код должен быть таким
Grid.BeforRowColChange
LPARAMETERS nColIndex
if INLIST(thisform.grid1.RowColChange,1,3)=.T.
= TABLEUPDATE(0,.T.,"disp1")
thisform.grid1.Refresh
ELSE
MESSAGEBOX("ошибка")
ENDIF
endif

но текст не сохраняется,т.е. из буфера он исчезает. Не согли бы рассказать как правильно обрабатывать такие случаи.
Буду очень признателен.
12 дек 06, 12:56    [3523630]     Ответить | Цитировать Сообщить модератору
 Re: Сохранение  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Здесь та же проблема, что и в начальном вопросе. В событии BeforRowColChange() содержимое ячейки еще не переписано в буфер поля таблицы. Поэтому надо сделать это явно. Перенести код в AftreRowColChange() нельзя, поскольку в случае проблем сохранения надо будет блокировать выход из записи, а в AfterRowColChange() это делать уже поздно.

Код будет примерно таким

* Событие Grid.BeforRowColChange()
LPARAMETERS nColIndex
if INLIST(This.RowColChange,1,3)=.T. 

	* Запись текста из объекта в поле таблицы
	LOCAL lcFieldName
	lcFieldName = This.Columns(nColIndex).ControlSource
	if NOT This.Value == EVALUATE(m.lcFieldName)
		select disp1
		replace &lcFieldName with this.Value
	endif

	* Попытка сохранения
	if TABLEUPDATE(0,.T.,"disp1")=.F.
		NODEFAULT	&& запрет на выход из строки
		MessageBox('Ошибка')
	endif
endif

Разумеется, код достаточно условный, но, думаю, дальше доработаешь по месту.
12 дек 06, 14:00    [3524258]     Ответить | Цитировать Сообщить модератору
 Re: Сохранение  [new]
МашкоБ.В.
Member

Откуда: Минск
Сообщений: 131
ВладимирМ , большое вам спасибо за разъяснения и помощь.
12 дек 06, 16:47    [3525811]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить