:: Visual Foxpro, Foxpro for DOS
Анализ на изменения полей в курсоре и сохранение. Помогите, плииз))
natashik319
Автор

Сообщений: 30
Дата регистрации: 16.05.2017
Есть таблица с буфером 5,из нее создаётся курсор и вы водится на грид. В гриде изменяю значения полей и обновляю курсор с помощью tableupdate.Далее нажимаю кнопку выход и должно вывестись сообщение, если были какие то изменения, сохранять ли эти изменения. Как сделать анализ и сохранить изменения в таблицу?
Ratings: 0 negative/0 positive
Re: Анализ на изменения полей в курсоре и сохранение. Помогите, плииз))
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
IF GETNEXTMODIFIED(0, "MyCursor") <> 0
* Есть в буфере несохранённые изменения

Обычно в QueryUnload прописывают (т.к. там через NODEFAULT можно даже "отменить" закрытие формы). QueryUnload вызывается при закрытии формы "крестиком". Если есть ещё и на самой форме кнопка - ну значит и в ней проверять (или вызвать тот же QueryUnload как метод - чтобы не дублировать код).

Только надо быть внимательным, чтобы не "подвешивать" всякие системные закрытия форм - например когда всё приложение закрывается (скажем винду "выключают") - в этих ситуациях следует работать без лишних вопросов - скорее всего просто отбросить молча несохранённые изменения и всё.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Анализ на изменения полей в курсоре и сохранение. Помогите, плииз))
Владимир Максимов

Сообщений: 14095
Откуда: Москва
Дата регистрации: 02.09.2000
Хм... "закат солнца вручную", конечно, сделать можно...

До вызова TableUpdate() проверить, были ли изменения в курсоре. Эти изменения скопировать в новый курсор и использовать его для переноса изменений в исходную таблицу. Для этого использовать следующие функции

GetNextModified() - найти запись после указанной, в буфере которой были изменения
GetFldState() - были ли изменения в полях одной текущей строки в текущем буфере

Примеры использования можете посмотреть как в справке по этим функциям, так и на данном форуме

Но вообще-то, лучше вместо ручного переноса: Таблица - Выборка - Буфер использовать штатные инструменты: класс CursorAdapter (появился в VFP8), а для младших версий - объект базы данных Local View

У этих объектов есть возможность настроить перенос изменений из курсора в исходную таблицу автоматически. Просто по команде TableUpdate()
Ratings: 0 negative/0 positive
Re: Анализ на изменения полей в курсоре и сохранение. Помогите, плииз))
natashik319
Автор

Сообщений: 30
Дата регистрации: 16.05.2017
Igor Korolyov
IF GETNEXTMODIFIED(0, "MyCursor") <> 0
* Есть в буфере несохранённые изменения

Обычно в QueryUnload прописывают (т.к. там через NODEFAULT можно даже "отменить" закрытие формы). QueryUnload вызывается при закрытии формы "крестиком". Если есть ещё и на самой форме кнопка - ну значит и в ней проверять (или вызвать тот же QueryUnload как метод - чтобы не дублировать код).

Только надо быть внимательным, чтобы не "подвешивать" всякие системные закрытия форм - например когда всё приложение закрывается (скажем винду "выключают") - в этих ситуациях следует работать без лишних вопросов - скорее всего просто отбросить молча несохранённые изменения и всё.
Не выходит, я же перед тем, как сделать сохранение в таблицу из курсора, этот курсор пересохраняю (tableupdate). Буфер сбрасывается, если я правильно поняла.
Ratings: 0 negative/0 positive
Re: Анализ на изменения полей в курсоре и сохранение. Помогите, плииз))
Crispy

Сообщений: 18571
Дата регистрации: 16.05.2005
Как показывает практика - любые сделанные изменения проще всего (и для пользователя в том числе) всегда сохранять тут же по умолчанию без всяких вопросов. По принципу: "сам знаешь, что правишь, сам и отвечаешь".
Грубо говоря, то же самое осуществлено например в Excel, и это вполне логично, что после правки там ячейки никто не спрашивает: "А вы уверены, что верно исправили?". Как мне сказал когда-то давно один пользователь, такие вопросы (в смысле в таких ситуациях) им лично всегда воспринимаются, как ехидные и издевательские.
Единственное, что обязан делать программист - установить максимально возможную проверку корректности каждого ввода.
Все остальное, как говорится, "от лукавого". И делается чаще по незнанию - у начинающих лишние вопросы сплошь и рядом. В реальных же программах "со стажем" - вопросов всегда минимум. Это намного ускоряет и упрощает работу с ними.


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)
Ratings: 0 negative/0 positive
Re: Анализ на изменения полей в курсоре и сохранение. Помогите, плииз))
natashik319
Автор

