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

Как добавить, изменить, удалить, посмотреть запись в DBGrid?

06.03.2012, 08:41. Показов 57612. Ответов 73
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет всем!
Помогите, пожааааааалуйста.
Дано:
1. на Form1 расположен DBGrid (2 колонки) и кнопки "добавить", "удалить", "посмотреть"
2. кнопка "добавить" открывает Form3
3. на Form3 расположены Edit1, Edit2, Edit3, Edit4, Edit5, Edit6, Edit7, а также кнопка "ОК"
Требуется:
1. При нажатии на кнопку "ОК" в колонки DBGrid'а попадали Edit1 и Edit4
2. При нажатии на кнопку "посмотреть" на конкретной строке открывалась Form3 без возможности редактирования плюс появлялась кнопка "изменить", при нажатии на которую можно было отредактировать и нажать "ОК"
3. При нажатии на кнопку "удалить" вся строка DBGrid'а удалялась
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.03.2012, 08:41
Ответы с готовыми решениями:

Как добавить, удалить или изменить запись в ListBox, чтобы при этом изменения сохранились в базе данных?
Как добавить, удалить или изменить запись в Listbox, чтобы при этом изменения сохранились в базе данных??? Кто нибудь может помочь с кодом...

Как добавить запись в dbgrid
Здравствуйте срочно нужна помощь делаю курсовую, не могу в dbgrid добавить запись. Хотел сделать через кнопку Table1.Insert; но учительница...

Как удалить запись в dbgrid?
здравствуйте! есть виртуальный датасет MemTableEh, в него заполняются данные из DataSet. затем по каждой заполненой строке MemTableEh...

73
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
06.10.2013, 19:47
Студворк — интернет-сервис помощи студентам
У таблицы ЛЮДИ есть поле Key1, оно заполняется автоматически.
При добавлении записи в таблицу КОНТАКТЫ значение этого поля надо присвоить полю LinkKey1.
0
6 / 6 / 6
Регистрация: 30.04.2012
Сообщений: 216
06.10.2013, 19:55
FIL, код можно? Мне бы пример в виде кода, а по остальным таблицам я соображу.
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
06.10.2013, 21:01
Delphi
1
  DataModule1.KontaktyTableLinkKey1.Value := DataModule1.LudiTableKey1.AsInteger;
0
6 / 6 / 6
Регистрация: 30.04.2012
Сообщений: 216
07.10.2013, 06:35
FIL, я извиняюсь,. этот фрагмент кода надо вставлять в кнопку добавления записи или в кнопку Сохранить на форме ввода? Пробовал первое, не срабатывает:
Delphi
1
2
3
4
5
6
7
8
{НЕ РАБОТАЕТ}
procedure TMainForm.AddN2Click(Sender: TObject);
begin
 DataModule1.LudiTable.Insert;
 DataModule1.KontaktyTable.Insert;
 DataModule1.KontaktyTableLinkKey1.Value := DataModule1.LudiTableKey1.AsInteger;
 AddEditFormForm.ShowModal;
end;
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
07.10.2013, 09:09
Можно так:
Delphi
1
2
3
4
5
6
7
procedure TMainForm.AddN2Click(Sender: TObject);
begin
 DataModule1.KontaktyTable.MasterSource := nil;
 DataModule1.LudiTable.Insert;
 DataModule1.KontaktyTable.Insert;
 AddEditFormForm.ShowModal;
end;
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
procedure TAddEditFormForm.SaveButtonClick(Sender: TObject);
begin
 if DataModule1.LudiTable.Modified then   // Åñëè çàïèñü ñ ëþäüìè èçìåíèëàñü, òîãäà
    DataModule1.LudiTable.Post   // ñîõðàíèòü
 else
   DataModule1.LudiTable.Cancel;
 if DataModule1.KontaktyTable.Modified then   // Åñëè çàïèñü ñ êîíòàêòàìè èçìåíèëàñü, òîãäà
 begin
    DataModule1.KontaktyTableLinkKey1.Value := DataModule1.LudiTableKey1.AsInteger;
    DataModule1.KontaktyTable.Post;   // ñîðõàíèòü
 end else
   DataModule1.KontaktyTable.Cancel;
 DataModule1.KontaktyTable.MasterSource := DataModule1.LudiSource;
 Close;   // Çàêðûòü ôîðìó ââîäà
