Форум программистов, компьютерный форум, киберфорум
C++ Builder: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
 Аватар для dalay_lama
82 / 82 / 50
Регистрация: 22.09.2012
Сообщений: 495

AdoDataSet. Добавление новой записи (insert) и связь DBLookupComboBox

20.03.2013, 12:38. Показов 3139. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток. Имеется такая не большая проблема. В общем, есть форма, с дбгридом, отражает таблицу "список заказов" в ней несколько полей, некоторые из них связаны с другой таблицей: "код клиента" и "код машины" - с таблицами "клиенты" и "машины" соответственно. По нажатию на кнопку "добавить заказ" вылезает новое окно с формированием нового заказа, а так-же я вызываю метод Insert/
C++
1
2
    DataModule1->ADODataSetListOrder->Insert();
    formAddEditOrder->ShowModal();
На этой форме формирования заказа присутствует компонент DBLookupComboBox, у которого в ListSource(т.е. откуда беру записи) указана таблица "клиенты", а в DataSource(т.е. куда я записываю выбранную запись) указана таблица "список заказов". Т.е., как это в общем выглядит: я нажимаю "добавить заказ" -> открывается форма -> в DBLookupComboBox выбираю клиента, и потом нажимаю кнопку сохранить.
C++
1
    DataModule1->ADODataSetListOrder->Post();
И всё замечательно сохраняет и так как мне нужно кроме одной маленькой мелочи, поле id_client записывается только тогда, когда я в DBLookup произведу щелчёк, т.е. конкретно выберу запись, а если DBLookupComboBox не трогать, то поле id_client останется пустым. Приведу пример на скринах:
1)Открываю форму

В лукапе запись выделена, но в вставку записи она не добавляется..
2)Открываю список лукапа, и щёлкаю по той-же записи

3)Теперь всё гуд

Подскажите, какие есть способы исправить эту проблемку, чтобы запись из лукапа автоматом вставлялась, потому-как для выбора машины лукап точно так-же настроен и соответственно, когда я щёлкаю по клиентам список машин меняется(за каждым клиентом свои машины закреплены), а в вставку записи машина не добавиться пока по ней не щёлкнешь. В общем прошу советов, как исправить ситуацию.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.03.2013, 12:38
Ответы с готовыми решениями:

DBLookUpComboBox и ADOTable. Добавление записи
Доброго времени! Такая проблема возникла. Использую ADOTable. При попытке добавлении новой записи в таблицу, как только щелкаю...

Добавление новой записи
Подскажите пожалуйста какой код надо для добавления новой записи???

Добавление и сохранение новой записи в БД
Беда в следующем Есть кнопка добавление новой записи в БД которая открывает новую форму где содержатся DBEdit после их заполнения нажимаю...

19
480 / 393 / 113
Регистрация: 24.04.2012
Сообщений: 1,632
Записей в блоге: 3
20.03.2013, 16:02
Странно, что у тебя есть уже значение в DBLoockupComboBox, т.к. если значение NULL то и отображаться ничего не должно.
1
 Аватар для dalay_lama
82 / 82 / 50
Регистрация: 22.09.2012
Сообщений: 495
21.03.2013, 04:46  [ТС]
Цитата Сообщение от Bit_Man Посмотреть сообщение
Странно, что у тебя есть уже значение в DBLoockupComboBox, т.к. если значение NULL то и отображаться ничего не должно.
Я ещё перед открытием насильно заставляю его устанавливать значение в первую запись, вот полный код на открытие формы добавления заказа:
C++
1
2
3
4
5
    DataModule1->ADODataSetListOrder->First();
    DataModule1->ADODataSetListOrder->Insert();
    DataModule1->ADODataSetCustomers->First();
    formAddEditOrder->DBLookupComboBoxClient->KeyValue =  DataModule1->ADODataSetCustomers->Fields->Fields[0]->AsInteger;
    formAddEditOrder->ShowModal()
0
480 / 393 / 113
Регистрация: 24.04.2012
Сообщений: 1,632
Записей в блоге: 3
21.03.2013, 05:41
Цитата Сообщение от skorik-1992 Посмотреть сообщение
Я ещё перед открытием насильно заставляю его устанавливать значение в первую запись
как бы я сделал
C++
1
2
3
4
DataModule1->ADODataSetListOrder->Append();
//ADODataSetListOrderOnNewRecord
DataModule1->ADODataSetCustomers->First();
DataModule1->ADODataSetListOrder->FieldByName("id_client")->Value = DataModule1->ADODataSetCustomers->FieldByName("id")->Value; //либо конкретное значение
1
 Аватар для dalay_lama
82 / 82 / 50
Регистрация: 22.09.2012
Сообщений: 495
21.03.2013, 05:58  [ТС]
Цитата Сообщение от Bit_Man Посмотреть сообщение
как бы я сделал
C++
1
2
3
4
DataModule1->ADODataSetListOrder->Append();
//ADODataSetListOrderOnNewRecord
DataModule1->ADODataSetCustomers->First();
DataModule1->ADODataSetListOrder->FieldByName("id_client")->Value = DataModule1->ADODataSetCustomers->FieldByName("id")->Value; //либо конкретное значение
Да, я вот только что почти так-же сделал, только не большая разница, я id беру не из дата-сета, а из лукапа по keyvalue, вот код:
C++
1
2
3
4
5
6
7
8
9
void __fastcall TformAddEditOrder::FormActivate(TObject *Sender)
{
DataModule1->ADODataSetListOrder->First();
DataModule1->ADODataSetListOrder->Insert();
DataModule1->ADODataSetCustomers->First();
formAddEditOrder->DBLookupComboBoxClient->KeyValue =  DataModule1->ADODataSetCustomers->Fields->Fields[0]->AsInteger;
DataModule1->ADODataSetListOrder->FieldByName("id_client")->Value = DBLookupComboBoxClient->KeyValue;
DataModule1->ADODataSetListOrder->FieldByName("id_car")->Value = DBLookupComboBoxCar->KeyValue;
}
И ещё на событие клика по лукапу клиентов добавил:
C++
1
2
3
4
void __fastcall TformAddEditOrder::DBLookupComboBoxClientClick(TObject *Sender)
{
    DataModule1->ADODataSetListOrder->FieldByName("id_car")->Value = DBLookupComboBoxCar->KeyValue;
}
А будет ли разница откуда брать? Как грамотней сделать?
0
480 / 393 / 113
Регистрация: 24.04.2012
Сообщений: 1,632
Записей в блоге: 3
21.03.2013, 06:19
А редактирование записи у тебя есть? этой же формой или другой?
если этой же, то при редактировании не поканает это
Цитата Сообщение от skorik-1992 Посмотреть сообщение
void __fastcall TformAddEditOrder::FormActivate(TObject *Sender)
{
DataModule1->ADODataSetListOrder->First();
DataModule1->ADODataSetListOrder->Insert();
DataModule1->ADODataSetCustomers->First();
formAddEditOrder->DBLookupComboBoxClient->KeyValue = *DataModule1->ADODataSetCustomers->Fields->Fields[0]->AsInteger;
DataModule1->ADODataSetListOrder->FieldByName("id_client")->Value = DBLookupComboBoxClient->KeyValue;
DataModule1->ADODataSetListOrder->FieldByName("id_car")->Value = DBLookupComboBoxCar->KeyValue;
}
1
 Аватар для dalay_lama