Сообщений: 30
Дата регистрации: 16.05.2017
Спасибо,поняла, о чем вы)) пойду штудировать информацию)
Ratings: 0 negative/0 positive
Re: Анализ на изменения полей в курсоре и сохранение. Помогите, плииз))
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
natashik319
Не выходит, я же перед тем, как сделать сохранение в таблицу из курсора, этот курсор пересохраняю (tableupdate). Буфер сбрасывается, если я правильно поняла.

Тогда более полно опиши что и как делаешь. Курсор - это не сама открытая dbf таблица? Тогда что - результат запроса? Но он вообще ни как не связан с исходными таблицами, тут Владимир значит угадал суть проблемы. Или локальное представление, или курсор порождённый курсорадаптером? Тогда вопрос в их настройках - что-то препятствует корректному переносу данных из курсора-представления в базовую таблицу...

Crispy
Грубо говоря, то же самое осуществлено например в Excel
Да, но в excel есть многоуровневый undo/redo, да и сам документ-книжка "сам по себе" не сохраняется. Так что там не проблема и отменить ошибочное действие, и вообще все "изменения" никуда не сохранять...
Впрочем, электронная таблица и БД штуки идеологически разные. И что хорошо в одном месте, слабо или вообще не применимо в другом.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Анализ на изменения полей в курсоре и сохранение. Помогите, плииз))
Crispy

Сообщений: 18571
Дата регистрации: 16.05.2005
При "закрытии по крестику" и прочих ситуациях следует еще не забывать такой момент.
А если свет тупо моргнет? Или вообще отключится. При отсутствии как правило всяческих ИБП (экономия же блин их, поскольку UPS как правило работают не больше пары лет, обычно их больше попросту не покупают).
Где тогда будут все старательно создаваемые диалоги и вопросы? ;) Не будем говорить в каком месте.
Поэтому всегда имеет смысл воспринимать момент "закрытие крестиком" и прочее - как то же отключение света.
Т.е. на этот момент все должно быть по умолчанию сохранено. И это бывает лучше всего - стараться сохранять всегда сразу же при занесении.
Этому учит обычный опыт. Без всяких красивых теоретизирований, тупо диктующий некие жесткие, порой даже жестокие, но годящиеся именно для наших (а не каких-нибудь идеальных американских) реалий, правила, следуя которым у тебя всегда будет намного больше шансов не иметь себе лишних проблем. Как говорится: Оно тебе надо - искать их для себя?
Отсюда и принцип - как можно меньше вопросов пользователю, как можно проще для него работа, и как можно выше надежность.
Т.е. в идеале например - не держать никогда длительно открытой ни одну таблицу. Считал-записал - и тут же закрыл. Для отображения же и прочей работы вполне достаточно и курсоров. Такая программа практически неубиваема и требует минимум сопровождения, в основном при необходимости каких-то новшеств.
В отличие от иных, которые время от времени виснут или не открываются по причине порчи таблиц.


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)
Ratings: 0 negative/1 positive
Re: Анализ на изменения полей в курсоре и сохранение. Помогите, плииз))
natashik319
Автор

Сообщений: 30
Дата регистрации: 16.05.2017
Сначала создавался курсор обычным криэйтом, затем в него заносились данные из таблицы. Решила делать, как вы написали, переношу данные реплейсом, открываю таблицу в броусе и изменения есть. Как только форма закрывается, то они пропадают.
Ratings: 0 negative/0 positive
Re: Анализ на изменения полей в курсоре и сохранение. Помогите, плииз))
Владимир Максимов

Сообщений: 14095
Откуда: Москва
Дата регистрации: 02.09.2000
natashik319
Сначала создавался курсор обычным криэйтом, затем в него заносились данные из таблицы. Решила делать, как вы написали, переношу данные реплейсом, открываю таблицу в броусе и изменения есть. Как только форма закрывается, то они пропадают.

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

Вам надо после всех команд Replace еще дать команду TableUpdate() на сохранение буфера в таблице

---------------------------------------
PS: Вам тут конечно, объяснят как правильно делать "закат солнца вручную", но стоит ли на собственном опыте искать все возможные "грабли"?

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

