Topic: Сортировка значений в Grid

Подскажите как при выводе информации в Grid , установить автоматическую сортировку значений в определенном столбце. При условии что вывод информации в Grid выполняется через sql-запрос.

Re: Сортировка значений в Grid

сортировку значений можно сделать непосредственно в SQL запросе с помощью слова ORDER BY fieldname, например

SELECT lastname, firstname FROM tablename ORDER BY lastname;

либо можно сортировать непосредственно в гриде с помощью скрипта

procedure Form1_TableGrid1_OnChange (Sender: string);
begin
    Form1.TableGrid1.Columns[1].Sorted := True; // сортировка второй колонки (нумерация колонок с нуля)
end;
Dmitry.

Re: Сортировка значений в Grid

Спасибо Дмитрий

Re: Сортировка значений в Grid

Дмитрий, здравствуйте.
Дабы не плодить темы форума, задам вопрос в этой теме.
Есть две таблицы Grid , в одной и во второй высчитывается сумма значений 1 столбика, с последующим выводом итоговой суммы в Footer (через sql запрос). Как произвести математические действия с итоговыми суммами взятыми из Footer-а обеих таблиц, с последующим выводом информации в поле Edit ?

Re: Сортировка значений в Grid

получить значение из футера в Edit можно так


Form1.Edit1.Text := FloatToStr(Form1.TableGrid1.Columns[0].Footer.FormulaValue);
Dmitry.

Re: Сортировка значений в Grid

DriveSoft wrote:

получить значение из футера в Edit можно так


Form1.Edit1.Text := FloatToStr(Form1.TableGrid1.Columns[0].Footer.FormulaValue);

Дмитрий, это я знаю . А вот как скажем суммировать значения из двух футеров разных гридов

Re: Сортировка значений в Grid

создайте в каждом гриде событие OnChange и в каждом напишите:

Form1.Edit1.Text := FloatToStr(Form1.TableGrid1.Columns[0].Footer.FormulaValue + Form1.TableGrid2.Columns[0].Footer.FormulaValue);
Dmitry.

Re: Сортировка значений в Grid

Дмитрий,  спасибо большое за подсказку.

Теперь возник еще один вопрос про футер таблицы.
Почему при запросе поиска данных в Grid

SELECT

UserOP.Famyli,
UserOP.Name,
UserOP.Otchestvo,


(
SELECT TOTAL(Fine.FineMoney) FROM Fine WHERE
(date({DateTimePicker1}) <= date(Fine.DataFine) AND date({DateTimePicker2}) >= date(Fine.DataFine)) AND
Fine.id_UserOP = UserOP.id
),

(
SELECT TOTAL(Prize.PrizeMoney) FROM Prize WHERE
(date({DateTimePicker1}) <= date(Prize.DataPrize) AND date({DateTimePicker2}) >= date(Prize.DataPrize)) AND
Prize.id_UserOP = UserOP.id
),



(
SELECT TOTAL(Prize.PrizeMoney) FROM Prize WHERE
(date({DateTimePicker1}) <= date(Prize.DataPrize) AND date({DateTimePicker2}) >= date(Prize.DataPrize)) AND
Prize.id_UserOP = UserOP.id
)
-
(
SELECT TOTAL(Fine.FineMoney) FROM Fine WHERE
(date({DateTimePicker1}) <= date(Fine.DataFine) AND date({DateTimePicker2}) >= date(Fine.DataFine)) AND
Fine.id_UserOP = UserOP.id
),



UserOP.id

FROM UserOP

WHERE

CASE WHEN '{Edit1}'<>'' THEN UserOP.FIO LIKE '%{Edit1}%' ELSE 1=1 END

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

frmSvodnayaTabl_TableGrid1_OnChange (Sender: string);
var
   i,c, q : integer;
begin
     q := 0;
        c := frmSvodnayaTabl.TableGrid1.RowCount - 1;
     for i := 0 to c do
         if ValidInt(frmSvodnayaTabl.TableGrid1.Cells[3, i]) then q := q + StrToInt(frmSvodnayaTabl.TableGrid1.Cells[3, i]);

     frmSvodnayaTabl.TableGrid1.Columns[3].Footer.Caption := IntToStr(q); // result
 end;

ничего не происходит, футер попросту не отображается. Ошибки при этом никакой не выдает. Где ошибся ?
За ранее спасибо !

Re: Сортировка значений в Grid

Вопрос, снят. Разобрался

Re: Сортировка значений в Grid

Всем доброго вечера.
Назрел один вопрос, как с помощью скрипта отсортировать данные в таблице , а именно :
При условии нахождения , допустим в третьем столбце Gridа значения суммы (0), хотелось бы чтобы данная строка просто не выводилась в таблицу (визуально не отображалась ).
Просмотрел примеры поиска по условию, раскрашиванию строк но пока , увы не додумался как реализовать данный запрос. Прошу помощи.

Re: Сортировка значений в Grid

Igor
К сожалению нет возможности скрыть строку в гриде.


Думаю проще использовать кнопку "Поиск", чтобы отфильтровать ненужные строки.

Dmitry.

12 (edited by Igor 2015-09-26 22:34:25)

Re: Сортировка значений в Grid

Дмитрий, появился еще один вопрос по сортировке значений в Grid, а именно :

procedure Form1_TableGrid1_OnChange (Sender: string);
begin
    Form1.TableGrid1.Columns[1].Sorted := True; // сортировка второй колонки (нумерация колонок с нуля)
end;

Я так понимаю что данная строка скрипта просто включает сортировку значений в указанной колонке. По умолчанию сортировка выполняется с большего до меньшего значения либо по алфавиту. Как реализовать (реверсную) сортировку - с меньшего на большее (в обратном порядке). За ранее спасибо.

Re: Сортировка значений в Grid

    Form1.TableGrid1.Columns[1].SortKind := skDescending; // skAscending
    Form1.TableGrid1.Columns[1].Sorted := True;

skAscending - по возрастанию
skDescending - по уменьшению

Dmitry.

Re: Сортировка значений в Grid

Спасибо Дмитрий !

Re: Сортировка значений в Grid

Еще вопрос по теме - а можно ли как-либо задать собственную функцию компаратор для сортировки?

Вопрос растет отсюда - у меня есть поле (строка) с неким буквенно-цифровым номером. И выглядит родным алгоритмом примерно так:

107
109
11
110
112

Что не очень устраивает.

Re: Сортировка значений в Grid

Dreada
К сожалению пока нет возможности задать сортировку для текста таким образом.

Dmitry.

Re: Сортировка значений в Grid

Igor wrote:

Дмитрий, здравствуйте.
Дабы не плодить темы форума, задам вопрос в этой теме.
Есть две таблицы Grid , в одной и во второй высчитывается сумма значений 1 столбика, с последующим выводом итоговой суммы в Footer (через sql запрос). Как произвести математические действия с итоговыми суммами взятыми из Footer-а обеих таблиц, с последующим выводом информации в поле Edit ?

Добрый день!
А как вывести сумму(итог) столбцов в футер через sql запрос?
Если можно на моём примере, второй и третий столбец:

SELECT
Comp.CompName,         
TOTAL(OtgruzDokum.OtgruzDokumVes),
round(TOTAL((Schet.SchetSumma / Schet.SchetVesDokum)*(SELECT TOTAL(OtgruzDokum.OtgruzDokumVes) FROM OtgruzDokum WHERE OtgruzDokum.id_Schet=Schet.id)),2)
                                                                                                                                                     
FROM OtgruzDokum

LEFT OUTER JOIN Schet ON Schet.id=OtgruzDokum.id_Schet LEFT OUTER JOIN Prih ON Prih.id=Schet.id_Prih LEFT OUTER JOIN Comp ON Comp.id=Prih.id_Comp

WHERE
(CASE WHEN {DateTimePicker1} IS NOT NULL THEN date(OtgruzDokum.OtgruzDokumDate) >= date({DateTimePicker1}) ELSE 1=1 END) AND
(CASE WHEN {DateTimePicker2} IS NOT NULL THEN date(OtgruzDokum.OtgruzDokumDate) <= date({DateTimePicker2}) ELSE 1=1 END) AND
(CASE WHEN {ComboBox1} <> -1 THEN Prih.id_Comp = {ComboBox1} ELSE 1=1 END)

GROUP BY Comp.CompName

Re: Сортировка значений в Grid

Petr
Проще всего это сделать через настройку компонента TableGrid, просто заполните его какими либо полями и укажите, по какому столбцу считать сумму, т.о. при заполнении компонента данными от SQL запроса вы увидите сумму.

Dmitry.

Re: Сортировка значений в Grid

Работает!
Спасибо Дмитрий!
Два дня рыл форум прежде чем спросить)))

Re: Сортировка значений в Grid

Скриптом можно так

procedure Form1_TableGrid1_OnChange (Sender: string);
begin
     Form1.TableGrid1.Columns[2].Footer.FormulaKind := fkSum; // для третьей колонки, нумерация с  нуля
     Form1.TableGrid1.CalculateFooter;

     //Form1.TableGrid1.Columns[2].Footer.Caption := 'Так можете записать свое значение в футер';
end;


begin
    Form1.TableGrid1.Options := Form1.TableGrid1.Options + goFooter;
end.
Dmitry.

Re: Сортировка значений в Grid

При варианте подсчета итогов через свойства какого либо поля наблюдался следующий баг:
при первоначальном переходе на форму с поиском всё ОК, всё ищет, футер считает. При закрытии и повторном переходе
на форму ругается что такой то колонки не существует. Разбираться не стал.
Остановился на варианте со скриптом, только убрал включение футера т.к. включаю его в свойствах таблицы.
Теперь точно всё работает.
Спасибо Дмитрий!