Консультация № 180714
13.11.2010, 12:01
0.00 руб.
0 23 2
Уважаемые эксперты!

Вопрос: имеется база Команды (поля id, Название) и база Матчи (поля id, Ком1, Ком2, счет). На форме Grid1 и Grid2 и 2 запроса Query1 и Query2, DataSourse.

В Query1 – список команд (Select * From Команды) – отображается в Grid1.

При выборе команды в Grid1 необходимо в Grid2 получить список матчей с участием данной команды (следует учесть, что Выбранная команда может находиться как в поле Ком1, так и в поле Ком2).

Пробовал запрос (Select * From Матчи Where Ком1=:ID Or Ком2=:ID), но в итоговый список попадают только матчи в которых команда находится в поле Ком1, а в поле Ком2 не попадают. Помогите, необходимо реализовать через параметры, которые передаются в Query2 при выборе в Query1.

Query2 связан с Query1 через DataSourse.

Обсуждение

Неизвестный
13.11.2010, 13:17
общий
Мне кажется использование Where в этом случае такое:
Select * From Матчи Where ((Ком1=:ID) Or (Ком2=:ID))
Попробуйте.
Неизвестный
13.11.2010, 13:36
общий
Попробовал Where ((Ком1=:ID) Or (Ком2=:ID)), не помогло, результат не изменился
давно
Мастер-Эксперт
425
4118
13.11.2010, 14:50
общий
1. Поясните подробно эту строчку:
Query2 связан с Query1 через DataSourse.

2. Поля Ком1 и Ком2 у Вас какого типа?

Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
13.11.2010, 15:21
общий
Поля Ком1 и Ком2 типа Integer, параметр :ID тоже делаю Integer
Неизвестный
13.11.2010, 15:59
общий
это ответ
Здравствуйте, KazAndr!
Используйте объединение запросов

Select * From Матчи Where Ком1=:ID
UNION
Select * From Матчи Where Ком2=:ID
Неизвестный
13.11.2010, 16:27
общий
Хотя очень странно что не работает простым or потому как у меня есть устаревшие базы одного проекта:
Users: UserID, UserName и т.д.
Clients: UserID, ClientID

Query2.Sql=select * from Users
Query1.Sql=SELECT * from clients where userid=:USERID or clientid=:USERID
Query1.DataSource=DataSource2; (Query2)
в обоих query добавлены все поля
в параметрах Query1, 2 одинаковых параметра сделаны в Int

Все работает, при выборе во 2 гриде информация в первом гриде веврно отображается!

Если не получится разобратся самому можно выслать мне исходники программы и таблицы БД на почту
давно
Академик
320937
2216
13.11.2010, 16:54
общий
По-моему, целесообразно выложить проект на сервер RFPRO и ссылку в мини-форум. И, кстати, отдельно-то работает только по Ком2?
Код:
Select * From Матчи Where Ком2=:ID
Неизвестный
13.11.2010, 17:05
общий
По отдельности запросы : Select * From Матчи Where Ком2=:ID и Select * From Матчи Where Ком1=:ID работают, но вместе никак
давно
Академик
320937
2216
13.11.2010, 19:05
общий
Выкладывайте проект.
Неизвестный
13.11.2010, 19:31
общий
Выкладываю проект (Delphi 2010) распаковать в с:\Для экспертов (чтобы не прописывать путь к базе)
Прикрепленные файлы:
78b34452ee2ecbdc326c811e18267022.rar
давно
Академик
320937
2216
13.11.2010, 20:04
общий
У меня RAD Studio 2007. Не читается. Не могли бы Вы сохранить в этой версии (или еще меньше для тех, у кого Delphi 7) ?
Неизвестный
13.11.2010, 20:32
общий
К сожалению D7 не установлен высылаю описание проекта
Прикрепленные файлы:
4f61659e35b3b074df05bd8cfd47732c.doc
давно
Профессионал
153662
1070
13.11.2010, 20:43
общий
Адресаты:
Цитата: lamed
У меня RAD Studio 2007. Не читается. Не могли бы Вы сохранить в этой версии (или еще меньше для тех, у кого Delphi 7) ?
Удалите файлы Project2.identcache, Project2.dproj.local, Project2.dproj, Unit2.dcu и можно открывать в любой версии хоть в делфи 7.
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

давно
Академик
320937
2216
13.11.2010, 20:57
общий
Адресаты:
Спасибо. Но не любит оно русских названий полей. Переименуем
давно
Профессионал
153662
1070
13.11.2010, 21:05
общий
Странно, форма в turbo delphi не открывается, хотя только что созданный проект в делфи 2010 в turbo открывается без проблем.
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

