晕死了,谁让你用报表设计器了,一直都是说用编程的方式实现,从来就没有说过用报表设计器。
两人行已有我师……
给你一个通用打印程序供参考。
这个通用数据库打印程序运行平台是FoxPro2.5 For Dos。其通用性在于:你只要选择到要打印数据库的工作区,并将表格主标题、副标题赋予变量,宾栏标题名称赋予变量数组,然后调用本程序,即可将数据库中的内容分页打印出来。
源程序:
**变量赋值,可放在调用的程序中
dybt='固定资产(机器设备)明细表' && ybt=主标题
dybf='1999年2月' && dybf=副标题1
sydw='江西苎麻纺织集团有限公司' && sydw=副标题2
dime adn(20) && 数组adn(x)=宾栏标题,不得少于字段数
adn(1)='设备名称' &&并与字段相对应
adn(2)='型号规格'
adn(3)='生产厂家'
adn(4)='出厂编号'
adn(5)='设备编号'
adn(6)='计量单位'
adn(7)='帐面数量'
adn(8)='实际数量'
adn(9)='安装及存放地点'
adn(10)='帐面原价'
adn(11)='帐面净值'
adn(12)='车间未登'
adn(13)='备注'
**被调用的程序开始
**PROCEDURE QSJSSJDY
define window _windy from 5,16 to 13,63 title ' 打 印 设 置 ';
shadow noclose nogrow;
color scheme 12
activate window _windy &&激活窗口
@ 0,1 say '打印内容:' color w+/r
@ 1,1 say '附加标题:' color w+/r
@ 2,1 say '打印方式:' color w+/r
@ 2,25 say '行间线:' color w+/r
@ 3,1 say '起始页号:' color w+/r
@ 3,25 say '总页数:' color w+/r
@ 4,1 say ;
'从第 页开始打印至 页为止,共 页。' color w+/r
dqqh=select() &&保存当前工作区号
copy to sjkjg structure extended
sele 0
use sjkjg &&要打印数据库的结构
zds=recc() &&取总字段数
sum field_len to dykd
dime zd(zds,4)
copy to array zd &&将要打印的数据库结构保存在数组zd中
use
eras sjkjg.dbf
select (dqqh) &&恢复当前工作区号
dyhx=.f. &&行间线不打印
dyhs=iif(dyhx,23,46) &&每页打印行数
dyyh=1 &&打印的起始页号
dyzs=ceiling((recc()-1)/dyhs) &&总页数
dyqy=1 &&打印起始页号
dyzy=dyzs &&打印结束页号
dyfs=1
j=max(round(zd(1,3)/2,0),len(adn(1))/2)
zd(1,4)=(zd(1,3)-len(adn(1)))/2
zd(1,3)=j*2+2
dykd=j*2 &&一行的打印宽度
dybd=repl('━',j)
dybj=repl('─',j)
dybk=repl(' ',j)
dybw=repl('━',j)
for j=2 to zds &&装配表格
i=max(round(zd(j,3)/2,0),len(adn(j))/2) &&当前字段的表格数
dykd=dykd+j*2+2
zd(j,4)=(zd(j,3)-len(adn(j)))/2
zd(j,3)=i*2+zd(j-1,3)+2 &&计算当前字段的打印起始位置
dybd=dybd+'┯'+repl('━',i)
dybj=dybj+'┼'+repl('─',i)
dybk=dybk+'│'+repl(' ',i)
dybw=dybw+'┷'+repl('━',i)
endfor
@ 0,11 say dybt pict'@s30'
@ 1,11 say dybf pict '@s30'
@ 2,11 say iif(dyfs=1,'16开折页打印',;
iif(dyfs=2,'全页打印','8开倍页打印'))
@ 2,33 say iif(dyhx,'有表格线','无表格线')
@ 3,11 say dyyh pict '999'
@ 3,33 say dyzs pict '999'
@ 4,6 say dyqy pict '999'
@ 4,23 say dyzy pict '999'
@ 4,37 say dyzy pict '999'
dyfs=iif(dykd<81,1,iif(dykd>132,3,2))
dyw0=(dykd-len(sydw))/2 &&单位名称的起始打印位置
dyw1=(dykd-len(dybt))/2 &&标题的起始打印位置
dyqd=66-int(dykd/2)
dyqd=iif(dyqd>0,dyqd,0) &&列打印起点
do whil.t.
dya0=1
@ 6,1 get dya0 function ;
'*RTH \<P.开始打印;\<E.改变设置;\<Q.结束返回'
=sys(2002,1)
read
@ 6,1 say spac(44)
=sys(2002)
dyzs=ceiling((recc()-1)/dyhs) &&总页数
dyok=.t.
do case
case dya0=1 &&开始打印
dyyh=dyqy
i=(dyqy-1)*dyhs
if recc()>i.and.i>0
go (i)
else
go top
endif
dyb1=.t.
do whil .t.
dybz=iif(dyfs=1.and.recc()-recn()>dyhs,.t.,.f.)
@ 5,2 say ;
'准备打印第'+str(dyyh,4)+' 页,还剩'+str(dyzy-dyyh,4)+'页'
@ 6,3 say ;
'请准备好打印机和打印纸,然后按任意键……' color n/r
?? chr(7)
y=qsinkey()
do whil.t. &&检测打印机
if qsprint()
y=.t.
exit
endif
if msou
?? chr(7)
endif
y='打印机缺纸或未联机, 继续打印吗?'
do qsjsqr with y
if !y
exit
endif
enddo
if !y &&放弃打印
exit
endif
@ 5,2 say '正在'
ajds=0
hh=1
set device to print
set print on
dyok=qsprint()
if !dyok
exit
endif
@ prow()+2,dyw0 say sydw &&打印单位名称
if dybz
@ prow(),dykd+dyw0 say sydw
endif
@ prow()+2,dyw1 say dybt &&打印主标题
if dybz
@ prow(),dykd+dyw1 say sydw
endif
@ prow()+1,dyqd+1 say dybf &&打印副标题
@ prow(),max(pcol()+4,dykd-20) say '第'
@ prow(),pcol() say dyyh pict '9999'
@ prow(),pcol() say '页'
if dybz
@ prow(),dykd+dyqd+1 say dybf
@ prow(),max(pcol()+4,dykd+60) say '第'
@ prow(),pcol() say dyyh+1 pict '9999'
@ prow(),pcol() say '页'
endif
@ prow()+1,dyqd say dybd &&打印表顶线
if dybz
@ prow(),dyqd+dykd say dybd
endif
ii=(max(zd(1,3),len(adn(1)))-len(adn(1)))/2
@ prow()+1,dyqd+ii say adn(1) &&打印宾栏
for i=2 to zds
@ prow(),zd(i-1,3)+dyqd-2 say '│'
@ prow(),max(pcol(),zd(i-1,3)+dyqd+dyqd+zd(i,4));
say adn(i)
endfor
if dybz
@ prow(),dyqd+dykd say adn(1) &&打印宾栏
for i=2 to zds
@ prow(),zd(i-1,3)+dykd+dyqd say '│'
@ prow(),zd(i-1,3)+dykd+dyqd+zd(i,4) say adn(i)
endfor
endif
@ prow()+1,dyqd say dybj &&打印表间线
if dybz
@ prow(),dyqd+dykd say dybj
endif
do whil hh<dyhs+1
if dyb1
if zd(1,2)='M' &&备注字段打印
@ prow()+1,dyqd say &zd(1,1) pict '@s12' &&打印内容
else &&其他字段打印
@ prow()+1,dyqd say &zd(1,1) &&打印内容
endif
for i=2 to zds
@ prow(),dyqd+zd(i-1,3)-2 say '│'
if zd(i,2)='M' &&备注字段打印
@ prow(),dyqd+zd(i-1,3) say &zd(i,1) pict '@s12'
else &&其他字段打印
@ prow(),dyqd+zd(i-1,3) say &zd(i,1)
endif
endfor
if dybz
if recc()-recn()>dyhs
skip dyhs
if zd(1,2)='M' &&备注字段打印
@ prow(),dyqd+dykd say &zd(1,1) pict '@s12'
else &&其他字段打印
@ prow(),dyqd+dykd say &zd(1,1) &&打印内容
endif
for i=2 to zds
@ prow(),dyqd+zd(i-1,3)+dykd-2 say '│'
if zd(i,2)='M' &&备注字段打印
@ prow(),dyqd+zd(i-1,3)+dykd ;
say &zd(i,1) pict '@s12'
else &&其他字段打印
@ prow(),dyqd+zd(i-1,3)+dykd say &zd(i,1)
endif
endfor
skip -dyhs
else &&打印空栏
@ prow(),dyqd+dykd say dybk
endif
endif
skip
if eof()
dyb1=.f.
endif
else
@ prow()+1,dyqd say dybk
if dybz
@ prow(),dyqd+dykd say dybk
endif
endif
if hh<dyhs.and.dyhx
@ prow()+1,dyqd say dybj
if dybz
@ prow(),dyqd+dykd say dybj
endif
endif
set device to print
set print on
hh=hh+1
enddo
@ prow()+1,dyqd say dybw
if dybz
@ prow(),dyqd+dykd say dybw
endif
@ prow()+1,dyqd+2 say '〖通用打印〗 V 2.0'
@ prow(),max(pcol()+6,dykd-24) say '打印日期:'
@ prow(),max(pcol(),dykd-14) say date()
if dybz
@ prow(),dyqd+dykd+2 say '〖通用打印〗 V 2.0'
@ prow(),max(pcol()+6,dykd*2-24) say '打印日期:'
@ prow(),max(pcol(),dykd*2-14) say date()
endif
??? chr(12)
dyyh=iif(dybz,dyyh+2,dyyh+1)
set print off
set device to scre
if dyyh>dyzy
exit
endif
enddo
@ 5,1 clea to 6,44
@ 5,20 say '本次打印完毕!' color n/r
case dya0=2 &&改变设置
i=1
do whil .t.
do case
case i=1
do whil .t.
@ 2,11 say subs(' 8开折页打印 全页打印 8开倍页打印';
,dyfs*12-11,12) color w+/w
y=qsinkey(0)
do case
case y=32
dyfs=iif(dyfs=4,1,dyfs+1)
if dykd>80.and.dyfs=1
if msou
?? chr(7)
endif
wait '要打印的记录太宽, 不能折页打印!' window
dyfs=1
endif
if dykd>132.and.dyfs<3
if msou
?? chr(7)
endif
wait '要打印的记录太宽, 只能倍页打印!' window
dyfs=3
endif
case y=13
exit
other
if msou
?? chr(7)
endif
endcase
enddo
@ 2,11 say ;
subs(' 8开折页打印 全页打印 8开倍页打印',dyfs*12-11,12)
i=2
case i=2
do whil .t.
@ 2,33 say iif(dyhx,'有表格线','无表格线') color w+/w
y=qsinkey(0)
do case
case y=32
dyhx=iif(dyhx,.f.,.t.)
case y=13
exit
other
if msou
?? chr(7)
endif
endcase
enddo
@ 2,33 say iif(dyhx,'有表格线','无表格线')
i=3
dyhs=iif(dyhx,23,46) &&每页打印行数
dyzs=ceiling((recc()-1)/dyhs) &&总页数
@ 3,33 say dyzs pict '999'
dyzy=dyzs+dyqy-1
@ 4,23 say dyzy pict '999'
case i=3
dyyh=1
do whil .t.
@ 3,11 get dyyh pict '999' rang 1,999
=sys(2002,1)
read
=sys(2002)
dyqy=dyyh
dyzy=dyzs+dyyh-1
@ 4,6 get dyqy pict '999' rang 1,dyzy
@ 4,23 get dyzy pict '999' rang dyqy,dyzy
=sys(2002,1)
read
=sys(2002)
if dyzy>=dyqy
exit
endif
enddo
@ 3,11 say dyyh pict '999'
@ 4,6 say dyqy pict '999'
@ 4,23 say dyzy pict '999'
@ 4,37 say dyzy+1-dyqy pict '999'
exit
endcase
enddo
case dya0=3
exit
endcase
enddo
deactivate window _windy &&关闭窗口
RETURN && OK