Проблема с insert()
Есть база данных MS Access. В ней 2 таблицы, одна является мастером для другой. Всё работает нормально, но как вызываю insert() для подчинённой таблицы пишется ошибка:
Project Project1.exe raised exception class EDatabaseError with message 'ADOTable'. Dataset not in edit or insert mode. Process stopped.
при чём после этого когда повторно нажимаешь run новая запись всё таки создаётся и сохраняется в базе данных.
Как это исправить?
Единственное что я смог придумать, это сделать второй объект ADOTAble без MasterSource и туда вводить новые записи а первый переактивировать чтобы там новые записи появлялись (По моему наихудший вариант).
Что бы избежать вышеозначенного косяка, видимо не всегда перевод в режим редактирования происходит (о чем и сообщается в тексте ошибки).
Очень зря, открой для себя удивительный мир SQL, и будут твои программы безглючны и шустры.
Сегодня 00:03
Freeman
Возможно, при потере фокуса редактором главной таблицы происходит автоматический CheckBrowseMode, приводящий к Post главной и Refresh подчинённой, из-за чего и теряется режим вставки.
Да возможно но не совсем тогда понимаю как умудряется теряться фокус. Вот код нажатия на кнопку при котором происходит ошибка :
DModulBase->ADOTLevelKnowledge->Insert();
}
При нажатии на эту кнопку уже вылетает ошибка. И после повторного нажатия на F9 (Run) в базу добавляется запись и при чём в новой записи уже содержится индекс ключа из базы MasterSource. Тоесть получается примерно так, вызывается метод insert(), в базе открывается поле для создания новой записи, туда автоматом записывается индекс базы MasterSource, вылетает ошибка и вызывается метод Post().
ДА такая же хрень происходит и если пытаться создать новую запись через DBGrid (когда просто нажимаешь стрелку вниз на последней записи).
Пока работает тока вариант как я написал выше с созданием нового объекта ADOTable без MasterSource тогда всё работает нормально.
P.S. oxotnik333 попробую перейти на SQL запросы, действительно так будет лучше.
Потеря фокуса может происходить как раз из за этого, так как при вставке нового поля происходить обращение к MasterSource. А кто нибудь знает как этого избежать или что делать? Не могу же я на каждой форме создавать новые ADO объекты, это ад какой -то.
Потеря фокуса может происходить как раз из за этого, так как при вставке нового поля происходить обращение к MasterSource. А кто нибудь знает как этого избежать или что делать? Не могу же я на каждой форме создавать новые ADO объекты, это ад какой -то.
во первых - нет ничего страшного в создании ADO-объектов для конкретных задач. Во вторых - их таки желательно создавать не на форме, а в специальном объекте - TDataModule. В третьих - таки лучше создавать их динамически.
Тока, Я создаю один TDataModule к которому подключаю все формы или всё таки лучше делать несколько для каждой формы?
Тока, Я создаю один TDataModule к которому подключаю все формы или всё таки лучше делать несколько для каждой формы?
TDataModule предназначен для того, что бы всю структуру и работу с БД держать в одном месте, и смысла их плодить нету (ну разве, что структура БД будет сложная).
Тока, Я создаю один TDataModule к которому подключаю все формы или всё таки лучше делать несколько для каждой формы?
Я лично использую подход - инкапсуляция всех операций для одного объекта. Т.е. например Клиент - и класс реализующий всю функциональность по БД к нему. Документ - и класс реализующий работу с БД для него. Если БД-логика пересекается - например соотношения клиент-документ - то для этих задач создается отдельный класс - возможно в качестве наследника.