免费下载应用软件、交流使用经验。

软件下载 经验交流 软件开发 专题论述 请君留言 网站介绍 休闲时光 返回主页
 
通用数据库(表)打印程序

作者:本人     来源:本站

    这个通用数据库打印程序运行平台是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 \ =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     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      @ 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



注:

发表日期:1999-4-8     修改日期:

备案序号:赣ICP备05002359号

建议使用1024*768分辩率浏览 ☆版权所有 摘抄或转载须得到书面许可☆ Hujiajun ©1999,2016
E-Mail: hu-jj@21cn.com