Мы можем точно сказать, что все функции приведённые в коде работают. Функция "Previous" просто берёт значение из предыдущей строки указанной колонки. Код работает и с группировкой дынных (используя бэнды "Заголовок группы" и "Итог группы") и без группировки. Также можем точно сказать, что если они у Вас не работают, то код либо был перенесён неправильно, либо данные в источнике имеют какой-то особый формат, который мы не можем учесть глядя на приведённый Вами скрин в предыдущем сообщении. Либо есть ещё какие-то причины связанные со структурой отчета.
И еще. Форматов-то много, а переменная vrTotalFormat одна. Непонятно, где прописано, для какого формата происходит суммирование.
Этот код не работает с конкретными форматами, прочтите предыдущие сообщения и наши пояснения к коду:
Теперь при печати отчета переменная vrTotalFormat будет содержать сумму всех щитов выпущенных перед переходом на новый формат.
Если нужно вести подсчет для какого-то определённого формата, то код нужно изменить так:
/* получаем формат из текущей строки */
string aNowFormat = Данные.Формат_щита;
/* получаем формат из пред. строки */
string aPrevFormat = "";
if (!PreviousIsNull(Данные, "Формат_щита"))
aPrevFormat = Previous(Данные, "Формат_щита").ToString();
/* получаем кол-во щитов из пред. строки */
double aPrevCount = 0;
if (!PreviousIsNull(Данные, "Выпущено_щитов"))
aPrevCount = (double)Previous(Данные, "Выпущено_щитов");
/* суммируем, если формат щита изменился. Суммируем только строки формата "770 X 1200" */
if (aPrevFormat == "770 X 1200")
if (aNowFormat != aPrevFormat){
vrTotalFormat += aPrevCount;
}
Пожалуйста, постарайтесь хотя-бы немного разобраться с кодом и тем, как он работает. Для этого не нужно обладать серьёзными знаниями в программировании. Все условия примитивны и Вы без труда можете изменить их под свою задачу. Если есть подозрение что какое-то условие выполняется неправильно, либо функция возвращает что-то не то, то создайте свою строковую переменную и выведите в неё результат любой функции, например оставив только следующий код:
myVariable = Previous(Данные, "Выпущено_щитов").ToString();
Затем выведите в отчет переменную myVariable и проверьте результат. Если он равен 0, значит в пред. строке источника данных значение колонки "Данные.Выпущено_щитов" на 100% равно нулю и можно размышлять почему это так и вносить корректировки. Аналогично результат можно вывести для любых других условий и проверок.
Действительно, при явном задании переменной aPrevFormat какого-либо значения, например, "800 X 1200", сумма получается ненулевой. Что-то не так в процедуре получения формата из предыдущей строки.
Это совершенно не говорит о том, что с процедурой получения формата что-то не так. Выставляя принудительно значение переменной aPrevFormat Вы просто гарантируете проход условия по-изменению "if (aNowFormat != aPrevFormat){" и конечно результат становится ненулевым. Процедуры "PreviousIsNull" и "Previous", это обычные программы, которые всегда работают одинаково (независимо от отчета или структуры данных) и никогда не меняются. Они могут не сработать только если передать в них неправильные параметры, или данные с опечатками. Если параметры верны и данные функции всё равно возвращают нулевые значения, значит в предыдущей строке указанной колонки действительно значение равно нулю и нужно думать почему.
Если всё это слишком сложно, то можем только предложить следующий вариант: вышлите на
support@simple-scada.com текущую версию проекта из папки "Projects\". Затем в редакторе отчетов постройте свой отчет. Кликните правой кнопкой мыши по источнику данных и выберите пункт "Просмотреть данные" и скопируйте всё содержимое открывшейся таблицы. Вставьте его в текстовый файл и вышлите его нам. Если источников данных несколько, то проделайте это для каждого источника. Опишите максимально подробно все задачи (в том числе те, до которых Вы пока не дошли) которые нужно решить при построении отчета, условия подсчета итогов, группировок и т.д. Мы попробуем на основе данных из вашего источника данных решить все описанные задачи. Но это займёт время.