Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.12.2019, 14:07   #1
theMaZaReX
Новичок
Джуниор
 
Регистрация: 17.05.2014
Сообщений: 3
По умолчанию Добавление записи в БД (Access) без кнопки

Всем привет. Делаю коннект с БД через компоненты ADO. На форме есть ADOtable, ADOconnection, DataSource. Таблицу из БД вывожу на DBGrid. Изначально для добавления/удаления записей добавил DBNavigator, но теперь хочется реализовать добавление новой записи без нажатия кнопки, т.е. вводишь в поле какую-либо запись (в самом dbgrid), нажал допустим enter или переключился на новое поле и запись добавилась в БД. http://prntscr.com/qb24rc
theMaZaReX вне форума Ответить с цитированием
Старый 15.12.2019, 14:26   #2
theMaZaReX
Новичок
Джуниор
 
Регистрация: 17.05.2014
Сообщений: 3
По умолчанию

ПРобовал создавать событие AfterInsert у ADOTable и добавлять код adotable1.insert; Но работает странно. Добавил запись в dbgrid, нажал enter, в таком случае ничего не сохранится. Если после нажатия на enter я переключусь на какое-либо другое поле, то запись сохраняется
theMaZaReX вне форума Ответить с цитированием
Старый 16.12.2019, 00:21   #3
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию

Цитата:
Сообщение от theMaZaReX Посмотреть сообщение
Если после нажатия на enter я переключусь на какое-либо другое поле, то запись сохраняется
Код покажите
xxbesoxx вне форума Ответить с цитированием
Старый 16.12.2019, 21:25   #4
theMaZaReX
Новичок
Джуниор
 
Регистрация: 17.05.2014
Сообщений: 3
По умолчанию

Цитата:
Сообщение от xxbesoxx Посмотреть сообщение
Код покажите
Сейчас вообще убрал все обработчики событий и добавление в БД работает точно таким же образом, что я описал выше. Т.е. оно и без кода работает, но не совсем тем образом, как мне надо. Т.е. сохранение в БД происходит только после того, как я в Dbgrid заполню поле и после кликну на любое другое поле. Если на другое поле не кликнуть и просто заполнить данные, то они не сохранятся

Последний раз редактировалось theMaZaReX; 16.12.2019 в 21:57.
theMaZaReX вне форума Ответить с цитированием
Старый 27.12.2019, 09:46   #5
Heneken87
Форумчанин
 
Регистрация: 27.04.2012
Сообщений: 219
По умолчанию

Если у Вас этой утилитой будет пользоваться более 1 человека - не рекомендую такой подход. (Ваш датасет(ADOTable) через Dbgrid открыт для редакции и выполняет POST автоматически? через AdoConnection1 производиться авто подтверждение транзакции). Если вашей утилитой при таком подходе будет пользоваться не 1 человек, могут начаться проблемы. Изменение, удаление, вставку сущностей в БД рекомендую прописывать руками с контролем транзакций. И вообще иной реализацией.
Ваша текущая проблема в режиме монопользователя следующая:
вы пытаетесь вставить новую строку, и вынуждены вставать на последнюю строчку грида, нажать клавишу "вниз", заполнить хотя бы одно поле и далее кликнуть в другое поле из другой строки. После этого происходит POST, пока вы этого не сделаете, не будет подтверждения окончания ввода, не будет транзакции(подтверждения). А значит и данные не сохранятся.

Решение: Вы должны обозначить окончание заполнение когда Вам это нужно. Например отловить нажатие Enter в событии OnKeyUP и подтвердить окончание заполнения/редакции. Например: ADOTable.Post.
Иными словами, Вы должны обозначить событие после которого необходимо выполнить сохранение. Будь это нажатие на Enter, отслеживание хлопока в ладошки через микрофон, нажатие комбинации клавиш. В общем, определитесь с событием которое будет инициировать подтверждение окончания заполнения - транзакцию - сохранение сущности в БД.

Пример(без кода):
Если Enter нажат уже в существующей строке и таблица не в режиме редактирования или вставки (ADOTable1.State in [dsEdit, dsInsert] = False ) - переводим ее в режим редакции - ADOTable.Edit иначе ADOTabl.Post.
Если пользователь нажал Ctrl + Enter переводим таблицу в режим вставки ADOTable.insert

В примере автотранзакция может быть включена или выключена. Разница для выключенной автотранзакции - после метода ADOTable.Post выполняется ADOConnection1.CommitTrans. При таком подходе, в случае ошибки, транзакции можно отменять , указывать пользователю на его ошибки и.т.д. Утилита становится более правильной для мультипользования. И вы перед применением или в случаях ошибки транзакции всегда сможете отследить, не навводил ли вам юзер бреда в поля и не занята ли эта сущность другим пользователем.

Это оооооОООчень абстрактный пример. Вообще Dbgrid используется строго для отображения данных, для управления данными/сущностями пишется свой интерфейс программы(не путать с интерфейсами среды разработки), в котором через формы и SQL реализуется управление.


P;S: Это если по простому и без кучи терминов. Сущность - это грубо запись/строка в таблице.
Пишу много и развернуто

Последний раз редактировалось Heneken87; 27.12.2019 в 10:37.
Heneken87 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Добавление записи в таблицу из формы (MS Access) Mihanches Microsoft Office Access 7 09.05.2017 23:21
Добавление записи из одного DBGrid в другой DBGrid c помощью кнопки, а также удаление записи Evgen7 БД в Delphi 20 16.02.2014 17:05
Access 2010 форма на добавление записи DSFIN Помощь студентам 0 13.06.2012 19:24
Добавление записи в бд access Elementig Помощь студентам 1 07.04.2011 16:51
Добавление записи через список в связанную таблицу(при связи с Access) megaten БД в Delphi 5 17.05.2009 15:57