配色: 字号:
在VFP报表打印中控制每页打印的记录数
2024-09-24 | 阅:  转:  |  分享 
  
! 编号:PRG0133! 功能:在VFP报表打印中控制每页打印的记录数! 说明:与程序MyReport配合使用,该方法就是利用
一个中间表temp,每次将表文件中一页所需要的记录数通过一个数组变量yy送到temp表,然后报表中细节带区域控件与temp相联系,
从而输出temp中的记录 CLOSE DATABASESSET DATE TO YMDSET SAFETY OF
FcPath=ADDBS(JUSTPATH(SYS(16)))SET DEFAULT TO (cPath)PUBLIC p
age, mPage, xxSELECT 3useSELECT 2use teacher02xx=30mPage=IIF(M
OD(RECCOUNT(),xx)=0,RECCOUNT()/xx,INT(RECCOUNT()/xx)+1)COPY STRU
CTURE to tempSELECT 3use temp EXCLUSIVESELECT 2page=0 && p
age为页号do while not EOF()i=1SELECT 3ZAPSELECT 2do while i<
=xx and not EOF()SCATTER to yySELECT 3APPEND BLANKGATHER
from yySELECT 2SKIPi=i+1ENDDOpage=page+1SELECT 3增加以下几行代码,尾页以
空行补足每页指定记录数 IF RECCOUNT( )<>xx AND RECCOUNT( )>0 FOR i=1
TO xx- RECCOUNT( ) APPEND BLANK ENDFOR ENDIFGO TOPMyRepor
t([cxjsxxb],[陈集小学教师基本信息一览表],1)report form cxjsxxb previewend
do生成动态报表文件【体验版】程序名:MyReport功能:根据当前工作区的表生成报表文件调用方法:MyReport([<
报表文件名>],[<报表标题>],[<打印方向>],[<左页脚],[<右页脚>])使用举例1:USE E:\kb201809
\jsrkb201809.dbfMyReport(''教师任课表'',''陈集小学2018年秋学期各班教师任课表'',1)REPORT
FORM e:\kb201809\教师任课表 Preview && 预览或 REPORT FORM e:\kb20
1809\教师任课表 && 打印使用举例2:USE 陈集小学教师或 SELECT from 陈集小学教师
WHERE 政治面貌="党员 " into CURSOR temp或 SELECT 姓名, 性别, 出生年月, 学历,
工作时间 from 陈集小学教师 into cursor tempMyReport([jsxx2024],[陈集小学教
师信息一览表],0,[制表人:XXX],[制表单位:陈集小学])report form jsxx2024 preview【
VFP9代码】PARAMETERS 报表文件名,报表标题,L_打印方向,L_左页脚,L_右页脚 &&报表文件名不带扩展名,可缺省
(缺省文件名为TMP_REPORT),报表标题可缺省PRIVATE ALL LIKE L_CAWAIT ''正在生成
报表......'' WINDOW NOWAIT NOCLEARIF TYPE(''M.报表文件名'')=''L'' OR EM
PTY(M.报表文件名) 报表文件名=''TMP_REPORT''ENDIF 定义页脚LeftFooter="制表日期:"+STR(
year(DATE()),4)+"年"+STR(month(DATE()),2)+"月"+STR(day(DATE()),2)+"
日"RightFooter= "共 "+ALLTRIM(STR(_PAGETOTAL))+" 页 第 "+ALLTRIM(STR
(_PAGENO))+" 页"RightFooter="第 "+ALLTRIM(STR(_PAGENO))+" 页"RightF
ooter=" "IF EMPTY(L_左页脚) L_左页脚=LeftFooterELSE LeftFooter=L_左页脚E
NDIFIF EMPTY(L_右页脚) L_右页脚=" "ELSE RightFooter=L_右页脚ENDIFIF EMPT
Y(L_打印方向) L_打印方向=0ENDIFL_字符宽度9=625 && FONTSIZE=9L_字符宽度9粗=729.167
&& FONTSIZE=9,粗体L_字符宽度16=1250 && FONTSIZE=16(半角字符宽度为1250,半个全角字
符宽度为1145.833,故由此算得标题居中位置并不准确)L_域控件宽度修正9=370 && 由"L_字符宽度9"算得域控件宽度
需加上此数值,才能完整输出L_带区指示条高度=2083L_标题区高度=IIF(TYPE(''M.报表标题'')=''L'' OR EM
PTY(报表标题),0,5000)L_页标头区高度=2400L_细节区高度=2400L_页脚区高度=2500L_左边距=5000L
_右边距=0L_页标头区VPOS=L_标题区高度+IIF(L_标题区高度=0,0,L_带区指示条高度)L_细节区VPOS=L_标题
区高度+L_页标头区高度+IIF(L_标题区高度=0,1,2)L_带区指示条高度L_TMP=SYS(2015)L_CA=SELE
CT( )COPY STRUCTURE TO (L_TMP) EXTECREATE CURSOR TMP (TMPFI
ELD C(10))CREATE REPORT (报表文件名) FROM TMPUSE 报表文件名+''.FRX'' EX
CLIF L_标题区高度#0添加标题区INSERT BLANKREPLACE PLATFORM WITH ''WINDO
WS'',;OBJTYPE WITH 9,;HEIGHT WITH L_标题区高度ENDIF设置左边距LOCATE FOR
OBJTYPE=1REPLACE HPOS WITH L_左边距设置打印方向默认为0-竖向,如果设为1-横向,则修改
打印方向IF L_打印方向=1 REPLACE EXPR WITH SUBSTR(EXPR,1, ATC("ORIENT
ATION",EXPR)-1)+"ORIENTATION=1"+;CHR(10)+SUBSTR(EXPR, ATC("ORIENT
ATION",EXPR)+ATC(CHR(10),;SUBSTR(expr, ATC("orientation",expr),15
)))ENDIF设置纸张REPLACE EXPR WITH SUBSTR(expr,1, ATC("PAPERSIZE",
EXPR)-1)+"PAPERSIZE=9"+;CHR(10)+SUBSTR(expr, ATC("PAPERSIZE", EX
PR)+ATC(CHR(10),;SUBSTR(expr, ATC("PAPERSIZE",EXPR),15))) 获取页面宽度
LOCATE FOR EXPR=''_PAGENO''L_页面宽度=HPOS+WIDTH增高页标头区LOCATE FOR OB
JTYPE=9 AND OBJCODE=1L_页标头区原高度=HEIGHT L_页标头区增高=L_页标头区高度-HEIGHT
REPLACE HEIGHT WITH L_页标头区高度增高细节区LOCATE FOR OBJTYPE=9 AN
D OBJCODE=4L_细节区原高度=HEIGHTL_细节区增高=L_细节区高度-HEIGHTREPLACE HEIGHT
WITH L_细节区高度增高页脚区LOCATE FOR OBJTYPE=9 AND OBJCODE=7REPLACE
HEIGHT WITH L_页脚区高度标题区以下内容重定位LOCATE FOR OBJTYPE=5L_列标题高度=H
EIGHT修改页注脚区内容垂直位置REPLACE VPOS WITH L_细节区VPOS+L_细节区高度+L_带区指示条高
度;FOR VPOS > L_页标头区原高度+L_带区指示条高度+L_细节区原高度; AND INLIST(OBJTYPE,5
,8)修改细节区内容垂直位置REPLACE VPOS WITH L_细节区VPOS+L_细节区增高/2;FOR BETW
EEN(VPOS, L_页标头区原高度, L_页标头区原高度+;L_带区指示条高度+L_细节区原高度)修改页标头区内容垂直位置R
EPLACE VPOS WITH L_页标头区VPOS+L_页标头区增高/2;FOR VPOS < L_页标头区原高度
AND !INLIST(OBJTYPE,1,9)修改页注脚内容CALCULATE MAX(HPOS) TO L_MAX
FOR OBJTYPE=5 AND TOPLOCATE FOR HPOS=L_MAXSCATTER MEMV ME
MO添加列标题标签控件、细节区域控件以及表格线先保存报表中基于TMPFIELD字段的标签控件和域控件记录,作为生成各列的标题标
签控件和细节域控件的依据LOCATE FOR UPPER(EXPR)=["TMPFIELD"]SCATTER TO L_列
标题记录 MEMODELETELOCATE FOR UPPER(EXPR)=[TMPFIELD]SCATTER TO L
_列细节记录 MEMODELETEPACKSELECT 0USE (L_TMP)ALTER TABLE (L_TMP)
add 是否打印 L REPLACE ALL 是否打印 WITH .T.BROWSE FIELDS Fiel
d_name, 是否打印 ; TITLE "打印字段选择:T—打印,F—不打印 " L_报表宽度=0L_HPOS=0L_G
AP=400 && 列与纵线之间的间隙设置纵线属性OBJTYPE=6EXPR=''''WIDTH=104.167HEIGHT=L_
细节区高度PENSIZE=1PENPAT=8MODE=0SCAN FOR FIELD_TYPE#''G'' AND 是否打
印=.T. &&通用字段除外SCAN FOR FIELD_TYPE#''G''L_列标题高度=TRIM(FIELD_NAME)L
_列标题宽=LEN(L_列标题高度)L_字符宽度9粗L_列细节宽=FIELD_LENL_字符宽度9+L_域控件宽度修正9L_列
宽=MAX(L_列标题宽,L_列细节宽)L_报表宽度=L_报表宽度+WIDTH+2L_GAP+L_列宽L_类型=FIELD_TY
PEIF L_报表宽度>L_页面宽度-L_左边距- L_右边距 EXITENDIFSELECT (报表文件名)添加纵线( )
L_HPOS=L_HPOS+WIDTH+L_GAP 添加列标题APPEND BLANKGATHER FROM L_列标题记录
MEMOREPLACE EXPR WITH ["]+L_列标题高度+["],;HPOS WITH L_HPOS,;WI
DTH WITH L_列标题宽 添加列细节APPEND BLANKGATHER FROM L_列细节记录 MEMOR
EPLACE EXPR WITH L_列标题高度,;HPOS WITH L_HPOS,;WIDTH WITH L_列
细节宽,;FILLCHAR WITH CHRTRAN(L_类型,''YFTBIM'',''NNDNNC'')DO CASE CA
SE L_类型="N" REPLACE PICTURE WITH IIF(L_类型="N",''"@Z"'',"") && 数
值型字段空值不显示 CASE L_类型="D" REPLACE PICTURE WITH IIF(L_类型="D",
''"@Z"'',"{}") && 日期型字段空值不显示 CASE L_类型="L" REPLACE PICTURE WITH
IIF(L_类型="L",''"@Z"'',"(. .)") && 逻辑型字段空值不显示 ENDCASEIF FILLCH
AR=''N''REPLACE OFFSET WITH 1ENDIFL_HPOS=L_HPOS+L_列宽+L_GAPSELECT
(L_TMP)ENDSCANUSESELECT (报表文件名)添加纵线()L_报表宽度=L_HPOS+WIDTH添加横线HP
OS=0HEIGHT=104.167WIDTH=L_报表宽度APPEND BLANKGATHER MEMV MEMOREPLA
CE VPOS WITH L_页标头区VPOSAPPEND BLANKGATHER MEMV MEMOREPLACE
VPOS WITH L_页标头区VPOS+L_页标头区高度APPEND BLANKGATHER MEMV MEMOREP
LACE VPOS WITH L_细节区VPOS+L_细节区高度IF L_标题区高度#0 拷贝一个标签记录并改造成报表标
题记录LOCATE FOR OBJTYPE=5SCATTER MEMV MEMOL_标题宽度=LEN(M.报表标题)L_
字符宽度16EXPR=["]+M.报表标题+["]VPOS=1000HPOS=MAX(0,(L_报表宽度-L_标题宽度)/2)WI
DTH=L_标题宽度HEIGHT=2500FONTSIZE=16APPEND BLANKGATHER MEMV MEMOEN
DIF修改页脚区页脚设置左页脚CALCULATE MAX(HPOS) TO L_MAX FOR OBJTYPE=5
AND TOPLOCATE FOR HPOS=L_MAXIF !EMPTY(LeftFooter)L_页脚宽度=LEN(L
eftFooter)L_字符宽度9REPLACE EXPR WITH ["]+LeftFooter+["],;VPOS W
ITH L_细节区VPOS+L_细节区高度+L_带区指示条高度,; HPOS WITH 0,;WIDTH WITH L
_页脚宽度ELSEDELETEPACKENDIF设置右页脚LOCATE FOR EXPR=[DATE()] AND TO
PREPLACE expr with [" "]IF !EMPTY(RightFooter)LOCATE FOR EX
PR=[_PAGENO] AND TOPREPLACE expr with [" "]L_页脚宽度=LEN(RightF
ooter)L_字符宽度9REPLACE EXPR WITH ["]+RightFooter+["],;VPOS W
ITH L_细节区VPOS+L_细节区高度+L_带区指示条高度,;HPOS WITH L_报表宽度-L_页脚宽度,;WIDT
H WITH L_页脚宽度,;OBJTYPE WITH 5ELSESCATTER MEMV MEMOREPLACE
EXPR WITH ["共"],;HPOS WITH L_报表宽度-25L_字符宽度9,;WIDTH WITH 3L
_字符宽度9APPEND BLANKGATHER MEMV MEMOREPLACE EXPR WITH ["]+AL
LTRIM(STR(mPAGE))+["],;HPOS WITH L_报表宽度-20L_字符宽度9,;WIDTH WITH
3L_字符宽度9APPEND BLANKGATHER MEMV MEMOREPLACE EXPR WITH ["页
第"],;HPOS WITH L_报表宽度-16L_字符宽度9,;WIDTH WITH 8L_字符宽度9 APPE
ND BLANKGATHER MEMV MEMOREPLACE EXPR WITH ["页"],;HPOS WITH
L_报表宽度-3L_字符宽度9,;WIDTH WITH 3L_字符宽度9LOCATE FOR EXPR=[_PAGENO] AND TOP REPLACE EXPR WITH ["]+ALLTRIM(STR(Page))+["]REPLACE HPOS WITH L_报表宽度-8L_字符宽度9,;WIDTH WITH 3L_字符宽度9ENDIFUSESELECT (L_CA)ERASE L_TMP+''.''ERASE L_TMP.DBFWAIT CLEARRETURNPROCEDURE 添加纵线APPEND BLANKGATHER MEMV MEMOREPLACE VPOS WITH L_页标头区VPOS,;HPOS WITH L_HPOSAPPEND BLANKGATHER MEMV MEMOREPLACE VPOS WITH L_细节区VPOS,;HPOS WITH L_HPOS,;STRETCH WITH .T.ENDPROC
献花(0)
+1
(本文系王咸美首藏)