Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/30: Рейтинг темы: голосов - 30, средняя оценка - 4.67
 Аватар для VladSharikov
25 / 25 / 7
Регистрация: 02.12.2010
Сообщений: 824

DataSet и изменение запроса в зависимости от выбранной строки DbGrid

12.05.2013, 21:42. Показов 6362. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет. Есть 2 компонента. DBGridSuppliers (содержит постащиков) и DBGridSuppliersGoods (содержит товары поставщиков, одно из полей записи - SuppliersGoods_ID - то есть указание на поставщика).

Хочу сделать так, чтобы по нажатию на строку в DBGridSuppliers в DBGridSuppliersGoods показывались только товары опеределенного поставщика.
Итого:
Я понял, что нужно править событие DBGridSuppliers OnCellClick. То есть по клику по строке. Я понял как взять ID поставщика.
Delphi
1
2
3
4
5
6
7
procedure TFrameSuplliersList.DBGridSuppliersCellClick(Column: TColumn);
var
  ID: Integer;
begin
  ID := DBGridSuppliers.DataSource.DataSet.FieldValues['Supplier_ID'];
  //DBGridGoods.DataSource.DataSet.Edit
end;
Теперь мне нужно поменять каким-то образом DataSet.CommandText, который привязан к DBGridSuppliersGoods. Я предполагаю, что нужно юзать Parameters. Но не очень понимаю как.

Грубо говоря. У меня был запрос в дата сет select * from SuppliersGoods, надо его изменить и получить select * from SuppliersGoods where SuppliersGoods_SupplierID = ' тут ID записи той строки, которая была выбрана '. Выручайте

С прошедшими праздниками.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.05.2013, 21:42
Ответы с готовыми решениями:

Изменение запроса в зависимости от выбранных строк в нескольких DbGrid (в SQL получить значения из нескольких DataSet)
Здравствуйте. Есть таблицы и компоненты: Tbl_authors – Таблица авторов. С ней связаны компоненты: - ADOTable_authors, -...

Сохранить данные из выбранной строки в dbgrid
в общем, имеется форма на ней dbgrid и множество строк, если я выберу одну из них и нажму кнопку, то данные записываются в другую таблицу....

Получить значение определенной ячейки из выбранной юзером строки в DbGrid
Каким образом получить значение определенной одной ячейки из выбранной юзером строки в DBGrid? Грид подвязат к DataSourse-у а тот в свою...

8
 Аватар для ZfoxAK
670 / 560 / 242
Регистрация: 26.11.2012
Сообщений: 2,191
13.05.2013, 06:56
1. В компоненте DataSet проверить и установить свойство ParamCheck = True;
2. where SuppliersGoods_SupplierID = :Param //(Param - имя параметра, на подобии переменой)
3.
Delphi
1
2
3
IBDataSet1.Active:=False;
IBDataSet1.Prepare;
IBDataSet1.ParamByName('Param').AsInteger:= DBGridSuppliers.DataSource.DataSet.FieldValues['Supplier_ID'] ;
Вроде все.
0
 Аватар для VladSharikov
25 / 25 / 7
Регистрация: 02.12.2010
Сообщений: 824
13.05.2013, 20:54  [ТС]
ZfoxAK, не проверяю пока даже работает ли ваша команда.

сам у себя сделал вот таким образом и оно работает.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
procedure TMainForm.FrameSuplliersListCheckBoxOnlyWithContractsClick(
  Sender: TObject);
begin
  if(MainForm.FrameSuplliersList.CheckBoxOnlyWithContracts.State = cbUnchecked) then
  begin
    MainForm.TmpQuery.Close;
    MainForm.TmpQuery.SQL.Clear;
    MainForm.TmpQuery.SQL.Add('select * from Suppliers');
    MainForm.TmpQuery.Open;
  end;
 
  if(MainForm.FrameSuplliersList.CheckBoxOnlyWithContracts.State = cbChecked) then
  begin
    MainForm.TmpQuery.Close;
    MainForm.TmpQuery.SQL.Clear;
    MainForm.TmpQuery.SQL.Add('select * from Suppliers where Supplier_Status = 1');
    MainForm.TmpQuery.Open;
  end;
  MainForm.TmpQuery.DataSource := nil;
  MainForm.FrameSuplliersList.DBGridSuppliers.DataSource.DataSet := TmpQuery;
end;
можете пошагово пояснить как работает Ваш алгоритм.
0
 Аватар для VladSharikov
25 / 25 / 7
Регистрация: 02.12.2010
Сообщений: 824
20.05.2013, 21:15  [ТС]
Работать - работает. Но при взаимодействиях с другими частями программы работает через одно место.

Поясните пожалуйста принцип?
2 пункт куда вписывать?
0
 Аватар для ZfoxAK
670 / 560 / 242
Регистрация: 26.11.2012
Сообщений: 2,191
21.05.2013, 13:02
Цитата Сообщение от ZfoxAK Посмотреть сообщение
where SuppliersGoods_SupplierID = :Param //(Param - имя параметра, на подобии переменой)
В этом пункте я указал часть запроса. т.е. эту част нужно поместить в компоненту через которую вы обращаетесь к базе. Query или т.п. в данном случае примерно так
Цитата Сообщение от VladSharikov Посмотреть сообщение
MainForm.TmpQuery.SQL.Add('select * from Suppliers where Supplier_Status = :Param');
Принцы такой в запрос помещается перепенная - параметр, обозначается : param (имя любое, двоеточие обозначает что за ним идет имя параметра.
т.к. я предложил вариаент для компонент работающих с СУБД fireBird, другие компоненты работающие с другими СУБД могут не содержать такого свойства

Цитата Сообщение от ZfoxAK Посмотреть сообщение
IBDataSet1.Prepare;
используется как предварительная обработка запроса и определение наличия в запросе параметра

Цитата Сообщение от ZfoxAK Посмотреть сообщение
IBDataSet1.ParamByName('Param').AsIntege r:= DBGridSuppliers.DataSource.DataSet.Field Values['Supplier_ID'] ;
Здесь идет присвоение параметру оперделенного значения через свойство ParamByName - которое находит параметр по имени AsInteger определяет тип параметра Integer после := передаете значение. вместо AsInteger можно использоват более универсальное свойство Value, но тогда тип передаваемого значение на вашей совести.
После определения значений параметров производите запрос к базе.
0
 Аватар для VladSharikov
25 / 25 / 7
Регистрация: 02.12.2010
Сообщений: 824
22.05.2013, 23:19  [ТС]
ZfoxAK, понял.

написал бОльшую часть приложения на обычных ADODataSet.
Вы приводите пример с IBDataSet. При попытке заменить хотя бы 1 начал ругаться на отсутствие библиотек и т.д., потому менять на IB не стал. С ADODataSet ваш вариант не очень хочет работать. Ругается на неизвестный синтаксис ":" перед "Param".
0
 Аватар для ZfoxAK
670 / 560 / 242
Регистрация: 26.11.2012
Сообщений: 2,191
23.05.2013, 05:37
Почему созданый парамет в компоненте не работате хз знает. Может мастера подскажут?! ))
Я обошел таким вариантом.
ADODataSet1.Parameters.CreateParameter(' Param', ftInteger, pdInput,10,12); Имя параметра, тип параметра, для ввода/вывод, размер поля, значение по умолчанию
ADODataSet1.Parameters.ParamByName('Para m').Value:= значение ...

Добавлено через 8 минут
Цитата Сообщение от VladSharikov Посмотреть сообщение
потому менять на IB
Если работатет с СУБД FireBird, то настоятельно рекомендую использовать специально заточенные под это СУБД компоненты. Если с другой СУБД, целесообразно использовать как вариант ADO.
0
 Аватар для VladSharikov
25 / 25 / 7
Регистрация: 02.12.2010
Сообщений: 824
26.05.2013, 22:39  [ТС]
ZfoxAK, пока что избавился от той ошибки , немного другим путем.

А что если мне нужно в ADOTable сделать то же самое? выбрать из определенной таблице с каким-то параметром?
мой способ не катит с adotable)

p.s.: нет не с FB работаю.
0
 Аватар для ZfoxAK
670 / 560 / 242
Регистрация: 26.11.2012
Сообщений: 2,191
27.05.2013, 12:26
Цитата Сообщение от VladSharikov Посмотреть сообщение
выбрать из определенной таблице с каким-то параметром?
думаю только по средством фильтра. Может для реализации вашей идеи заменить Table на Query?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.05.2013, 12:26
Помогаю со студенческими работами здесь

Работа с DataSet и DBGrid: осуществить добавление новой строки
Ребята,помогите. работаю в delphi и с базой firebirds. проблема такая: нужно осуществить добавление новой строки. при открытии формы курсор...

Как сделать вызов формы по нажатию на ячейку DBGrid, с информацией выбранной строки?
всем привет, я делаю дипломную работу на тему (личная карточка пациента), хотелось бы узнать как сделать вызов формы из Dbgrida по нажатию...

При (двойном) клике на строке в dbgrid отображать в другой форме информацию из выбранной строки грида
Ребят помогите плз. Хочу сделать так чтобы при (двойном) клике на строке в dbgride открывалась 2 форма и на ней в компонент memo выводилась...

Как вывести в DBGrid информацию только по выбранной строке в другой таблице DBGrid?
У меня есть 3 таблицы - Компании, Адреса и Квартиры. Компании содержит поля - Код компании и название Адреса содержит поля - Код...

Открыть картинку в PictureBox, в зависимости от выбранной строки в ComboBox
Доброго времени суток) Возник такой вопрос, как открыть картинку в picturebox, в зависимости от выбранной строки в combobox? мои...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru