flint |
Отправлено: 21.07.2005, 06:56 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 58
|
Пишу программное обеспечение (первый раз:) и прошу подсказать, как при работе с базами данных избежать ошибок при сохранении, если поля обязательные.
Пишет ошибку : "Field '...' must have a value."
Форму с "анкетой" создаю динамически. Сразу после выдачи ошибки закрывает эту форму (после нажатия ОК).
Бедному пользователю приходится заново открывать и заполнять анкету.
И еще... как сохранить в БД данные поля Memo?
Заранее благодарен...
|
|
flint |
Отправлено: 21.07.2005, 06:57 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 58
|
Бд — Paradox 7 |
|
VovaN |
Отправлено: 21.07.2005, 09:41 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 72
|
По идее надо отлавливать эту ошибку при помощи
CODE |
try
{
Пытаемся добавить
}
catch (Исключение) //если не удалось.
{
Вывод сообщения, что такое- то полее доолжно быть заполнено.
}
|
А форма не должна закрываться. Просто сделайте её закрытие в блоке try — тогда она будет закрываться только после успешной вставки или сделайте дополнительную кнопку "сохранить".
Отредактировано VovaN — 21/07/2005, 09:41 |
|
flint |
Отправлено: 21.07.2005, 12:29 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 58
|
Спасибо, просто я с try/catch по неопытности знаком не был:)
Надо почитать...
А по-поводу Memo не в курсе? У меня получается только одну из строк сохранить. |
|
VovaN |
Отправлено: 21.07.2005, 13:11 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 72
|
Попробуй к строке добраться так:
CODE |
Memo->Lines->String[i];
|
это доступ к i-й строке (с 0) |
|
Admin |
Отправлено: 21.07.2005, 22:39 |
|
Владимир
Группа: Администратор
Сообщений: 1190
|
1/ QUOTE | И еще... как сохранить в БД данные поля Memo? |
CODE |
Table->FieldByName("MemoField")->AsString = Memo1->Lines->Text;
|
сохраняете в поле MemoField все строки из Memo1
2/ QUOTE | Пишет ошибку : "Field '...' must have a value." |
Значит дайте этому полю обязательно какое-либо значение,
если не назначено значение поля по умолчанию.
Если поле Name — обязательное, то и присвойте ему значение по
умолчанию:
Table->Edit();
Table->FieldByName("Name")->AsString = "Аноним";
Table->Post();
или заставьте пользователя ввести данные в это поле.
Купите книжку Архангельского и изучите.
(можете параллельно с написанием программы).
в очень простой и доступной форме прочтете
и про try...catch и про работу с базами данных.
|
|
flint |
Отправлено: 22.07.2005, 06:47 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 58
|
Спасибо. Теперь все работает без ошибок.
А можно сделать так, что-бы по-умолчанию в строке писалось не просто "Аноним", а "Аноним1","Аноним2"...... ? Есть идея: завести счетчик или просто инкрементируемое поле в таблице базы, и каждый раз прибавлять к строке "Аноним" в конец символы счетчика. Или быть может в могучем C есть более простой для этого способ? заранее спасибо. |
|
flint |
Отправлено: 22.07.2005, 07:38 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 58
|
Есть еще вопрос. Никак не могу разобраться. Для редактирования записей в таблице вывожу пользователю почти такую же форму, что и при создании нового пользователя, только предварительно во все поля Edit вставляю соответствующие значения. Причем заменяю
Table1->Append() на Table1->Edit()
В результате изменения сохраняется не только запись, которую пользователь выделяет во время работы приложения мышью в ДБГриде, но и первая запись в таблице. Объясните, пожалуйста, как последнего избежать. |
|
flint |
Отправлено: 22.07.2005, 13:35 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 58
|
Гляжу в книгу — написано использовать для таких случаев Locate().
Кроме того в ней написано, что ф-ция делает запись активной, тем самым открывает доступ к ней. Ф-ция все находит, но приложение выводит ошибку, что дескать мол БД не переведена в режим Edit или Insert. Ладно пишу так:
CODE |
Table1->Locate("...","...",Options);
Table1->Edit();
Table1->FieldByName("...")->AsString = Edit1->Text;
....
Table1->Post();
|
Опять удаляется первая запись, а на ее место становится исправленная
А исходная запись остается на месте
Делаю по другому:
CODE |
Table1->Edit();
Table1->Locate("...","...",Options);
Table1->FieldByName("...")->AsString = Edit1->Text;
....
Table1->Post();
|
Выдает ошибку, что
"Table1: Dataset is not in edit or insert mode"
И что же мне делать???????????????????????????????????????????
|
|
** Admin |
Отправлено: 22.07.2005, 13:49 |
|
Не зарегистрирован
|
В C:\Program Files\Borland\CBuilder6\Examples
есть примеры работы с базами данных — изучите. |
|
flint |
Отправлено: 25.07.2005, 06:01 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 58
|
Ладно, давно знал, что лучше мануалов на свете нет помошника:) |
|
flint |
Отправлено: 25.07.2005, 06:02 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 58
|
Но все-равно, спасибо |
|
flint |
Отправлено: 27.07.2005, 07:24 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 58
|
Всё, разобрался. Теперь другая проблема
Кто хочет помочь, жмите сюда |
|