Database 版 (精华区)

发信人: starstar (星语心愿), 信区: Database
标  题: VFP 中任意改变报表栏目的方法 
发信站: 哈工大紫丁香 (2001年05月19日20:36:48 星期六), 站内信件

---- 

一、引言
在使用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.239.32]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.315毫秒