Форум программистов, компьютерный форум, киберфорум
C++ Builder: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
11 / 11 / 4
Регистрация: 17.06.2010
Сообщений: 438

Редактирование записи выбранной в DBGrid

27.05.2015, 18:46. Показов 3247. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер. Отображаю данные в DBGrid таким образом переходом на другую форму

C++
1
2
3
4
5
6
7
8
9
void __fastcall Tfrm_oprr::N2Click(TObject *Sender)
{
        frm_vakansii->ADOQuery_vakansii->Close();
        frm_vakansii->ADOQuery_vakansii->SQL->Clear();
        //запрос на удаление
        frm_vakansii->ADOQuery_vakansii->SQL->Add("SELECT `vakansii`.`idvakansii`, `vakansii`.`sost`, `vakansii`.`data_reg`, `nazv_prof`.`nazv_prof`, `predpriyatie`.`nazvanie`, `vakansii`.`z_p`, `vakansii`.`kommentariy`,  `vakansii`.`data_zakr`  FROM vakansii, predpriyatie, nazv_prof WHERE (vakansii.predpriyatie_reg_nomer=predpriyatie.reg_nomer) AND (vakansii.nazv_prof_id_prof=nazv_prof.id_prof)");
        frm_vakansii->ADOQuery_vakansii->Open();
         frm_vakansii->DataSource_vakansii->DataSet=frm_vakansii->ADOQuery_vakansii;
}
На форме что открылась данные отобразились, добавление работает хорошо. А вот если сделать изменить, то почему-то берет всегда первую запись, какую бы я не выбрал, изменяет тоже нормально. Подскажите пожалуйста как исправить?

Код запроса на изменение

C++
1
2
3
4
5
 ADOTable_vakansii->Edit();
     //создаем и открываем форму как модальную (чтобы пользователь не могу ничего сделать с другими формами)
    frm_dobavlenie_vakansii = new Tfrm_dobavlenie_vakansii(Application);
   frm_dobavlenie_vakansii->ShowModal();
    frm_dobavlenie_vakansii->Repaint();
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.05.2015, 18:46
Ответы с готовыми решениями:

Добавление записи в DBGrid и получение записи в DBGrid Другой формы
К проекту подключена Access .mdb БД. Имеется 2 формы. На обоих формах есть DBGrid. Как сделать, что бы при добавлении записи в таблицу из...

Передача позиции выбранной ячейки в DBGrid в другую форму
Здраствуйте. Сталкнулся с такой проблемой: Выбираю позицию в DBGrid, открываю редактировать в другой форме позиция переносится в начало....

Подсветка выбранной записи
Привет всем. У меня есть на форме dbgrid1 и radiobutton1. При нажатии на radiobutton1 выполняется такой код: { ...

20
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
27.05.2015, 20:46
Цитата Сообщение от TYMON Посмотреть сообщение
Код запроса на изменение
А где поле в котором ты собираешься делать редактирование в модальной форме
0
164 / 49 / 27
Регистрация: 04.06.2013
Сообщений: 636
27.05.2015, 20:59
так можно сразу в гриде редактировать, а потом сохранить
0
11 / 11 / 4
Регистрация: 17.06.2010
Сообщений: 438
27.05.2015, 21:09  [ТС]
mish_k98, не, надо через модальную форму.

Sasha, о каком поле речь?
0
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
27.05.2015, 21:17
Цитата Сообщение от TYMON Посмотреть сообщение
Sasha, о каком поле речь?
Ну тыже собрался в модальной форме редактировать, а там должен быть какой-нит Edit должны попасть данные который нужно из базы
0
11 / 11 / 4
Регистрация: 17.06.2010
Сообщений: 438
27.05.2015, 21:31  [ТС]
А, стоят поля там dbedit, данные туда отображаются, но только почему то всегда первой записи в гриде, и собственно сохраняет изменения нормально, но только всегда первой строки
0
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
27.05.2015, 21:36
Чё-то яне вижу где-ты создаёшь там на модальной форме dbedit?
0
11 / 11 / 4
Регистрация: 17.06.2010
Сообщений: 438
27.05.2015, 21:38  [ТС]
Они нанесены на форме модальной, и привязаны ж к полям
0
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
27.05.2015, 21:57
Вот тогда вот эта строка мне не понятно зачем здесь
Цитата Сообщение от TYMON Посмотреть сообщение
frm_dobavlenie_vakansii = new Tfrm_dobavlenie_vakansii(Application);
Если ты сделал заранее форму, эта строка тут лишняя, достаточно только этой строки

C++
1
frm_dobavlenie_vakansii->ShowModal();
0
11 / 11 / 4
Регистрация: 17.06.2010
Сообщений: 438
27.05.2015, 22:05  [ТС]
Нет, она не auto-create
0
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
27.05.2015, 22:10
Ну так если она не auto-create тогда зачем писать вот это
C++
1
frm_dobavlenie_vakansii = new Tfrm_dobavlenie_vakansii(Application);
0
11 / 11 / 4
Регистрация: 17.06.2010
Сообщений: 438
27.05.2015, 22:43  [ТС]
по другому ошибка выскакивает, всегда так писал
0
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
27.05.2015, 23:02
какая ошибка выскакивает?
0
11 / 11 / 4
Регистрация: 17.06.2010
Сообщений: 438
28.05.2015, 09:05  [ТС]
Такая ошибка
Миниатюры
Редактирование записи выбранной в DBGrid  
0
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
28.05.2015, 09:23
Так это у тебя считывается не с того адреса с котрого нужно, явно в проекте где-то косяк
0
11 / 11 / 4
Регистрация: 17.06.2010
Сообщений: 438
28.05.2015, 09:52  [ТС]
Может быть, вопрос в другом, будет ли позволят мне это изменять данные?
0
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
28.05.2015, 12:31
надо на проект смотреть, что у тебя там сделано, потому как по такой ошибке трудно определить в чём дело
0
480 / 393 / 113
Регистрация: 24.04.2012
Сообщений: 1,632
Записей в блоге: 3
29.05.2015, 04:23
Вот специально для тебя наваял:
C++
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
// Изменение данных
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  TForm2 *newForm = NULL;
  try
   {newForm = new TForm2(this);
    newForm->DataSource1->DataSet = IBTable1;
    IBTable1->Edit();
    newForm->ShowModal();
   }
  __finally
   {IBTable1->Cancel();
    delete newForm;
   }
}
//---------------------------------------------------------------------------
// Добавление данных
void __fastcall TForm1::Button2Click(TObject *Sender)
{
  TForm2 *newForm = NULL;
  try
   {newForm = new TForm2(this);
    newForm->DataSource1->DataSet = IBTable1;
    IBTable1->Append();
    newForm->ShowModal();
   }
  __finally
   {IBTable1->Cancel();
    delete newForm;
   }
}
//---------------------------------------------------------------------------
// Фиксация изменений
void __fastcall TForm2::FormCloseQuery(TObject *Sender, bool &CanClose)
{
  if (IsPositiveResult(ModalResult) == true)
    DataSource1->DataSet->Post();
  else
    DataSource1->DataSet->Cancel();
}
//---------------------------------------------------------------------------
Добавлено через 5 минут
Цитата Сообщение от TYMON Посмотреть сообщение
данные туда отображаются, но только почему то всегда первой записи в гриде,
Скорее всего ты запутался в своих DataSet'ах. Желательно показать весь код
0
11 / 11 / 4
Регистрация: 17.06.2010
Сообщений: 438
29.05.2015, 10:19  [ТС]
Не спорю, скорей всего запутался. Открытие формы vakansii происходит по нажатию кнопки на другой форме.
C++
1
2
3
4
5
6
7
8
9
10
11
void __fastcall Tfrm_oprr::N2Click(TObject *Sender)
{
frm_vakansii->Visible=true;
frm_oprr->Visible=false;
        frm_vakansii->ADOQuery_vakansii->Close();
        frm_vakansii->ADOQuery_vakansii->SQL->Clear();
        //запрос на удаление
        frm_vakansii->ADOQuery_vakansii->SQL->Add("SELECT `vakansii`.`idvakansii`, `vakansii`.`sost`, `vakansii`.`data_reg`, `nazv_prof`.`nazv_prof`, `predpriyatie`.`nazvanie`, `vakansii`.`z_p`, `vakansii`.`kommentariy`,  `vakansii`.`data_zakr`  FROM vakansii, predpriyatie, nazv_prof WHERE (vakansii.predpriyatie_reg_nomer=predpriyatie.reg_nomer) AND (vakansii.nazv_prof_id_prof=nazv_prof.id_prof)");
        frm_vakansii->ADOQuery_vakansii->Open();
         frm_vakansii->DataSource_vakansii->DataSet=frm_vakansii->ADOQuery_vakansii;
            }
Форма отображения данных и кнопок:
C++
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "vakansii.h"
#include "vhod.h"
#include "oprr.h"
#include "dobavlenie_vakansii.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
Tfrm_vakansii *frm_vakansii;
//---------------------------------------------------------------------------
__fastcall Tfrm_vakansii::Tfrm_vakansii(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall Tfrm_vakansii::FormCloseQuery(TObject *Sender, bool &CanClose)
{
frm_vhod->Close();
}
//---------------------------------------------------------------------------
 
 
void __fastcall Tfrm_vakansii::FormDestroy(TObject *Sender)
{
ADOConnection_vakansii->Connected=false;
 
}
//---------------------------------------------------------------------------
 
//переход на другую форму
 
void __fastcall Tfrm_vakansii::N1Click(TObject *Sender)
{
  frm_vakansii->Visible=false;
frm_oprr->Visible=true;
}
//---------------------------------------------------------------------------
 
//добавление данных
void __fastcall Tfrm_vakansii::Button_dobavitClick(TObject *Sender)
{
 ADOTable_vakansii->Insert();
     //создаем и открываем форму как модальную (чтобы пользователь не могу ничего сделать с другими формами)
    frm_dobavlenie_vakansii = new Tfrm_dobavlenie_vakansii(Application);
   frm_dobavlenie_vakansii->ShowModal();
    frm_dobavlenie_vakansii->Repaint();
}
//---------------------------------------------------------------------------
 
//изменение данных
void __fastcall Tfrm_vakansii::Button1Click(TObject *Sender)
{
 
 ADOTable_vakansii->Edit();
     //создаем и открываем форму как модальную (чтобы пользователь не могу ничего сделать с другими формами)
    frm_dobavlenie_vakansii = new Tfrm_dobavlenie_vakansii(Application);
   frm_dobavlenie_vakansii->ShowModal();
    frm_dobavlenie_vakansii->Repaint();
 
}
//---------------------------------------------------------------------------
 
//изменение данных
void __fastcall Tfrm_vakansii::DBGrid_vakansiiDblClick(TObject *Sender)
{
 
 ADOTable_vakansii->Edit();
     //создаем и открываем форму как модальную (чтобы пользователь не могу ничего сделать с другими формами)
    frm_dobavlenie_vakansii = new Tfrm_dobavlenie_vakansii(Application);
   frm_dobavlenie_vakansii->ShowModal();
    frm_dobavlenie_vakansii->Repaint();
}
//---------------------------------------------------------------------------
 
//удаление данных
void __fastcall Tfrm_vakansii::Button2Click(TObject *Sender)
{
String del=this->DBGrid_vakansii->DataSource->DataSet->FieldByName("idvakansii")->AsString;
 //выдаем запрос на удаление данных
  if (ADOTable_vakansii->RecordCount>0)
        {
 
            if (Application->MessageBoxW((const wchar_t*) L"Вы действительно хотите удалить выбранную запись? ", (const wchar_t*) L"Подтверждение",MB_YESNO|MB_ICONINFORMATION) == ID_YES)
                    {
        ADOQuery_vakansii->Close();
        ADOQuery_vakansii->SQL->Clear();
        //запрос на удаление
        ADOQuery_vakansii->SQL->Add("DELETE FROM vakansii WHERE idvakansii='"+del+"'");
        ADOQuery_vakansii->ExecSQL();
        frm_oprr->N2Click(Sender);
                    }
         }
}
//---------------------------------------------------------------------------
 
void __fastcall Tfrm_vakansii::N3Click(TObject *Sender)
{
//выход из программы
 frm_vakansii->ADOTable_vakansii->Active=false;
                frm_vakansii->ADOTable_predpriyatie->Active=false;
              frm_vakansii->ADOTable_nazv_prof->Active=false;
              ADOConnection_vakansii->Connected=false;
              frm_vhod->Close();
}
//---------------------------------------------------------------------------
Форма добавления данных:
C++
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
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "dobavlenie_vakansii.h"
#include "vakansii.h"
#include "oprr.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
Tfrm_dobavlenie_vakansii *frm_dobavlenie_vakansii;
//---------------------------------------------------------------------------
__fastcall Tfrm_dobavlenie_vakansii::Tfrm_dobavlenie_vakansii(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
 
void __fastcall Tfrm_dobavlenie_vakansii::FormCloseQuery(TObject *Sender, bool &CanClose)
 
{
frm_vakansii->ADOTable_vakansii->Cancel();
}
//---------------------------------------------------------------------------
 
void __fastcall Tfrm_dobavlenie_vakansii::Button_sohranitClick(TObject *Sender)
{
   if (DBComboBox1->Text.IsEmpty() || DBEdit_data_reg->Text.IsEmpty() || DBLookupComboBox_nazv_prof->Text.IsEmpty() || DBLookupComboBox_predp->Text.IsEmpty() || DBEdit_z_p->Text.IsEmpty() || DBEdit_kommentariy->Text.IsEmpty() || DBEdit_data_zakr->Text.IsEmpty() )
{
       Application->MessageBoxW((const wchar_t*) L"Поле не может быть пустым!! Введите пожалуйста данные ", (const wchar_t*) L"Ошибка ввода!",MB_OK+MB_ICONSTOP);
 
    }
     //если все заполнены
    else
    {
    //сохраняем запись
      frm_vakansii->ADOTable_vakansii->Post();
       frm_oprr->N2Click(Sender);
     frm_dobavlenie_vakansii->Close();
 }
}
 
void __fastcall Tfrm_dobavlenie_vakansii::Button_otmenaClick(TObject *Sender)
{
frm_vakansii->ADOTable_vakansii->Cancel();
  frm_oprr->N2Click(Sender);
    frm_dobavlenie_vakansii->Close();
}
 
void __fastcall Tfrm_dobavlenie_vakansii::FormClose(TObject *Sender, TCloseAction &Action)
 
{
Action=caFree;
}
0
480 / 393 / 113
Регистрация: 24.04.2012
Сообщений: 1,632
Записей в блоге: 3
04.06.2015, 18:37
Лишние инклуды.
C++
1
2
3
#include "vakansii.h"
#include "dobavlenie_vakansii.h"
Tfrm_vakansii *frm_vakansii;
C++
1
2
#include "dobavlenie_vakansii.h"
Tfrm_dobavlenie_vakansii *frm_dobavlenie_vakansii;
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void __fastcall Tfrm_oprr::N2Click(TObject *Sender)
{
  frm_oprr->Hide();
  Tfrm_vakansii *frm_vakansii = NULL;
  try
   {
    frm_vakansii = new Tfrm_vakansii(this);
    if (frm_vakansii->ADOQuery_vakansii->Active) frm_vakansii->ADOQuery_vakansii->Close();
    frm_vakansii->ADOQuery_vakansii->SQL->Clear();
    frm_vakansii->ADOQuery_vakansii->SQL->Add("SELECT `vakansii`.`idvakansii`, `vakansii`.`sost`, `vakansii`.`data_reg`, `nazv_prof`.`nazv_prof`, `predpriyatie`.`nazvanie`, `vakansii`.`z_p`, `vakansii`.`kommentariy`,  `vakansii`.`data_zakr`  FROM vakansii, predpriyatie, nazv_prof WHERE (vakansii.predpriyatie_reg_nomer=predpriyatie.reg_nomer) AND (vakansii.nazv_prof_id_prof=nazv_prof.id_prof)");
    frm_vakansii->ADOQuery_vakansii->Open();
    frm_vakansii->DataSource_vakansii->DataSet=frm_vakansii->ADOQuery_vakansii;
    frm_vakansii->ShowModal();
  __finally
   {delete frm_vakansii;}
  frm_oprr->Show();  
}
Добавлено через 9 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//Изменение данных
void __fastcall Tfrm_vakansii::ChangeData(bool NewRecord)
{
  if (NewRecord) ADOTable_vakansii->Insert();
  else ADOTable_vakansii->Edit();
  Tfrm_dobavlenie_vakansii *frm_dobavlenie_vakansii = NULL;
  try
   {frm_dobavlenie_vakansii  = new Tfrm_dobavlenie_vakansii(this);
    frm_dobavlenie_vakansii ->DataSource1->DataSet = ADOTable_vakansii;
    frm_dobavlenie_vakansii->ShowModal();
   }
  __finally
  {delete frm_dobavlenie_vakansii;
  }
}
Добавлено через 2 минуты
Надеюсь так пойдет?! Остальное надеюсь додумаешь и лишнее уберешь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.06.2015, 18:37
Помогаю со студенческими работами здесь

Удаление выбранной записи из таблицы
Нашел на форуме способ удаления, и вроде бы он рабочий: String del=Form1-&gt;DBGrid2-&gt;SelectedField-&gt;AsString; String...

Редактирование DBGrid
Люди добрые, помогите, пожалуйста! В таблице DBGrid очень длинные записи не помещаются в ячейку. Есть ли какая-нибудь возможность...

Редактирование dbgrid
как сделать что бы по кнопке добавить выходила новая запись в dbgrid и кнопка удаления , на форме имеется adotable , adoconnection...

Редактирование записей в DBGrid
Вечер добрый. Необходимо организовать редактирование записей в таблице Access подключенную через DBGrid ADOTable &amp; DataSource. А...

Множественное редактирование в DBGrid
Объясните, пожалуйста, начинающему програмисту на С++, как осуществить множественное редактирование в DBGrid. Я написал программу для...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru