Вход | Регистрация

1С:Предприятие ::

Метки:внешние обработки

Как вывести подитог сверху?

Я
   Platon
 
24.08.04 - 08:40
У меня в обработке есть таблица значений, и обычно после заполнения этой таблици я её сортирую по колонкам по которым мне надо подвести подитог затем делаю цикл по этой таблици значений.
   // Сортируем таблицу

    ТЗ.Сортировать(\"+1,+2,+3,+4\");
   // Заполняю таблицу и одновременно группирую по участку 

   // и Цеху т.е. по первой и второй колонке таблицы значений

    Сум=0;
    СумОткл=0;
    Сум1=0;
    СумОткл1=0;
    
    Для прм=1 по ТЗ.КоличествоСтрок() Цикл
        Сум=Сум+ТЗ.ПолучитьЗначение(прм,6);//суммируем для участка

        СумОткл=СумОткл+ТЗ.ПолучитьЗначение(прм,7);
        Сум1=Сум1+ТЗ.ПолучитьЗначение(прм,6);//суммируем для цеха

        СумОткл1=СумОткл1+ТЗ.ПолучитьЗначение(прм,7);
        Таб.ВывестиСекцию(\"Стр\");// вывод всех строк таблици значений

        Если ТЗ.КоличествоСтрок()=прм Тогда
            Таб.ВывестиСекцию(\"Участок\"); 
            Таб.ВывестиСекцию(\"Цех\"); 
        ИначеЕсли (ТЗ.ПолучитьЗначение(прм,1)<>ТЗ.ПолучитьЗначение(прм+1,1)) Тогда
            Таб.ВывестиСекцию(\"Участок\");
            Таб.ВывестиСекцию(\"Цех\");//когда сменяется цех в \"стр\"

            Сум=0;
            СумОткл=0;
            Сум1=0;
            СумОткл1=0;
        ИначеЕсли (ТЗ.ПолучитьЗначение(прм,2)<>ТЗ.ПолучитьЗначение(прм+1,2)) Тогда
            Таб.ВывестиСекцию(\"Участок\");//когда сменяется только участок

            Сум1=0;
            СумОткл=0;
        КонецЕсли;
   КонецЦикла;
соответственно подитог выводится снизу после смены участка затем после смены цеха.
А как сделать чтобы итог был в начале каждого цеха и участка?
 
  Рекламное место пустует
   SnarkHunter
 
1 - 24.08.04 - 08:44
Ну что, никто не сталкивался что ли?
   Валентин
 
2 - 24.08.04 - 09:00
Где-то на форуме была ссылка на "ленивые отчеты". Можно там посмотреть.
У себя в отчетах в ТЗ добавляю колонку "Порядок вывода". Сортирую по ней и потом можно делать что угодно
   Platon
 
3 - 24.08.04 - 09:29
Уже пробовал сделать так:
    тз.Sort(\"+1,+2\");
    
    sum=1;
    
    ~m:    for i=sum to тз.LinesCnt() do
        сумндс1=сумндс1+тз.GetValue(i,3);    //итог по организации

        сум901=сум901+тз.GetValue(i,4);
        сум45901=сум45901+тз.GetValue(i,5);
        сум451=сум451+тз.GetValue(i,6);
        сумнов1=сумнов1+тз.GetValue(i,7);
        спис1=спис1+тз.GetValue(i,8);
        ост1=ост1+тз.GetValue(i,9);
        
        if тз.LinesCnt()=i then
            t.PutSection(\"Строка\");
            
        elsif тз.GetValue(i,1)<>тз.GetValue(i+1,1)    then
            t.PutSection(\"Строка\");
            сумндс1=0;      //итог по организации

            сум901=0;
            сум45901=0;
            сум451=0;
            спис1=0;
            сумнов1=0;
            ост1=0;
            n=n+1; // счётчик 

            
            
            for sum=sum to i do  //тз.LinesCnt()

                сумндс=сумндс+тз.GetValue(sum,3);    //итог по дате

                сум90=сум90+тз.GetValue(sum,4);
                сум4590=сум4590+тз.GetValue(sum,5);
                сум45=сум45+тз.GetValue(sum,6);
                сумнов=сумнов+тз.GetValue(sum,7);
                спис=спис+тз.GetValue(sum,8);
                ост=ост+тз.GetValue(sum,9);
                
                if тз.LinesCnt()=sum then
                    t.PutSection(\"itog\");
                    
                elsif тз.GetValue(sum,2)<>тз.GetValue(sum+1,2)    then    
                    t.PutSection(\"itog\");
                    сумндс=0;       //итог по дате

                    сум90=0;
                    сум4590=0;
                    сум45=0;
                    спис=0;
                    сумнов=0;
                    ост=0;
                    if  sum=i    then
                        Goto ~m;
                    endif;
                endif;
                
            enddo;
        endif;
   enddo;
коротко звучит так:
пока не сменится контрагент суммируем суммируемые колонки. Затем когда контрагент сменился выводим секцию итог по контрагенту и создаём новый цикл от начала контрагента до конца и в нём выводим уже те строки по которым уже подведён итог и когда этот цикл доходит до конца где начинается новый контрагент то переходим \"Goto\" в начала главного цикла а там уже переменная начала цикла равна номеру последней строки первого контрагента т.е. цикл начинается уже с нового контрагента итд. Но в этом алгоритме, что-то не работает и после первого обхода всё циклится. а отладчик говорит что номер строки после первого контрагнта перестаёт сменятся хотя цикл идёт.
   Platon
 
4 - 24.08.04 - 09:32
(2)Приведи пример пожалуйста.
   Platon
 
5 - 24.08.04 - 09:32
(2)Приведи пример пожалуйста.
   Platon
 
6 - 24.08.04 - 10:15
Кто как делает итоги?
   КККК
7 - 24.08.04 - 10:26
(0) вывел названия цеха, запомнил номер строки в печ.форме
когда цех смениться выводишь итоги через таб.область().текст туда куда нужно
   Den
 
8 - 24.08.04 - 10:33
(6) Запросами
   Platon
 
9 - 24.08.04 - 11:16
(8)Запросами не получится т.к. после выборки надо произвести сложную манипуляцию с результатами выборки через промежуточную таблицу значений.

(7) КККК а можешь пример привести?
   КККК
10 - 24.08.04 - 11:24
(9) А что непонятно то?
 
  Рекламное место пустует
   КККК
11 - 24.08.04 - 11:29
(9) почту скажи отправлю пример.
   Platon
 
12 - 24.08.04 - 11:47
(11)Отправь если не трудно a.usov#sual.com
   КККК
13 - 24.08.04 - 11:54
(12) ушло
   Platon
 
14 - 24.08.04 - 12:09
KKKK Благодарю получил
   Platon
 
15 - 24.08.04 - 12:10
KKKK Благодарю получил
   Platon
 
16 - 24.08.04 - 12:21
Ктонибудь ещё пришлите свои способы формирования итогов, очень интересно
   Platon
 
17 - 24.08.04 - 12:22
Ктонибудь ещё пришлите свои способы формирования итогов, очень интересно
   wolk
 
18 - 24.08.04 - 12:32
Делаешь ТЗ1, потом ТЗ.Выгрузить(ТЗ1), потом ТЗ1.Свернуть по нужным колонкам, потом выборка строк в ТЗ1, а внутри - выборка строк ТЗ.
   Platon
 
19 - 24.08.04 - 15:08
(18)Вобщем сделал я так но немогу понять почему не меняются переменные str и kon в цикле. В первом обходе ведь меняются        
 тз.Выгрузить(тз1);
     тз1.Свернуть("1","3,4,5,6,7,8,9");
    t=CreateObject("Table");
    t.SourceTable("Таблица");
    t.PutSection("Шапка");
    t.Options(0,0,t.TableHeight(),0);
    тз1.Sort("+1");
    тз.Sort("+1,+2");
    
    Если тз1.КоличествоСтрок()<>0 Тогда
        for j=1 to тз1.LinesCnt() do
            тз1.ПолучитьСтрокуПоНомеру(j); 
            t.PutSection("Строка");
            
            
            значениеТекКонтрагента=тз1.GetValue(j,1);
            if j<>тз1.LinesCnt() then
                значениеСледКонтрагента=тз1.GetValue(j+1,1);
                тз.FindValue(значениеСледКонтрагента,kon,)//находим номер строки следующего контрагента и передаём перем kon

            else
                kon=тз.LinesCnt();
            endif;
        
             тз.FindValue(значениеТекКонтрагента,str,)//находим номер строки текущего  контрагента и передаём перем str

             
                n=n+1;
                for i=str to kon do                
                    t.PutSection("itog");
                enddo;
        
        КонецЦикла;
    КонецЕсли;
   Platon
 
20 - 25.08.04 - 08:10
Ну вот сам нашёл надо было просто начало и конец цикла обнулить после окончания цикла.
Вот что получилось (проверено работает):
   //**********************( Секция подведения итогов и вывода в таблицу. (итоги сверху))********************************

    тз.Выгрузить(тз1); //выгружаем ранее созданную и заполненную таблицу значений в новую пустую таблицу значений

   // теперь у нас две одинаковых таблици (можно и больше если надо больше подитогов)    

    тз1.Свернуть("1","3,4,5,6,7,8,9");// Свернули новую ТЗ по группируемым колонкам и просуммировали суммируемые

    тз.Свернуть("1,2","3,4,5,6,7,8,9");// то-же сделаем со старой но сгруппируем по двум колонкам

    
    t=CreateObject("Table");  // создали таблицу

    t.SourceTable("Таблица");
    t.PutSection("Шапка");
    t.Options(0,0,t.TableHeight(),0); 
   //отсортировали обе таблици в  одинаковом порядке и по одинаковым колонкам

    тз1.Sort("+1");
    тз.Sort("+1,+2");
    
   // проверим есть ли строки в таблице

    Если тз1.КоличествоСтрок()<>0 Тогда
       //строки есть и мы начинаем цикл по новой ТЗ т.к. итоги будут сверху.

        for j=1 to тз1.LinesCnt() do
            тз1.ПолучитьСтрокуПоНомеру(j); 
            t.PutSection("Строка");//сразу выводим секцию с подитогом в которой помещены значения новой ТЗ

           //т.к. новая ТЗ свёрнута то значениями секции являются суммы сгруппированных

           //колонок (в данном случае итог по контрагенту)

            зн=тз1.GetValue(j,1); // в переменную помещаем значение контрагента текущей строки новой ТЗ

            
            тз.FindValue(зн,str,);// находим в старой ТЗ значение контрагента равного текущему контрагенту

                                  // новой ТЗ и номер строки передаём переменной str (это начало следующего цикла)

            
            if j<>тз1.LinesCnt() then //Если номер текущей строки тз1 не равен общему количеству строк тогда

                
                                      //проверяем следующую строку после текущей в тз1

                k=тз1.GetValue(j+1,1);// в переменную помещаем значение контрагента следующей строки новой ТЗ

                
                тз.FindValue(k,kon,); // находим в старой ТЗ значение контрагента равного следующего контрагенту

                                      // новой ТЗ и номер строки передаём переменной kon (это конец следующего цикла)

                                       
                kon=kon-1;              // вычитаем из числа 1 т.к. нам нужна проследняя строка текучего контрагента

                                      // а не первая следующего в старой таблице значений

            else
                kon=тз.LinesCnt();   //Если номер текущей строки тз1 равен общему количеству строк тогда конец цикла будет

                                     // равен концу строк в старой ТЗ (больше контрагентов не предвидится :)    

            endif;
            
            
            n=n+1;
            for i=str to kon do           //цикл от начала контрагента до конца (контрагент тотже по которому мы только-что

                                       // подвели итог)

                t.PutSection("itog");
            enddo;
            str=0; //обязательно всё обнуляем (начало и конец цикла) иначе будем бегать по одному контрагенту

            kon=0;
        КонецЦикла;
        
    КонецЕсли;
    
    t.PutSection("Подвал");
    t.PageSetup(2,,,7,3,7,3,0,5,1);
    t.ReadOnly(1);
    t.Show("Резерв по сомнительным долгам (62.01, 62.07)","");
//***************************************(вот и вывели таблицу на печать)**************************************************


Список тем форума
Рекламное место пустует   Рекламное место пустует
Компьютер — устройство разработанное для ускорения и автоматизации человеческих ошибок.
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Ветка сдана в архив. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует