Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.70/40: Рейтинг темы: голосов - 40, средняя оценка - 4.70
0 / 0 / 0
Регистрация: 26.04.2017
Сообщений: 37

Запрос AdoQuery, соединение с таблицами в разных формах. Delphi. DBGrid

03.03.2019, 22:24. Показов 8347. Ответов 37

Здравствуйте, помогите пожалуйста! В общем нужно чтоб при выборе определенного (курса)из грида, а после нажатии "выбрать", открывалась следующая форма с предметами этого курса.
Это Sql, ADOQuery1 -Form4 ; Select * From курс where Код =:CodSemestra
Это Sql, ADOQuery1 -Form6 ; Select * From Students order by фио
Это Sql, ADOQuery2 -Form6 ; Select * From предметы where КодСеместра = :CodSemestra order by ФИО
вот код кнопки "выбрать"
Delphi
1
2
3
4
5
6
7
8
9
 procedure TForm4.Button4Click(Sender: TObject);
begin
 Form4.AdoQuery1.Active := false;
Form4.AdoQuery1.Parameters.ParamByName('CodSemestra').Value := form4.DBGrid1.DataSource.DataSet.FieldByName('Код').Value;
Form4.AdoQuery1.Active := true;
//Form5.ADOQuery1.FieldByName('КодФакультета').Value := DBGrid1.DataSource.DataSet.FieldByName('Код').Value;
glavnaya.KodSemestra:= DBGrid1.DataSource.DataSet.FieldByName('Код').Value;
Form6.Show;
end;
уже много чего пробовала, но уже вовсе не отображается таблица с курсами, а при нажатии кнопки "выбрать" всегда ошибка "AdoQuery: Field 'Код' not found"



0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.03.2019, 22:24
Ответы с готовыми решениями:

Связь между таблицами на разных формах
Подскажите пожалуйста, как связать таблицы на разных формах. Делал на делфи "костыли", все отлично работало. А в C# без понятия как...

Как сделать подстановку между таблицами sql в Delphi+AdoQuery?
Есть две таблицы Клиент и Заявление. В 1ой таблице есть поля: Код клиента, Фамилия, Имя, Отчество и во 2ой таблицы, поля Номер заявления и...

Как связать DbChart с таблицей DbGrid, если они на разных формах?
как связать dbchart с таблицей dbgrid, которые на разных формах... с dataset в dbchart когда на одной форме я знаю как делать,а тут не...

37
882 / 404 / 173
Регистрация: 20.10.2016
Сообщений: 1,828
11.03.2019, 11:28
А что принципиально поменялось? Как я в прошлом сообщении сказал, у вас все действует в рамках логики. Более того, если вы выберете курс с кодом 6, то он вообще покажет пустую таблицу. Потому что КодСеместра у вас настолько же уникален, как и Код. Вы же, надеюсь, понимаете, что выполняет SELECT и зачем задается условие в WHERE?
0
0 / 0 / 0
Регистрация: 26.04.2017
Сообщений: 37
11.03.2019, 11:58  [ТС]
Nanotentacle, я не понимаю в чем ошибка

Добавлено через 56 секунд
Цитата Сообщение от Nanotentacle Посмотреть сообщение
Вы же, надеюсь, понимаете, что выполняет SELECT и зачем задается условие в WHERE?
совсем не много
0
882 / 404 / 173
Регистрация: 20.10.2016
Сообщений: 1,828
11.03.2019, 12:58
Цитата Сообщение от Lizalili Посмотреть сообщение
совсем не много
SELECT - это оператор выборки из базы данных. Он позволяет следующее (я опишу малую часть, на самом деле, но вам хватит):
1) выбрать произвольное количество полей из таблицы
2) выбрать произвольное количество полей из нескольких таблиц, объединенных по некоторому условию
3) выбрать произвольное количество полей из таблицы по некоторому условию.

По факту, это выглядит вот так:

SQL
1
SELECT какие_поля_вам_надо_выбрать FROM ваша_таблица WHERE условие_по_которому_фильтруются_данные
.

У вас в таблице записи с уникальными значениями в столбце КодСеместра. Если вы делаете простую выборку, где в условии КодСеметра стоит равенство, то он вернет либо одно значение, либо ни одного. Примерно как вам сказать "на столе лежит груша, яблоко, слива, апельсин, мандарин. Дай мне тот фрукт, который апельсин". Вы же не можете на это дать яблоко? Фрукт, который вам надо передать, вполне однозначно определен. Потому и у вас выбирается только одна строка: вы задаете условие, которое ограничивает выборку из БД.
0
0 / 0 / 0
Регистрация: 26.04.2017
Сообщений: 37
11.03.2019, 13:14  [ТС]
Nanotentacle, не понимааюю
SQL
1
 SELECT КодСеместра FROM предметы WHERE "а тут что писать?"
0
882 / 404 / 173
Регистрация: 20.10.2016
Сообщений: 1,828
11.03.2019, 14:47
SQL
1
SELECT КодСеместра FROM предметы WHERE "тут писать условие для выборки"
Что писать - это вам виднее. Я когда спрашивал, что вы хотите в результате получить именно это и имел ввиду. Я не представляю что должна делать ваша программа, поэтому остается только гадать.

По факту, в условие вам надо поставить название столбца, знак сравнения (больше, меньше, равно) и значение, с которым все это будет сравниваться. Надо выбрать значения больше трех? Ставьте "КодСеместра > 3", и он выберет все записи, в которых КодСеместра больше трех. Надо, чтобы был меньше пяти? Ставьте "КодСеместра < 5". Надо, чтобы не КодСеместра был, а, скажем, название предмета? Ну так внесите его в условие. Вы сначала сформулируйте то, что вы хотите получить, на понятном для себя языке, а потом условие для выборки записей станет очевидным.
0
0 / 0 / 0
Регистрация: 26.04.2017
Сообщений: 37
11.03.2019, 15:07  [ТС]
Nanotentacle, ну я более менее объяснила же, при выборе курса все что записано в таблице "предметы" должно отображаться
0
882 / 404 / 173
Регистрация: 20.10.2016
Сообщений: 1,828
11.03.2019, 15:32
Цитата Сообщение от Lizalili Посмотреть сообщение
Nanotentacle, ну я более менее объяснила же, при выборе курса все что записано в таблице "предметы" должно отображаться
Если надо, чтобы отображалось все, то надо просто убрать условие (т.е. все, что после WHERE, включая сам WHERE).

Как вы сами понимаете, при этом у вас пропадет параметр, и начнет выбивать ошибку. Поэтому и присвоение значения параметру тоже надо убирать.
0
0 / 0 / 0
Регистрация: 26.04.2017
Сообщений: 37
11.03.2019, 16:31  [ТС]
Nanotentacle, должны отображаться только строки с кодом курса, который был выбран.
0
882 / 404 / 173
Регистрация: 20.10.2016
Сообщений: 1,828
12.03.2019, 04:13
Цитата Сообщение от Lizalili Посмотреть сообщение
Nanotentacle, ну я более менее объяснила же, при выборе курса все что записано в таблице "предметы" должно отображаться
Цитата Сообщение от Lizalili Посмотреть сообщение
Nanotentacle, должны отображаться только строки с кодом курса, который был выбран.
Вам не кажется, что эти два заявления с разницей в полтора часа противоречат друг другу? Если должно отображаться все, то я написал что делать. Если должно отображаться только в соответствии с выбранным курсом, то ничего делать не надо, но и удивляться, что к выбранному курсу относится только одна строка, тогда не надо. Тут либо я вас не понимаю, либо у вас нет понимания, какая информация и где должна отображаться. Вы же понимаете, что данные отображаются те, которые содержатся в вашей базе, и если там только одна строка в таблице "Предметы" для каждого курса, то если
Цитата Сообщение от Lizalili Посмотреть сообщение
Nanotentacle, должны отображаться только строки с кодом курса, который был выбран.
из этого следует, что при корректной обработке алгоритма будет возвращена только одна строка максимум?
0
0 / 0 / 0
Регистрация: 26.04.2017
Сообщений: 37
13.03.2019, 00:22  [ТС]
Nanotentacle, Есть таблица Курс (код, курс) и предметы(код, КодСтудента, кодДисциплины, кодСеместра, оценка, пропуски). Код из таблицы "Курс" привязан к КодСеместра из таблицы "предметы". Нужно, чтоб при выборе курса, на первой форме из DBGrid, и нажатия кнопки , открывалась вторая форма с другим DBGrid, где отображалась таблица "предметы" , НО со строками этого выбранного курса их может быть много . Я уже не знаю как вам объеснить.
По вашему, я так понимаю, так сделать в программе нельзя?!
0
882 / 404 / 173
Регистрация: 20.10.2016
Сообщений: 1,828
13.03.2019, 03:55
Цитата Сообщение от Lizalili Посмотреть сообщение
Нужно, чтоб при выборе курса, на первой форме из DBGrid
Не "первой формы", а Form4. Иначе есть риск того, что вас не поймут.
Цитата Сообщение от Lizalili Посмотреть сообщение
открывалась вторая форма с другим DBGrid, где отображалась таблица "предметы" , НО со строками этого выбранного курса их может быть много
Не "вторая форма", а Form6.
Понимаете, тут ключевое слово "может быть". А может и не быть. Может быть будет одна строка. Может быть не будет совсем (задайте КодСеметра=10 и проверьте).
Зайдите в свою базу. Откройте там таблицу "Предметы". В столбце "КодСеместра" примените фильтр. Выберите любое одно число. Сколько строк у вас там получится? После этого эксперимента попробуйте объяснить как вы хотите сделать так, чтобы при задании КодаСеместра у вас выдавалось несколько записей, если сейчас в таблице каждому семестру соответствует только одна запись? Если вам надо несколько строк - добавьте их в базу и не трогайте программу. Если я правильно понимаю, то вы путаете хранилище (суть, вашу БД) и интерфейсную часть этого хранилища, которое только совершает действия над хранилищем (выборку данных, их изменение или вставку), но не занимается тем, чтобы эти данные хранить. Программа только показывает то, что хранится в базе.
0
0 / 0 / 0
Регистрация: 26.04.2017
Сообщений: 37
13.03.2019, 16:24  [ТС]
Nanotentacle, а если сделать все на одной форме и выбор курса делать через комбобокс?
0
882 / 404 / 173
Регистрация: 20.10.2016
Сообщений: 1,828
14.03.2019, 03:59
Лучший ответ Сообщение было отмечено Lizalili как решение

Решение

Цитата Сообщение от Lizalili Посмотреть сообщение
Nanotentacle, а если сделать все на одной форме и выбор курса делать через комбобокс?
Можно и так. Это лишь вопрос концепции, делать можно так, как удобнее.

Я посмотрел соседнюю тему и да, ошибка есть.

Delphi
1
2
3
4
5
6
7
8
9
procedure TForm4.Button4Click(Sender: TObject);
begin
Form4.AdoQuery1.Active := false;
//Form4.AdoQuery1.Parameters.ParamByName('CodSemestra').Value := //form4.DBGrid1.DataSource.DataSet.FieldByName('Êîä').Value;
Form4.AdoQuery1.Active := true;
//Form5.ADOQuery1.FieldByName('КодСеместра').Value := DBGrid1.DataSource.DataSet.FieldByName('Код').Value;
Form6.RefreshData(ADOQuery1.FieldByName('Êîä').asInteger);
Form6.Show;
end;
При закрытии и последующем открытии запроса указатель встанет на первую запись. Соответственно, надо сделать так:
Delphi
1
2
3
4
5
6
7
8
9
procedure TForm4.Button4Click(Sender: TObject);
begin
//Form4.AdoQuery1.Active := false;
//Form4.AdoQuery1.Parameters.ParamByName('CodSemestra').Value := //form4.DBGrid1.DataSource.DataSet.FieldByName('Êîä').Value;
//Form4.AdoQuery1.Active := true;
//Form5.ADOQuery1.FieldByName('КодСеместра').Value := DBGrid1.DataSource.DataSet.FieldByName('Код').Value;
Form6.RefreshData(ADOQuery1.FieldByName('Êîä').asInteger);
Form6.Show;
end;
А в событии OnActivate формы внести

Delphi
1
2
AdoQuery1.Active := false;
AdoQuery1.Active := true;
В этой части я попался на копипасте, считая, что тот код достоверный, но жизнь показала, что надо быть внимательне...
0
0 / 0 / 0
Регистрация: 26.04.2017
Сообщений: 37
14.03.2019, 12:04  [ТС]
Nanotentacle, Да, теперь этот код работает, спасибо.
0
0 / 0 / 0
Регистрация: 26.04.2017
Сообщений: 37
15.03.2019, 13:03  [ТС]
Nanotentacle,
и снова здравствуйте, как мне соединить два запроса ? в тот Adoquery где я подключаюсь к коду семестра
SQL
1
2
3
4
5
6
SELECT предметы.Код, предметы.кодСтуд, Students.ФИО, предметы.КодДисц, Дисциплины.Дисциплина, предметы.КодСеместра, предметы.Оценка, предметы.пропуски
 FROM (предметы
INNER JOIN Students ON предметы.кодСтуд=Students.Код)
 INNER JOIN Дисциплины ON предметы.КодДисц=Дисциплины.Код 
 
SELECT * FROM предмет WHERE (Код  = :СodSemestra)
0
882 / 404 / 173
Регистрация: 20.10.2016
Сообщений: 1,828
15.03.2019, 18:06
Цитата Сообщение от Lizalili Посмотреть сообщение
и снова здравствуйте, как мне соединить два запроса ? в тот Adoquery где я подключаюсь к коду семестра
Желательно все же говорить о конкретном ADOQuery - к какой форме принадлежит и как называется. Если я правильно уловил суть, то тут потребуются JOIN'ы, что у вас в коде есть, но реализация несколько странновата. Хотя пока мне не совсем понятна задача какой-то код выкладывать будет опрометчиво.
0
0 / 0 / 0
Регистрация: 26.04.2017
Сообщений: 37
15.03.2019, 20:59  [ТС]
Nanotentacle, Сделала по другому. Есть другая проблема, при добавлении записи в таблицу, не присваивает код выбранного семестра
вот код
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
procedure TForm3.Button2Click(Sender: TObject);
begin
  if CheckError() then
  begin
  if Form6.ADOQuery1.Modified then
    begin
   // Form6.ADOQuery2.Parameters.ParamByName('CodSemestra').value := ;
      //Form6.ADOQuery1.FieldByName('КодСеместра').Value :=CodSemestra;
      Form6.ADOQuery1.Post;
    end;
         Form3.close;
  end;
 
end;
вот форма на ней DBlookuocombobox x2, dbedit x2
0
882 / 404 / 173
Регистрация: 20.10.2016
Сообщений: 1,828
16.03.2019, 05:03
Цитата Сообщение от Lizalili Посмотреть сообщение
Nanotentacle, Сделала по другому. Есть другая проблема, при добавлении записи в таблицу, не присваивает код выбранного семестра
вот код
Понимаете в чем штука (прошу не обижаться, я постараюсь быть объективным) - вы совершенно не представляете полезной информации, которая подсказала, как вам помочь. Давайте рассмотрим код, который вы прислали.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
procedure TForm3.Button2Click(Sender: TObject);
begin
  if CheckError() then
  begin
  if Form6.ADOQuery1.Modified then
    begin
   // Form6.ADOQuery2.Parameters.ParamByName('CodSemestra').value := ;
      //Form6.ADOQuery1.FieldByName('КодСеместра').Value :=CodSemestra;
      Form6.ADOQuery1.Post;
    end;
         Form3.close;
  end;
 
