Форум программистов, компьютерный форум, киберфорум
C++ Builder: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
6 / 6 / 0
Регистрация: 16.05.2010
Сообщений: 98

Прибавление к текущей записи

05.05.2012, 19:04. Показов 1300. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Есть база через ADO. Есть форма добавления записи в ней находятся DBEdit`ы и DBLookupComboBox, первый для ввода количества материала, второй для выбора материала из другой таблицы по подстановочному полю.
При нажатии на кнопку Добавить хочу сделать проверку на наличие такого материала в таблице, и если он имется, то просто прибавить введенное количество к существующей записи, а если не существует, то тогда уже добавить.
Специально для этой цели поставил второй ADOTable с подключением к этой же таблице, т.к. я фильтрую записи, а при фильтрации Insert сбрасывается. В общем вначале фильтрую записи во втором ADOTable:
C++
1
2
3
Form3->tbl1->Filtered=false;
Form3->tbl1->Filter="id_mat='"+DBLookupComboBox1->KeyValue+"'";
Form3->tbl1->Filtered=true;
Потом проверяю если ли записи с таким материалом в таблице, и если есть то добавляю значение, а если нету, то добавляю новое поле:
C++
1
2
3
4
5
6
7
8
if (Form3->tbl1->RecordCount>0) { //если записей больше нуля
  Form3->tbl1->Edit(); //включаем редактирование
  Form3->tbl1kolvo->Value=Form3->tbl1kolvo->Value + StrToInt(dbedtkolvo2->Text); //прибавляем количество
  Form3->ADOTable7->Cancel(); //отключаем Insert в первом тэйбле
  Form3->ADOTable7->Active=false; //обновляем таблицу
  Form3->ADOTable7->Active=true;
}
else Form3->ADOTable7->Post(); //Если нету записи то добавляем
В результате не прибавляется, а работает вообще не так как надо. Я понимаю что возможно моя идея вообще бредовая, но не могли бы вы подсказать мне тогда как реализовать это же более простым путем?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.05.2012, 19:04
Ответы с готовыми решениями:

Отобрать записи по текущей дате
Здравствуйте.. Подскажите пожалуйста с синтаксисом необходимо в DBGrid выводить запись вчерашние и сегодняшние ...

Вывод в отчет текущей записи
Выводит все записи которые находятся в подчиненой таблице, именно по группам. Если выбрана одна группа в главной таблице и выберу запись...

Кнопка, отвечающая за удаление текущей записи из таблицы
Помогите написать обработчик событий для кнопки, отвечающей за удаление текущей записи из таблицы в borland c++ :)

19
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
06.05.2012, 10:51
Попробуй использовать Locate() для проверки записи
1
6 / 6 / 0
Регистрация: 16.05.2010
Сообщений: 98
09.05.2012, 19:34  [ТС]
Цитата Сообщение от Sasha Посмотреть сообщение
Попробуй использовать Locate() для проверки записи
Попробовал. Но что-то не так делаю походу...

В общем проверяю вначале на наличие записи, если нету записи то пытаюсь добавить...
C++
1
2
3
4
5
6
  if (!Form3->ADOTable7->Locate("id_mat",edt1->Text, TLocateOptions())) {
  Form3->ADOTable7->Insert();
  Form3->ADOTable7id_mat->AsString=edt1->Text;
  Form3->ADOTable7kolvo->Value=StrToInt(edt3->Text);
  Form3->ADOTable7id_ost->Value=Form3->ADOTable3id_ost->Value;
  Form3->ADOTable7->Post(); }
Иначе, прибавляю к найденной записи значение
C++
1
2
3
4
  else {
  Form3->ADOTable7->Edit();
  Form3->ADOTable7kolvo->Value+=StrToInt(edt3->Text);
  Form3->ADOTable7->Post(); }
Но в результате получается прибавление в любом случает. Если есть такой материал и если нету...
Что я делаю не так?

Добавлено через 12 минут
Хотя наверное я знаю почему не работает таким образом...
Дело в том что я использую две связанные между собой таблицы. И в той таблице в которой я пытаюсь реализовать данное прибавление, показываются лишь те записи, которые соответствуют таблице 1.
А через locate я ищу запись которая есть, но не отображается т.к. фильтруется по связи с таблицей 1. Т.е. запись находит но т.к. она не отображается то прибавляется к текущей...
Мастера, как можно это исправить?
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
09.05.2012, 19:47
Plug, запросами SQL вы это сделаете программу гораздо быстрее и компактнее, и скорость ответа системы на запросы пользователя будет минимальной...

ваш подход имеет место быть, т.к. это позволяет сделать используемые классы, но от оптимального он очень далек...

Добавлено через 4 минуты
Plug,
Цитата Сообщение от Plug Посмотреть сообщение
Дело в том что я использую две связанные между собой таблицы. И в той таблице в которой я пытаюсь реализовать данное прибавление, показываются лишь те записи, которые соответствуют таблице 1.
А через locate я ищу запись которая есть, но не отображается т.к. фильтруется по связи с таблицей 1. Т.е. запись находит но т.к. она не отображается то прибавляется к текущей...
для такого отображения данных вам поможет - Join
1
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
09.05.2012, 20:14
Lord_Voodoo,
Цитата Сообщение от Lord_Voodoo Посмотреть сообщение
запросами SQL вы это сделаете программу гораздо быстрее и компактнее
Хм... То есть, к примеру, добавление записи таким образом:

C++
1
2
3
4
5
ADOQuery1->Close();
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Text = "INSERT INTO table ([End]) VALUES(:End)";
ADOQuery1->Parameters->Items[0]->Value=Edit1->Text;
ADOQuery1->ExecSQL();
оптимальнее нежели таким:

C++
1
2
3
DataSource1->DataSource1->DataSet->Insert();
DataSource1->DataSet->FieldByName("End")->Value = Edit1->Text;
DataSource1->DataSource1->DataSet->Post();
?
1
6 / 6 / 0
Регистрация: 16.05.2010
Сообщений: 98
09.05.2012, 20:51  [ТС]
Цитата Сообщение от Lord_Voodoo Посмотреть сообщение
Plug, запросами SQL вы это сделаете программу гораздо быстрее и компактнее, и скорость ответа системы на запросы пользователя будет минимальной...
Я Table использую из-за того что связываю таблицы по полю с другой таблицей...
0
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
09.05.2012, 21:44
Цитата Сообщение от Plug Посмотреть сообщение
Я Table использую из-за того что связываю таблицы по полю с другой таблицей...
Эту связь также можно настроить через запрос.
1
6 / 6 / 0
Регистрация: 16.05.2010
Сообщений: 98
09.05.2012, 21:59  [ТС]
Уже вроде решил проблему
Вот только один вопрос... У меня стоит DBLookupComboBox, как можно при выборе в нем значений получаемый keyfield вывести в Edit?
0
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
09.05.2012, 22:41
Цитата Сообщение от Plug Посмотреть сообщение
Вот только один вопрос... У меня стоит DBLookupComboBox, как можно при выборе в нем значений получаемый keyfield вывести в Edit?
Попробуй так

C++
1
Edit1->Text = DBLookupComboBox1->Text;
1
6 / 6 / 0
Регистрация: 16.05.2010
Сообщений: 98
09.05.2012, 23:12  [ТС]
Пробовал. Но это получается ListField, т.е. текстом, а мне нужен код, т.е. KeyField
0
 Аватар для Sasha
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
09.05.2012, 23:17
C++
1
Edit1->Text = DBLookupComboBox1->KeyValue;
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
10.05.2012, 01:07
The_Immortal,
ну вообще этот код можно и одной строкой сделать:
C++
1
2
3
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Text = "INSERT INTO table ([End]) VALUES(:End)";
ADOQuery1->Parameters->Items[0]->Value=Edit1->Text;
=
C++
1
ADOQuery1->SQL->Text = "INSERT INTO table ([End]) VALUES("+ Edit1->Text + ")";
и операция у ТС предполагается - UPDATE, а там код становится гораздо веселее... или вы хотите сказать, что через таблицу лучше работать, чем запросами?
0
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
10.05.2012, 01:12
Lord_Voodoo, нее, теперь я хочу сказать, что
C++
1
ADOQuery1->SQL->Text = "INSERT INTO table ([End]) VALUES("+ Edit1->Text + ")";
- Велкам, Ms. SQL injection!

Или нет?
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
10.05.2012, 01:14
The_Immortal, не осилил, что вы этим хотели сказать
0
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
10.05.2012, 01:16
Lord_Voodoo, Внедрение SQL-кода

Правда не знаю насколько это актуально для такого рода запросов, однако много где говорят использовать только параметризованные запросы.
1
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
10.05.2012, 01:25
The_Immortal, для строковых нужно использовать функцию AnsiQuotedStr, ну и экранирование внутри строки... и тогда:

Чтобы внедрение кода было невозможно, для некоторых СУБД, в том числе, для MySQL, требуется брать в кавычки все строковые параметры.
или вы хотите сказать, что таблица в билдере по скорости не уступает запросу, особенно при использовании функции Locate
1
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
10.05.2012, 01:34
Цитата Сообщение от Lord_Voodoo Посмотреть сообщение
или вы хотите сказать, что таблица в билдере по скорости не уступает запросу, особенно при использовании функции Locate
Вот этого я точно сказать не хочу
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
10.05.2012, 01:38
The_Immortal, а вот с другой стороны, параметризованные запросы все равно в базу должны отправить запрос с уже заданным значением, следовательно, можно отписать свое форматирование передаваемых данных, да и все... но даже с параметром, все равно запросы гораздо лучше использовать... убедился на своем опыте, когда табличные коды перегонял на запросы...
0
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
10.05.2012, 01:43
Lord_Voodoo, немного не понял, из запросов - какие все-таки оптимальнее использовать? Обычные или параметризованные?
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
10.05.2012, 01:49
The_Immortal, да нет разницы... вернее параметризованные удобнее, потому что не заботишься о подготовке данных сам, это за тебя объект сделает перед отправкой... зато с обычными текст становится несколько меньше по объему
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.05.2012, 01:49
Помогаю со студенческими работами здесь

Изменение текущей записи
Сделал выборку данных Adoquery Показал их в dbgrid А теперь по нажатию кнопки нужно изменить значение поля в записи(строке) на которой...

Обновление текущей записи!!!
Есть таблица с полями Код,Телефон,Признак. На основе этой таблицы построен запрос, на основе этого запроса построена подчиненная табличная...

Удаление текущей записи
Всем привет! Подскажите как можно удалить текущую запись с помощью кнопки?? Чтобы также поменялись числа в строки состоянии, а не просто...

Синхронизация текущей записи
Есть таблица из 3-х полей: 1. Код (счетчик) 2. Целое - байт. Представляет собой номер категории 3. Строка, содержащая наименование...

Удаление текущей записи
Здравствуйте! проблема такая копирую с журнала в архив данные и запись с которой производилось копирование удаляю. все работает но есть...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru