Вообщем такая проблема:
Пишу отчет, который вытягивает данные по принципу "дерева":
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