Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Программно создать новую строку в .mdb


Автор: Данкинг 13.10.2010, 14:44
Суть вопроса: есть таблица для ввода анкет. На форме - соответствующие DB-контролы: DbEdit, DbCheckBox и т.п.  - в них вводятся ответы на вопросы. После того, как анкета заполнена - нужно, соответственно, забивать следующую анкету, т.е. следующую строчку таблицы. Вопрос: как программно создать новую строку таблицы, дабы с помощью DbEdit'ов и прочих контролов её заполнять?

Автор: ~FoX~ 13.10.2010, 16:23
Эгм, DataSet переводим в Insert mode, например TTable.Append, или Insert

Цитата

Append method (TDataSet)
Adds a new, empty record to the end of the dataset.

Цитата

Insert method (TDataSet)
Inserts a new, empty record in the dataset.

Апосля не забываем делать Post  smile 

Но ИМХО, не очень правильный вариант работы с БД, ибо юзер сусчество человеческое и может во время набора может ошибица, или вообще посередине ему надоест и он нажмет на крестик, тебе придется отлавливать все исключения БД... 
Лучше все таки сначала заполнить поля, проверить на корректность, а уже затем помещать данные в таблицу...


Автор: Данкинг 13.10.2010, 17:55
Цитата(~FoX~ @  13.10.2010,  17:23 Найти цитируемый пост)
Лучше все таки сначала заполнить поля, проверить на корректность, а уже затем помещать данные в таблицу...

В смысле - вместо DbEdit ставить Edit, а затем уже вручную делать .post в соответствующие поля?

Добавлено через 1 минуту и 40 секунд
Цитата(~FoX~ @  13.10.2010,  17:23 Найти цитируемый пост)
Эгм, DataSet переводим в Insert mode, например TTable.Append, или Insert

Кстати, не прокатит в данном случае. Ты так предлагаешь:
Код

if AdoTable.BOF then AdoTable.Append;

?

Автор: ~FoX~ 13.10.2010, 18:15
Цитата(Данкинг @  13.10.2010,  18:55 Найти цитируемый пост)
В смысле - вместо DbEdit ставить Edit, а затем уже вручную делать .post в соответствующие поля?

Ну как вариант....

Цитата(Данкинг @  13.10.2010,  18:55 Найти цитируемый пост)
Кстати, не прокатит в данном случае. Ты так предлагаешь:

Почему не проканает? 
Цитата(Данкинг @  13.10.2010,  18:55 Найти цитируемый пост)
if AdoTable.BOF then AdoTable.Append;

Во первых почему BOF, Append добавляет новую строку в конец
Цитата

Adds a new, empty record to the /end/ of the dataset.

Во вторых заненадобностью оно вообще... Гляди, ты создал новую пустую запись, если не использовать например транзакции, то эта запись попадает тебе в монопольный доступ.... Т.е. пока ты не сделаешь Post или не отменишь Append ты даже с нее перейти ни куда не сможешь.

Автор: Данкинг 13.10.2010, 18:25
Цитата(~FoX~ @  13.10.2010,  19:15 Найти цитируемый пост)
Ну как вариант....

Склоняюсь всё же к этому варианту... Хоть и заколебёшься прописывать все поля, зато точно знаешь, что все значения будут сохранены.
Цитата(~FoX~ @  13.10.2010,  19:15 Найти цитируемый пост)
Почему не проканает? 

Потому что там ерунда получается. Честное слово, не знаю, как объяснить, это надо видеть. smile 
Цитата(~FoX~ @  13.10.2010,  19:15 Найти цитируемый пост)
Во первых почему BOF, Append добавляет новую строку в конец

Ну да, EOF, не знаю, с чего я про BOF вспомнил.
Цитата(~FoX~ @  13.10.2010,  19:15 Найти цитируемый пост)
Т.е. пока ты не сделаешь Post или не отменишь Append ты даже с нее перейти ни куда не сможешь.

Да, тут тоже верно. В общем, если ещё голоса за Edit вместо DbEdit будут, то остановлюсь на этом варианте.

Автор: ~FoX~ 13.10.2010, 18:44
Если честно я как то отошел от программирования БД через методы контролов и перешло на dbGo, ADO и ежесними... 
SQL все таки работает по веселее чем Post, да и большенство мороки по отловли ексепшенов ложица не на твои плечи, а на провайдер  smile 
А дальше SELECT, INSERT INTO, DELETE и т.д. и все прелести SQL у тебя под рукой... smile  smile  smile 
Код

ADOQuery1.SQL.Add('INSERT INTO TabTest (Name) VALUES("' +  Edit1.Text + ");');

Автор: Данкинг 13.10.2010, 19:15
ОК, будем смотреть в направлении запросов. smile 

Автор: Frees 14.10.2010, 07:29
Цитата(~FoX~ @  13.10.2010,  21:44 Найти цитируемый пост)
DOQuery1.SQL.Add('INSERT INTO TabTest (Name) VALUES("' +  Edit1.Text + ");');

не надо так запросы собирать, кто знает что там в Edit1 напишут, лучше так

Код

ADOQuery1.SQL.Add('INSERT INTO TabTest (Name) VALUES(:Name);');
ADOQuery1.ParamByName('Name')asstring := Edit1.Text;


ИМХО я бы не стал отказываться от DB контролов.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)