Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi и базы данных
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 251, средняя оценка - 4.90
МАрковка
0 / 0 / 2
Регистрация: 06.03.2012
Сообщений: 35
#1

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

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

Привет всем!
Помогите, пожааааааалуйста.
Дано:
1. на Form1 расположен DBGrid (2 колонки) и кнопки "добавить", "удалить", "посмотреть"
http://www.cyberforum.ru/delphi-database/thread1414486.html
2. кнопка "добавить" открывает Form3
3. на Form3 расположены Edit1, Edit2, Edit3, Edit4, Edit5, Edit6, Edit7, а также кнопка "ОК"
Требуется:
1. При нажатии на кнопку "ОК" в колонки DBGrid'а попадали Edit1 и Edit4
2. При нажатии на кнопку "посмотреть" на конкретной строке открывалась Form3 без возможности редактирования плюс появлялась кнопка "изменить", при нажатии на которую можно было отредактировать и нажать "ОК"
3. При нажатии на кнопку "удалить" вся строка DBGrid'а удалялась
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.03.2012, 08:41
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Как добавить, изменить, удалить, посмотреть запись в DBGrid? (Delphi БД):

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

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

Как добавить текущую запись из DbGrid в StringGrid?
Как добавить текущую запись из бд access которая отображается в DBgrid при...

Добавить запись в два DbGrid-а
Добрый день, подскажите как можно добавить запись сразу в 2 DBGrida? есть...

DBGrid столбцы (добавить - удалить)
Доброго времени суток. У меня такой вопрос: возможно ли у DBGrid сделать...

73
FIL
Модератор
3409 / 2547 / 725
Регистрация: 19.09.2012
Сообщений: 7,908
06.10.2013, 19:47 #41
У таблицы ЛЮДИ есть поле Key1, оно заполняется автоматически.
При добавлении записи в таблицу КОНТАКТЫ значение этого поля надо присвоить полю LinkKey1.
0
Shman
5 / 5 / 6
Регистрация: 30.04.2012
Сообщений: 212
06.10.2013, 19:55 #42
FIL, код можно? Мне бы пример в виде кода, а по остальным таблицам я соображу.
0
FIL
Модератор
3409 / 2547 / 725
Регистрация: 19.09.2012
Сообщений: 7,908
06.10.2013, 21:01 #43
Delphi
1
  DataModule1.KontaktyTableLinkKey1.Value := DataModule1.LudiTableKey1.AsInteger;
0
Shman
5 / 5 / 6
Регистрация: 30.04.2012
Сообщений: 212
07.10.2013, 06:35 #44
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
Модератор
3409 / 2547 / 725
Регистрация: 19.09.2012
Сообщений: 7,908
07.10.2013, 09:09 #45
Можно так:
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
Shman
5 / 5 / 6
Регистрация: 30.04.2012
Сообщений: 212
07.10.2013, 10:07 #46
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
Модератор
3409 / 2547 / 725
Регистрация: 19.09.2012
Сообщений: 7,908
07.10.2013, 10:41 #47
Сначала надо удалить все контакты человека (их может быть несколько), а потом уже запись из таблицы ЛЮДИ.
0
Shman
5 / 5 / 6
Регистрация: 30.04.2012
Сообщений: 212
07.10.2013, 10:50 #48
FIL, получилось! Надо всего лишь было строки поменять местами:
Delphi
1
2
3
4
 begin
   DataModule1.KontaktyTable.Delete;
   DataModule1.LudiTable.Delete;
 end;
0
FIL
Модератор
3409 / 2547 / 725
Регистрация: 19.09.2012
Сообщений: 7,908
07.10.2013, 10:54 #49
Записей в таблице КОНТАКТЫ для одного чела может быть несколько или их вообще может не быть, это надо проверять.
0
Shman
5 / 5 / 6
Регистрация: 30.04.2012
Сообщений: 212
07.10.2013, 11:16 #50
FIL, сначала надо разобраться как добавить 2-ю запись. Для моего тестового проекта будет достаточно 2-х. На форме есть заготовка. Как при нажатии чекбокса "Ещё" Вставить доп. поле для внесения конт. данных?
0
Вложения
Тип файла: zip TestBook.zip (516.3 Кб, 8 просмотров)
Shman
5 / 5 / 6
Регистрация: 30.04.2012
Сообщений: 212
07.10.2013, 12:28 #51
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
Shman
5 / 5 / 6
Регистрация: 30.04.2012
Сообщений: 212
07.10.2013, 12:33 #52
Однако стал наблюдаться неприятный эффект после того как введешь данные нового чел-ка и тут же отменяешь. Контактные данные человека с фамилией Крюгер , а именно номера телефонов 666-660-66, +7-666-66-66 и его емайл kr@gmail.ru накладываются на конт. данные Сидорова, хотя реально в самой БД все в порядке и когда подвигаешь курсором по DB Grid все становится на свои места . Вот как избавиться от этого глюка? Скриншоты приложил. Первые два скрина - все норм, третий - глюк после отмены добавления новой записи.
0
Миниатюры
Как добавить, изменить, удалить, посмотреть запись в DBGrid?   Как добавить, изменить, удалить, посмотреть запись в DBGrid?   Как добавить, изменить, удалить, посмотреть запись в DBGrid?  

FIL
Модератор
3409 / 2547 / 725
Регистрация: 19.09.2012
Сообщений: 7,908
07.10.2013, 13:14 #53
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
Shman
5 / 5 / 6
Регистрация: 30.04.2012
Сообщений: 212
07.10.2013, 14:07 #54
Цитата Сообщение от 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
Shman
5 / 5 / 6
Регистрация: 30.04.2012
Сообщений: 212
07.10.2013, 19:00 #55
Немного доработал форму ввода и сделал форму ввода контактов отдельно. Написал строки кода для связки таблиц и сохранения по аналогии с предыдущем примером. Однако номера телефонов и емайлов корректно сохраняться и отображаться не хотят (на контакты нового чел-ка накладываются контакты остальных людей в базе). См. скриншот.
Помогите найти, где и что я упустил, и, пожалуйста, приводите сразу участки кода, чтобы было понятно о чем речь.
Прошу помочь мне разобраться в этом деле, потому что эти баги и нюансы тормозят основное дело.
0
Миниатюры
Как добавить, изменить, удалить, посмотреть запись в DBGrid?  
Вложения
Тип файла: zip TestBook2.zip (531.3 Кб, 10 просмотров)
FIL
Модератор
3409 / 2547 / 725
Регистрация: 19.09.2012
Сообщений: 7,908
07.10.2013, 20:43 #56
Цитата Сообщение от Shman Посмотреть сообщение
В каком смысле разделить?
В смысле добавление людей разделить с добавлением контактов. Тогда и проблем таких не будет.
0
Shman
5 / 5 / 6
Регистрация: 30.04.2012
Сообщений: 212
08.10.2013, 07:08 #57
FIL, я разделил! См. чуть выше. Но все равно не все гладко. Помоги пжста подправить сохранение. Горю!
0
FIL
Модератор
3409 / 2547 / 725
Регистрация: 19.09.2012
Сообщений: 7,908
08.10.2013, 08:47 #58
Цитата Сообщение от Shman Посмотреть сообщение
я разделил!
Это тебе так кажется . Представь ситуацию, когда ты сохранил контакты и нажал отмену создания чела - что будет?
Меню обработки контактов должно быть полностью отделено от меню людей. Добавил чела, сохранил - можешь работать с его контактами, но не раньше.
0
Shman
5 / 5 / 6
Регистрация: 30.04.2012
Сообщений: 212
08.10.2013, 09:14 #59
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 емайла.
0
Вложения
Тип файла: zip TestBook1.zip (516.8 Кб, 13 просмотров)
Shman
5 / 5 / 6
Регистрация: 30.04.2012
Сообщений: 212
08.10.2013, 09:35 #60
Хотя нет, после
Delphi
1
  DataModule1.LudiTable.Cancel;
строка
Delphi
1
 DataModule1.KontaktyTable.MasterSource := DataModule1.LudiSource;
и не нужна вовсе. А после
Delphi
1
DataModule1.KontaktyTable.Cancel;
нужна!
0
08.10.2013, 09:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.10.2013, 09:35
Привет! Вот еще темы с решениями:

DBGrid столбцы (добавить - удалить)
Здравствуйте. Помогите пожалуйста, весь интернет перерыла. На форме...

Добавить запись в выделенную ячейку DBGRID
Всем привет, разрабатываю программу электронная регистратура. Такой вопрос, как...

DBGrid, добавить запись в колонку с выборкой
Есть грид, пользователей. (uid, login) Пользователи заполняют таблицу...

Удалить запись из DBGrid
В DBGrid выводится информация из 2 таблиц. Выделяю нужную строку, жму кнопку...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru