Database 版 (精华区)

发信人: mengy (往事如风), 信区: Database
标  题: VFP中任意改变报表栏目的方法
发信站: 哈工大紫丁香 (2000年12月06日19:48:45 星期三), 站内信件

VFP 中任意改变报表栏目的方法


一、引言
在使用Foxpro编制报表处理程序时,有些报表的栏目是不确定的,例如工资构成表
中的表外工资项目每个月都可能不一样,这时候就要求应用程序能让用户自己选择
要打印的项目,任意改变所选项目的打印顺序,任意改变对应栏目的中文名称等,
而不需要程序员每个月都来修改报表处理程序。本文介绍一种利用内存变量任意改
变报表栏目名称和打印顺序的方法。 
二、数据库设计
BWGZ.DBF:GH C(6) 工号, XM C(8) 
姓名, BWGZ01~BWGZ0n N(7,2) 表外工资01~0n,
BWGZZE N(8,2) 表外工资总额
LMDY.DBF:COL_NO N(2,0) 表栏打印顺序, 
ITEM_CH1 C(6) 表栏名称第一行,
ITEM_CH2 C(6) 表栏名称第二行,
BWGZ_FLD C(8) 对应表外工资字段名
LSSTRU.DBF:GH C(6),M_P01~M_P0n N(7,2)
在这里,我们假定n≤9。当n>9时,处理方法类似。

三、算法描述
---- 将不用的栏目名称第一行改为'未定义',往栏目最后移动,并重新编排
COL_NO顺序; 
---- 按COL_NO顺序过滤掉LMDY.DBF中所有ITEM_CH1='未定义'的记录,得到有效栏
目数SUM_ITEM; 

---- 打印报表之前,按LMDY.DBF中COL_NO的顺序,将对应的表外工资字段的值保
存到LSSTRU中: 

与COL_NO=i对应的表外工资字段BWGZ_FLD 
── > LSSTRU.M_P0i ,1≤i≤n;
4.修改BWGZ.DBF中BWGZ01~BWGZ0n的数值:
LSSTRU.M_P0i ──> BWGZ.BWGZ0i 
,1≤i≤SUM_ITEM 
0 ── > BWGZ.BWGZ0i 
1 ,SUM_ITEM<i≤n
5.打印报表之后,从LSSTRU还原BWGZ.DBF中BWGZ01~BWGZ0n的数值:
LSSTRU.M_P0i ── > 
与COL_NO=i对应的表外工资字段BWGZ_FLD ,
1≤i≤n。

四、报表格式文件W_BWGZ.FRX设计说明
---- 1.在“页标头”栏中绘制表头栏目如下: 
┌──┬──┬────┬─────────────────────--┐
│ │ │ │其中: │
│工号│姓名│表外工资├────┬────┬───┬───┬────┤
│ │ │ 总额 │M_CH101 │M_CH102 │M_CH103│ ...│M_CH10n│
│ │ │ │M_CH201 │M_CH202 │M_CH203│ ...│M_CH20n│
└──┴──┴────┴────┴────┴───┴───┴────┘

---- 其中,内存变量M_CH101~M_CH10n与M_CH201~M_CH20n分别代表报表栏目的
第一、二行,它们的值按打印顺序从LMDY.DBF中取,可通过程序修改。 

---- 2.在“细节”栏中添加BWGZ.DBF字段,并定义数值字段格式为@Z(如果为0保
持为空): 

│gh│xm│bwgzze│bwgz01│bwgz02│bwgz03│ ... │bwgz0n│
└─┴─┴───┴───┴───┴───┴───┴───┘

---- 3.在“总结”栏中添加与“细节”栏对应的数值字段,并定义其计算属性为
“总和”: 
│ 合 计 │bwgzze│bwgz01│bwgz02│bwgz03│ ... │bwgz0n│
└────┴───┴───┴───┴───┴───┴───┘

---- 
五、功能说明
---- 利用本文介绍的方法,只要改变LMDY.DBF中的栏目顺序号COL_NO即可改变对
应数据的打印顺序,通过改变内存变量M_CH10i与M_CH20i (1≤i≤n)的值就可以改
变打印出来的栏目名称。当栏目名称="未定义"时,不汇总也不打印该栏目。 
六、源程序
---- 报表栏目名称的修改与打印顺序的调整比较简单,这里就不介绍了。下面给
出的是报表打印源 
程序W_PRINT.PRG:
PARAMETER N_COLUMN    
            && N_COLUMN为栏目总数
USE BWGZ IN 1    
        && 打开表外工资数据库
SELECT 2
USE LMDY        
            && 打开报表栏目定义库
INDEX ON COL_NO TO LMDY_NO
SUM_ITEM=0
DO WHILE .NOT.EOF()
IF ITEM_CH1="未定义"
EXIT
ENDIF
SUM_ITEM=SUM_ITEM+1
SKIP
ENDDO
DIMENSION cur_copy[N_COLUMN+1,4]
cur_copy[1,1]='GH'
cur_copy[1,2]='C'
cur_copy[1,3]='006'
cur_copy[1,4]='000'
i=1
do while i< =N_COLUMN
ii=iif(i< 10,'0'+str(i,1),str(i,2))
cur_copy[i+1,1]='M_P'+ii
cur_copy[i+1,2]='N'
cur_copy[i+1,3]='007'
cur_copy[i+1,4]='002'
i=i+1
enddo
CREATE DBF lsstru FROM ARRAY cur_copy
        && 创建临时库
index on gh to lsstr_gh
select 2
GO TOP
do while .NOT.EOF()
jj=iif(col_no< 10,'0'+str(col_no,1),
str(col_no,2))
m_ch1&jj=iif(col_no >SUM_ITEM,'',
alltrim(item_ch1))
m_ch2&jj=iif(col_no >SUM_ITEM,'',
alltrim(item_ch2))
m_rep&jj=alltrim(bwgz_fld)
SKIP
enddo
select 1
go top
do while .not.eof()
select 3
append blank
repl gh with a- >gh
i=1
do while i< =N_COLUMN
ii=iif(i< 10,'0'+str(i,1),str(i,2))
repl m_p&ii with a- >&m_rep&ii
i=i+1
enddo
select 1
skip
enddo
go top
do while .not.eof()
select 3
seek a- > gh
select 1
i=1
do while i< =N_COLUMN
ii=iif(i< 10,'0'+str(i,1),str(i,2))
repl BWGZ&ii with iif(i > SUM_ITEM,
0,c- > m_p&ii)
i=i+1
enddo
repl BWGZZE with BWGZ01
i=2
do while i< =N_COLUMN
ii=iif(i< 10,'0'+str(i,1),str(i,2))
repl BWGZZE with BWGZZE+BWGZ&ii
i=i+1
enddo
skip
enddo

REPORT FORM W_BWGZ TO PRINTER PROMPT
CLEAR

go top
do while .not.eof()
select 3
seek a- >gh
select 1
i=1
do while i< =N_COLUMN
ii=iif(i< 10,'0'+str(i,1),str(i,2))
repl &m_rep&ii with c- >m_p&ii
i=i+1
enddo
skip
enddo
CLOSE DATABASES
ERASE LSSTRU.DBF
ERASE LSSTR_GH.IDX

---- 以上程序在中文版Windows 95和Visual Foxpro 5.0中运行通过。

--

       大海无边天做岸
               山登绝顶我为风

※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.227.121]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.508毫秒