Добрый день!
Вопрос новичка. Использую TDBEdit для работы с БД MySQL, есть и TDBNavigator, соединенный с тем же источником данных.
Целочисленную информацию в компонент (dbeField1) можно внести или вручную, или по нажатию кнопки, которая вставляет в компонент некоторым образом рассчитанное значение. В обработчике нажатия кнопки использую команду dbeField1.Text := IntToStr(newValue1).
Если я вношу информацию в компонент вручную, проблем не возникает. Если нажимаю кнопку, то, хотя текст в компоненте появляется, он нигде в запросе не "прописывается", в навигаторе не делается активной кнопка сохранения изменений, а при перемещении фокуса на компопнент, в него возвращается старое значение.
Как мне правильно действовать?
Как правильно внести данные в TDBEdit программно?
Модератор: Модераторы
-
Apprehension
- незнакомец
- Сообщения: 7
- Зарегистрирован: 15.12.2016 11:56:03
А в каком компоненте у Вас лежит набор данных, который Вы получили из MySQL? У этого компонента есть метод Post, который фиксирует внесённые изменения в этом наборе данных, а потом метод ApplyUpdates, который отсылает сделанные изменения на сервер. Если Вы изменяете не одну запись, а группу, то Post делаете после каждого изменения, а ApplyUpdates только один раз, когда в эту группу все изменения уже внесены.
В качестве альтернативы изменения\добавления данных в БД можно использовать метод коннектора с БД ExecuteDirect(). При этом данные надо отсылать в виде SQL-выражения. После чего, чтобы обновить Ваш набор данных (т.к. в этом случае мы его совсем не трогали), у компонента набора данных надо выполнить метод Refresh(). При этом способе данные на сервере оказываются гораздо быстрее, однако нужно сделать дополнительную манипуляцию с Вашим набором данных, чтобы Вы эти изменения увидели глазами. Если любоваться на данные нет необходимости, то второй метод самый лучший.
В качестве альтернативы изменения\добавления данных в БД можно использовать метод коннектора с БД ExecuteDirect(). При этом данные надо отсылать в виде SQL-выражения. После чего, чтобы обновить Ваш набор данных (т.к. в этом случае мы его совсем не трогали), у компонента набора данных надо выполнить метод Refresh(). При этом способе данные на сервере оказываются гораздо быстрее, однако нужно сделать дополнительную манипуляцию с Вашим набором данных, чтобы Вы эти изменения увидели глазами. Если любоваться на данные нет необходимости, то второй метод самый лучший.
Почему не внести напрямую в DataSet (оно же TQuery/TTable)
DataSet.Edit (если новое то DataSet.Insert) - тем самым переводим DataSet в режим редактирования..
Далее просто DataSet.FieldByName('name').AsInteger=newValue1 записываем в нужное поле нужное значение
DataSet.Post() - отправляем в БД.
Дело в том, что запись в само поле dbeField1.Text - возможно не переводит DataSet в режим редактирования, следовательно DataSet не знает о существовании измененного поля для себя..
и после обновления(Refresh) или перехода(Next) на новую позицию в БД просто обновляет значение из базы, стирая введенное "dbeField1.Text := IntToStr(newValue1)"..
все зависит от реализации взаимодействие самого компонента dbeField1.
Когда я разрабатывал свой компонент TDBEdit на основе простого TEdit - мне приходилось учитывать вхождение(OnEnter) на редактирования поля текста компонента и самостоятельно переводить DataSet в режим вставки или редактирования.
DataSet.Edit (если новое то DataSet.Insert) - тем самым переводим DataSet в режим редактирования..
Далее просто DataSet.FieldByName('name').AsInteger=newValue1 записываем в нужное поле нужное значение
DataSet.Post() - отправляем в БД.
Дело в том, что запись в само поле dbeField1.Text - возможно не переводит DataSet в режим редактирования, следовательно DataSet не знает о существовании измененного поля для себя..
и после обновления(Refresh) или перехода(Next) на новую позицию в БД просто обновляет значение из базы, стирая введенное "dbeField1.Text := IntToStr(newValue1)"..
все зависит от реализации взаимодействие самого компонента dbeField1.
Когда я разрабатывал свой компонент TDBEdit на основе простого TEdit - мне приходилось учитывать вхождение(OnEnter) на редактирования поля текста компонента и самостоятельно переводить DataSet в режим вставки или редактирования.
По мотивам пламенного выступления olegy123...
Действительно, про перевод набора записей (DataSet) в режим редактирования я позабыл сказать. У компонента TDBEdit такой перевод происходит автоматически только при получении фокуса ввода. Поэтому, если у Вашего TDBEdit фокус не установлен, соответственно DataSet находится в режиме только просмотра записей, потому (для TDBEdit, который не с фокусом
), переводить DataSet в режим редактирования нужно вручную:
Действительно, про перевод набора записей (DataSet) в режим редактирования я позабыл сказать. У компонента TDBEdit такой перевод происходит автоматически только при получении фокуса ввода. Поэтому, если у Вашего TDBEdit фокус не установлен, соответственно DataSet находится в режиме только просмотра записей, потому (для TDBEdit, который не с фокусом
Код: Выделить всё
dbeField1.DataSource.Edit;
dbeField1.Text := IntToStr(newValue1);
dbeField1.DataSource.Post;
...-
Apprehension
- незнакомец
- Сообщения: 7
- Зарегистрирован: 15.12.2016 11:56:03
Да, спасибо, всё получилось. Забыл перевести источник данных (запрос) в режим редактирования. )
