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

 
Помогите разобраться
flint
  Отправлено: 21.07.2005, 06:56


Дежурный стрелочник

Группа: Участник
Сообщений: 58



Пишу программное обеспечение (первый раз:) и прошу подсказать, как при работе с базами данных избежать ошибок при сохранении, если поля обязательные.
Пишет ошибку : "Field '...' must have a value."
Форму с "анкетой" создаю динамически. Сразу после выдачи ошибки закрывает эту форму (после нажатия ОК).
Бедному пользователю приходится заново открывать и заполнять анкету.
И еще... как сохранить в БД данные поля Memo?
Заранее благодарен...
flint
Отправлено: 21.07.2005, 06:57


Дежурный стрелочник

Группа: Участник
Сообщений: 58



Бд — Paradox 7 smile.gif
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



Но все-равно, спасибо biggrin.gif
flint
  Отправлено: 27.07.2005, 07:24


Дежурный стрелочник

Группа: Участник
Сообщений: 58



Всё, разобрался. Теперь другая проблема cool.gif
Кто хочет помочь, жмите сюда

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