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

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

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.04.2016, 09:01   #1
martofpain
Пользователь
 
Регистрация: 15.03.2016
Сообщений: 36
По умолчанию Обновить конкретную запись в DBGrid

Как реализовать редактирование конкретной строки в DBGrid.
Есть таблица взятая из БД MySQL и подключеная к Delphi через Zeos. Я вывел одну ячейку из строки таблицы в отдельный элемент edit, и надо чтоб я ввел другое значение и запись редактировалась, как это сделать. Вот мой код
Код:
 
 ZQuery1.SQL.Clear;
  ZQuery1.SQL.Text:= 'UPDATE  `Goods1`  SET  Date_of_issue=:Date_of_issue ';
  zQuery1.ParamByName('Date_of_issue').Asstring :=maskEdit1.Text;
  ZQuery1.Close;
  ZQuery1.Open;
при срабатывание появляется ошибка и DBGrid очищается, перезагружаю проект и все нормально, но меняются все значение в столбце.
Как сделать так чтоб меня лась конкретная запись, я так понимаю нужен where но я не знаю как его написать.
В самой таблице есть следующие столбцы `Number`, `Arrival_date`, `Flight`, `Сonsignor`, `Consignee`. Помогите



В чем может быть проблема???
martofpain вне форума Ответить с цитированием
Старый 01.04.2016, 09:36   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Как сделать так чтоб меня лась конкретная запись, я так понимаю нужен where но я не знаю как его написать.
написать условие ОДНОЗНАЧНО определяющее запись для редактирования.
как максимум это может быть условие совпадения(равенства) ВСЕХ полей(столбцов) текущей (редактируемой) строки(записи).
и тут самое время познакомиться с параметрами.
Код:
SQL.Text:='update goods1 set date_of_issue=:date_ofissue '
 + 'where nuamber=:number and arrival_date=:arrival_date and ....';
SQL.ParamByName('date_ofissue').AsDateTime:=StrtoDatetime(maskedit1.Text);//НЕ надо будет заботиться о том какой формат дат поддерживает и понимает СУБД и текущая база данных.
SQL.ParamByName('number').Asinteger:= ??? а вот что же задать ЗДЕСЬ?
ОТВЕТ: у тебя ДОЛЖНО быть ДВА ZQuery
один (ZQuery1) для показа таблицы и только для этого!!!
и другой (ZQueryUpdt) для модификации (update )
и теперь можно спокойно писать так
Код:
ZQueyUpdt.ParamByName('number').Asinteger:=Zquery1.FieldByName('number').AsInteger;
P.S. кстати это (два разных Query) ИЗБАВИТ и от
Цитата:
при срабатывание появляется ошибка и DBGrid очищается,
НО!! увы полное сравнение (всех полей) сработает КАК НАДО только в том случае если УЖЕ заполнены все поля.
поэтому на практике все таблицы (или почти все) снабжают дополнительным полем (т.н. ключом) и "заставляют" заполнять это поле саму СУБД сразу же при создании новой записи и так чтобы в пределах таблицы оно не повторялось. Acsess это называет счетчиком.
чтобы подчеркнуть это "особость" обычно его(это поле таблицы) называют ID / CODE / ID_tablename
А теперь условие для update можно сократить до простого
Код:
where ID_tablename =:id
Код:
ParamByName('id').AsInteger =FieldByName('id_table');
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 06.04.2016, 22:02   #3
kropotkina-alice
Форумчанин
 
Аватар для kropotkina-alice
 
Регистрация: 27.10.2014
Сообщений: 594
По умолчанию

Цитата:
Сообщение от martofpain Посмотреть сообщение
В чем может быть проблема???
Можно гораздо проще делать - работать с Query, как с Table...
В вашем случае примерно так:
Код:
Query1.Edit;
Query1Capital.Text:=Edit1.Text;
Query1.Post;
Но для этого нужно сделать дополнительное усилие - поставить свойство Query1.RequestLive в True...
Изменения в DBGrid вы увидите сразу.

Последний раз редактировалось kropotkina-alice; 07.04.2016 в 00:29.
kropotkina-alice вне форума Ответить с цитированием
Старый 07.04.2016, 07:53   #4
martofpain
Пользователь
 
Регистрация: 15.03.2016
Сообщений: 36
По умолчанию

Спасибо большое, все получилось. А такой вопрос, у меня есть CheckBox и в него кидаются данные из строки 1=нажат, 0=не нажат. можно ли как то передать это в таблицу??
martofpain вне форума Ответить с цитированием
Старый 07.04.2016, 09:19   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Код:
ADOQuery1.ParamemterByName('mycheck').value:=Checkbox1.Checked;


Код:
if Checkbox1.Checked then
  ADOQuery1.ParamByName('mycheck').value:=1
else
  ADOQuery1.ParamByName('mycheck').value:=0;
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 07.04.2016, 11:17   #6
kropotkina-alice
Форумчанин
 
Аватар для kropotkina-alice
 
Регистрация: 27.10.2014
Сообщений: 594
По умолчанию

Цитата:
Сообщение от martofpain Посмотреть сообщение
Спасибо большое, все получилось. А такой вопрос, у меня есть CheckBox и в него кидаются данные из строки 1=нажат, 0=не нажат. можно ли как то передать это в таблицу??
Добавьте в вашу таблицу поле "newfield" типа BOOLEAN, уберите CheckBox и вместо него добавьте на форму DBCheckBox, в свойствах которого укажите соответствующий DataSource (через который подключена таблица) и DataField=имени нового поля
Цитата:
в него кидаются данные из строки 1=нажат, 0=не нажат
???
Если все так, как вы написали, то присваивание таким образом:
Код:
Query1.FieldByName('newfield').Value:=строка='нажат';

Последний раз редактировалось kropotkina-alice; 07.04.2016 в 11:22.
kropotkina-alice вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
обновить БД данными из DBGrid megostudent БД в Delphi 6 21.05.2013 00:50
как обновить DBGrid bmb_66 БД в Delphi 0 29.11.2010 14:48
Запись в конкретную строку, позицию.... DasModelka Общие вопросы Delphi 6 15.06.2010 16:03
Обновить данные в DBGRID sl963 БД в Delphi 7 04.06.2010 18:06