Пока не поздно, смиритесь с тем, что выбранный Вами способ реализации приложения не самый оптимальный. Надо переделывать ВСЮ работу с данными через CursorAdapter. Нет, разумеется, можно продолжать подставлять "костыли" под то, что Вы уже сделали. Но тогда смиритесь с тем, что проблемы будут возникать еще долго и в самых неожиданных местах...

Вкратце, что надо сделать

1. Все формы должны работать в Private DataSession.
2. Создать класс-наследник от CursorAdapter, который будет реализовывать выборку из Вашей таблицы и последующее сохранение внесенных в эту выборку изменений

Собственно, это почти все. Команда TableUpdate(), которая будет сохранять буфер курсора, созданного CursorAdapter автоматически перенесет изменения в таблицу-источник.



Исправлено 1 раз(а). Последнее : Владимир Максимов, 04.08.17 11:09
Ratings: 0 negative/0 positive
Re: Анализ на изменения полей в курсоре и сохранение. Помогите, плииз))
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
...


------------------




Исправлено 1 раз(а). Последнее : Аспид, 04.08.17 11:03
Ratings: 0 negative/0 positive
Re: Анализ на изменения полей в курсоре и сохранение. Помогите, плииз))
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Crispy
А если свет тупо моргнет?
А если монтировкой по голове
Нет смысла париться по поводу форсмажорных обстоятельств. Ну хорошо, поборешь ты "моргание света" - а поломку HDD? А налёт бандитов-хакеров крадущих компьютер? В общем глупости всё это.
Crispy
Поэтому всегда имеет смысл воспринимать момент "закрытие крестиком" и прочее - как то же отключение света.
Конечно же нет. На "закрытие крестиком" вполне можно отреагировать, при том вполне разумно. На отключение света или падение метеорита отреагировать нельзя.
Да, реагировать нужно "с умом". В частности нужно отделять ситуацию когда пользователь просто закрывает одно окошко (внутри программы, или саму программу) от ситуации когда он выключает компьютер (или даже не самолично пользователь, а система - по команде администратора, или по команде той же службы управления UPS-ом). В первом случае допустимо "задавать вопросы" - т.к. пользователь гарантированно сможет на них прореагировать. Ну от "особо тугого" пользователя - задавать вопрос в диалоге с таймаутом. Во втором случае всяческие "вопросы" исключаются - НО сами действия по корректному закрытию формы конечно же остаются! Можно попробовать и "сохранить" данные (хотя обычно это не будет правильным решением - тем более что далеко не всякое "текущее состояние данных в форме" корректно и МОЖЕТ быть сохранено в БД), можно просто всё отменить (это вообще проще всего - да и вполне логично).

Crispy
И это бывает лучше всего - стараться сохранять всегда сразу же при занесении.
Ага, именно опыт и показывает сколько г*на в БД вносят таким образом построенные приложения. Все эти тысячи пустых записей, пустые поля внешних ключей и дат, нулевые суммы и прочие радости. При том что такой подход ВЫНУЖДАЕТ отказаться от использования практически всех средств проверки в рамках СУБД. Т.к. для "сохранения сразу" нужно чтобы ничего не мешало - никакие "глупые правила" что сумма перевода должна быть больше нуля, или что ФИО сотрудника не может быть пустым.
Впрочем, каждый сам себе злой буратино - хочется лепить коников из @#$%^ - лепи


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Анализ на изменения полей в курсоре и сохранение. Помогите, плииз))
Владимир Максимов

Сообщений: 14095
Откуда: Москва
Дата регистрации: 02.09.2000
Igor Korolyov
Ага, именно опыт и показывает сколько г*на в БД вносят таким образом построенные приложения. Все эти тысячи пустых записей, пустые поля внешних ключей и дат, нулевые суммы и прочие радости. При том что такой подход ВЫНУЖДАЕТ отказаться от использования практически всех средств проверки в рамках СУБД. Т.к. для "сохранения сразу" нужно чтобы ничего не мешало - никакие "глупые правила" что сумма перевода должна быть больше нуля, или что ФИО сотрудника не может быть пустым.

Игорь, не начинай "holy war" Ты снова наступаешь на те же грабли: рассматриваешь совет с точки зрения той идеологии построения приложения, к которой ты привык.

При записи сразу в момент ввода существует своя концепция построения приложения. И не плохо себе существует. Вполне себе успешно и заметь, как-то обходятся без "тысячи пустых записей, пустые поля внешних ключей и дат, нулевые суммы и прочие радости"
Ratings: 0 negative/3 positive
Re: Анализ на изменения полей в курсоре и сохранение. Помогите, плииз))
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Не обходятся. Я таких систем не видел. И не вижу ни единого способа такую систему сделать даже теоретически - это два диаметрально противоположных требования. Сохранять любое г*но, и держать в БД исключительно корректные и непротиворечивые данные. Оба их удовлетворить попросту невозможно.

