Topic: Сортировка значений в Grid
Подскажите как при выводе информации в Grid , установить автоматическую сортировку значений в определенном столбце. При условии что вывод информации в Grid выполняется через sql-запрос.
My Visual Database → Russian → Сортировка значений в Grid
Подскажите как при выводе информации в Grid , установить автоматическую сортировку значений в определенном столбце. При условии что вывод информации в Grid выполняется через sql-запрос.
сортировку значений можно сделать непосредственно в 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;
Спасибо Дмитрий
Дмитрий, здравствуйте.
Дабы не плодить темы форума, задам вопрос в этой теме.
Есть две таблицы Grid , в одной и во второй высчитывается сумма значений 1 столбика, с последующим выводом итоговой суммы в Footer (через sql запрос). Как произвести математические действия с итоговыми суммами взятыми из Footer-а обеих таблиц, с последующим выводом информации в поле Edit ?
получить значение из футера в Edit можно так
Form1.Edit1.Text := FloatToStr(Form1.TableGrid1.Columns[0].Footer.FormulaValue);
получить значение из футера в Edit можно так
Form1.Edit1.Text := FloatToStr(Form1.TableGrid1.Columns[0].Footer.FormulaValue);
Дмитрий, это я знаю . А вот как скажем суммировать значения из двух футеров разных гридов
создайте в каждом гриде событие OnChange и в каждом напишите:
Form1.Edit1.Text := FloatToStr(Form1.TableGrid1.Columns[0].Footer.FormulaValue + Form1.TableGrid2.Columns[0].Footer.FormulaValue);
Дмитрий, спасибо большое за подсказку.
Теперь возник еще один вопрос про футер таблицы.
Почему при запросе поиска данных в 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;
ничего не происходит, футер попросту не отображается. Ошибки при этом никакой не выдает. Где ошибся ?
За ранее спасибо !
Вопрос, снят. Разобрался
Всем доброго вечера.
Назрел один вопрос, как с помощью скрипта отсортировать данные в таблице , а именно :
При условии нахождения , допустим в третьем столбце Gridа значения суммы (0), хотелось бы чтобы данная строка просто не выводилась в таблицу (визуально не отображалась ).
Просмотрел примеры поиска по условию, раскрашиванию строк но пока , увы не додумался как реализовать данный запрос. Прошу помощи.
Igor
К сожалению нет возможности скрыть строку в гриде.
Думаю проще использовать кнопку "Поиск", чтобы отфильтровать ненужные строки.
Дмитрий, появился еще один вопрос по сортировке значений в Grid, а именно :
procedure Form1_TableGrid1_OnChange (Sender: string);
begin
Form1.TableGrid1.Columns[1].Sorted := True; // сортировка второй колонки (нумерация колонок с нуля)
end;
Я так понимаю что данная строка скрипта просто включает сортировку значений в указанной колонке. По умолчанию сортировка выполняется с большего до меньшего значения либо по алфавиту. Как реализовать (реверсную) сортировку - с меньшего на большее (в обратном порядке). За ранее спасибо.
Form1.TableGrid1.Columns[1].SortKind := skDescending; // skAscending
Form1.TableGrid1.Columns[1].Sorted := True;
skAscending - по возрастанию
skDescending - по уменьшению
Спасибо Дмитрий !
Еще вопрос по теме - а можно ли как-либо задать собственную функцию компаратор для сортировки?
Вопрос растет отсюда - у меня есть поле (строка) с неким буквенно-цифровым номером. И выглядит родным алгоритмом примерно так:
107
109
11
110
112
Что не очень устраивает.
Dreada
К сожалению пока нет возможности задать сортировку для текста таким образом.
Дмитрий, здравствуйте.
Дабы не плодить темы форума, задам вопрос в этой теме.
Есть две таблицы 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
Petr
Проще всего это сделать через настройку компонента TableGrid, просто заполните его какими либо полями и укажите, по какому столбцу считать сумму, т.о. при заполнении компонента данными от SQL запроса вы увидите сумму.
Работает!
Спасибо Дмитрий!
Два дня рыл форум прежде чем спросить)))
Скриптом можно так
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.
При варианте подсчета итогов через свойства какого либо поля наблюдался следующий баг:
при первоначальном переходе на форму с поиском всё ОК, всё ищет, футер считает. При закрытии и повторном переходе
на форму ругается что такой то колонки не существует. Разбираться не стал.
Остановился на варианте со скриптом, только убрал включение футера т.к. включаю его в свойствах таблицы.
Теперь точно всё работает.
Спасибо Дмитрий!
My Visual Database → Russian → Сортировка значений в Grid
Powered by PunBB, supported by Informer Technologies, Inc.
Theme Hydrogen by Kushi