-
Здравствуйте мастера! Нужно в программе сделать выборку данных по некоторому количеству параметров которое задает пользователь во время работы. Пробовал сделать в цикле так:
for I := 1 to MyParamsCount
begin
MyData:='мои данные';
IBQuery1.SQL.Add('(MYFIELD=:Name_param'+IntToStr(i)+')');
IBQuery1.ParamByname('Name_param'+IntToStr(i)).AsString := MyData;
end;
где в переменную MyData(тип String) вношу нужные данные
но в результате не получаю необходимый результат выборки.
Как правильно реализовать эту процедуру?
-
А зачем в цикле?
-
По ходу работы программы кол.параметров меняется(выбирает пользователь)
вот и решил менять размерность цикла по кол.параметров и вносить их так IBQuery1.SQL.Add но не работает. Как лучше сделать?
-
Может можно добавлять данные в DBGRID? Ну так чтобы результаты предыдущей выборки не пропали, тогда сделал бы последовательный перебор и вывод результатов по всем нужным параметрам...
-
может надо копать в сторону FOR SELECT DO?
-
выведите IBQuery1.SQL.Text куда-то посмотрите, правильно ли получается запрос
-
> но в результате не получаю необходимый результат выборки.
для правильного результата необходимо верно составить условие-задать значения..., а уж как, статически, динамически, в цикле - неважно.
> MyData:='мои данные';
в цикле? т.е. все параметры одно значение получают?
кстати, еще чем смущает приведенный цикл, добавлением параметров+значение по одному... по идее это вызывает репарс запроса, и пересоздание переменных. т.е. первые значения занилятся, останется только последнее.
попробуй разбить на 2 цикла, в первом добавь ВСЕ параметры, а уже после, во втором инициализируй их значениями.
-
Лично меня смущает получаемый в результате этого кода текст запроса
"что-то" + '(MYFIELD=:Name_param'+IntToStr(1)+')'+'(MYFIELD=:Name_param'+IntToStr(2)+')'+'(MYFIELD=:Name_param'+IntToStr(3)+')'+...
-
> А зачем в цикле?
а чтобы потом мучаться с запросами, дурное дело не хотрое
-
Повторюсь: зачем в цикле?
есть ряд условий выборки: усл1, усл2, усл3
почему вместо
for i:=1 to 3 do условие=условие+усл(i);
не сделать сразу
условие=усл1.and.усл2.and.усл3
??????
-
>manaka © (13.01.19 22:53) [9]
потому что MyParamsCount не обязан быть равным 3
-
> Крылов И.В. (11.01.19 19:23)
1. IBQuery1.Prepared = false;
2. // перезаписать SQL
3. // В цикле добавить параметры
4. IBQuery1.Prepared = true;
5. // В цикле присвоить значения параметрам
6. // Если результат не удовлетворил, использовать отладчик
-
> niteshade © (15.01.19 06:29) [10]
> >manaka © (13.01.19 22:53) [9]
> потому что MyParamsCount не обязан быть равным 3
да хоть 7.
Кстати в цикле сработает условие a.and.b.and.c.and.d...
А если пользователю надо ((a.and.b).or.(c.and.d)).or.e?
-
>manaka © (20.01.19 16:28) [12]
>да хоть 7.
пример кода?
-
> пример кода?
вы ниразу не видели код с 7 параметрами? или какой код..
-
>ухты © (22.01.19 00:08) [14]
например, sql-запрос с неизвестным заранее кол-вом параметров
и как, в общем случае, его получить без цикла
и, коли уж выступаете адвокатом manaka, поясните, откуда следует вот это:
>Кстати в цикле сработает условие a.and.b.and.c.and.d...
-
MyParamsCount как получили? может там сразу и запрос составить, смотришь и цикл не нужен.
И вообще тут похоже на поиски под фрнарем. Озвучте задачу, тогда и решать будем.
-
> niteshade © (22.01.19 06:42) [15]
> и как, в общем случае, его получить без цикла
условие=''
пользователь задал усл1
условие=усл1
пользователь задал усл2
условие=условие+".and."+усл2
пользователь задал усл3
условие=условие+".and."+усл3
и т.д.
Так можно?
-
>manaka © (22.01.19 15:02) [17]
т.е. после ввода пользователем условия, добавляем его (условие) к строке запроса?
-
> niteshade © (23.01.19 06:18) [18]
ну да