1 (edited by sign2 2014-09-11 08:29:37)

Topic: сумма значений в Грид

На гриде есть колонки, в которых требуется посчитать сумму значений. В настройке компонентов таблицы, в поле "Итог", установлено значение "Sum", но ничего не происходит. Значения ячеек в таблице - целое число.
Подскажите, что можно сделать?

И ещё, в догонку, я в своё время спрашивал, как посчитать количество записей в определенной колонке, если не все ячейки заполнены данными (есть пустые). Вы ответили, что в данный момент это не возможно.
Спасибо.

Re: сумма значений в Грид

Такое может случится, если в одной из записей присутствует пустое значение, чтобы предотвратить это, для компонента Edit куда вносится данное число, установите значение 0 в свойстве DefaultValue, и желательно данное поле базы данных сделать обязательным для ввода.

Dmitry.

Re: сумма значений в Грид

Спасибо!
Как насчет второго вопроса?

Re: сумма значений в Грид

Т.е. вы хотите посчитать количество записей в колонке, за исключением пустых?

Dmitry.

5 (edited by sign2 2014-09-11 12:09:40)

Re: сумма значений в Грид

Да. И чтобы кол-во отображалось внизу этой колонки

Re: сумма значений в Грид

Добавил в скрипт возможность присваивать текст в подвале, т.о. расчет можно производить по любому алгоритму из скрипта.

Скачайте сначала бета версию 1.44
https://www.dropbox.com/s/2phoggh5kfu88 … 4.zip?dl=0


Пример реализации с помощью скрипта:

procedure Form1_GridAbonent_OnChange (Sender: string);
var
   i,c, q: integer;
begin
     q := 0;
     c := Form1.GridAbonent.RowCount - 1;
     for i := 0 to c do
         if Form1.GridAbonent.Cells[0, i] <> '' then Inc(q);

     Form1.GridAbonent.Columns[0].Footer.Caption := IntToStr(q); // result
end;

begin
     Form1.GridAbonent.Options := Form1.GridAbonent.Options + goFooter; // Show footer
end.

Также можете скачать проект с реализацией данного примера

Post's attachments

Attachment icon Calculate footer.zip 4.91 kb, 674 downloads since 2014-09-11 

Dmitry.

Re: сумма значений в Грид

Спасибо!

Re: сумма значений в Грид

DriveSoft wrote:

Такое может случится, если в одной из записей присутствует пустое значение, чтобы предотвратить это, для компонента Edit куда вносится данное число, установите значение 0 в свойстве DefaultValue, и желательно данное поле базы данных сделать обязательным для ввода.

Как мне избежать пересоздание базы, чтобы она не обнулилась?

Re: сумма значений в Грид

В текущей версии это невозможно, могу предложить изменять структуру базы данных с помощью бесплатной программы SQLite Studio, затем необходимо также изменить структуру базы через My Visual Database, при запуске проекта отказаться от пересоздания базы данных, таким образом данные не будут потеряны.

Dmitry.

Re: сумма значений в Грид

DriveSoft wrote:

Добавил в скрипт возможность присваивать текст в подвале, т.о. расчет можно производить по любому алгоритму из скрипта.

Скачайте сначала бета версию 1.44
https://www.dropbox.com/s/2phoggh5kfu88 … 4.zip?dl=0


Пример реализации с помощью скрипта:

procedure Form1_GridAbonent_OnChange (Sender: string);
var
   i,c, q: integer;
begin
     q := 0;
     c := Form1.GridAbonent.RowCount - 1;
     for i := 0 to c do
         if Form1.GridAbonent.Cells[0, i] <> '' then Inc(q);

     Form1.GridAbonent.Columns[0].Footer.Caption := IntToStr(q); // result
end;

begin
     Form1.GridAbonent.Options := Form1.GridAbonent.Options + goFooter; // Show footer
end.

Также можете скачать проект с реализацией данного примера

Придумал более простое решение. В моём случае нужно посчитать кол-во детей до 17 лет и кол-во взрослых от 18 и выше.
Выбираю нужный мне месяц, в текстбоксе возраста ребенка устанавливаю фильтр "<", в текстбоксе взрослого фильтр ">", естественно всё это настраиваю в действии "Поиск" и всё работает.

Re: сумма значений в Грид

Добрый день! А как можно в подвале округлить значения?

Re: сумма значений в Грид

danisl wrote:

Добрый день! А как можно в подвале округлить значения?

Можно

procedure Form1_TableGrid1_OnChange (Sender: string);
begin
    Form1.TableGrid1.Columns[0].Footer.Caption := IntToStr(Round(Form1.TableGrid1.Columns[0].Footer.FormulaValue));
end;
Dmitry.