end;
В какой из строк я должен понять, что на данном этапе содержится в свойстве SQL у ADOQuery1? Как я должен понять, каким образом вы планируете изменять данные в таблице? Если вы приводите форму с заполнением данных, то я делаю вывод, что где-то должен быть полноценный INSERT или UPDATE в виде отдельного запроса. У вас же все происходит через ADOQuery1.Post, и я совершенно не в курсе, какие данные были добавлены/изменены (и были ли вообще).

Учитесь правильно формулировать задачу. Например, "Для изменения данных в таблице было принято решение использовать дополнительную форму с такими-то полями для заполнения. В результате нажатия кнопки "Ок" должна производиться запись в базу. В результате записи в базу должны быть заполнены такие-то поля таблицы. Для записи в базу используется отдельный ADOQuery, который содержит вот такой-то запрос и такие-то параметры". Вы же когда пишете код, вы чем-то руководствуетесь, не просто же делаете комбинацию из объектов и их свойств? Вот и опишите, чем вы руководствуетесь и как, по вашему мнению, это работает.

Можно, конечно, прикладывать код вашей программы, тогда многое станет понятнее. Но это не дает 100% гарантии, что вам правильно поймут. В жизни навык формулировать свои действия и концепции вам очень пригодятся.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.03.2019, 05:03

DBGrid, ADOQuery и запрос с Edit
Простите за простой вопрос, но полдня поисков не дало нужного результата. У меня не выводит данные запроса, введенный в Edit, в таблицу...

Запрос ADOQuery со сменой параметров и повторный вывод в DBGrid
Ребята, такая проблема, мучаюсь целый день. Есть следующий код: void __fastcall TForm4::SpeedButtonZAPRClick(TObject *Sender) { ...

Delphi + ADOQuery+ Запрос SQL
Добрый день уважаемые програмисты! Помогите разобраться с запросом. Есть две таблицы Stb с поляли StbKey, Num, Gr, GrP, Name и Bdg с...

Запрос на выборку из двух таблиц в AdoQuery в Delphi
Доброго времени суток! Подскажите, как сделать запрос на выборку нескольких полей из двух таблиц через AdoQuery в Delphi. Сама база на...

Запрос по дате через AdoQuery (Delphi DateTimePicker1)
Доброго времени суток! Не могу написать запрос в AdoQuery2 для вывода тех дат которые равны DateTimePicker1 procedure...


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

Или воспользуйтесь поиском по форуму:
38
Ответ Создать тему
Новые блоги и статьи
Контроль уникальности строк в табличной части документа
Maks 18.06.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ПланированиеСпецтехники" с табличной частью "НаличиеОборудования", разработанного в КА2. Задача: контроль уникальности строк в. . .
Клиент
Uhbif79 18.06.2026
Здесь простой клиент для работы с сервером.
Сервер
Uhbif79 18.06.2026
Выкладываю простейший сервер.
Дефенестрация
kumehtar 18.06.2026
Узнал интересное слово. Дефенестрация. Это когда ты выбрасываешь кого-либо или что-либо из окна. Возьму на вооружение)))
Дихотомия добра и зла
kumehtar 18.06.2026
Как Дзен-буддисты говорят о добре и зле: не нужно воевать против зла, нужно воевать против невежества. Тогда добро станет ествественным, и поэтому вечным. Но дело в том, что невежество всё время. . .
Своя Интернет-Компания
iceja 18.06.2026
Я программист с экономическим образованием, пишу свой проект, это SaaS для бизнесов. Мне нужен co-founder с высшим экономическим образованием, и/ или инвестор. Сейчас проект в интенсивной разработке,. . .
24 Мат модель здравосохранения: функциональные требования к строительству пищеблока
anaschu 18.06.2026
СРесурсами1: финансовый SD-контур, калькулятор функциональных требований пищеблока Сегодня разделили затраты в агенте Экономика по образцу модели НАСОСЫ, добавили расчёт ROI и построили первый. . .
23. что сделано за последнее время.
anaschu 17.06.2026
• Эталон: Клиника НИИ питания РАМН, Москва — централизованный пищеблок, 225 коек, 180 пациентов • Git: репозиторий med2, ветка абсентеизм. Рабочий файл: СРесурсами1_v4. alp • Смежный проект:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru