试一试Decision Cube栏中的控件?

解决方案 »

  1.   

    use this kind of sql script Select case when Substr(Max(startdate),1,4)=2001 then To_Char(to_date(Max(startdate),'YYYYMMDD'),'MM/DD/YY') else to_char(ADD_MONTHS(to_date(Max(startdate),'YYYYMMDD'), 12),'MM/DD/YY') end
    , sum(case when CATEGORY=1 and period_key between 200103 and 200109 then dollars else 0 end) as ty_dollars_0
    , sum(case when CATEGORY=3 and period_key between 200103 and 200109 then dollars else 0 end) as ty_dollars_1
    , sum(case when CATEGORY=4 and period_key between 200103 and 200109 then dollars else 0 end) as ty_dollars_2
    , sum(case when CATEGORY=5 and period_key between 200103 and 200109 then dollars else 0 end) as ty_dollars_3
    , sum(case when CATEGORY=6 and period_key between 200103 and 200109 then dollars else 0 end) as ty_dollars_4
    , sum(case when CATEGORY=7 and period_key between 200103 and 200109 then dollars else 0 end) as ty_dollars_5
    , sum(case when CATEGORY=8 and period_key between 200103 and 200109 then dollars else 0 end) as ty_dollars_6
    , sum(case when CATEGORY=9 and period_key between 200103 and 200109 then dollars else 0 end) as ty_dollars_7
    , sum(case when CATEGORY=20985 and period_key between 200103 and 200109 then dollars else 0 end) as ty_dollars_8
    , sum(case when CATEGORY=10 and period_key between 200103 and 200109 then dollars else 0 end) as ty_dollars_9
    , sum(case when CATEGORY=-1 and period_key between 200103 and 200109 then dollars else 0 end) as ty_dollars_10
    , sum(case when CATEGORY=12 and period_key between 200103 and 200109 then dollars else 0 end) as ty_dollars_11
    , sum(case when period_key between 200103 and 200109 then dollars else 0 end) as ty_dollars
    , sum(case when period_key between 200103 and 200109 then uniques else 0 end) as ty_uniques
    , case when Substr(min(startdate),1,4)=2000 then To_Char(to_date(Min(startdate),'YYYYMMDD'),'MM/DD/YY') else to_char(ADD_MONTHS(to_date(Min(startdate),'YYYYMMDD'), -12),'MM/DD/YY') end
    , sum(case when CATEGORY=1 and period_key between 200003 and 200009 then dollars else 0 end) as ly_dollars_0
    , sum(case when CATEGORY=3 and period_key between 200003 and 200009 then dollars else 0 end) as ly_dollars_1
    , sum(case when CATEGORY=4 and period_key between 200003 and 200009 then dollars else 0 end) as ly_dollars_2
    , sum(case when CATEGORY=5 and period_key between 200003 and 200009 then dollars else 0 end) as ly_dollars_3
    , sum(case when CATEGORY=6 and period_key between 200003 and 200009 then dollars else 0 end) as ly_dollars_4
    , sum(case when CATEGORY=7 and period_key between 200003 and 200009 then dollars else 0 end) as ly_dollars_5
    , sum(case when CATEGORY=8 and period_key between 200003 and 200009 then dollars else 0 end) as ly_dollars_6
    , sum(case when CATEGORY=9 and period_key between 200003 and 200009 then dollars else 0 end) as ly_dollars_7
    , sum(case when CATEGORY=20985 and period_key between 200003 and 200009 then dollars else 0 end) as ly_dollars_8
    , sum(case when CATEGORY=10 and period_key between 200003 and 200009 then dollars else 0 end) as ly_dollars_9
    , sum(case when CATEGORY=-1 and period_key between 200003 and 200009 then dollars else 0 end) as ly_dollars_10
    , sum(case when CATEGORY=12 and period_key between 200003 and 200009 then dollars else 0 end) as ly_dollars_11
    , sum(case when period_key between 200003 and 200009 then dollars else 0 end) as ly_dollars
    , sum(case when period_key between 200003 and 200009 then uniques else 0 end) as ly_uniques
    , sum(case when CATEGORY=1 and period_key between 200103 and 200109 then units else 0 end) as ty_units_0
    , sum(case when CATEGORY=3 and period_key between 200103 and 200109 then units else 0 end) as ty_units_1
    , sum(case when CATEGORY=4 and period_key between 200103 and 200109 then units else 0 end) as ty_units_2
    , sum(case when CATEGORY=5 and period_key between 200103 and 200109 then units else 0 end) as ty_units_3
    , sum(case when CATEGORY=6 and period_key between 200103 and 200109 then units else 0 end) as ty_units_4
    , sum(case when CATEGORY=7 and period_key between 200103 and 200109 then units else 0 end) as ty_units_5
    , sum(case when CATEGORY=8 and period_key between 200103 and 200109 then units else 0 end) as ty_units_6
    , sum(case when CATEGORY=9 and period_key between 200103 and 200109 then units else 0 end) as ty_units_7
    , sum(case when CATEGORY=20985 and period_key between 200103 and 200109 then units else 0 end) as ty_units_8
    , sum(case when CATEGORY=10 and period_key between 200103 and 200109 then units else 0 end) as ty_units_9
    , sum(case when CATEGORY=-1 and period_key between 200103 and 200109 then units else 0 end) as ty_units_10
    , sum(case when CATEGORY=12 and period_key between 200103 and 200109 then units else 0 end) as ty_units_11
    , sum(case when period_key between 200103 and 200109 then units else 0 end) as ty_units
    , sum(case when period_key between 200103 and 200109 then uniques else 0 end) as ty_uniques
    , To_Char(to_date(Min(startdate),'YYYYMMDD'),'MM/DD/YY')
    , sum(case when CATEGORY=1 and period_key between 200003 and 200009 then units else 0 end) as ly_units_0
    , sum(case when CATEGORY=3 and period_key between 200003 and 200009 then units else 0 end) as ly_units_1
    , sum(case when CATEGORY=4 and period_key between 200003 and 200009 then units else 0 end) as ly_units_2
    , sum(case when CATEGORY=5 and period_key between 200003 and 200009 then units else 0 end) as ly_units_3
    , sum(case when CATEGORY=6 and period_key between 200003 and 200009 then units else 0 end) as ly_units_4
    , sum(case when CATEGORY=7 and period_key between 200003 and 200009 then units else 0 end) as ly_units_5
    , sum(case when CATEGORY=8 and period_key between 200003 and 200009 then units else 0 end) as ly_units_6
    , sum(case when CATEGORY=9 and period_key between 200003 and 200009 then units else 0 end) as ly_units_7
    , sum(case when CATEGORY=20985 and period_key between 200003 and 200009 then units else 0 end) as ly_units_8
    , sum(case when CATEGORY=10 and period_key between 200003 and 200009 then units else 0 end) as ly_units_9
    , sum(case when CATEGORY=-1 and period_key between 200003 and 200009 then units else 0 end) as ly_units_10
    , sum(case when CATEGORY=12 and period_key between 200003 and 200009 then units else 0 end) as ly_units_11
    , sum(case when period_key between 200003 and 200009 then units else 0 end) as ly_units
    , sum(case when period_key between 200003 and 200009 then uniques else 0 end) as ly_uniques
    from ( 
    select /*+ordered star_transformations*/ 
    I.CATEGORY_KEY as CATEGORY
    , c.year||Lpad(c.week,2,'0') as PERIOD_KEY, Min(c.period_key) as StartDate, sum(nvl(p.dollars,0)) as dollars, sum(nvl(p.units,0)) as units
    , count(distinct(case when nvl(p.dollars,0)<>0 and nvl(p.units,0)<>0 then p.store_key else null end)) as uniques
     from rsnet.AMGRT_DAILY p 
     ,rsnet_dim.calendar_period c
         , rsnet_attrib.AMGRT_CUSTOM_ITEM i
      where p.retailer_key = 1
        and p.vendor_key = 2
        and p.period_key >=  20010107
        and p.period_key <=  20010224
        and p.amount_type_key in (1,2,3)
        and p.currency_type_key in (1)
        and p.item_key = i.item_key
       and c.period_key= p.period_key
       and c.calendar_key = 1
     group by I.CATEGORY_KEY,c.year||Lpad(c.week,2,'0')
     union 
    select /*+ordered star_transformations*/ 
    I.CATEGORY_KEY as CATEGORY
    , c.year||Lpad(c.week,2,'0') as PERIOD_KEY, Min(c.period_key) as StartDate, sum(nvl(p.dollars,0)) as dollars, sum(nvl(p.units,0)) as units
    , count(distinct(case when nvl(p.dollars,0)<>0 and nvl(p.units,0)<>0 then p.store_key else null end)) as uniques
     from rsnet.AMGRT_DAILY p 
     ,rsnet_dim.calendar_period c
         , rsnet_attrib.AMGRT_CUSTOM_ITEM i
      where p.retailer_key = 1
        and p.vendor_key = 2
        and p.period_key >=  20000109
        and p.period_key <=  20000226
        and p.amount_type_key in (1,2,3)
        and p.currency_type_key in (1)
        and p.item_key = i.item_key
       and c.period_key= p.period_key
       and c.calendar_key = 1
     group by I.CATEGORY_KEY,c.year||Lpad(c.week,2,'0'))
     group by substr(PERIOD_KEY,5,6)
    having sum(case when period_key between 200103 and 200109 then abs(dollars)+abs(units) else 0 end) <> 0 
    or sum(case when period_key between 200003 and 200109 then abs(dollars)+abs(units) else 0 end) <> 0 
    order by 1 
      

  2.   

    今天我刚刚完成类似要求的报表!
    你可以先参考一下Delphi 5 自带的例子(在..\Delphi5\Demos\Quickrpt\Qr3中的frmNeedData窗体)。
    与一般的报表相比,它多用了一个TStringList;但QReport中的控件用得就少多了!
    原理:
        把要打印的数据从数据库或数组取中,每一行的多列数据都连成一个字符串str,然后用StringList1.Lines.Add(str)在QuickRep1NeedData事件中赋值给QRLabel.Caption,注意定义和初始化行序号。
        另外,为了使每一列都能对齐,可以格式化字符串,例如:
    StringList1.Lines.Add(Format('%-10s%-20s%-30s',[field1,field2,field3]),三个字段分别占10、20、30个字符的位置,负号表示左对齐。   
      

  3.   

    这是一个把主细表的数据合为一张表的操作,其实不难,使用Tclientdataset 控件建立这个临时表,把主表和细表的数据放入即可,1)new a Tclientdataset
    2)使用定义字段功能创建表结构:
     {单位名称 string ,产量1 forlt 产量2 forlt ,产量30 forlt}
     产量字段可预留多一点。
    3)单位表,和产量表一定是使用产品编号关联,行成主细表,
    4)
      遍历主表,
      把主表的单位名称字段值添入ClientDataSet的单位名称,
        遍历细表,
         取产品名称,和 数量, 
          判断 ClientDataSet的产量1或产量2、3、4 的显示标题 是否 等于 细表的产品名称
          不等于把细表的产品名称字段值赋值 ClientDataSet的产量1或产量2、3、4 的显示标
              题,
          找到ClientDataSet的产量1或产量2、3、4 的显示标题 和细表的产品名称一至就把
          细表的数量添入该字段