Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.04.2010, 19:21   #1
R11
Пользователь
 
Регистрация: 06.01.2008
Сообщений: 61
По умолчанию Передача значения переменной в Query. SQL

Как правильно такие вещи делаются, я незнаю
Но пишу свое виденья процесса....

есть Ouery
в свойстве SQL запись
........
General.ID= :PR
........

Мне надо, чтобы по нажатию кнопки в программе, параметр PR принимал определенное значение.
(становилось так: General.ID= необходимое значение )

Реализовал так:

procedure TGeneralForm.Button1Click(Sender: TObject);
var
xPR : string;
begin
xPR := 'необходимое значение';
....

DataModule2.Query_SQL_FAM.Parameter s.ParamByName('PR').Value:= xPR;
....

Но необходимого результата не получил
R11 вне форума Ответить с цитированием
Старый 16.04.2010, 22:21   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

в принципе мыслите правильно.
А какой результат не получили?
И давайте код заполнения/вызова Query_SQL_FAM полностью.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 16.04.2010, 22:58   #3
R11
Пользователь
 
Регистрация: 06.01.2008
Сообщений: 61
Хорошо

Это содержимое SQL в Query:
SELECT*
FROM Главная, ST, SG, SM, Группы
WHERE Главная.Фамилия LIKE :Fam
AND Группы.Key_group=Главная.LinkGroup
AND Главная.GeneralID= :PR

в самой программе код на double click по записи в DB Grid:
var
xPR : string;
begin
if DataModule2.GroupTable.Fields[2].AsString ='значение' then
begin
xPR := 'ST.LinkGeneral';
else
....
DataModule2.Query_SL_FM.Parameters. ParamValues['PR']:= xPR;
....
и т.д.

Смысл в том, что Grid содержит записи из разных таблиц, и по двойному щелчку на определенной записи выскакивает некая сводная форма.
У меня сейчас эта форма выскакивает, но пустая.

Если просто в Query написать
FROM Главная, ST, SG, SM, Группы
WHERE Главная.Фамилия LIKE :Fam
AND Группы.Key_group=Главная.LinkGroup
AND Главная.GeneralID= : ST.LinkGeneral (или SG.LinkGeneral...)

то таблицы подключаются и форма заполняется

Последний раз редактировалось R11; 16.04.2010 в 23:07. Причина: уточнил
R11 вне форума Ответить с цитированием
Старый 17.04.2010, 06:25   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ясно..
Вы код всё равно не полностью привели, но, ИМХО,
я понял, где у Вас ошибка:
для того, чтобы параметры вступили в силу, запрос надо закрыть, потом присвоить новое значение параметра и потом запрос открыть:
Код:
else 
....
DataModule2.Query_SL_FM.Close;
DataModule2.Query_SL_FM.Parameters. ParamValues['PR']:= xPR;
DataModule2.Query_SL_FM.Open;
....
посмотрел чуть внимательнее на текст запроса!
Он же НЕПРАВИЛЬНЫЙ у Вас!!!!
Параметер подставляется, НО!
Это же ПАРАМЕТЕР! а не текст запроса!!!!!
т.е. Вы получаете такой запрос:
Код:
SELECT*
FROM Главная, ST, SG, SM, Группы
WHERE Главная.Фамилия LIKE :Fam
AND Группы.Key_group=Главная.LinkGroup
AND Главная.GeneralID= 'тут Ваш текст'
Это раз!
во-вторых, у вас очень плохо со знанием SQL (крайне рекомендую почитать книжки. Например, "классику" М.Грубер -"Понимание SQL")
Вкратце, если Вы указали в источнике данных (после ключевого слова FROM ) пять таблиц, значит в связях ( WHERE ... ) должно быть указано минимум четыре реляции, связывающие эти таблицы (или ограничивиющие выбор из каждой таблицы)! Иначе получите перемножение записей всех таблиц!


а, конкретно, в Вашем случае нужно как раз таки использовать изменение текста запроса в процессе работы программы!
Код:
else 
....
DataModule2.Query_SL_FM.Close;
DataModule2.Query_SL_FM.SQL.Clear;
DataModule2.Query_SL_FM.SQL.Add('SELECT * ');
DataModule2.Query_SL_FM.SQL.Add('FROM Главная, ST, SG, SM, Группы ');
DataModule2.Query_SL_FM.SQL.Add('WHERE Главная.Фамилия LIKE :Fam ');
DataModule2.Query_SL_FM.SQL.Add('  AND Группы.Key_group=Главная.LinkGroup ');
DataModule2.Query_SL_FM.SQL.Add('  AND Главная.GeneralID= ' + xPr);
DataModule2.Query_SL_FM.Parameters. ParamValues['FAM']:= 'Фамилия';
DataModule2.Query_SL_FM.Open;

....
Удачи.

Последний раз редактировалось Serge_Bliznykov; 17.04.2010 в 06:46.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 17.04.2010, 10:37   #5
R11
Пользователь
 
Регистрация: 06.01.2008
Сообщений: 61
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение

а, конкретно, в Вашем случае нужно как раз таки использовать изменение текста запроса в процессе работы программы!
Код:
else 
....
DataModule2.Query_SL_FM.Close;
DataModule2.Query_SL_FM.SQL.Clear;
DataModule2.Query_SL_FM.SQL.Add('SELECT * ');
DataModule2.Query_SL_FM.SQL.Add('FROM Главная, ST, SG, SM, Группы ');
DataModule2.Query_SL_FM.SQL.Add('WHERE Главная.Фамилия LIKE :Fam ');
DataModule2.Query_SL_FM.SQL.Add('  AND Группы.Key_group=Главная.LinkGroup ');
DataModule2.Query_SL_FM.SQL.Add('  AND Главная.GeneralID= ' + xPr);
DataModule2.Query_SL_FM.Parameters. ParamValues['FAM']:= 'Фамилия';
DataModule2.Query_SL_FM.Open;

....
Удачи.
Спасибо
Чувствовал, что надо весь запрос переписывать, но была надежда
Только тогда, наверное, надо еще одну переменную, чтобы не подключать все три таблицы ( ST, SG, SM) а подключать одну, в зависимости от значения переменной?
R11 вне форума Ответить с цитированием
Старый 17.04.2010, 16:37   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Только тогда, наверное, надо еще одну переменную, чтобы не подключать все три таблицы ( ST, SG, SM) а подключать одну, в зависимости от значения переменной?
Ну, во-первых, Вам это виднее (кто ж его знает, что у Вас с таблицах ST SG SM )
во-вторых, скорее всего, так Вам и надо сделать...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 18.04.2010, 12:12   #7
R11
Пользователь
 
Регистрация: 06.01.2008
Сообщений: 61
По умолчанию

Спасибо, теперь все работает!
R11 вне форума Ответить с цитированием
Старый 18.04.2010, 22:37   #8
R11
Пользователь
 
Регистрация: 06.01.2008
Сообщений: 61
По умолчанию

что-то все перерыл, не могу собразить...
в выше указаном примере, по щелчку на записи в гриде выскакивает форма, это форма состоит из таблицы. В зависимости от подключенной таблицы, в гриде разные столбцы.
Как передать гриду параметр Add all fields ?
R11 вне форума Ответить с цитированием
Старый 18.04.2010, 23:57   #9
R11
Пользователь
 
Регистрация: 06.01.2008
Сообщений: 61
По умолчанию

вроде нашел. своство: TDBGridColumnsState = (csDefault, csCustomized);
Только где такое свойство у элемента cxDbVerticalGrid ?!
R11 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача переменной в EXE Evgen1503 Общие вопросы Delphi 6 03.05.2010 15:56
sql запрос через Query Lokos БД в Delphi 21 03.03.2010 14:38
Передача переменной в php Ruska882009 PHP 2 23.09.2009 12:57
Передача переменной PHP tsergey PHP 4 02.06.2009 03:20