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

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

14.02.2020, 19:39. Показов 804. Ответов 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
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,671
Записей в блоге: 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
9928 / 6465 / 2457
Регистрация: 21.01.2014
Сообщений: 27,420
Записей в блоге: 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
5981 / 4556 / 1095
Регистрация: 29.08.2013
Сообщений: 28,193
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 30.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru