C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Как получить строку введённую пользователем?
krecha
Отправлено: 29.07.2004, 21:30


Не зарегистрирован







Пользователь вводит строку заведомо находящуюся в базе днных. Как можно получить (расрзнать то что он ввёл) эту строку?
olegenty
Отправлено: 30.07.2004, 06:49


Ветеран

Группа: Модератор
Сообщений: 2412



фоновым запросом поискать в соответствующем поле. других вариантов нет, по-моему. smile.gif
AVC
Отправлено: 30.07.2004, 08:08


Ветеран

Группа: Модератор
Сообщений: 1583



Согласен с olegenty. Только поиском по базе. В исключительном случае (с таким запросом работает только один пользователь и ВСЕ записи находятся на стороне клиента) можно искать по DataSet.
Обычно это является правилом целостности и возлагается на сервер БД (constraint, trigger или unique index)
olegenty
Отправлено: 30.07.2004, 08:57


Ветеран

Группа: Модератор
Сообщений: 2412



целостность-то возлагается, но вот простой аргумент заказчика:
- зачем мне вводить ВСЕ поля, и после попытки записи видеть сообщение об ошибке, если после ввода значения в данное поле УЖЕ известно, что запись не пройдёт (или мне нужна дополнительная информация).

приходится писать всякие CheckFieldExists и т.д. :-)

думаю, все с этим сталкивались. да и пользователь-заказчик в этом случае прав.
AVC
Отправлено: 30.07.2004, 09:21


Ветеран

Группа: Модератор
Сообщений: 1583



Во первых я не против фонового запроса.
Во вторых
QUOTE
зачем мне вводить ВСЕ поля, и после попытки записи видеть сообщение об ошибке, если после ввода значения в данное поле УЖЕ известно, что запись не пройдёт

Я стараюсь централизировать бизнес правила на сервере и освобождать от сложных проверок клиента. Это позволят легко перенастраивать систему без обновления клиентов. Поэтому только сервер является высшим арбитром по допустимости данных и только он может отвергнуть запрос. Если запрос отвергнут я обычно возвращаюсь в режим редактирования для исправления ошибок.
У меня хватит фантазии придумать ситуацию, когда фоновый запрос будет выполняться минуты или больше.
Такие проверки как правило нужны в справочниках т.е. простых таблицах типа ID, Name а там и повторить ввод не зазорно. В сложных таблицах уникальность одного поля обычно роли не играет.
Ни когда не использую типа CheckFieldExists.
olegenty
Отправлено: 30.07.2004, 09:27


Ветеран

Группа: Модератор
Сообщений: 2412



насчёт вернуть поля для редактирования — я не подумал, это ты безоговорочно прав. а насчёт Check... вопрос интерфейса пользователя, который хочет видеть заказчик. другого способа вытягивать дополнительную инфу (история изменения конструкторской документации по коду изделия) я не нашел...
AVC
Отправлено: 30.07.2004, 09:38


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE

насчёт Check... другого способа вытягивать дополнительную инфу (история изменения конструкторской документации по коду изделия) я не нашел...

Не совсем понял (совсем не понял) связь проверки поля с дополнительной информацией о записи. Поделись проблеммой — может найдется решение.
olegenty
Отправлено: 30.07.2004, 12:14


Ветеран

Группа: Модератор
Сообщений: 2412



да всё просто: в общем случае это процедура, возвращающая указатель на TDataSet, который получается по запросу с параметром. Пользователю модально показывается окно с этим DataSet, и предлагается
1. перейти на работу с уже имеющейся записью
2. продолжить работу
3. прийти к выводу, что он вообще не прав, и глобально выйти в окно списка-перечня конструкторских изделий.
AVC
Отправлено: 30.07.2004, 13:00


Ветеран

Группа: Модератор
Сообщений: 1583



Теперь ясно. smile.gif Я бы делал по примерно такой же схеме, но возвращал бы не DataSet а PrimaryKey. Тогда (в моих соглашениях)
newID == oldID — продолжаем работу;
newID != oldID — переходим к старой записи;
newID == 0 — отказ от редактирования, шаг назад.
olegenty
Отправлено: 02.08.2004, 14:38


Ветеран

Группа: Модератор
Сообщений: 2412



я так и делаю, но позже, после выбора записи из вернувшегося датасета.
AVC
Отправлено: 02.08.2004, 16:15


Ветеран

Группа: Модератор
Сообщений: 1583



А я DataSet'ы размещаю на формах поэтому после закрытия дочерней формы DataSet'а уже нет.
olegenty
Отправлено: 03.08.2004, 07:07


Ветеран

Группа: Модератор
Сообщений: 2412



ну и у меня так. датасеты показываются модально, а по факту закрытия формы, валятся вместе с формой. ))

Вернуться в Работа с базами данных в C++Builder