Анализ на изменения полей в курсоре и сохранение. Помогите, плииз)) | |
---|---|
natashik319 Автор Сообщений: 30 Дата регистрации: 16.05.2017 |
Есть таблица с буфером 5,из нее создаётся курсор и вы водится на грид. В гриде изменяю значения полей и обновляю курсор с помощью tableupdate.Далее нажимаю кнопку выход и должно вывестись сообщение, если были какие то изменения, сохранять ли эти изменения. Как сделать анализ и сохранить изменения в таблицу?
|
Re: Анализ на изменения полей в курсоре и сохранение. Помогите, плииз)) | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Обычно в QueryUnload прописывают (т.к. там через NODEFAULT можно даже "отменить" закрытие формы). QueryUnload вызывается при закрытии формы "крестиком". Если есть ещё и на самой форме кнопка - ну значит и в ней проверять (или вызвать тот же QueryUnload как метод - чтобы не дублировать код). Только надо быть внимательным, чтобы не "подвешивать" всякие системные закрытия форм - например когда всё приложение закрывается (скажем винду "выключают") - в этих ситуациях следует работать без лишних вопросов - скорее всего просто отбросить молча несохранённые изменения и всё. ------------------ WBR, Igor |
Re: Анализ на изменения полей в курсоре и сохранение. Помогите, плииз)) | |
---|---|
Владимир Максимов Сообщений: 14095 Откуда: Москва Дата регистрации: 02.09.2000 |
Хм... "закат солнца вручную", конечно, сделать можно...
До вызова TableUpdate() проверить, были ли изменения в курсоре. Эти изменения скопировать в новый курсор и использовать его для переноса изменений в исходную таблицу. Для этого использовать следующие функции GetNextModified() - найти запись после указанной, в буфере которой были изменения GetFldState() - были ли изменения в полях одной текущей строки в текущем буфере Примеры использования можете посмотреть как в справке по этим функциям, так и на данном форуме Но вообще-то, лучше вместо ручного переноса: Таблица - Выборка - Буфер использовать штатные инструменты: класс CursorAdapter (появился в VFP8), а для младших версий - объект базы данных Local View У этих объектов есть возможность настроить перенос изменений из курсора в исходную таблицу автоматически. Просто по команде TableUpdate() |
Re: Анализ на изменения полей в курсоре и сохранение. Помогите, плииз)) | |
---|---|
natashik319 Автор Сообщений: 30 Дата регистрации: 16.05.2017 |
Не выходит, я же перед тем, как сделать сохранение в таблицу из курсора, этот курсор пересохраняю (tableupdate). Буфер сбрасывается, если я правильно поняла. |
Re: Анализ на изменения полей в курсоре и сохранение. Помогите, плииз)) | |
---|---|
Crispy Сообщений: 18571 Дата регистрации: 16.05.2005 |
Как показывает практика - любые сделанные изменения проще всего (и для пользователя в том числе) всегда сохранять тут же по умолчанию без всяких вопросов. По принципу: "сам знаешь, что правишь, сам и отвечаешь".
Грубо говоря, то же самое осуществлено например в Excel, и это вполне логично, что после правки там ячейки никто не спрашивает: "А вы уверены, что верно исправили?". Как мне сказал когда-то давно один пользователь, такие вопросы (в смысле в таких ситуациях) им лично всегда воспринимаются, как ехидные и издевательские. Единственное, что обязан делать программист - установить максимально возможную проверку корректности каждого ввода. Все остальное, как говорится, "от лукавого". И делается чаще по незнанию - у начинающих лишние вопросы сплошь и рядом. В реальных же программах "со стажем" - вопросов всегда минимум. Это намного ускоряет и упрощает работу с ними. ------------------ В действительности все иначе, чем на самом деле. (Антуан де Сент-Экзюпери) |
Re: Анализ на изменения полей в курсоре и сохранение. Помогите, плииз)) | |
---|---|
natashik319 Автор Сообщений: 30 Дата регистрации: 16.05.2017 |
Спасибо,поняла, о чем вы)) пойду штудировать информацию)
|
Re: Анализ на изменения полей в курсоре и сохранение. Помогите, плииз)) | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Тогда более полно опиши что и как делаешь. Курсор - это не сама открытая dbf таблица? Тогда что - результат запроса? Но он вообще ни как не связан с исходными таблицами, тут Владимир значит угадал суть проблемы. Или локальное представление, или курсор порождённый курсорадаптером? Тогда вопрос в их настройках - что-то препятствует корректному переносу данных из курсора-представления в базовую таблицу... Да, но в excel есть многоуровневый undo/redo, да и сам документ-книжка "сам по себе" не сохраняется. Так что там не проблема и отменить ошибочное действие, и вообще все "изменения" никуда не сохранять... Впрочем, электронная таблица и БД штуки идеологически разные. И что хорошо в одном месте, слабо или вообще не применимо в другом. ------------------ WBR, Igor |
Re: Анализ на изменения полей в курсоре и сохранение. Помогите, плииз)) | |
---|---|
Crispy Сообщений: 18571 Дата регистрации: 16.05.2005 |
При "закрытии по крестику" и прочих ситуациях следует еще не забывать такой момент.
А если свет тупо моргнет? Или вообще отключится. При отсутствии как правило всяческих ИБП (экономия же блин их, поскольку UPS как правило работают не больше пары лет, обычно их больше попросту не покупают). Где тогда будут все старательно создаваемые диалоги и вопросы? ;) Не будем говорить в каком месте. Поэтому всегда имеет смысл воспринимать момент "закрытие крестиком" и прочее - как то же отключение света. Т.е. на этот момент все должно быть по умолчанию сохранено. И это бывает лучше всего - стараться сохранять всегда сразу же при занесении. Этому учит обычный опыт. Без всяких красивых теоретизирований, тупо диктующий некие жесткие, порой даже жестокие, но годящиеся именно для наших (а не каких-нибудь идеальных американских) реалий, правила, следуя которым у тебя всегда будет намного больше шансов не иметь себе лишних проблем. Как говорится: Оно тебе надо - искать их для себя? Отсюда и принцип - как можно меньше вопросов пользователю, как можно проще для него работа, и как можно выше надежность. Т.е. в идеале например - не держать никогда длительно открытой ни одну таблицу. Считал-записал - и тут же закрыл. Для отображения же и прочей работы вполне достаточно и курсоров. Такая программа практически неубиваема и требует минимум сопровождения, в основном при необходимости каких-то новшеств. В отличие от иных, которые время от времени виснут или не открываются по причине порчи таблиц. ------------------ В действительности все иначе, чем на самом деле. (Антуан де Сент-Экзюпери) |
Re: Анализ на изменения полей в курсоре и сохранение. Помогите, плииз)) | |
---|---|
natashik319 Автор Сообщений: 30 Дата регистрации: 16.05.2017 |
Сначала создавался курсор обычным криэйтом, затем в него заносились данные из таблицы. Решила делать, как вы написали, переношу данные реплейсом, открываю таблицу в броусе и изменения есть. Как только форма закрывается, то они пропадают.
|
Re: Анализ на изменения полей в курсоре и сохранение. Помогите, плииз)) | |
---|---|
Владимир Максимов Сообщений: 14095 Откуда: Москва Дата регистрации: 02.09.2000 |
Это означает, что таблица буферизирована. Находится в режиме табличной буферизации. В этом случае, закрытие таблицы (автоматическое, при закрытии формы) означает потерю всех данных, которые успели занести в буфер Вам надо после всех команд Replace еще дать команду TableUpdate() на сохранение буфера в таблице --------------------------------------- PS: Вам тут конечно, объяснят как правильно делать "закат солнца вручную", но стоит ли на собственном опыте искать все возможные "грабли"? В общем случае, надо сделать много разных "телодвижений". Ведь, например, надо учесть, что изменения в буфере таблицы могут быть сделаны в другой форме. Т.е. надо сохранить только те изменения, которые сделаны в текущей форме, но не трогать тех изменений буфера, которые сделаны в другой форме. Пока не поздно, смиритесь с тем, что выбранный Вами способ реализации приложения не самый оптимальный. Надо переделывать ВСЮ работу с данными через CursorAdapter. Нет, разумеется, можно продолжать подставлять "костыли" под то, что Вы уже сделали. Но тогда смиритесь с тем, что проблемы будут возникать еще долго и в самых неожиданных местах... Вкратце, что надо сделать 1. Все формы должны работать в Private DataSession. 2. Создать класс-наследник от CursorAdapter, который будет реализовывать выборку из Вашей таблицы и последующее сохранение внесенных в эту выборку изменений Собственно, это почти все. Команда TableUpdate(), которая будет сохранять буфер курсора, созданного CursorAdapter автоматически перенесет изменения в таблицу-источник. Исправлено 1 раз(а). Последнее : Владимир Максимов, 04.08.17 11:09 |
Re: Анализ на изменения полей в курсоре и сохранение. Помогите, плииз)) | |
---|---|
Аспид Сообщений: 3475 Откуда: Москва Дата регистрации: 01.04.2005 |
...
------------------ Исправлено 1 раз(а). Последнее : Аспид, 04.08.17 11:03 |
Re: Анализ на изменения полей в курсоре и сохранение. Помогите, плииз)) | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
А если монтировкой по голове Нет смысла париться по поводу форсмажорных обстоятельств. Ну хорошо, поборешь ты "моргание света" - а поломку HDD? А налёт бандитов-хакеров крадущих компьютер? В общем глупости всё это. Конечно же нет. На "закрытие крестиком" вполне можно отреагировать, при том вполне разумно. На отключение света или падение метеорита отреагировать нельзя. Да, реагировать нужно "с умом". В частности нужно отделять ситуацию когда пользователь просто закрывает одно окошко (внутри программы, или саму программу) от ситуации когда он выключает компьютер (или даже не самолично пользователь, а система - по команде администратора, или по команде той же службы управления UPS-ом). В первом случае допустимо "задавать вопросы" - т.к. пользователь гарантированно сможет на них прореагировать. Ну от "особо тугого" пользователя - задавать вопрос в диалоге с таймаутом. Во втором случае всяческие "вопросы" исключаются - НО сами действия по корректному закрытию формы конечно же остаются! Можно попробовать и "сохранить" данные (хотя обычно это не будет правильным решением - тем более что далеко не всякое "текущее состояние данных в форме" корректно и МОЖЕТ быть сохранено в БД), можно просто всё отменить (это вообще проще всего - да и вполне логично). Ага, именно опыт и показывает сколько г*на в БД вносят таким образом построенные приложения. Все эти тысячи пустых записей, пустые поля внешних ключей и дат, нулевые суммы и прочие радости. При том что такой подход ВЫНУЖДАЕТ отказаться от использования практически всех средств проверки в рамках СУБД. Т.к. для "сохранения сразу" нужно чтобы ничего не мешало - никакие "глупые правила" что сумма перевода должна быть больше нуля, или что ФИО сотрудника не может быть пустым. Впрочем, каждый сам себе злой буратино - хочется лепить коников из @#$%^ - лепи ------------------ WBR, Igor |
Re: Анализ на изменения полей в курсоре и сохранение. Помогите, плииз)) | |
---|---|
Владимир Максимов Сообщений: 14095 Откуда: Москва Дата регистрации: 02.09.2000 |
Игорь, не начинай "holy war" Ты снова наступаешь на те же грабли: рассматриваешь совет с точки зрения той идеологии построения приложения, к которой ты привык. При записи сразу в момент ввода существует своя концепция построения приложения. И не плохо себе существует. Вполне себе успешно и заметь, как-то обходятся без "тысячи пустых записей, пустые поля внешних ключей и дат, нулевые суммы и прочие радости" |
Re: Анализ на изменения полей в курсоре и сохранение. Помогите, плииз)) | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Не обходятся. Я таких систем не видел. И не вижу ни единого способа такую систему сделать даже теоретически - это два диаметрально противоположных требования. Сохранять любое г*но, и держать в БД исключительно корректные и непротиворечивые данные. Оба их удовлетворить попросту невозможно.
А что "успешно существуют" - ну да. Чего бы им не существовать то. В мире предостаточно всякого безобразия существует Я такого г*на повидал предостаточно :puke: Хорошо когда не нужно работать напрямую с сей кучей мусора, а есть какой-никакой программный интерфейс для извлечения нужных данных, и все проблемы отделения г*на от данных решает автор "чуда" (и несёт полную ответственность за те данные, которые подаёт). А когда нет - ну просто хочется чтобы автор убил себя ап стену, или выпил йаду и более никому и никогда нервы не портил своими гениальными творениями ------------------ WBR, Igor |
Re: Анализ на изменения полей в курсоре и сохранение. Помогите, плииз)) | |
---|---|
LUCIAN Сообщений: 343 Откуда: Лида Беларусь Дата регистрации: 25.03.2008 |
Создал и использую такой класс на базе курсорадаптера
|
Re: Анализ на изменения полей в курсоре и сохранение. Помогите, плииз)) | |
---|---|
spinz Сообщений: 5263 Дата регистрации: 21.01.2016 |
Может имеет смысл (пытаться) в подобных аварийных случаях тупо сохранять в какую-то таблиц(у,ы) внесенные изменения, чтобы юзер мог после ребута хотя бы увидеть что он там навводил? |
Re: Анализ на изменения полей в курсоре и сохранение. Помогите, плииз)) | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Ну ворд/эксель так примерно и делают - после аварийного выхода предлагают "восстановить предыдущую работу" - но для типичной работы с БД я такой надобности не вижу. Если ты вводишь 100500 записей не сохраняя ни единой (и, попутно, не проверяя их на корректность), то ты что-то делаешь не так. А "потеря" одной текущей недовведенной "накладной", пусть там и будет 20 строк - не критична (конечно же если подобный форс-мажор не происходит по 100 раз на день).
------------------ WBR, Igor |
Re: Анализ на изменения полей в курсоре и сохранение. Помогите, плииз)) | |
---|---|
Божья_коровка Сообщений: 25720 Дата регистрации: 23.08.2001 |
В моем приложении такая фигня есть, данные сохраняются в дбфки с "уникальным наименованием" которые не удаляются, данные из них не записываются при этом в оракловую БД с которой работает приложение...Это как аварийный вариант. Чёт я не вижу особых плюсов в таком построении, эти гадские дбфки копятся их приходится удалять руками. ------------------ Жись, она как зёбра, полоса белая, полоса черная, а мне всегда задница достается... Исправлено 1 раз(а). Последнее : Божья_коровка, 04.08.17 16:35 |
Re: Анализ на изменения полей в курсоре и сохранение. Помогите, плииз)) | |
---|---|
Аспид Сообщений: 3475 Откуда: Москва Дата регистрации: 01.04.2005 |
+100500 ------------------ |
Re: Анализ на изменения полей в курсоре и сохранение. Помогите, плииз)) | |
---|---|
Владимир Максимов Сообщений: 14095 Откуда: Москва Дата регистрации: 02.09.2000 |
Все-таки не утерпел. Начал Две аксиомы 1. Качество приложения (код, данные, интерфейс и т.д. и т.п.) никак, никоим образом, не зависит от принятой идеологии работы с данными. 2. Любая идея доведенная до своего логического завершения становится абсурдной ----------------------- Ты опять думаешь о чем-то своем. Сугубо личном. Вот с чего ты решил, что требование немедленного сохранения означает ОТСУТСТВИЕ контроля корректности данных? Вот с чего ты решил, что если ослабить контроль корректность в момент сохранения, то нельзя будет выполнить контроль корректности ПОТОМ? Вот с чего ты решил, что нельзя разделить данные на предварительные и окончательные? Создавать как "Заявку" (черновик с "мусорными" данными), так и "Заказ" (окончательный документ, созданный на основе данных черновика) Это так, тезисно. Чтобы было понятно, что система с "немедленным" сохранением очень даже возможна и вполне себе будет содержать корректные и не противоречивые данные. "Мусор", конечно, будет. Но он будет занимать строго отведенное ему место Для меня кажется странным запретить немедленное сохранение при вводе документа на 100500+ строк. Как в таких условиях работать-то? Это сутками не есть не спать, вводить ОДИН документ? Глупость какая-то! |
© 2000-2024 Fox Club  |