А что "успешно существуют" - ну да. Чего бы им не существовать то. В мире предостаточно всякого безобразия существует
Я такого г*на повидал предостаточно :puke: Хорошо когда не нужно работать напрямую с сей кучей мусора, а есть какой-никакой программный интерфейс для извлечения нужных данных, и все проблемы отделения г*на от данных решает автор "чуда" (и несёт полную ответственность за те данные, которые подаёт). А когда нет - ну просто хочется чтобы автор убил себя ап стену, или выпил йаду и более никому и никогда нервы не портил своими гениальными творениями


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Анализ на изменения полей в курсоре и сохранение. Помогите, плииз))
LUCIAN

Сообщений: 343
Откуда: Лида Беларусь
Дата регистрации: 25.03.2008
Создал и использую такой класс на базе курсорадаптера
**************************************************
*-- Class: crad (k:\u76\office.vcx)
*-- ParentClass: cursoradapter
*-- BaseClass: cursoradapter
*-- Time Stamp: 11/09/15 12:22:08 PM
*
DEFINE CLASS crad AS cursoradapter
Tag = ""
Height = 22
Width = 23
UseDeDataSource = .T.
Alias = "cursor1"
BufferModeOverride = 5
DataSource = ""
DataSourceType = "Native"
Flags = 0
KeyFieldList = ""
UpdatableFieldList = ""
UpdateNameList = ""
datn = (GOMONTH(DATE()-DAY(DATE())+1,-MONTH(DATE())+1))
datk = (DATE())
op = .F.
post = .F.
scet = .F.
val = .F.
id_u76 = .F.
id_trb = .F.
n_dok = .F.
PROCEDURE soxr
LOCAL NZ
if NOT tableupdate(1,.T.,This.Alias)
aerror(lArr)
messagebox(lArr(2))
ELSE
NZ=RECNO(This.Alias)
IF NZ>0 AND RECCOUNT(This.Alias)>0
GO MIN(NZ,RECCOUNT(This.Alias)) IN (This.Alias)
ENDIF
ENDIF
ENDPROC
** ПРОВЕРКА НА ИЗМЕНЕНИЯ
PROCEDURE pr_kor
IF THIS.SendUpdates AND USED(This.Alias) AND NOT EMPTY(THIS.UpdatableFieldList) AND NOT EMPTY(THIS.KeyFieldList)
SELECT (This.Alias)
LOCAL lnCurRec,I
lnCurRec = GETNEXTMODIFIED(0)
DO WHILE m.lnCurRec > 0
* Переход к измененной записи
GOTO (m.lnCurRec)
IF DELETED()
m.lnCurRec = -1
EXIT
ENDIF
FOR I=1 TO FCOUNT(This.Alias)
IF OLDVAL(FIELD(I),This.Alias) <> EVALUATE(RTRIM(This.Alias)+'.'+FIELD(I))
m.lnCurRec = -1
EXIT
ENDIF
ENDFOR
IF m.lnCurRec > 0
lnCurRec = GETNEXTMODIFIED(m.lnCurRec)
ENDIF
ENDDO
IF m.lnCurRec < 0
IF 6=MESSAGEBOX("Изменения сохранить",32+0+4,"Производилась корректировка таблицы "+This.Alias)
THIS.SOXR
ELSE
THIS.OTMENA
ENDIF
ENDIF
ENDIF
ENDPROC
PROCEDURE otmena
LOCAL NZ
NZ=RECNO(This.Alias)
tablerevert(.T.,This.Alias)
IF NZ>0 AND RECCOUNT(This.Alias)>0
GO MIN(NZ,RECCOUNT(This.Alias)) IN (This.Alias)
ENDIF
ENDPROC
PROCEDURE BeforeCursorClose
LPARAMETERS cAlias
THIS.PR_KOR
ENDPROC
PROCEDURE BeforeCursorFill
LPARAMETERS luseCursorSchema, lNoDataOnLoad, cSelectCmd
THIS.PR_KOR
ENDPROC
PROCEDURE BeforeCursorRefresh
LPARAMETERS cSelectCmd
THIS.PR_KOR
ENDPROC
PROCEDURE calc
ENDPROC
ENDDEFINE
Ratings: 0 negative/0 positive
Re: Анализ на изменения полей в курсоре и сохранение. Помогите, плииз))
spinz

Сообщений: 5263
Дата регистрации: 21.01.2016
Igor Korolyov
Только надо быть внимательным, чтобы не "подвешивать" всякие системные закрытия форм - например когда всё приложение закрывается (скажем винду "выключают") - в этих ситуациях следует работать без лишних вопросов - скорее всего просто отбросить молча несохранённые изменения и всё.

Может имеет смысл (пытаться) в подобных аварийных случаях тупо сохранять в какую-то таблиц(у,ы) внесенные изменения, чтобы юзер мог после ребута хотя бы увидеть что он там навводил?
Ratings: 0 negative/0 positive
Re: Анализ на изменения полей в курсоре и сохранение. Помогите, плииз))
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Ну ворд/эксель так примерно и делают - после аварийного выхода предлагают "восстановить предыдущую работу" - но для типичной работы с БД я такой надобности не вижу. Если ты вводишь 100500 записей не сохраняя ни единой (и, попутно, не проверяя их на корректность), то ты что-то делаешь не так. А "потеря" одной текущей недовведенной "накладной", пусть там и будет 20 строк - не критична (конечно же если подобный форс-мажор не происходит по 100 раз на день).


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Анализ на изменения полей в курсоре и сохранение. Помогите, плииз))
Божья_коровка

Сообщений: 25720
Дата регистрации: 23.08.2001
spinz
Igor Korolyov
Только надо быть внимательным, чтобы не "подвешивать" всякие системные закрытия форм - например когда всё приложение закрывается (скажем винду "выключают") - в этих ситуациях следует работать без лишних вопросов - скорее всего просто отбросить молча несохранённые изменения и всё.

Может имеет смысл (пытаться) в подобных аварийных случаях тупо сохранять в какую-то таблиц(у,ы) внесенные изменения, чтобы юзер мог после ребута хотя бы увидеть что он там навводил?
В моем приложении такая фигня есть, данные сохраняются в дбфки с "уникальным наименованием" которые не удаляются, данные из них не записываются при этом в оракловую БД с которой работает приложение...Это как аварийный вариант. Чёт я не вижу особых плюсов в таком построении, эти гадские дбфки копятся их приходится удалять руками.


------------------
Жись, она как зёбра, полоса белая, полоса черная, а мне всегда задница достается...




Исправлено 1 раз(а). Последнее : Божья_коровка, 04.08.17 16:35
Ratings: 0 negative/0 positive
Re: Анализ на изменения полей в курсоре и сохранение. Помогите, плииз))
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
Божья_коровка
Чёт я не вижу особых плюсов в таком построении,
+100500
:beer2:


------------------
Ratings: 0 negative/0 positive
Re: Анализ на изменения полей в курсоре и сохранение. Помогите, плииз))
Владимир Максимов

Сообщений: 14095
Откуда: Москва
Дата регистрации: 02.09.2000
Igor Korolyov
Не обходятся. Я таких систем не видел. И не вижу ни единого способа такую систему сделать даже теоретически - это два диаметрально противоположных требования. Сохранять любое г*но, и держать в БД исключительно корректные и непротиворечивые данные. Оба их удовлетворить попросту невозможно.

Все-таки не утерпел. Начал

Две аксиомы

1. Качество приложения (код, данные, интерфейс и т.д. и т.п.) никак, никоим образом, не зависит от принятой идеологии работы с данными.

2. Любая идея доведенная до своего логического завершения становится абсурдной

-----------------------

Ты опять думаешь о чем-то своем. Сугубо личном. Вот с чего ты решил, что требование немедленного сохранения означает ОТСУТСТВИЕ контроля корректности данных? Вот с чего ты решил, что если ослабить контроль корректность в момент сохранения, то нельзя будет выполнить контроль корректности ПОТОМ? Вот с чего ты решил, что нельзя разделить данные на предварительные и окончательные? Создавать как "Заявку" (черновик с "мусорными" данными), так и "Заказ" (окончательный документ, созданный на основе данных черновика)

Это так, тезисно. Чтобы было понятно, что система с "немедленным" сохранением очень даже возможна и вполне себе будет содержать корректные и не противоречивые данные. "Мусор", конечно, будет. Но он будет занимать строго отведенное ему место

Для меня кажется странным запретить немедленное сохранение при вводе документа на 100500+ строк. Как в таких условиях работать-то? Это сутками не есть не спать, вводить ОДИН документ? Глупость какая-то!
Ratings: 0 negative/2 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 27 alex; OlegA  (Гостей: 25)

© 2000-2024 Fox Club 
Яндекс.Метрика