-
Доброго времени суток! Собственно сабж, никак не выходит.. (( Перелопатил кучу инфы в сети нашел, что народ решает эту задачу создавая глобальную переменную в которую и передает запрос, а потом при клике на колонке переоткрывает его меняя order by + Index колонки:
http://base.vingrad.ru/view/1180-Sortirovka-DBGrid-po-kliku-na-kolonke Но у меня в запросе куча параметров и уже есть сортировка. Как решить?
Была идея извлекать и SQL.Text и менять order by а потом повторно присвоить и открыть запрос, но не уверен что прокатит без передачи параметров.. ((
-
D2010, FB2.5, ibquery
-
> Но у меня в запросе куча параметров и уже есть сортировка.
> Как решить?
Очевидно, изменить запрос в части Order by, повторно присвоить параметрам значения и выполнить. Другого пути попросту нет.
-
А что будет с ранее переданными параметрами в запрос? Они вытянутся с SQL.Text? Выполниться запрос просто с измененным order by? Повторная передача параметров будет довольно затруднительной.. Разве что постоянно где-то в глобалках их хранить тоже придется, чего бы не оч.хотелось..
-
Проблема в том что меняются не только запросы но и количество параметров в них, так-как в DbGrid выводятся разные поисковые данные. Если еще с подменой order by более-менее понятно, то как выполнить парсинг SQL.Text чтобы узнать количество переданных параметров даже не представляю.. ((
-
у тебя соседский дядя что ли sql текст формирует
что ты без понятия сколько там параметров в твоем запросе?
-
)) пользователь можт че угодно искать в базе и параметры соответственно меняются.. и их количество также.. Все-таки параметры нужно хранить и снова передавать. С датасетом никак не получится пересортировать?
-
другого способа пересортировки в обычном DbGrid нет? чтобы не юзать EhLibы всякие..
-
пользователь можт че угодно искать в базе
кто конкретно меняет текст sql?
пользователь или программист?
-
пользователь можт че угодно искать в базе и параметры соответственно меняются.. и их количество также..
ой бедааа......
возьмем например TQuery из D2.
писали его в середине девяностых прошлого века.
сегодня я беру его, записываю произвольный sql text с произвольным количеством параметров.
и о чудо! оно работает даже в 17 году следующего столетия.
это что же получается?
получается они в 94 году уже знали какой я запрос напишу в 17 году и сколько в нем будет параметров?
крута.....
-
пользователь задает параметрі поиска в программе, а она формирует запрос в базу, но количество параметров действительно может меняться. if then else короче.. ((
-
и што?
действия пользователя каким-то магическим способом уничтожает коллекцию парамз у датасета что ты ее перестаешь видеть?
-
пользователь задает параметрі поиска в программе, а она формирует запрос в базу
а ну понятно.
есть пользователь и есть "она".
программист здесь не предусмартивался изначально.
чо тогда паришься?
если "она" формирует запрос, то пусть "она" и с параметрами разбирается.
а ты отмечай новый год.
-
)) она - программа, просто незнаю как параметры у датасета вытащить? подскажете? а с подменой order by запроса уже разберусь...
-
некогда праздновать, заказчик напрягает.. ((
-
конечно подскажу.
про параметры датасета твоего
надо читать доку датасета твоего.
там же можно прочитать есть ли у него клиентский сорт и работает ли он.
заказчик его напрягает ....
как все серьезно ио там
-
FB 2.5 действительно серьезно.. стал бы я спрашивать если бы сам знал.. ((
-
ты бы лучше заказчиков заводил не до прочтения доки а после.
ага.
"серьезная фирма возьмет дырокол в аренду"...
-
> А что будет с ранее переданными параметрами в запрос?
Их надо запомнить перед тем, как менять текст SQL-запроса. В твоем случае ничего не меняется кроме части order by, следовательно, количество параметров тоже не изменится.
-
Количество параметров варьируется в зависимости от условий поиска. Хранить их в глобалках или их можно вытащить из датасета и повторно присвоить перед выполнением измененного запроса?
-
Михалыч (05.01.17 13:08) [19]
Количество параметров при модификации order by остается таким же, от этого и надо отталкиваться. Можно вытащить и повторно присвоить перед выполнением измененного (в части order by) запроса.
-
А как вытащить параметры из датасета, чтобы не хранить в глобалках? Загуглил примеры но к сожалению не нашел.. ((
-
Почитать справку по используемому датасету, например.
-
FB2.5, D2010, IBQuery
Доки я читал:
http://www.ibase.ru/ibxНо там написано только о присвоении параметров, а как их потом считать нет.. ((
-
Наверное нужно что-то в виде:
DS := TADOQuery.Create(nil);
DS.ConnectionString := 'Provider=SQLOLEDB.1;.....';
DS.SQL.Text := 'select * from Users where UserID = :UserID';
for i := 0 to DS.Parameters.Count - 1 do
begin
DS.Parameters[0].Value := 1;
end;
DS.Open;
DS.Free;
Но не для АДО а для Firebird.. но как написать увы не знаю.. ((
-
Это по присвоение, перебором как-бы.. Еще как-то нужно извлечь присвоенные ранее параметры.. ((
-
нашел! читать можно так-же как и присваивать..
все, сделал. Можно закрыть ветку
-
Удалено модератором
-
Вторая проблемка: ParamCount возвращает бред, передал в IbQuery один параметр, а в ShowMessage вижу 8. чудеса.. ParamCheck в True
пробовал перед выполнением запроса ParamClear не помогло. куда копать?
-
> куда копать?
Код уже пора показывать или приглашать телепатов
-
нашел, в запросе и правда 8 пареметром но все с одинаковым именем , просто через ИЛИ прописаны. А мне нужно считать значение переданного этому имени
ParamByName нужно видимо...
-
в данном случае парамкаунт бесполезен, так-как лишь вносит путаницу ((
-
Например:
IBQuery1.SQL.Add('SELECT * FROM MyTable WHERE (POLE1=:Name_param1) ');
IBQuery1.SQL.Add('OR (POLE2=:Name_param1) OR (POLE3=:Name_param1)');
IBQuery1.SQL.Add(' order by POLE1');
IBQuery1.ParamByName('Name_param1').AsString := 'ля-ля';
передаю одно значения в три имени, ParamCount показывает три параметра.
теперь после выполнения запроса, нужно подменить order by на второе
поле к примеру, но сохранив переданные ранее параметры чтобы передать
в измененный запрос и выполнить его конечно. С подменой я справился.
Теперь нужно читать параметры и присваивать уже все три или как правильно?
-
как-то так?
for i := 0 to IBQuery1.Parameters.Count - 1 do
begin
IBQuery1.Parameters[0].Value := 'тут считанные ранее три параметра в масив например';
end;
Или достаточно сохранить s:=IBQuery1.ParamByName('Name_param1').AsString в переменную а потом присвоить по имени при выполнении измененного запроса:
IBQuery1.ParamByName('Name_param1').AsString:=s;
???
-
Заработало! Сделал чтение/запись все параметров в цикле.. ))
-
Жаль, что так и не удалось послушать начальника транспортного цеха.
-
А зачем вообще переоткрывать запрос и тащить все данные с сервера при изменении сортировки пользователем?
Имхо, куда правильнее стянуть все данные в локальный датасет (типа, например, TClientDataset) и уже его подрубать к гриду... А в нем (локальном датасете) уже сортировать данные как душе угодно, не напрягая сервер почем зря, просто создавая индексы...
Или я не прав?