end;
1
6 / 6 / 6
Регистрация: 30.04.2012
Сообщений: 216
07.10.2013, 10:07
FIL, получается так: перед стартом AddEditForm мы обнуляем параметр MasterSource, затем во время сохранения мы присваиваем уникальному ключу Key1 из табл. ЛЮДИ значение LinkKey1 из табл. КОНТАКТЫ, а после сохранения в параметр MasterSource заносим обратно LudiSource?
Таааак. А как теперь корректно удалить запись человека вместе с его контактами?

Добавлено через 25 минут
Вот такой вариант не работает:
Delphi
1
2
3
4
5
6
7
8
9
procedure TMainForm.DelN4Click(Sender: TObject);
begin
 if Application.MessageBox(PChar('Вы действительно хотите удалить '
  +DataModule1.LudiTableWideStringField.AsString), 'Внимание!!!', MB_OKCANCEL)=id_OK then
 begin
   DataModule1.LudiTable.Delete;
   DataModule1.KontaktyTable.Delete;   // НЕ СРАБАТЫВАЕТ
 end;
end;
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
07.10.2013, 10:41
Сначала надо удалить все контакты человека (их может быть несколько), а потом уже запись из таблицы ЛЮДИ.
0
6 / 6 / 6
Регистрация: 30.04.2012
Сообщений: 216
07.10.2013, 10:50
FIL, получилось! Надо всего лишь было строки поменять местами:
Delphi
1
2
3
4
 begin
   DataModule1.KontaktyTable.Delete;
   DataModule1.LudiTable.Delete;
 end;
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
07.10.2013, 10:54
Записей в таблице КОНТАКТЫ для одного чела может быть несколько или их вообще может не быть, это надо проверять.
0
6 / 6 / 6
Регистрация: 30.04.2012
Сообщений: 216
07.10.2013, 11:16
FIL, сначала надо разобраться как добавить 2-ю запись. Для моего тестового проекта будет достаточно 2-х. На форме есть заготовка. Как при нажатии чекбокса "Ещё" Вставить доп. поле для внесения конт. данных?
Вложения
Тип файла: zip TestBook.zip (516.3 Кб, 9 просмотров)
0
6 / 6 / 6
Регистрация: 30.04.2012
Сообщений: 216
07.10.2013, 12:28
FIL, Кстати, после того как мы изменили код к кнопке Сохранить, кнопка Отменить перестала работать. Её следует подправить аналогичным способом:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
procedure TAddEditForm.CancelButtonClick(Sender: TObject);
begin
  if DataModule1.LudiTable.Modified then   // Если запись с людьми изменилась, тогда
   DataModule1.LudiTable.Cancel;   // отменить
 
 if DataModule1.KontaktyTable.Modified then   // Если запись с контактами изменилась, тогда
  begin
   DataModule1.KontaktyTableLinkKey1.Value := DataModule1.LudiTableKey1.AsInteger;   // связывем KontaktyTable с LudiTable
   DataModule1.KontaktyTable.Cancel;   // отменить
  end;
 DataModule1.KontaktyTable.MasterSource := DataModule1.LudiSource;    // LudiSource заносим обратно в параметр MasterSource
 Close;   // Закрываем форму ввода
end;
0
6 / 6 / 6
Регистрация: 30.04.2012
Сообщений: 216
07.10.2013, 12:33
Однако стал наблюдаться неприятный эффект после того как введешь данные нового чел-ка и тут же отменяешь. Контактные данные человека с фамилией Крюгер , а именно номера телефонов 666-660-66, +7-666-66-66 и его емайл kr@gmail.ru накладываются на конт. данные Сидорова, хотя реально в самой БД все в порядке и когда подвигаешь курсором по DB Grid все становится на свои места . Вот как избавиться от этого глюка? Скриншоты приложил. Первые два скрина - все норм, третий - глюк после отмены добавления новой записи.
Миниатюры
Как добавить, изменить, удалить, посмотреть запись в DBGrid?   Как добавить, изменить, удалить, посмотреть запись в DBGrid?   Как добавить, изменить, удалить, посмотреть запись в DBGrid?  

0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
07.10.2013, 13:14
Delphi
1
2
3
4
5
6
7
8
9
10
procedure TAddEditForm.CancelButtonClick(Sender: TObject);
begin
 if DataModule1.KontaktyTable.Modified then   // Если запись с контактами изменилась, тогда
   DataModule1.KontaktyTable.Cancel;   // отменить
 if DataModule1.LudiTable.Modified then   // Если запись с людьми изменилась, тогда
   DataModule1.LudiTable.Cancel;   // отменить
 
 DataModule1.KontaktyTable.MasterSource := DataModule1.LudiSource;    // LudiSource заносим обратно в параметр MasterSource
 Close;   // Закрываем форму ввода
end;
А вообще, добавление людей и контактов правильно было бы разделить.
0
6 / 6 / 6
Регистрация: 30.04.2012
Сообщений: 216
07.10.2013, 14:07
Цитата Сообщение от FIL Посмотреть сообщение
Delphi
1
2
3
4
5
6
7
8
9
10
procedure TAddEditForm.CancelButtonClick(Sender: TObject);
begin
 if DataModule1.KontaktyTable.Modified then   // Если запись с контактами изменилась, тогда
   DataModule1.KontaktyTable.Cancel;   // отменить
 if DataModule1.LudiTable.Modified then   // Если запись с людьми изменилась, тогда
   DataModule1.LudiTable.Cancel;   // отменить
 
 DataModule1.KontaktyTable.MasterSource := DataModule1.LudiSource;    // LudiSource заносим обратно в параметр MasterSource
 Close;   // Закрываем форму ввода
end;
Глюк как был так и остался.

Цитата Сообщение от FIL Посмотреть сообщение
А вообще, добавление людей и контактов правильно было бы разделить.
В каком смысле разделить? Я хочу добиться чтобы для каждого ФИО программа показывала свои контакты (по одному, максимум по по два домаш. телефона, мобильника и емайла), поэтому таблицы связаны
0
6 / 6 / 6
Регистрация: 30.04.2012
Сообщений: 216
07.10.2013, 19:00
Немного доработал форму ввода и сделал форму ввода контактов отдельно. Написал строки кода для связки таблиц и сохранения по аналогии с предыдущем примером. Однако номера телефонов и емайлов корректно сохраняться и отображаться не хотят (на контакты нового чел-ка накладываются контакты остальных людей в базе). См. скриншот.
Помогите найти, где и что я упустил, и, пожалуйста, приводите сразу участки кода, чтобы было понятно о чем речь.
Прошу помочь мне разобраться в этом деле, потому что эти баги и нюансы тормозят основное дело.
Миниатюры
Как добавить, изменить, удалить, посмотреть запись в DBGrid?  
Вложения
Тип файла: zip TestBook2.zip (531.3 Кб, 10 просмотров)
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
07.10.2013, 20:43
Цитата Сообщение от Shman Посмотреть сообщение
В каком смысле разделить?
В смысле добавление людей разделить с добавлением контактов. Тогда и проблем таких не будет.
0
6 / 6 / 6
Регистрация: 30.04.2012
Сообщений: 216
08.10.2013, 07:08
FIL, я разделил! См. чуть выше. Но все равно не все гладко. Помоги пжста подправить сохранение. Горю!
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
08.10.2013, 08:47
Цитата Сообщение от Shman Посмотреть сообщение
я разделил!
Это тебе так кажется . Представь ситуацию, когда ты сохранил контакты и нажал отмену создания чела - что будет?
Меню обработки контактов должно быть полностью отделено от меню людей. Добавил чела, сохранил - можешь работать с его контактами, но не раньше.
0
6 / 6 / 6
Регистрация: 30.04.2012
Сообщений: 216
08.10.2013, 09:14
FIL,
[q]Меню обработки контактов должно быть полностью отделено от меню людей. Добавил чела, сохранил - можешь работать с его контактами, но не раньше.
В таком случае надо делать разные формы ввода, отдельно для ЛЮДЕЙ и отдельно для КОНТАКТОВ, а в моем случае это неудобно. Удобнее как это было в первом варианте (приложил).

Однако стал наблюдаться неприятный эффект после того как введешь данные нового чел-ка и тут же отменяешь. Контактные данные человека с фамилией Крюгер , а именно номера телефонов 666-660-66, +7-666-66-66 и его емайл kr@gmail.ru накладываются на конт. данные Сидорова, хотя реально в самой БД все в порядке и когда подвигаешь курсором по DB Grid все становится на свои места . Вот как избавиться от этого глюка? Скриншоты приложил. Первые два скрина - все норм, третий - глюк после отмены добавления новой записи.
Сегодня допёр как избавиться от этого неприятного эффекта. Надо написать:
Delphi
1
2
3
4
5
6
7
8
9
10
procedure TAddEditForm.CancelButtonClick(Sender: TObject);
begin
  DataModule1.KontaktyTable.Cancel; 
  DataModule1.KontaktyTable.MasterSource := DataModule1.LudiSource;  
 
  DataModule1.LudiTable.Cancel;
  DataModule1.KontaktyTable.MasterSource := DataModule1.LudiSource;
 
 Close;   
end;
То есть после каждого отката каждого ADOTable написать:
Delphi
1
  DataModule1.KontaktyTable.MasterSource := DataModule1.LudiSource;
Все просто! Неужели было так трудно подсказать?

Теперь осталось допереть как добавить 2-ой телефон или 2-ой емайл для 1-го человека. Для данного дела мне достаточно максимум 2 номера телефона и\или 2 емайла.
Вложения
Тип файла: zip TestBook1.zip (516.8 Кб, 13 просмотров)
0
6 / 6 / 6
Регистрация: 30.04.2012
Сообщений: 216
08.10.2013, 09:35
Хотя нет, после
Delphi
1
  DataModule1.LudiTable.Cancel;
строка
Delphi
1
 DataModule1.KontaktyTable.MasterSource := DataModule1.LudiSource;
и не нужна вовсе. А после
Delphi
1
DataModule1.KontaktyTable.Cancel;
нужна!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.10.2013, 09:35

Как добавить текущую запись из DbGrid в StringGrid?
Как добавить текущую запись из бд access которая отображается в DBgrid при клике мыши по ней или при нажатии на кнопку , в компонент...

Как добавить запись в нужную строку DBGrid?
Нужно чтобы,по указанному в DateTimePicker времени,он добавлял запись в нужную строку.Вот скрин: Т.е. в пикере я указываю...

Символическая ссылка (удалить/добавить/посмотреть)
Здравствуйте, пожалуйста скажите, кто знает как УДАЛИТЬ символическую ссылку, и посмотреть созданые? я создавал её командой ln -s...

Четыре кнопки на форме: добавить запись, удалить запись, закрыть, найти запись
Private Sub КнопкаДобавитьЗапись_Click() On Error GoTo Err_КнопкаДобавитьЗапись_Click DoCmd.GoToRecord , , acNewRec ...

Как удалить/добавить запись, используя Nhibernate?
Как удалить/добавить запись, используя Nhibernate? Не могу понять. Покажите на примере, если не сложно. Заранее спасибо.


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Оказывается, Unreal Engine позволяет качество на порядки выше, чем было в Lineedge
Etyuhibosecyu 05.07.2026
Жаль, конечно, что я не узнал об этом, пока Lineedge существовала, а то бы Noname2331 написал, что волки превращаются в пиксельную кашу, а я бы его попросил скачать какую-нибудь бриллиантовую или Pro. . .
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru