Hi,
Creating a hierarchical portlet should solve your problem, especially as you can add a Gantt view to see the overall timeline of the program and underlying projects.
The view would then be:
Program A
Project 1
Project 2
Program B
Project 3
Program C
Project 4
Project 5
Below is an example on NSQL query to create a hierarchial portlet on portfolio. This has to be updated to suit your needs, but should work as a frame.
select distinct
@select:dim:user_def:implied:data:unique_row:unique_row@
,@select:dim_prop:user_def:implied:data:portfolio_id:portfolio_id@
,@select:dim_prop:user_def:implied:data:inv_code:inv_code@
,@select:dim_prop:user_def:implied:data:inv_name:inv_name@
,@select:dim_prop:user_def:implied:data:inv_start:inv_start@
,@select:dim_prop:user_def:implied:data:inv_fin:inv_fin@
,@select:dim_prop:user_def:implied:data:odf_object_code:odf_object_code@
,@select:dim_prop:user_def:implied:data:hg_has_children:hg_has_children@
from
(
select rownum unique_row
,pp.id portfolio_id
,inv.code inv_code
,inv.name inv_name
,inv.schedule_start inv_start
,inv.schedule_finish inv_fin
,inv.odf_object_code
,inv.id hg_has_children
from pfm_portfolios pp
join pfm_investments pi on pi.portfolio_id = pp.id
join inv_investments inv on inv.id = pi.investment_id
where @where:param:user_def:string:hg_row_id@ is null
and inv.odf_object_code = 'project'
union all
select rownum unique_row
,pp.id portfolio_id
,invest.code inv_code
,invest.name inv_name
,invest.schedule_start inv_start
,invest.schedule_finish inv_fin
,invest.odf_object_code
,null hg_has_children
from pfm_portfolios pp
join pfm_investments pi on pi.portfolio_id = pp.id
join inv_investments inv on inv.id = pi.investment_id
) data
where data.portfolio_id = @WHERE:PARAM:XML:INTEGER:/data/id/@value@
and @filter@