Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?

Официальный форум Simple-Scada.

Автор Тема: Как вывести в отчет только итоговые строки?  (Прочитано 8802 раз)

alan54

  • Постоялец
  • ***
  • Сообщений: 145
    • Просмотр профиля
Есть отчет по изменению (см. вложение 1). Но такая детализация не нужна, нужны только итоговые строки по количеству выпущенных поддонов данного формата (см. вложение 2). Подскажите, пожалуйста, как это сделать?

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3215
    • Просмотр профиля
    • Simple-Scada
Re: Как вывести в отчет только итоговые строки?
« Ответ #1 : 02 Декабря 2018, 20:34:11 »
Здравствуйте.
Обычно все подобные задачи решаются добавлением фильтров при помощи которых лишние строки удаляются при построении отчета. Но, насколько мы поняли, в имеющихся данных нет какой-то отметки по которой можно было бы понять, что одна строка итоговая, а другие нет. Поэтому можно попробовать следующий способ:

1. Над бэндом данных (и после бэнда Заголовок данных) разместить бэнд "Заголовок группы" и выбрать для него в качестве колонки данных, колонку "Формат поддона". Теперь данные будут автоматически разбиваться на группы по этой колонке. Т.е. все данные с форматом "780 Х 980" попадут в одну группу, а данные с форматом "770 Х 1200" в другую группу. Чтобы избежать смещений, высоту бэнда "Заголовок группы" делаем нулевой;

2. Под бэндом данных размещаем бэнд "Итог группы". В нём размещаем компоненты "Текст" для каждой колонки с выражением: {Last(ИмяИсточника.ИмяКолонки)}. Таким образом мы получаем для каждой группы последнюю строку;

3. Теперь нужно сделать так, чтобы бэнд данных не отображался и оставить только итоги группы. Для этого удаляем все компоненты вложенные в бэнд данных и уменьшаем его высоту до 0;

4. На этом этапе задача уже решена. Но в данных которые Вы прикрепили видно, что последняя строка группы "780 Х 980" имеет "Задание = 0" и "Выпущено поддонов = 0". Нужно исключить такие строки. Дважды кликаем бэнд данных и в открывшемся окне на вкладке Фильтр добавляем фильтр: Значение -> Числовой -> Колонка "Задание на выпуск" -> больше чем -> 0. Можно добавить ещё один такой фильтр для колонки "Выпущено поддонов".

см. скрины во вложении (на примере демо-отчета).
« Изменён: 02 Декабря 2018, 20:59:49 от Simple-Scada »

alan54

  • Постоялец
  • ***
  • Сообщений: 145
    • Просмотр профиля
Re: Как вывести в отчет только итоговые строки?
« Ответ #2 : 02 Декабря 2018, 21:44:54 »
Благодарность моя не имеет пределов  :)  Все оказывается просто, если консультирует грамотный специалист. Большое спасибо!
« Изменён: 02 Декабря 2018, 22:20:08 от alan54 »

alan54

  • Постоялец
  • ***
  • Сообщений: 145
    • Просмотр профиля
Re: Как вывести в отчет только итоговые строки?
« Ответ #3 : 07 Декабря 2018, 10:32:24 »
Здравствуйте.
Возникла еще одна проблема. Как теперь получить итог по всему отчету (то есть просуммировать только итоги по группам)?

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3215
    • Просмотр профиля
    • Simple-Scada
Re: Как вывести в отчет только итоговые строки?
« Ответ #4 : 07 Декабря 2018, 23:13:19 »
Здравствуйте.

Здесь нужно действовать по аналогии с одной из предыдущих задач:
  • переходим на вкладку "Словарь" и в разделе "Переменные" создаём новую переменную с типом Double и значением "0". Назовём её vrTotalFinal;
  • в бэнде "Итог группы" на странице отчета выделяем ячейку в которую выводится итог какой-то колонки. Допустим это итог с формулой:
    {Last(ИмяИсточника.ИмяКолонки)};
  • переходим на вкладку "Свойства" -> "События" (кнопка с иконкой молнии);
  • на событие "После печати" назначаем следующий код: vrTotalFinal += (double)Last(ИмяИсточника.ИмяКолонки)
Теперь при построении отчета в переменную vrTotalFinal будут просуммированы все итоговые значения всех групп. Значение переменной vrTotalFinal можно вынести в любое место отчета, в Вашем случае его скорее всего нужно вывести в бэнд "Итог данных" или "Итог отчета". И так для итога по каждой колонке.
« Изменён: 09 Декабря 2018, 10:22:51 от Simple-Scada »

alan54

  • Постоялец
  • ***
  • Сообщений: 145
    • Просмотр профиля
Re: Как вывести в отчет только итоговые строки?
« Ответ #5 : 08 Декабря 2018, 08:26:12 »
Спасибо за ответ, попробую. Я делал немного по другому, поэтому итоги по отчету были неверные (видимо, суммировались все данные, а не только подитоги).
P.S. Попробовал, что-то все равно не то. Ругается на переменную TotalLevel. Что это - какая то системная переменная?
И мне надо не все итоги по группам свалить в одну кучу, а каждый итог в свою группу (сортировку по группам я отключил, поэтому идет сортировка по датам, и одна и та же группа встречается в отчете несколько раз, в разные даты).
Чтобы было понятнее, что нам надо, я вручную нарисовал требуемый отчет (см. вложение 2)
« Изменён: 08 Декабря 2018, 19:12:05 от alan54 »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3215
    • Просмотр профиля
    • Simple-Scada
Re: Как вывести в отчет только итоговые строки?
« Ответ #6 : 09 Декабря 2018, 10:33:05 »
Цитировать
Попробовал, что-то все равно не то. Ругается на переменную TotalLevel. Что это - какая то системная переменная?
Это опечатка, исправили, там должна быть переменная vrTotalFinal.

Цитировать
И мне надо не все итоги по группам свалить в одну кучу, а каждый итог в свою группу (сортировку по группам я отключил, поэтому идет сортировка по датам, и одна и та же группа встречается в отчете несколько раз, в разные даты).
Если группы не используются то такой способ не подойдёт и нужно решать задачу по-другому. Можно просто разместить в отчете бэнд "Итог данных" и в него поместить компоненты текст с итогами для каждой группы поддонов. Для этого в условии итога нужно оставить какую-то одну группу, например так:
Код: (c#)
Данные.Формат_щита == "770 Х 1200"
Тогда итог будет подводиться только для поддонов с форматом "770 Х 1200". Аналогично для других форматов. Во вложении пример итога с условием (для другого отчета, но суть та же).

alan54

  • Постоялец
  • ***
  • Сообщений: 145
    • Просмотр профиля
Re: Как вывести в отчет только итоговые строки?
« Ответ #7 : 09 Декабря 2018, 18:52:45 »
Если группы не используются то такой способ не подойдёт и нужно решать задачу по-другому. Можно просто разместить в отчете бэнд "Итог данных" и в него поместить компоненты текст с итогами для каждой группы поддонов. Для этого в условии итога нужно оставить какую-то одну группу, например так:
Код: (c#)
Данные.Формат_щита == "770 Х 1200"
Тогда итог будет подводиться только для поддонов с форматом "770 Х 1200". Аналогично для других форматов. Во вложении пример итога с условием (для другого отчета, но суть та же).
Группы используются, только сортировка по группам выключена! Поэтому сортировка идет по дате-времени, и одна и та же группа встречается несколько раз. А в итоге отчета группы надо объединить, а результаты просуммировать. А Ваш рецепт дает какие-то сумасшедшие результаты.
« Изменён: 09 Декабря 2018, 18:54:08 от alan54 »

alan54

  • Постоялец
  • ***
  • Сообщений: 145
    • Просмотр профиля
Re: Как вывести в отчет только итоговые строки?
« Ответ #8 : 09 Декабря 2018, 19:48:22 »
...на событие "После печати" назначаем следующий код: vrTotalFinal += (double)Last(ИмяИсточника.ИмяКолонки)
мне кажется, что если на это суммирование наложить условие
 Данные.Формат_щита == "770 Х 1200"
то все получится. Но как? Синтаксиc C# для меня пока темный лес.

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3215
    • Просмотр профиля
    • Simple-Scada
Re: Как вывести в отчет только итоговые строки?
« Ответ #9 : 09 Декабря 2018, 20:18:03 »
Цитировать
Группы используются, только сортировка по группам выключена! Поэтому сортировка идет по дате-времени, и одна и та же группа встречается несколько раз. А в итоге отчета группы надо объединить, а результаты просуммировать. А Ваш рецепт дает какие-то сумасшедшие результаты.
Что в Вашем понимании означает фраза "Группы используются, только сортировка по группам выключена!"? Вы дали два файла, начальные данные "Форматы поддонов.txt" и то, что нужно получить "Форматы поддонов краткий.txt". В файле "Форматы поддонов.txt" видно, что сортировка по группа отключена, это понятно. Но как там используются группы? По какому столбцу идёт группировка? В файле не видно сгруппированных данных.
Если это чистые данные, без группировки по какому-либо столбцу, то для того чтобы из первого файла получить второй, можно не использовать никакие компоненты, кроме бэндов "Данные" и "Итог данных". В первый вывести данные в чистом виде (сортировка по-умолчанию по-времени), а в бэнде итогов разместить компоненты с суммированием и условием для каждого формата, как в примере из предыдущего сообщения.

Цитировать
мне кажется, что если на это суммирование наложить условие Данные.Формат_щита == "770 Х 1200"
Условие "если" выглядит так:
Код: (c#)
if (Данные.Формат_щита == "770 Х 1200") { 
  vrTotalFinal += (double)Last(ИмяИсточника.ИмяКолонки)
}

alan54

  • Постоялец
  • ***
  • Сообщений: 145
    • Просмотр профиля
Re: Как вывести в отчет только итоговые строки?
« Ответ #10 : 09 Декабря 2018, 22:23:54 »
Условие "если" выглядит так:
Код: (c#)
if (Данные.Формат_щита == "770 Х 1200") { 
  vrTotalFinal += (double)Last(ИмяИсточника.ИмяКолонки)
}
Ругается на нехватку ";" Куда ее забыли поставить?
P.S. Нашел методом научного тыка - в конце второй строки. Нужный результат получился.
« Изменён: 09 Декабря 2018, 22:48:08 от alan54 »

alan54

  • Постоялец
  • ***
  • Сообщений: 145
    • Просмотр профиля
Re: Как вывести в отчет только итоговые строки?
« Ответ #11 : 20 Декабря 2018, 21:44:15 »
Рано обрадовался - нужный результат пока не получен. Нельзя ли как-то исхитриться и вложить одну группу в другую? Первая группировка - по дате, вторая - по форматам поддонов внутри одной даты? Вот сегодня такой отчет получился, а за другую дату - почему-то нет, выдает только последний результат...
P.S. Ответ на свой вопрос нашел сам в руководстве по Стимулсофту, попробую.
« Изменён: 21 Декабря 2018, 11:51:20 от alan54 »

alan54

  • Постоялец
  • ***
  • Сообщений: 145
    • Просмотр профиля
Re: Как вывести в отчет только итоговые строки?
« Ответ #12 : 21 Декабря 2018, 19:44:33 »
Попробовал - получилось!
Но нужна еще помощь. В отчете в строке ИТОГО должны суммироваться не все значения последнего столбца (Выпущено щитов данного формата всего), а только максимальные, достигнутые перед переходом на другой формат.
Суммирование выполняется по такой формуле:
Код: (c#)
if (Источник_ФорматыПоддонов.Ширина_поддона == 770) {
  vrTotalFinal770 += (double)Last(Источник_ФорматыПоддонов.ShieldNum);
}
Пытался сюда воткнуть функцию Max, но что-то не получилось - выходит то ошибка, то 0, то вообще программа редактора отчетов зависает, приходится снимать ее из диспетчера задач... Как правильно подправить формулу, подскажите, пожалуйста.
« Изменён: 23 Декабря 2018, 09:57:34 от Simple-Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3215
    • Просмотр профиля
    • Simple-Scada
Re: Как вывести в отчет только итоговые строки?
« Ответ #13 : 23 Декабря 2018, 10:22:01 »
В словаре отчета, в разделе "Переменные" создаём переменную с именем vrTotalFormat, типом данных "uint" и начальным значением 0. В неё будем суммировать количество выпущенных щитов при смене формата. Далее в бэнде "Данные" выделяем ячейку "Формат щита" и на вкладке "Свойства" -> "События" на событие "После печати" назначаем следующий код:
Код: (c#)
/* получаем формат из текущей строки */
string aNowFormat = Данные.Формат_щита;

/* получаем формат из пред. строки */
string aPrevFormat = "";
if (!PreviousIsNull(Данные, "Формат_щита"))
  aPrevFormat = Previous(Данные, "Формат_щита").ToString();

/* получаем кол-во щитов из пред. строки */
uint aPrevCount = 0;
if (!PreviousIsNull(Данные, "Выпущено_щитов"))
  aPrevCount = (uint)Round((double)Previous(Данные, "Выпущено_щитов"));

/* суммируем, если формат щита изменился */
if (aPrevFormat != "")
  if (aNowFormat != aPrevFormat){
    vrTotalFormat += aPrevCount;
  }
Теперь при печати отчета переменная vrTotalFormat будет содержать сумму всех щитов выпущенных перед переходом на новый формат. Её можно отобразить в любом месте отчета.
« Изменён: 23 Декабря 2018, 10:23:02 от Simple-Scada »

alan54

  • Постоялец
  • ***
  • Сообщений: 145
    • Просмотр профиля
Re: Как вывести в отчет только итоговые строки?
« Ответ #14 : 23 Декабря 2018, 20:14:32 »
...Далее в бэнде "Данные" выделяем ячейку "Формат щита" и на вкладке "Свойства" -> "События" на событие "После печати" назначаем следующий код...
У меня бэнд "Данные", согласно Вашим же рекомендациям (см выше), имеет высоту 0 и в нем нет никаких ячеек! Возможно, Вы имели в виду бэнд итогов группы? Я вставил рекомендованный код в событие соответствующей ячейки этого бэнда, но получил 0...
И зачем в строке12 кода оператор Round?
Насколько существенно объявление переменных vrTotalFormat и aPrevCount типа uint? Счетчик щитов данного формата ("Выпущено_щитов") у меня был объявлен как double.
« Изменён: 23 Декабря 2018, 21:17:12 от alan54 »