Конференция "Начинающим" » Сортировка DbGrid по клику на колонке [D7, XP]
 
  • Михалыч (04.01.17 19:53) [0]
    Доброго времени суток! Собственно сабж, никак не выходит.. (( Перелопатил кучу инфы в сети нашел, что народ решает эту задачу создавая глобальную переменную в которую и передает запрос, а потом при клике на колонке переоткрывает его меняя order by + Index колонки:
    http://base.vingrad.ru/view/1180-Sortirovka-DBGrid-po-kliku-na-kolonke
    Но у меня в запросе куча параметров и уже есть сортировка. Как решить?
    Была идея извлекать и SQL.Text и менять order by а потом повторно присвоить и открыть запрос, но не уверен что прокатит без передачи параметров.. ((
  • Михалыч (04.01.17 20:03) [1]
    D2010, FB2.5, ibquery
  • Игорь Шевченко © (04.01.17 21:30) [2]

    > Но у меня в запросе куча параметров и уже есть сортировка.
    >  Как решить?


    Очевидно, изменить запрос в части Order by, повторно присвоить параметрам значения и выполнить. Другого пути попросту нет.
  • Михалыч (04.01.17 23:05) [3]
    А что будет с ранее переданными параметрами в запрос? Они вытянутся с SQL.Text? Выполниться запрос просто с измененным order by? Повторная передача параметров будет довольно затруднительной.. Разве что постоянно где-то в глобалках их хранить тоже придется, чего бы не оч.хотелось..
  • Михалыч (04.01.17 23:14) [4]
    Проблема в том что меняются не только запросы но и количество параметров в них, так-как в DbGrid выводятся разные поисковые данные. Если еще с подменой order by более-менее понятно, то как выполнить парсинг SQL.Text чтобы узнать количество переданных параметров даже не представляю.. ((
  • iop © (04.01.17 23:53) [5]
    у тебя соседский дядя что ли sql текст формирует
    что ты без понятия сколько там параметров в твоем запросе?
  • Михалыч (04.01.17 23:55) [6]
    )) пользователь можт че угодно искать в базе и параметры соответственно меняются.. и их количество также.. Все-таки параметры нужно хранить и снова передавать. С датасетом никак не получится пересортировать?
  • Михалыч (04.01.17 23:59) [7]
    другого способа пересортировки в обычном DbGrid нет? чтобы не юзать EhLibы всякие..
  • iop © (05.01.17 00:00) [8]
    пользователь можт че угодно искать в базе

    кто конкретно меняет текст sql?
    пользователь или программист?
  • iop © (05.01.17 00:06) [9]
    пользователь можт че угодно искать в базе и параметры соответственно меняются.. и их количество также..

    ой бедааа......

    возьмем например TQuery из D2.
    писали его в середине девяностых прошлого века.
    сегодня я беру его, записываю произвольный sql text с произвольным количеством параметров.
    и о чудо! оно работает даже в 17 году следующего столетия.

    это что же получается?
    получается они в 94 году уже знали какой я запрос напишу в 17 году и сколько в нем будет параметров?
    крута.....
  • Михалыч (05.01.17 00:20) [10]
    пользователь задает параметрі поиска в программе, а она формирует запрос в базу, но количество параметров действительно может меняться. if then else короче.. ((
  • iop © (05.01.17 00:22) [11]
    и што?

    действия пользователя каким-то магическим способом уничтожает коллекцию парамз у датасета что ты ее перестаешь видеть?
  • iop © (05.01.17 00:24) [12]
    пользователь задает параметрі поиска в программе, а она формирует запрос в базу

    а ну понятно.
    есть пользователь и есть "она".
    программист здесь не предусмартивался изначально.

    чо тогда паришься?
    если "она" формирует запрос, то пусть "она" и с параметрами разбирается.

    а ты отмечай новый год.
  • Михалыч (05.01.17 00:27) [13]
    )) она - программа, просто незнаю как параметры у датасета вытащить? подскажете? а с подменой order by запроса уже разберусь...
  • Михалыч (05.01.17 00:28) [14]
    некогда праздновать, заказчик напрягает.. ((
  • iop © (05.01.17 00:52) [15]
    конечно подскажу.
    про параметры датасета твоего
    надо читать доку датасета твоего.
    там же можно прочитать есть ли у него клиентский сорт и работает ли он.

    заказчик его напрягает ....
    как все серьезно ио там
  • Михалыч (05.01.17 00:54) [16]
    FB 2.5 действительно серьезно.. стал бы я спрашивать если бы сам знал.. ((
  • iop © (05.01.17 00:56) [17]
    ты бы лучше заказчиков заводил не до прочтения доки а после.
    ага.

    "серьезная фирма возьмет дырокол в аренду"...
  • Игорь Шевченко © (05.01.17 11:15) [18]

    > А что будет с ранее переданными параметрами в запрос?


    Их надо запомнить перед тем, как менять текст SQL-запроса. В твоем случае ничего не меняется кроме части order by, следовательно, количество параметров тоже не изменится.
  • Михалыч (05.01.17 13:08) [19]
    Количество параметров варьируется в зависимости от условий поиска. Хранить их в глобалках или их можно вытащить из датасета и повторно присвоить перед выполнением измененного запроса?
  • Игорь Шевченко © (05.01.17 21:12) [20]
    Михалыч   (05.01.17 13:08) [19]

    Количество параметров при модификации order by остается таким же, от этого и надо отталкиваться. Можно вытащить и повторно присвоить перед выполнением измененного (в части order by) запроса.
  • Михалыч (06.01.17 11:57) [21]
    А как вытащить параметры из датасета, чтобы не хранить в глобалках? Загуглил примеры но к сожалению не нашел.. ((
  • Игорь Шевченко © (06.01.17 15:29) [22]
    Почитать справку по используемому датасету, например.
  • Михалыч (06.01.17 15:36) [23]
    FB2.5, D2010, IBQuery
    Доки я читал: http://www.ibase.ru/ibx
    Но там написано только о присвоении параметров, а как их потом считать нет.. ((
  • Михалыч (08.01.17 11:34) [24]
    Наверное нужно что-то в виде:

    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.. но как написать увы не знаю.. ((
  • Михалыч (08.01.17 11:39) [25]
    Это по присвоение, перебором как-бы.. Еще как-то нужно извлечь присвоенные ранее параметры.. ((
  • Михалыч (08.01.17 13:16) [26]
    нашел! читать можно так-же как и присваивать..
    все, сделал. Можно закрыть ветку
  • ЯЧтсия (09.01.17 14:48) [27]
    Удалено модератором
  • Михалыч (09.01.17 22:03) [28]
    Вторая проблемка: ParamCount возвращает бред, передал в IbQuery один параметр, а в ShowMessage вижу 8. чудеса.. ParamCheck в True
    пробовал перед выполнением запроса ParamClear не помогло. куда копать?
  • Игорь Шевченко © (09.01.17 22:09) [29]

    > куда копать?


    Код уже пора показывать или приглашать телепатов
  • Михалыч (09.01.17 22:10) [30]
    нашел, в запросе и правда 8 пареметром но все с одинаковым именем , просто через ИЛИ прописаны. А мне нужно считать значение переданного этому имени
    ParamByName нужно видимо...
  • Михалыч (09.01.17 22:11) [31]
    в данном случае парамкаунт бесполезен, так-как лишь вносит путаницу ((
  • Михалыч (09.01.17 22:26) [32]
    Например:

    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 на второе
    поле к примеру, но сохранив переданные ранее параметры чтобы передать
    в измененный запрос и выполнить его конечно. С подменой я справился.
    Теперь нужно читать параметры и присваивать уже все три или как правильно?
  • Михалыч (09.01.17 22:31) [33]
    как-то так?

    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;

    ???
  • Михалыч (10.01.17 11:23) [34]
    Заработало! Сделал чтение/запись все параметров в цикле.. ))
  • Игорь Шевченко © (10.01.17 12:52) [35]
    Жаль, что так и не удалось послушать начальника транспортного цеха.
  • asail © (12.01.17 17:17) [36]
    А зачем вообще переоткрывать запрос и тащить все данные с сервера при изменении сортировки пользователем?
    Имхо, куда правильнее стянуть все данные в локальный датасет (типа, например, TClientDataset) и уже его подрубать к гриду... А в нем (локальном датасете) уже сортировать данные как душе угодно, не напрягая сервер почем зря, просто создавая индексы...
    Или я не прав?
 
Конференция "Начинающим" » Сортировка DbGrid по клику на колонке [D7, XP]
Есть новые Нет новых   [118241   +25][b:0][p:0.001]