Форум программистов, компьютерный форум, киберфорум
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. Показов 3197. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Подстановка значения реквизита справочника в табличную часть документа
Maks 11.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 10.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 09.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 09.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 08.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 08.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru