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
, 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
你可以先参考一下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个字符的位置,负号表示左对齐。
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 的显示标题 和细表的产品名称一至就把
细表的数量添入该字段