82 / 82 / 50
Регистрация: 22.09.2012
Сообщений: 495
21.03.2013, 07:10  [ТС]
Цитата Сообщение от Bit_Man Посмотреть сообщение
А редактирование записи у тебя есть? этой же формой или другой?
если этой же, то при редактировании не поканает это
Да, этой же, но я редактирование только вот сейчас делаю, пока проблем не заметил, а в чём может выразиться?
0
480 / 393 / 113
Регистрация: 24.04.2012
Сообщений: 1,632
Записей в блоге: 3
21.03.2013, 08:15
Цитата Сообщение от skorik-1992 Посмотреть сообщение
void __fastcall TformAddEditOrder::FormActivate(TObject *Sender)
{
DataModule1->ADODataSetListOrder->First();
DataModule1->ADODataSetListOrder->Insert();
DataModule1->ADODataSetCustomers->First();
если ты редактируешь, зачем тебе Insert
1
 Аватар для dalay_lama
82 / 82 / 50
Регистрация: 22.09.2012
Сообщений: 495
21.03.2013, 08:16  [ТС]
Цитата Сообщение от Bit_Man Посмотреть сообщение
если ты редактируешь, зачем тебе Insert
А, ты про это) Это я просто пример как пример выложил, т.е. пока тестил у меня так было, а вообще у меня две кнопки, на одну insert вызывается на другую edit
0
480 / 393 / 113
Регистрация: 24.04.2012
Сообщений: 1,632
Записей в блоге: 3
21.03.2013, 08:33
с FormActivate на FormCreate
1
 Аватар для dalay_lama
82 / 82 / 50
Регистрация: 22.09.2012
Сообщений: 495
21.03.2013, 08:55  [ТС]
Цитата Сообщение от Bit_Man Посмотреть сообщение
с FormActivate на FormCreate
Почему? форма то может вызываться не однократно
"Событие OnCreate происходит один раз за все время существования формы, прочие же события могут вызываться неоднократно." Источник - http://www.helloworld.ru/texts... thform.htm
Там конечно про делфи, но компоненты то одни и теже используются или я что-то напутал?
0
480 / 393 / 113
Регистрация: 24.04.2012
Сообщений: 1,632
Записей в блоге: 3
21.03.2013, 09:16
Если ты ее создаешь в самом начале запуска программы или создания формы, тогда соглашусь с тобой.
1
 Аватар для dalay_lama
82 / 82 / 50
Регистрация: 22.09.2012
Сообщений: 495
21.03.2013, 09:29  [ТС]
Цитата Сообщение от Bit_Man Посмотреть сообщение
Если ты ее создаешь в самом начале запуска программы или создания формы, тогда соглашусь с тобой.
Нет, она у меня не в самом начале создаётся.
Т.е., когда я нажимаю кнопку, на открытие формы(ShowModal) у формы происходит событие OnCreat? и событие OnCreat будет происходить каждый раз, если я закрываю форму(Close()) и снова её открываю? Если да, то я не знал, спасибо за наводку)
И ещё, немного не по теме, можешь пожалуйста подсказать в чём прикол, у меня в одной из таблиц есть вычисляемое поле, оно корректно вычисляется но данные не записываются в БД, т.е. я когда открываю приложение, я вижу данные которые он вычисляет, но они не записываются. Вот код вычисляемого поля:
C++
1
2
3
4
5
6
void __fastcall TDataModule1::ADODataSetProcesedJobCalcFields(TDataSet *DataSet)
 
{
    ADODataSetProcesedJob->FieldByName("sum")->Value = ADODataSetProcesedJob->FieldByName("number")->Value * ADODataSetJob->FieldByName("price")->Value;
}
}

0
480 / 393 / 113
Регистрация: 24.04.2012
Сообщений: 1,632
Записей в блоге: 3
21.03.2013, 10:07
При создании формы OnCreate. При ShowModal OnShow точно должна срабатывать, а OnActivate точно не знаю, вроде тоже.
Цитата Сообщение от skorik-1992 Посмотреть сообщение
DODataSetProcesedJob->FieldByName("sum")->Value = ADODataSetProcesedJob->FieldByName("number")->Value * ADODataSetJob->FieldByName("price")->Value;
я бы это на BeforePost повешал и посмотри SQL Insert и Edit и Refresh
1
 Аватар для dalay_lama
82 / 82 / 50
Регистрация: 22.09.2012
Сообщений: 495
21.03.2013, 10:42  [ТС]
Цитата Сообщение от Bit_Man Посмотреть сообщение
При создании формы OnCreate. При ShowModal OnShow точно должна срабатывать, а OnActivate точно не знаю, вроде тоже.
я бы это на BeforePost повешал и посмотри SQL Insert и Edit и Refresh
События OnPost нету, есть только OnPostError - но это как я понимаю не то?
Ещё есть AfterPost и BeforePost, на AfterPost ругается, на BeforePost просто ничего не делает, поле не вычисляется.
Ещё попробовал просто перед тем как событие Post проходит попытаться вставить, но результат такой-же как и на Before - ничего не происходит:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void __fastcall TformAddProccesedJob::btSaveClick(TObject *Sender)
{
    DataModule1->ADODataSetProcesedJob->FieldByName("id_job")->Value = DataModule1->ADODataSetJob->FieldByName("id_job")->Value;
    DataModule1->ADODataSetProcesedJob->FieldByName("id_order")->Value = DataModule1->ADODataSetListOrder->FieldByName("id_order")->Value;
    DataModule1->ADODataSetProcesedJob->FieldByName("sum")->Value = DataModule1->ADODataSetProcesedJob->FieldByName("number")->Value * DataModule1->ADODataSetJob->FieldByName("price")->Value;
    DataModule1->ADODataSetProcesedJob->Post();
    Close();
}
void __fastcall TDataModule1::ADODataSetProcesedJobBeforePost(TDataSet *DataSet)
{
    ADODataSetProcesedJob->FieldByName("sum")->Value = ADODataSetProcesedJob->FieldByName("number")->Value * ADODataSetJob->FieldByName("price")->Value;
}
void __fastcall TDataModule1::ADODataSetProcesedJobAfterPost(TDataSet *DataSet)
{
 //  ADODataSetProcesedJob->FieldByName("sum")->Value = ADODataSetProcesedJob->FieldByName("number")->Value * ADODataSetJob->FieldByName("price")->Value;
}
Естественно я это всё не вместе запускаю) Просто здесь перечислил примеры как я пробовал сделать

Добавлено через 2 минуты
Цитата Сообщение от Bit_Man Посмотреть сообщение
посмотри SQL Insert и Edit и Refresh
Здесь не совсем понял, что ты имел введу
0
480 / 393 / 113
Регистрация: 24.04.2012
Сообщений: 1,632
Записей в блоге: 3
21.03.2013, 10:52
Цитата Сообщение от skorik-1992 Посмотреть сообщение
FieldByName("sum")->Value
смотри какое у тебя здесь значение после присваивания. Если нет ничего то попробуй As(по типу поля:Integer или Float) у всех трех полей. И у меня такое иногда случалось, приходилось конкретно указывать тип.

Добавлено через 3 минуты
Цитата Сообщение от skorik-1992 Посмотреть сообщение
ADODataSetProcesedJob
не знаком с таким, по "DataSet" подумал что там есть SQL.

Добавлено через 2 минуты
Это обычный ADODataSet? я им не пользовался
1
 Аватар для dalay_lama
82 / 82 / 50
Регистрация: 22.09.2012
Сообщений: 495
21.03.2013, 10:55  [ТС]
Цитата Сообщение от Bit_Man Посмотреть сообщение
смотри какое у тебя здесь значение после присваивания. Если нет ничего то попробуй As(по типу поля:Integer или Float) у всех трех полей. И у меня такое иногда случалось, приходилось конкретно указывать тип.
Странно как-то происходит, смотри, вот использую такой код, решил вывести в ShowMessage значение которое находится в sum, вот что получилось:
1)Код:
C++
1
2
3
4
5
6
7
8
9
void __fastcall TformAddProccesedJob::btSaveClick(TObject *Sender)
{
    DataModule1->ADODataSetProcesedJob->FieldByName("id_job")->Value = DataModule1->ADODataSetJob->FieldByName("id_job")->Value;
    DataModule1->ADODataSetProcesedJob->FieldByName("id_order")->Value = DataModule1->ADODataSetListOrder->FieldByName("id_order")->Value;
    DataModule1->ADODataSetProcesedJob->FieldByName("sum")->Value = DataModule1->ADODataSetProcesedJob->FieldByName("number")->Value * DataModule1->ADODataSetJob->FieldByName("price")->Value;
    ShowMessage(DataModule1->ADODataSetProcesedJob->FieldByName("sum")->Value);
    DataModule1->ADODataSetProcesedJob->Post();
    Close();
}
2)Вот, вроде-бы значение добавилось, но Post ещё не прошол...

3)Нажимаю "OK", проходит метод Post. Результат - поле не посчиталось:
0
 Аватар для dalay_lama
82 / 82 / 50
Регистрация: 22.09.2012
Сообщений: 495
21.03.2013, 11:18  [ТС]
Цитата Сообщение от Bit_Man Посмотреть сообщение
Это обычный ADODataSet? я им не пользовался
Да, самый простой из простых ADODataSet)

Добавлено через 15 минут
Проблема решилась заменой типа поля "sum" в датасете. Поменял с fkCalculated на fkInternalCalc. Не знаю почему, но это помогло.

Добавлено через 6 минут
А в прочем можно и обычный Data поставить.
0
480 / 393 / 113
Регистрация: 24.04.2012
Сообщений: 1,632
Записей в блоге: 3
21.03.2013, 11:51
Цитата Сообщение от skorik-1992 Посмотреть сообщение
Проблема решилась заменой типа поля "sum" в датасете. Поменял с fkCalculated на fkInternalCalc. Не знаю почему, но это помогло.
ну ептить, и догодался же поменять.
Data - это данные таблицы (запроса);
fkCalculated - результат каких либо вычислений (помойму редактировать нельзя)
fkInternalCalc - редактируемое поле.
1
 Аватар для dalay_lama
82 / 82 / 50
Регистрация: 22.09.2012
Сообщений: 495
21.03.2013, 12:04  [ТС]
Цитата Сообщение от Bit_Man Посмотреть сообщение
fkCalculated - результат каких либо вычислений (помойму редактировать нельзя)
Ну дык, мне это и нужно было) просто где-то читал, про то, как делать вычисляемые поля, чтобы они автоматом считались. и там было описанно, что нужно установить поле как calculeted и на событие calc писать то вычисление которое нужно. Отсюда и пошло всё)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.03.2013, 12:04
Помогаю со студенческими работами здесь

Добавление новой записи в Memo
Возможно ли как-то осуществить запись из Edit в Memo, а из Memo в текстовый файл так, чтобы при нажатии на кнопку текстовый файл дополнял...

Проверить записи в ListBox и ADODataSet на совпадение
Есть таблица с 2 поями: Код и Наименование. Есть ListBox. Мне нужно создать цикл в котором я сравниваю название каждого элемента в...

Связь ComboBox и DBLookupCombobox
Помогите решить проблему. Необходимо чтобы после выбора значения в ComboBox1 (выбор группы препаратов) в DBLookupCombobox автоматически...

Как очищать DBLookupCombobox перед созданием новой записи (gdb interbase)?
Получилось связать 2 DBLookupComboboxeh ( dbgrideh - ibdatabase - ibtransaction - datasource - ibdataset). Добавляю записи в базу через...

Добавление записи из dblookupcombobox
Проблема в том, что запись из dblookupcombobox не записывается в таблицу. Добавление записи произвожу вот так: datamodul.q1.insert;


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
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
/ * Дана цепь постоянного тока с 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/
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
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru