С Новым годом! Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 17.03.2019
Сообщений: 15

Изменение данных в БД DBGrid

14.02.2020, 19:39. Показов 789. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер, прошу подсказать как правильно вносить изменения в БД (Access) используя компонент DBGrid.

В проекте есть форма на которой расположен DBGrid подключенный к БД.
Запросом к БД DBGrid отображает данные, при двойном клике по ячейке открывается новая форма со своими компонентами (код открытия формы ниже)
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
procedure TForm16.DBGrid1DblClick(Sender: TObject);
begin
Form22.Show;
Form22.Caption := 'Карточка правонарушения №' + ' ' + DataModule1.ADOQuery4.FieldByName('id').AsString;
Form22.Edit8.Text := DataModule1.ADOQuery4.FieldByName('reg_nomer').AsString;                 
Form22.Edit7.Text := DataModule1.ADOQuery4.FieldByName('fio_f').AsString;                     
Form22.Label15.Caption := DataModule1.ADOQuery4.FieldByName('forma_reporta').AsString;        
Form22.Label17.Caption := DataModule1.ADOQuery4.FieldByName('type_reporta').AsString;         
Form22.Label18.Caption := DataModule1.ADOQuery4.FieldByName('period').AsString;               
Form22.Label19.Caption := DataModule1.ADOQuery4.FieldByName('god').AsString;                  
Form22.Edit5.Text := DataModule1.ADOQuery4.FieldByName('data_notification').AsString;         
Form22.Edit6.Text := DataModule1.ADOQuery4.FieldByName('data_protocol').AsString;             
Form22.Edit1.Text := DBGrid1.DataSource.DataSet.FieldByName('number_protocol').AsString;           
Form22.Edit2.Text := DBGrid1.DataSource.DataSet.FieldByName('data_decision').AsString;             
Form22.Edit3.Text := DBGrid1.DataSource.DataSet.FieldByName('decision').AsString;                  
Form22.Edit4.Text := DBGrid1.DataSource.DataSet.FieldByName('total_decision').AsString;           
Form22.CheckBox1.Checked := DBGrid1.DataSource.DataSet.FieldByName('verbal_warning').AsBoolean;   
Form22.CheckBox2.Checked := DBGrid1.DataSource.DataSet.FieldByName('o_protocol').AsBoolean;        
Form22.CheckBox3.Checked := DBGrid1.DataSource.DataSet.FieldByName('v_protocol').AsBoolean;        
Form22.RichEdit1.Text := DBGrid1.DataSource.DataSet.FieldByName('reason_for_return').AsString;     
Form22.CheckBox6.Checked := DBGrid1.DataSource.DataSet.FieldByName('pay_fine').AsBoolean;          
Form22.CheckBox9.Checked := DBGrid1.DataSource.DataSet.FieldByName('s_protocol').AsBoolean;        
Form22.CheckBox8.Checked := DBGrid1.DataSource.DataSet.FieldByName('s_offence').AsBoolean;         
Form22.CheckBox4.Checked := DBGrid1.DataSource.DataSet.FieldByName('definition').AsBoolean;        
Form22.CheckBox7.Checked := DBGrid1.DataSource.DataSet.FieldByName('lich_notification').AsBoolean; 
Form22.CheckBox5.Checked := DBGrid1.DataSource.DataSet.FieldByName('termination_ap').AsBoolean;    
Form22.CheckBox10.Checked := DBGrid1.DataSource.DataSet.FieldByName('signed_protocol').AsBoolean;  
Form22.CheckBox11.Checked := DBGrid1.DataSource.DataSet.FieldByName('status_org').AsBoolean;  
end;
После редактирования и нажатия кнопки сохраняю данные (код сохранения)
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
procedure TForm22.Button1Click(Sender: TObject);
begin
Form16.DBGrid1.DataSource.DataSet.Edit;
Form16.DBGrid1.DataSource.DataSet.FieldByName('lich_notification').AsBoolean:= CheckBox7.Checked;
Form16.DBGrid1.DataSource.DataSet.FieldByName('definition').AsBoolean:= CheckBox4.Checked;
Form16.DBGrid1.DataSource.DataSet.FieldByName('number_protocol').AsString:= Edit1.Text;
Form16.DBGrid1.DataSource.DataSet.FieldByName('o_protocol').AsBoolean:= CheckBox2.Checked;
Form16.DBGrid1.DataSource.DataSet.FieldByName('data_decision').AsString:= Edit2.Text;
Form16.DBGrid1.DataSource.DataSet.FieldByName('decision').AsString:= Edit3.Text;
Form16.DBGrid1.DataSource.DataSet.FieldByName('verbal_warning').AsBoolean:= CheckBox1.Checked;
Form16.DBGrid1.DataSource.DataSet.FieldByName('total_decision').AsString:= Edit4.Text;
Form16.DBGrid1.DataSource.DataSet.FieldByName('v_protocol').AsBoolean:= CheckBox3.Checked;
Form16.DBGrid1.DataSource.DataSet.FieldByName('termination_ap').AsBoolean:= CheckBox5.Checked;
Form16.DBGrid1.DataSource.DataSet.FieldByName('s_offence').AsBoolean:= CheckBox8.Checked;
Form16.DBGrid1.DataSource.DataSet.FieldByName('reason_for_return').AsString:= RichEdit1.Text;
Form16.DBGrid1.DataSource.DataSet.FieldByName('s_protocol').AsBoolean:= CheckBox9.Checked;
Form16.DBGrid1.DataSource.DataSet.FieldByName('pay_fine').AsBoolean:= CheckBox6.Checked;
Form16.DBGrid1.DataSource.DataSet.FieldByName('signed_protocol').AsBoolean:= CheckBox10.Checked;
Form16.DBGrid1.DataSource.DataSet.FieldByName('status_org').AsBoolean:= CheckBox11.Checked;
Form16.DBGrid1.DataSource.DataSet.Post;                                              
Form22.Close;
end;
Подскажите как правильно? Сохранять через DBGrid или можно сразу в DataSorse
пример открытия
Delphi
1
Edit1.Text :=DataModule1.ADOQuery4.FieldByName('id').AsString;
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.02.2020, 19:39
Ответы с готовыми решениями:

Как можно сделать в стандартном DBgrd сортировку по столбцам?
Здравствуйте. Такой вопрос: как можно сделать в стандартном DBgrd сортировку по столбцам (кликая на заголовок столбца) не используя...

Слияние с WORD базы данных ACCESS (изменение вида передачи данных)
Уважаемые знатоки! В VBA новичок, прошу помощи, очень надо.

Изменение набора данных ADOQuery без изменения подключенной к нему базы данных
Проблема следующая Есть база данных, есть подключенный к ней ADOQuery, в котором ЧАСТЬ записей базы. Я хочу поменять данные только в...

8
 Аватар для krapotkin
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,657
Записей в блоге: 21
15.02.2020, 09:17
интересно, что произошло в промежуток между написанием строки 12
Цитата Сообщение от Casperchik Посмотреть сообщение
DataModule1.ADOQuery4.FieldByName
и 13
Цитата Сообщение от Casperchik Посмотреть сообщение
DBGrid1.DataSource.DataSet.FieldByName
??? )))
зачем вам брести по ссылкам от DBGrid.Datasource.....
если вы точно знаете, какой Dataset туда подключен?


0. грид НЕ ХРАНИТ данные, он их только отображает. он для пользователей. общаться с ним программе - себя не уважать.


вообще говоря, вы идете в верном направлении, хотя для той замшелой парадигмы DELPHI-90 вполне бы подошло просто вместо TEdit использовать TDBEdit;
но, если уж у нас есть такая форма...

1. метод, где все слова начинаются на Form22, должен быть методом TForm22
Кликните здесь для просмотра всего текста
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
procedure TForm22.Load;
var 
  Q:TAdoQuery;
begin
    q := DataModule1.ADOQuery4;
 
    Caption := 'Карточка правонарушения №' + ' ' + Q.FieldByName('id').AsString;
    Edit8.Text := Q.FieldByName('reg_nomer').AsString;                 
    Edit7.Text := Q.FieldByName('fio_f').AsString;                     
    Label15.Caption := Q.FieldByName('forma_reporta').AsString;        
    Label17.Caption := Q.FieldByName('type_reporta').AsString;         
    Label18.Caption := Q.FieldByName('period').AsString;               
    Label19.Caption := Q.FieldByName('god').AsString;                  
    Edit5.Text := Q.FieldByName('data_notification').AsString;         
    Edit6.Text := Q.FieldByName('data_protocol').AsString;             
    Edit1.Text := Q.FieldByName('number_protocol').AsString;           
    Edit2.Text := Q.FieldByName('data_decision').AsString;             
    Edit3.Text := Q.FieldByName('decision').AsString;                  
    Edit4.Text := Q.FieldByName('total_decision').AsString;           
    CheckBox1.Checked := Q.FieldByName('verbal_warning').AsBoolean;   
    CheckBox2.Checked := Q.FieldByName('o_protocol').AsBoolean;        
    CheckBox3.Checked := Q.FieldByName('v_protocol').AsBoolean;        
    RichEdit1.Text := Q.FieldByName('reason_for_return').AsString;     
    CheckBox6.Checked := Q.FieldByName('pay_fine').AsBoolean;          
    CheckBox9.Checked := Q.FieldByName('s_protocol').AsBoolean;        
    CheckBox8.Checked := Q.FieldByName('s_offence').AsBoolean;         
    CheckBox4.Checked := Q.FieldByName('definition').AsBoolean;        
    CheckBox7.Checked := Q.FieldByName('lich_notification').AsBoolean; 
    CheckBox5.Checked := Q.FieldByName('termination_ap').AsBoolean;    
    CheckBox10.Checked := Q.FieldByName('signed_protocol').AsBoolean;  
    CheckBox11.Checked := Q.FieldByName('status_org').AsBoolean;  
end;
 
procedure TForm22.Save();
var 
  Q:TAdoQuery;
begin
    q := DataModule1.ADOQuery4;
    Q.Edit;
    Q.FieldByName('lich_notification').AsBoolean:= CheckBox7.Checked;
    Q.FieldByName('definition').AsBoolean:= CheckBox4.Checked;
    Q.FieldByName('number_protocol').AsString:= Edit1.Text;
    Q.FieldByName('o_protocol').AsBoolean:= CheckBox2.Checked;
    Q.FieldByName('data_decision').AsString:= Edit2.Text;
    Q.FieldByName('decision').AsString:= Edit3.Text;
    Q.FieldByName('verbal_warning').AsBoolean:= CheckBox1.Checked;
    Q.FieldByName('total_decision').AsString:= Edit4.Text;
    Q.FieldByName('v_protocol').AsBoolean:= CheckBox3.Checked;
    Q.FieldByName('termination_ap').AsBoolean:= CheckBox5.Checked;
    Q.FieldByName('s_offence').AsBoolean:= CheckBox8.Checked;
    Q.FieldByName('reason_for_return').AsString:= RichEdit1.Text;
    Q.FieldByName('s_protocol').AsBoolean:= CheckBox9.Checked;
    Q.FieldByName('pay_fine').AsBoolean:= CheckBox6.Checked;
    Q.FieldByName('signed_protocol').AsBoolean:= CheckBox10.Checked;
    Q.FieldByName('status_org').AsBoolean:= CheckBox11.Checked;
    Q.Post;                                              
end;

2. в соответствии с этими соображениями
нужно создать форму, загрузить в нее данные, показать модально и если нажато ОК, сохранить данные, потом убить форму
вуаля
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
procedure TForm16.DBGrid1DblClick(Sender: TObject);
var 
  F:TForm22;
begin
  f := TForm22.Create(NIL);
  try
    f.load();
    if f.showModal() = mrOk then
      f.Save();
  finally
    f.Free;
  end;
end;
согласитесь, это в 100 раз понятнее читается ?

//не забудем назначить кнопкам OK и Отмена ModalResult = mrOk и mrCancel соответственно...

3. по-прежнему, для тех кто называет компоненты Edit27 и Form25, в аду стоит отдельный вместительный котёл класса лакшери
1
0 / 0 / 0
Регистрация: 17.03.2019
Сообщений: 15
15.02.2020, 10:00  [ТС]
Спасибо, за Ваш ответ.
Да, я знаю что DBGrid лишь отображает данные из БД.
В строке 12 написан первоначальный вариант, потом запутался и прописал от DBGrid. Для этого и решил спросить, а как должно быть правильно.
Edit использовал, чтоб исключить случайное изменение пользователем данных в БД.
С модальным созданием форм и дальнейшим уничтожением формы ещё не разобрался, изучаю, спасибо за ссылку на информацию.
0
561 / 230 / 88
Регистрация: 11.07.2015
Сообщений: 817
15.02.2020, 12:25
Пожалейте клавиатуру. Набирать каждый раз
Delphi
1
2
Form16.DBGrid1.DataSource.DataSet.FieldByName('lich_notification').AsBoolean:= CheckBox7.Checked
...
Проще
Delphi
1
2
3
4
5
6
7
with ADOTable do // или ADOQuery
    begin
      ADOTable.Edit;
      FieldByName('lich_notification').AsBoolean:= CheckBox7.Checked;
      ...
      ADOTable.Post;
    end;
1
 Аватар для Пытливый
3763 / 2267 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
15.02.2020, 15:47
Не настаиваю на правильности, но я считаю что with надо использовать только в финале, когда блок кода отлажен и никаких изменений в нем не ожидается. Проводить отладку кода, где используется with - это чертовски неудобное дело.
1
0 / 0 / 0
Регистрация: 14.05.2017
Сообщений: 6
30.03.2020, 15:50
Всем привет! Подскажите, как сделать форму!
На форме есть DBGrid1 (инфа тянется из Книга.xlsx) и DBGrid2(инфа тянется из База.accdb),
Книга.xlsx и База.accdb содержит одинаковый список людей, содержит уникальные данные (Key, FIO,DB,DOC).
и вот в Книга.xlsx были внесены новые записи, как сделать что бы при нажатии на Button1 в DBGrid1 остались те записи которых нет в DBGrid2?
Спасибо!
Миниатюры
Изменение данных в БД  DBGrid  
0
Модератор
 Аватар для D1973
9908 / 6445 / 2455
Регистрация: 21.01.2014
Сообщений: 27,363
Записей в блоге: 3
30.03.2020, 16:28
UR1004SWL,
with ADOTable do // <<==
begin
ADOTable.Edit; //???
FieldByName('lich_notification').AsBoole an:= CheckBox7.Checked;
...
ADOTable.Post; //???
end;
Добавлено через 1 минуту

Не по теме:

Ох, блин, на дату не посмотрел...



Добавлено через 1 минуту
Vados1984, ну и зачем Вы влезли в чужую тему с совершенно левым вопросом?
Есть проблема - создавайте собственную тему и озвучивайте ее!
0
0 / 0 / 0
Регистрация: 14.05.2017
Сообщений: 6
30.03.2020, 18:55
Вот можно использовать для внесения и редактирования записей.
Работаю с Аксесом, использую TEdit-ы.
при этом работает условия, что если Edit-ы не заполнены, выдает сообщение, что нужно заполнить поля.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
procedure TForm1.Button1Click(Sender: TObject);
begin
try
if (Edit1.Text<>'')and (Edit2.Text<>'') and (Edit3.Text<>'') and (Edit4.Text<>'') and (Edit5.Text<>'') and (Edit6.Text<>'') and (Edit7.Text<>'') and (Edit8.Text<>'') and (Edit9.Text<>'') and (Edit10.Text<>'') and (Edit11.Text<>'') then
 
 case MessageBox (Handle,'Внести данного клиента в базу?','Добавление',mb_YesNo) of
       IDYES:  begin
        ADOQuery1.Close;
        ADOQuery1.SQL.Clear;
        ADOQuery1.SQL.Add ('insert into dsa (asd, dd,qq,ww,ee,rr,tt,yy,uu,ii,oo,pp) VALUES ('''+Edit1.Text+''','''+DateToStr(+DateTimePicker1.Date)+''','''+Edit2.Text+''','''+Edit3.Text+''','''+Edit4.Text+''','''+Edit5.Text+''','''+Edit6.Text+''','''+Edit7.Text+''','''+Edit8.Text+''','''+Edit9.Text+''','''+Edit10.Text+''','''+Edit11.Text+''')');
     if ADOQuery1.ExecSQL>0 then ShowMessage('Сохранено');
        ADOQuery1.Requery;
        ADOQuery1.Free;
               end;
 
      IDNO:         begin   end;
 
         end
 
 else begin
      ShowMessage('Есть не заполненные поля');
 end;
 
 except
 
Form1.Close;
 
 end;
 
 end;
 
end.
0
5958 / 4534 / 1094
Регистрация: 29.08.2013
Сообщений: 28,143
Записей в блоге: 3
30.03.2020, 19:37
Цитата Сообщение от Vados1984 Посмотреть сообщение
except
Form1.Close;
отличная обработка ошибок
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.03.2020, 19:37
Помогаю со студенческими работами здесь

TableLayout - чтение данных из строк, изменение данных в строках
Заполнить TableLayout довольно просто. А вот прочитать ... И примеры есть в интернете, и клипса не ругается, и методы эти существуют...

Изменение данных в базе данных путем UPDATE
Есть запрос, ну не знаю, запрос это или просто код, но суть не в этом, ниже код: &lt;?php require 'connect.php'; ...

Добавление, изменение и удаление данных в базе данных
Методом научного тыка кое как подключил таблицу Microsoft Access с помощью datagrid вот только ни нашел ничего связанного с делфи или c++...

Изменение данных в таблице на основе данных из другой
Здравствуйте. У меня есть две таблицы, условно назовём их T1(с полями ID, Status) и T2(с полями ID, isTer). Все поля числовые. Мне...

Изменение текстовых данных в базе данных
Не могу изменить данные в столбце Name, т.к. требуются &quot;&quot; , а данные считываются из TextBox. Как это можно реализовать?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru