
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
08.08.2006, 13:23
|
|||
|---|---|---|---|
Функция, обратная Thisform.Refresh() - есть такая ? |
|||
|
#18+
Предыстория, зачем мне это. Есть десяток форм с большой кучей полей в каждой. Все поля имеют в качестве ControlSource колонки алиасов, обновляемых на сервере по ODBC командой tableupdate(). Поля могут быть textbox, combobox, listbox, checkbox. Соответственно, у всех полей форм в свойстве ControlSource стоит, например, myalias.code1, а всякие другие свойства определяют, что отображается на экране. Например, для combobox может отображаться или код (то, чего записано в code1), или название по коду. Далее, юзер вводит новые значения в поля формы и сохраняет. Выдается команда tableupdate(), и если в ответ сервер СУБД возвращает ошибку (например, нарушения primary- или foreign-ключа, еще каких ограничений типа not null или срабатывания триггеров защиты на корректировку чужих записей), то выдается сообщение юзеру и команда tablerevert(). По tablerevert в alias значения становятся предыдущими (до их редактирования юзером), а в полях формы они пока остаются теми, что ввел юзер (и в каких-то значениях ошибся, к примеру). Если выдать команду thisform.refresh(), то все поля формы отобразят состояние alias до редактирования - и юзер должен будет все начинать сначала (даже если он откорректировал 20 полей, но ошибся в одной цифре). Если не выдать thisform.refresh(), то поля combobox и listbox начинают себя вести неправильно (в this.value у них одно - то, что ввел юзер, а в источнике - другое - старое значение). Tablerevert() после ошибки не выдавать нельзя - не пройдет следующий tableupdate(). Самое логичное здесь было бы выдать функцию, обратную thisform.refresh() - чтобы по ней в alias записались значения из полей формы с соблюдением типов данных и прочего. И тогда юзеру останется только исправить то, что он неправильно ввел и сохранить. Понятно, что можно в каждой форме писать длинные операторы replace code1 with thisform.TCode1.value, ... и в них заботиться о типах данных и прочей фигне. Но облом ! Ведь функция thisform.refresh() сама об этом заботится ! Так может есть такая функция (или готовая универсальная идея-реализация-подсказка) ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
08.08.2006, 13:38
|
|||
|---|---|---|---|
|
|||
Функция, обратная Thisform.Refresh() - есть такая ? |
|||
|
#18+
Есть идея: вызывать refresh только для комбо и листбоксов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
08.08.2006, 13:40
|
|||
|---|---|---|---|
|
|||
Функция, обратная Thisform.Refresh() - есть такая ? |
|||
|
#18+
Вариант 1 1.Ввод делать в локальный курсор 2.Обновлять на сервере 3.Анализировать ошибку/ выдавать сообщение / исправлять 4.если все ок обновлять курсор Вариант 2 (хотя и некрасивый) перед обновлением на клиенте проверять правильность заполнения, и уже потом обновлять на сервере. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
08.08.2006, 13:46
|
|||
|---|---|---|---|
Функция, обратная Thisform.Refresh() - есть такая ? |
|||
|
#18+
Как вариант: Непосредственно перед попыткой сброа буфера сохранить текущие данные через SCATTER MEMVAR После неудачного сброса и TableRevert() по новой прописать все данные через GATHER MEMVAR Можно сделать запись не через GATHER MEMVAR, а через цикл, чтобы не "портить" буфер теми данными, которые не изменились. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=41&mobile=1&tid=1591033]: |
0ms |
get settings: |
8ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
132ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
25ms |
get tp. blocked users: |
1ms |
| others: | 241ms |
| total: | 429ms |

| 0 / 0 |