давно
Академик
320937
2216
13.11.2010, 21:05
общий
Адресаты:
unsupported 16-bit resource in file unit2.dfm. Не судьба..
давно
Профессионал
153662
1070
13.11.2010, 21:12
общий
Адресаты:
Error creating form: Invalid stream format. Хотя в делфи 2010 открывается, мудрю.
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

Неизвестный
13.11.2010, 21:24
общий
Цитата: 318877
При выборе команды в Grid1 необходимо в Grid2 получить список матчей с участием данной команды (следует учесть, что Выбранная команда может находиться как в поле Ком1, так и в поле Ком2).
Пробовал запрос (Select * From Матчи Where Ком1=:ID Or Ком2=:ID), но в итоговый список попадают только матчи в которых команда находится в поле Ком1, а в поле Ком2 не попадают. Помогите, необходимо реализовать через параметры, которые передаются в Query2 при выборе в Query1.
Query2 связан с Query1 через DataSourse.

так не выйдет.
при такой организации связи, у вас работает только первый параметр (что и видно по вашему вопросу). Второй параметр автоматически не будет подставляться.
Либо связывать по двум РАЗНЫМ полям для обоих таблиц, либо писать ручками.

для "писать ручками":
1. удалите связь "через DataSource"
2. Перепишите запрос в Query2
Код:
SELECT * FROM math
WHERE ID_com1=:ID1 or ID_com2=:ID2

2. пропишите в событии AfterScroll для Query1 следующий код
Код:
procedure TForm1.ADOQuery1AfterScroll(DataSet: TDataSet);
begin
ADOQuery2.DisableControls;
ADOQuery2.Active := false;
ADOQuery2.Parameters.ParamByName('id1').Value := ADOQuery1id.Value;
ADOQuery2.Parameters.ParamByName('id2').Value:= ADOQuery1id.Value;
ADOQuery2.Active := true;
ADOQuery2.EnableControls;
end;


Понятно что я переименовал и таблицы и поля - НЕЛЬЗЯ ИСПОЛЬЗОВАТЬ РУССКИЕ НАЗВАНИЕ ПОЛЕЙ И ТАБЛИЦ - слишком много сложностей при этом может возникнуть.

Для того, что бы база открывалась в любом месте проекта - надо просто в AdoConection строку -путь откорректировать, убрать полный путь, оставить только имя файла (если база лежит в каталоге с программой или .\база\База.mdb если лежит в другом каталоге)

вот пример того что я написал пример - архив new.rar
давно
Профессионал
153662
1070
13.11.2010, 21:35
общий
Адресаты:
Вот исправил, теперь грузится.
Прикрепленные файлы:
b1cb9744155695fbd680def4dc429125.rar
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

давно
Академик
320937
2216
13.11.2010, 22:27
общий
Добрый вечер!
Код:
procedure TForm1.ADOQuery1AfterScroll(DataSet: TDataSet);
begin
ADOQuery2.DisableControls;
ADOQuery2.Active := false;
ADOQuery2.Parameters.ParamByName('id').Value:= ADOQuery1id.Value;
ADOQuery2.Active := true;
ADOQuery2.EnableControls;
end;

В Parameters оставляем один ID. ParamCheck ставим false, работаем.
Неизвестный
13.11.2010, 22:44
общий
Цитата: lamed
В Parameters оставляем один ID. ParamCheck ставим false, работаем.


Оставьте всё как было с самого начала, запрос перепишите (или оставьте):
Код:
SELECT * FROM math
WHERE ID_com1=:ID or ID_com2=:ID

в параметрах Query2 - удалите всё. добавьте новый( Name) ID , тип - ftInteger
ParamCheck ставим false

оставляем
Query2 связан с Query1 через DataSourse.


моя ссылка на проект
Цитата: 19206
вот пример того что я написал пример - архив new.rar

- обновлена, там лежат новые исходники

PS: как то всё больше ручками приходится, потому видать кое что забывается..
Неизвестный
14.11.2010, 09:38
общий
Большое спасибо всем участникам. Больше всего подошел ответ Victor Pyrlik.
давно
Академик
320937
2216
14.11.2010, 11:51
общий
это ответ
Добрый день! Для ответа на Ваш вопрос были использованы "переведенные" в Delphi-7 проекты экспертов Victor Pyrlik и Евгений/Genia007/.
1. Проблема заключается в следующем.
При попытке записать текст запроса
Код:
SQLSELECT * FROM math
WHERE ID_com1=:ID or ID_com2=:ID
в массив Parameters заносятся два одинаковых названия параметра id.
Оставляем только один. Устанавливаем в ParamCheck значение false. Теперь запрос работает
2. Дополнительные проблемы в любом случае создают русские названия полей (указал Victor Pyrlik).
Проект, подготовленный Victor Pyrlik
Удачи!
5
Форма ответа