-
vfp教程之Visual Foxpro生成任意打印字段报表的实现
---- 存在的问题
---- 用VFP生面的执行程序后,对于用户所需的某一数据库的任意字段组合报表,就显得不是那样运用自如。因为,一方面软件开发时,无法考虑到日后用户所需报表的所有格式。另一方面,由于所设计好的报表格式文件已编译成可执行文件,即使修改了.FRX和.FRT文件结构内容,也需在开发环境下重新编译,对用户来讲是不实现的。例如需一份员工名单及一个空栏位,进行签名或登记某一证件号码的问题就比较难解决。
---- 解决方案
---- 运用VFP与Excel 的交换数据及在VFP中全面控制Excel的操作(即自动服务器),就可以很好的解决这一问题。关于如何控制Excel,一方面可以通过Excel的帮助文件的VBA语法,另一方面也有相当多的文章关于控制Excel的语法。值得注意的是:1、为提高效率,所有有关计算、小计、合计最好在VFP中进行,并写在相应的记录内;2、由于是两个软件,如果在有大量数据逐一插入Excel单元格时,显得速度较慢,所以如果数据量较大,应直接用VFP的数据表导出为Excel格式,再由VFP在后台控制Excel打开,并指定的Excel格式文件进行修改文档标题、列的名称、网格线型,以及根据纸张大小计算各列宽和调整字体大小。
---- 实现办法
---- 利用SQL结构化语言的Select生成一个数据表
---- 在Select字段时,可以利用一个表单Form1加入两个列表框,一个列表框列出所有数据表的字段,另一个为空,利用鼠标双击或拖拉至空的列表框里,为选定一字段(此时第一个含有所有字段的列表框中,将不再显示被拖拉走的字段,而在另一列表中显示),并生成相应的Select查询程序段。
---- 在本实例中为:form1中含有一个list1和edit1和两个按钮
Form1.ini
public a,b,c,d,f,g
a="SELECT "
b=""
c=" FROM bn INTO CURSOR myquery"
d=""
f=0
g=0
list1.dblclick
if len(alltrim(b))=0
b=b+thisform.list1.value
else
b=b+","+thisform.list1.value
endif
d=a+b+c
thisform.edit1.refresh
for mm=1 to thisform.list1.listcount
if thisform.list1.selected(mm)
thisform.list1.removeitem(mm)
endif
endfor
command1.click ** 执行所生成的select语句
SELECT &B FROM BN INTO CURSOR MYQUERY
sele myquery
command2.click** 调用excel
my=createobject("excel.application")
my.visible=.t. **如果在交付用户时可以将其设置成 .F.
my.workbooks.add
select myquery
f=fcount()
g=reccount()
goto top
for l=1 to g
for i=1 to f
fieldname=field(i)
** 对于要生成中文的列位标题可以用
一英文字段名称与中文名称对应的参数库来解决
my.activeworkbook.sheets(1).cells(l,i).value=myquery.&fieldname
endfor
skip
endfor
** 如果要增加一空列可以用
my.activesheet.columns(f+1).insert语法
** 设置页眉 my.activesheet.pagesetup.
centerheader (centerfooter)=” xxx”
---- 其它方面的控制可以按上述提到的方法参考
---- 用VFP生面的执行程序后,对于用户所需的某一数据库的任意字段组合报表,就显得不是那样运用自如。因为,一方面软件开发时,无法考虑到日后用户所需报表的所有格式。另一方面,由于所设计好的报表格式文件已编译成可执行文件,即使修改了.FRX和.FRT文件结构内容,也需在开发环境下重新编译,对用户来讲是不实现的。例如需一份员工名单及一个空栏位,进行签名或登记某一证件号码的问题就比较难解决。
---- 解决方案
---- 运用VFP与Excel 的交换数据及在VFP中全面控制Excel的操作(即自动服务器),就可以很好的解决这一问题。关于如何控制Excel,一方面可以通过Excel的帮助文件的VBA语法,另一方面也有相当多的文章关于控制Excel的语法。值得注意的是:1、为提高效率,所有有关计算、小计、合计最好在VFP中进行,并写在相应的记录内;2、由于是两个软件,如果在有大量数据逐一插入Excel单元格时,显得速度较慢,所以如果数据量较大,应直接用VFP的数据表导出为Excel格式,再由VFP在后台控制Excel打开,并指定的Excel格式文件进行修改文档标题、列的名称、网格线型,以及根据纸张大小计算各列宽和调整字体大小。
---- 实现办法
---- 利用SQL结构化语言的Select生成一个数据表
---- 在Select字段时,可以利用一个表单Form1加入两个列表框,一个列表框列出所有数据表的字段,另一个为空,利用鼠标双击或拖拉至空的列表框里,为选定一字段(此时第一个含有所有字段的列表框中,将不再显示被拖拉走的字段,而在另一列表中显示),并生成相应的Select查询程序段。
---- 在本实例中为:form1中含有一个list1和edit1和两个按钮
Form1.ini
public a,b,c,d,f,g
a="SELECT "
b=""
c=" FROM bn INTO CURSOR myquery"
d=""
f=0
g=0
list1.dblclick
if len(alltrim(b))=0
b=b+thisform.list1.value
else
b=b+","+thisform.list1.value
endif
d=a+b+c
thisform.edit1.refresh
for mm=1 to thisform.list1.listcount
if thisform.list1.selected(mm)
thisform.list1.removeitem(mm)
endif
endfor
command1.click ** 执行所生成的select语句
SELECT &B FROM BN INTO CURSOR MYQUERY
sele myquery
command2.click** 调用excel
my=createobject("excel.application")
my.visible=.t. **如果在交付用户时可以将其设置成 .F.
my.workbooks.add
select myquery
f=fcount()
g=reccount()
goto top
for l=1 to g
for i=1 to f
fieldname=field(i)
** 对于要生成中文的列位标题可以用
一英文字段名称与中文名称对应的参数库来解决
my.activeworkbook.sheets(1).cells(l,i).value=myquery.&fieldname
endfor
skip
endfor
** 如果要增加一空列可以用
my.activesheet.columns(f+1).insert语法
** 设置页眉 my.activesheet.pagesetup.
centerheader (centerfooter)=” xxx”
---- 其它方面的控制可以按上述提到的方法参考
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式