Страница 1 из 2
Просмотр или изменение в форме
Добавлено: 22 Январь 2008, 9:53
NewUser
Не подскажет ли кто, как узнать следующее.
Имеется:
1. С6.3 АВС
2. Form, вызванная из Browse
3. Пользователь жмет на OK
Как узнать, были внесены изменения или был просто просмотр данных?
Заранее благодарен.
Добавлено: 22 Январь 2008, 10:24
Дед Пахом
можно при входе в форму сохранить File:Record, а при OK сравнить с текущим.
Добавлено: 22 Январь 2008, 10:43
NewUser
Это первое, что пришло в голову. Cохранить я пытался в структуру:
SaveRecord Like(PRE:Record)
SaveRecord :=: PRE:Record
И при выходе из формы по ОК:
IF SaveRecord <> PRE:Record then …. .
Не срабатывает.
Хэлп же поведал мне о следующем:
«…Если существующая метка представляет структуру QUEUE, то оператор LIKE не создает новую структуру QUEUE, поскольку новая метка рассматривается просто как структура GROUP. Это справедливо и для случая, когда существующая метка представляет структуру RECORD….»
Добавлено: 22 Январь 2008, 14:00
lsgsoftware
Я что-то не понял.При нажатии ОК мы же возвращаемся в бровз и ты увидишь изменения.Если тебя интересует, записались ли данные на диск или остались в кэше винды, то это та еще проблема, которая явного решения не имеет.На клашины средства принудительного сброса типа flush NT-подобные версии винды плюют. Такая чехарда иногда может приводить к очень серьезным ошибкам, что у меня было и выходить из положения пришлось путем муторного ручного кода.
Добавлено: 22 Январь 2008, 14:32
NewUser
Задача следующая:
При нажатии пользователем на ОК в форме, программный код должен анализировать, были ли произведены изменения в форме или просто пользователь нажал на ОК, не внося изменений в поля формы.
Вот как это реализовать, просто и надежно – я и спрашивал.
Ощущаются два варианта:
1. Сохранить при входе в форму значение PRE:Record а при нажатии на ОК – проанализировать изменения.
2. Воспользоваться стандартными (если таковы имеются в АВС) средствами отслеживания данного события.
Добавлено: 22 Январь 2008, 16:08
Дед Пахом
А в ABC вроде уже такой код проверки есть, по крайней мере похоже:
Код: Выделить всё
UnChanged = SELF.Primary.Me.EqualBuffer(SELF.Saved)
IF UnChanged
Error = 0
ELSE
Error = SELF.Primary.Update(CHOOSE(SELF.HistoryKey))
END
Добавлено: 22 Январь 2008, 16:22
NewUser
Да, совсем вылетела из головы History-структура:
IF PRE:Record <> History::PRE:Record Then … . – работает!
Но! Для имеющихся уже записей, при ПЕРВОМ открытии по ним формы и закрытии ее без изменений по ОК, выше приведенное условие дает истину! Почему? Далее – все нормально. Истина – только при изменении в полях формы. Но при первом входе-выходе…
Добавлено: 22 Январь 2008, 16:31
NewUser
Что-то не нашел я даже похожий код в форме
Дед Пахом писал(а):
Код: Выделить всё
UnChanged = SELF.Primary.Me.EqualBuffer(SELF.Saved)
IF UnChanged
Error = 0
ELSE
Error = SELF.Primary.Update(CHOOSE(SELF.HistoryKey))
END
Добавлено: 22 Январь 2008, 17:07
Дед Пахом
ABWINDOW.CLW
Добавлено: 22 Январь 2008, 17:26
NewUser
Для решения данной задачи остановился на следующем:
1. При открытии окна: History::PRE:Record :=: PRE:Record
2. При нажании на ОК : IF PRE:Record <> History::PRE:Record Then ... .
Все работает.
Всем огромное спасибо!
Добавлено: 22 Январь 2008, 17:30
NewUser
Дед Пахом писал(а):ABWINDOW.CLW
Выше приведенный код, на сколько я понял, относится к
WindowManager.SaveOnChangeAction, который в свою очередь отноститься к EIP?
Добавлено: 22 Январь 2008, 18:04
Дед Пахом
а, не знаю, к чему он относится, просто я увидел, что там есть механизм проверки, изменилась запись или нет. У WM Self.Saved определяет сохранённый буфер записи, а File.EqualBuffer сравнивает его с текущим.
Добавлено: 23 Январь 2008, 20:17
Олег
Что-ты вы, коллеги, долго спорите о простейших вещах!
Подобная проверка УЖЕ встроена в ЛЮБЫЕ шаблоны.
В частности, в ШВС, если изменений полей primary-файла не было, то при любом выходе из формы всегда будет LocalResponse = RequestCancelled.
В ABC, судя по всему, аналогичная ситуация.
Что до предложения сохранять буфер файла и проверять его перед выходом, то следует ПРАВИЛЬНО выбрать место сохранения буфера файла. Ведь поля могут дополнительно изменятся еще до открытия окна формы в точках вставки. Если сохранить буфер до этих точек, то при закрытии формы проверка может показать True, даже если сам оператор ничего не изменил!
NewUser писал(а):Хэлп же поведал мне о следующем:
«…Если существующая метка представляет структуру QUEUE, то оператор LIKE не создает новую структуру QUEUE, поскольку новая метка рассматривается просто как структура GROUP. Это справедливо и для случая, когда существующая метка представляет структуру RECORD….»
А это тут при чем?! Ты же берешь за основу обычную группу а не очередь. И сравниваешь поля групп а не записи очередей.
Добавлено: 23 Январь 2008, 22:45
NewUser
Олег писал(а):... в ШВС, если изменений полей primary-файла не было, то при любом выходе из формы всегда будет LocalResponse = RequestCancelled.
В ABC, судя по всему, аналогичная ситуация.
Что-то я не нашел данную аналогию в АВС. Там (в форме), если я правильно понял, RequestCancelled возвращается в том случае, если пользователь нажал или на Cancel, или Esc или на крестик в правом верхнем углу окна.
А это тут при чем?! Ты же берешь за основу обычную группу а не очередь. И сравниваешь поля групп а не записи очередей.
Тогда прошу продолжить лекбез.
Что здесь не правильно:
SaveRecord Like(PRE:Record)
SaveRecord :=: PRE:Record
И при выходе из формы по ОК:
IF SaveRecord <> PRE:Record then …. .
Почему не заработала данная конструкция?
Добавлено: 24 Январь 2008, 1:37
Олег
А кто сказал сказал, что она не заработала?!
Я же писал: главное - правильно найти точку вставки оператора SaveRecord = PRE:Record! Кстати, делать в данном случае :=: не нужно - по определению структуры обеих групп идентичны. И "глубокое присваивание" лишь замедлит выполнение.
К тому-же, как я писал уже давно в рассылке ClaList, в алгоритме "глубокого присваивания" есть ошибка - оно не корректно обрабатывает случаи наличия в группе подгрупп с одинаковыми полями. Правда, в данном случае этого не может быть - файл имеет префикс, поэтому компилятор предупредит о дублировании имен полей.
А сохранять буфер файла лучше всего в конце кода инициализации, непосредственно перед входом в ACCEPT-цикл. Если, конечно, по событию EVENT:OpenWindow не производится инициализация полей файла.
Вообщем, имхо - ошибка не в самой технологии, а в неправильном ее использовании!