Нужна помощь по ХП!!!

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
ZMan
Сообщения: 18
Зарегистрирован: 08 сен 2005, 07:44

Нужна помощь по ХП!!!

Сообщение ZMan » 26 апр 2006, 14:47

Приветствую всех!
Вообщем такая проблема:
Пишу отчет, который вытягивает данные по принципу "дерева":
1 уровень
2 уровень
3 уровень
... уровень
n уровень
Повторяется пока все уровни не исчерпаются.

Вопрос: как избежать отображения верхних уровней, если в самом нижнем уровне не нашел записей и при этом результат записывается в одно и тоже поле??? :?:

Я же вышел из этого тупика таким образом:
Выводится ровно столько полей сколько уровней, т.е. на каждый уровень свое поле. Но в этом случае не получается "дерева", чисто линейное отображение. :(
Помогите, ПЛИЗ! Срочно нужно. :!:

Привожу пример своей ХП.

Код: Выделить всё

create procedure FORMULA_REP_ContractsInfo (DateFrom date, DateTo date)
Returns (kdog integer, pp integer, prg char(3), ppr char(3), spk char(3),
statusname varchar(50),orgname varchar(100),
prgname varchar(255), pprname varchar(255), spkname varchar(255),
rname varchar(255), ndoc varchar(30), dtdoc date,
summancont double precision, summaspk double precision, summaavans double precision,
summaakts double precision, summapay double precision,
fio varchar(20))
AS
  Declare Variable ppp integer;
  Declare Variable pnspk integer;
  Declare Variable pk_el integer;
  Declare Variable pid_org integer;

  Declare Variable b char(1);
begin
  ppp = 0;
  pnspk = 0;

  -- СТАТУС ДОГОВОРА
  FOR
    select k_el1 , dop1
    from sp_universal
    where k_gr = 10 and k_el <> 0 and (k_el = 1 or k_el = 2 or k_el = 6)
  INTO
    :pk_el , :statusname
  DO
    begin
      --suspend;

      -- ОРГАНИЗАЦИИ
      FOR
        select id_org , rname
        from sp_org
        where p_org=4
        union
        select cast(0 as integer) , cast('' as varchar(90))
        from sp_org
      INTO
        :pid_org , :orgname
      DO
        begin
          --suspend;

          -- ПРОГРАММЫ
          FOR
            select prg , rname
            from sp_prg where ppr='999'
          INTO
            :prg , :prgname
          DO
            begin
              --suspend;

              -- ПОДПРОГРАММЫ
              FOR
                select ppr , rname
                from sp_prg where prg=:prg and ppr<>'999'
              INTO
                :ppr , :pprname
              DO
                begin
                  --suspend;

                  -- КОНТРАКТЫ
                  FOR
                    select info, n_doc, dt_doc, summa, k_dog
                    from tb_contract
                    where p_status = :pk_el and id_org = :pid_org and prg = :prg and
                          ppr = :ppr and (prizn = 1 or prizn = 2) and
                          (dt_doc between :DateFrom and :DateTo)
                  INTO
                    :rname, :ndoc, :dtdoc, :summancont, :kdog
                  DO
                    begin
                      ppp = :ppp + 1;
                      pp = :ppp;

                      -- АВАНС (сумма)
                      select sum(summa) from tb_prow
                      where k_dog = :kdog and k_doc = '11' and tip_oper = 16 and
                            (dt_doc between :DateFrom and :DateTo)
                      INTO :summaavans;
                      --if (:summaavans is null) then summaavans = 0;

                      -- ВЫСТАВЛЕННЫЕ АКТЫ (сумма)
                      select sum(summa) from tb_contract
                      where k_dog = :kdog and prizn = 88 and
                            (dt_doc between :DateFrom and :DateTo)
                      INTO :summaakts;
                      --if (:summaakts is null) then summaakts = 0;

                      -- ОПЛАЧЕННЫЕ СУММЫ (сумма)
                      select sum(b.summa)
                      from tb_contract a, tb_prow b
                      where a.k_dog = :kdog and b.k_dog = a.k_dog and
                            b.k_bdfs = a.k_bdfs and b.dt_doc = a.dt_doc and
                            (a.dt_doc between :DateFrom and :DateTo)
                      INTO :summapay;
                      --if (:summapay is null) then summapay = 0;

                      --suspend;

                      b = '0';
                      pnspk = 0;

                      -- ДАННЫЕ ПО СПЕЦИФИКАМ
                      FOR
                        select b.spk, c.rname, sum(b.summa), a.fio
                        from sp_mol a, tb_spk b, sp_spk c
                        where b.k_dog = :kdog and c.spk = b.spk and b.tabnum = a.tabnum
                        group by b.spk, a.fio, c.rname
                      INTO
                        :spk, :spkname, :summaspk, :fio
                      DO
                        begin
                          if (:pnspk > 0) then
                           begin
                             kdog = null;
                             prg = null;
                             ppr = null;
                             statusname = null;
                             orgname = null;
                             prgname = null;
                             pprname = null;
                             rname = null;
                             ndoc = null;
                             dtdoc = null;
                             summancont = null;
                             summaavans = null;
                             summaakts = null;
                             summapay = null;
                           end
                          b = '1';
                          pnspk = :pnspk + 1;
                          suspend;
                        end
                      if (:b = '0') then
                       begin
                         spk = null;
                         spkname = null;
                         summaspk = null;
                         fio = null;
                         suspend;
                       end
                    end
                  --suspend;
                end
            end
        end
    end
end

ZMan
Сообщения: 18
Зарегистрирован: 08 сен 2005, 07:44

Сообщение ZMan » 06 май 2006, 07:51

Не ожидал я, что никто не сможет ответит' на мой вопрос!!! :?
Хотя я уже разобрался, но все равно я очен' растроен! :(

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 06 май 2006, 10:18

блин, ты думаешь, у кого то есть интерес копаться в твоих портянках кода?

ZMan
Сообщения: 18
Зарегистрирован: 08 сен 2005, 07:44

Сообщение ZMan » 06 май 2006, 10:40

kdv писал(а):блин, ты думаешь, у кого то есть интерес копаться в твоих портянках кода?
Хот' кто бы наводящий вопрос задали....

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 07 май 2006, 09:54

наводящий на что? еще раз повторяю - твой текст читать НИКАКОГО интереса нет. на сайте есть статьи по древовидным структурам. Как хочешь, так и крути.

ZMan
Сообщения: 18
Зарегистрирован: 08 сен 2005, 07:44

Сообщение ZMan » 15 май 2006, 12:40

kdv писал(а):на сайте есть статьи по древовидным структурам.
Покажи хот' одну. :?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 15 май 2006, 13:31

Покажи хот' одну.
совсем обурели.

открываешь www.ibase.ru
тыкаешь в "Документация"
крутишь до раздела "Древовидные и иерархические структуры, хранение объектов"
читаешь.

на сайте ВСЕ статьи ТОЛЬКО В ЭТОМ РАЗДЕЛЕ.

Ответить