Database 版 (精华区)
发信人: mengy (LEAR DLLS 命令时,将从内存中清除), 信区: Database
标 题: VFP 中任意改变报表栏目的方法
发信站: 哈工大紫丁香 (2000年12月13日09:17: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.471毫秒