用PB开发报表系统.docx
《用PB开发报表系统.docx》由会员分享,可在线阅读,更多相关《用PB开发报表系统.docx(6页珍藏版)》请在冰豆网上搜索。
用PB开发报表系统
用PB开发报表系统
在建设某公司内部信息网的过程中,涉及到大量的DBF文件直接转换为HTML文件的应用,其他的文件格式(Excel,Access,以及大型数据库的查询)也有这方面的要求,由此用PB实现了基于ODBC查询的PSR文件生成工具。
此生成器的原理是:
1、通过取出表的结构,
2、生成查询的SQL语法,
3、SyntaxFromSQL()函数生成datawindow语法,
4、create()函数生成数据窗
5、将生成的数据窗进行修饰,包括增加对象、删除对象、修饰对象、布置对象等操作,进行数据窗的美化工作。
6、将生成的数据窗用SaveAs()函数另寸为PSR文件。
7、在HTML页中使用插件方式或直接连接方式显示该PSR文件。
在实现过程中,使用了数据窗函数Modify()的各种语法来实现对数据窗的修饰,如加入线条,加入文本、改变格式、颜色等。
可修饰的内容如下图:
该工具主要有以下特点:
1、自动化
对某些部门而言,需要处理的数据是动态变化的,如某销售公司,每天处理十几报表,报表的形式基本稳定,因此只需将更新后的数据拷贝到指定的位置,或在形成SQL语法时加入一定的条件,即可实现自动化的报表处理。
处理时,将需要的报表循环,自动设置ODBC连接参数(用写注册表的方法),自动连接好数据库,打开报表对应的数据窗,检索记录,然后另存为预定的PSR文件即可。
2、实用性
该工具特别针对查询而设计,可扩展到任何用ODBC连接的数据源,只要该数据源支持标准SQL查询即可。
特别对于OA中或信息发布中需要将一些沿用已久FOX系统下的DBF文件发布而言,所做工作只要在一次定义后,按几个按钮即可完成。
特别是在NOTES中只要将PSR文件作为附件直接插入到文档中,在客户端定义好Plugin,即可实现WEB发布。
【技术要点参考】
1、创建数据窗子对象
通过数据窗的Modify()函数实现,语法:
dw_report.modify('createtext(name=uc_text_001x="10"y="20"width="300"....')
通过对具体对象(statictext,picture,rectangle,line,compute等)的属性赋值(注意括号的使用与匹配),如x,y,width,height,color,font,background.color,background.mode,expression,format等,即可实现对象的创建。
创建对象时特别注意是加入moveable=1resizeable=1语法,实际上是将对象设为可移动,可变大小,这对于对象的调整是比较重要的。
删除对象只需用如下语法:
dw_report.modify('destroyuc_text_001')
如何实现象PB开发环境下的创建对象的方式呢?
1、建立菜单(将bar的Toolbar的Objecttype设为MenuCascade方式,Item项为各可创建对象),
2、各菜单Item的ClickedEvent中写入:
parent.toolbarItemdown=false//使该ToolbarItem处于压下状态
mf_createobject('STOP')
统一调用函数mf_create_object([对象类别]),[对象类别]可自定以好,如"text","line"等
3、mf_create_object函数如下(argument为stringobject_string)
windowlw_sheet
lw_sheet=parentwindow.GetActiveSheet()
ifIsValid(lw_sheet)then
lw_sheet.triggerevent('ue_createobject',0,obj_string)
endif
该函数取得当前打开的sheet窗口lw_sheet,然后调用该窗口下的ue_createobject自定义事件。
4、在主窗口下,自定义ue_createobject事件,该事件主要响应如下:
stringPassedString
PassedString=String(Message.LongParm,"address")//取出创建类型
ifisnull(passedstring)orpassedstring='STOP'then
m_main.m_objects.toolbaritemdown=false
ib_creatingObject=false
return
endif
ib_creatingobject=True//等待dw_report的click事件来触发
is_objectstring=passedstring//告知当前触发对象
5、在dw_report的clicked事件中,写入以下语法:
ifNOTib_creating_objectthenreturn//instance变量,记录是否处于创建状态
m_main.m_objects.toolbarItemdown=false//恢复ToolbarItem状态
ifisnull(is_objectstring)thenreturn//意外判断
ib_creatingobject=false//停止创建
choosecaseis_objectstring
……
[具体创建语法]
2、选择对象
产生Windows风格的选择形式主要包括:
单选,CTRL+单选,框选
单选:
容易实现,在datawindow的Clicked事件中用GetObjectAtPointer()函数即可取得点取的对象,然后在该对象四周画rectangle标记即可(清除其他已选对象选中标记);
多选:
在Clicked事件中判断是否有CTRL按下
ifKeyDown(keycontrol!
)then…
增加选中对象列表(数组)
显示选中标记
框选:
需要由3个事件协同工作
Clicked:
(鼠标单击)
记录左键按下时的位置(pixels),同时考虑Scrollhorizontal事件产生的位移量(unit)ib_rect_select=True//框选开始
ii_mousex=unitstopixels(ii_hscroll_offset,xunitstopixels!
)+xpos
ii_mousey=unitstopixels(ii_vscroll_offset,yunitstopixels!
)+ypos
ue_mousemove:
(自定义事件,EvendID=pbm_dwnmousemove)(鼠标移动)
//动态创建框选的矩形框
ifNOTib_rectselectthenreturn
intli_height,li_width,x2,y2,x1,y1
x1=ii_mousex
y1=ii_mousey
x2=unitstopixels(ii_hscroll,xunitstopixels!
)+xpos
y2=unitstopixels(ii_vscroll,yunitstopixels!
)+ypos
li_height=y2-y1
li_width=x2-x1
x1=pixelstounits(x1,xpixelstounits!
)
y1=pixelstounits(y1,ypixelstounits!
)
hh=pixelstounits(hh,ypixelstounits!
)
ww=pixelstounits(ww,xpixelstounits!
)
stringls_mstring
ls_mstring='createrectangle(band=foregroundname=uc_rect_selectx="'+string(x1)+&
'"y="'+string(y1)+'"width="'+string(ww)+'"height="'+string(hh)+'"'+&
'brush.hatch="7"brush.color="553648127"pen.style="2"pen.width="5"'+&
'pen.color="1090519039"background.mode="2"background.color="255")'
dw_pre.setredraw(false)
dw_pre.modify('destroyuc_rect_select')//先删除旧的矩形框
dw_pre.modify(ls_mstring)//再创建新的矩形框
dw_pre.setredraw(true)
ue_leftbuttonup:
(自定义事件,EvendID=pbm_lbuttonup)鼠标左键抬起
//鼠标左键抬起,如果处于ib_rectselect状态,则结束选择状态
ifNOTib_rectselectthenreturn
dw_pre.setredraw(false)
dw_pre.modify('destroyuc_rect_select')
dw_pre.setredraw(true)
ib_rectselect=false
……//处理选择对象
通过以上三个事件的协同工作,就可实现多对象的框选。
3、自动连接ODBC
自动连接ODBC是指不需要用户自己定义ODBC连接参数,通过程序自动实现连接,一方面简化了用户的操作,另一方面,使批量定制报表成为可能。
自动连接ODBC的实现是通过写注册表来实现的,主要用到的函数有两个:
Registryset()
Registryget()
通过Registryset()函数,改写注册表主键及相关键值:
HKEY_CURRENT_USERoftware\ODBC\ODBC.INI\[ODBC源名称]
HKEY_CURRENT_USERoftware\ODBC\ODBC.INI\ODBCDataSources
[ODBC源名称]即要创建或修改的ODBCsource,如
HKEY_CURRENT_USERoftware\ODBC\ODBC.INIystem
该主键下有若干键值记录了该连接的参数,如SybaseSQLanyway5.0的典型设置:
键值名
值
含义
Autostop
Yes
程序调用结束后自动终止连接
DatabaseFile
C:
\ProgramFiles\DBF自动报表ystem.DB
数据库文件
DatabaseName
system
连接名称
Description
自动生成ODBC
描述
Driver
C:
\ProgramFiles\DBF自动报表\WOD50T.DLL
驱动程序语法解释
PWS
SQL
用户口令
Start
C:
\ProgramFiles\DBF自动报表\dbeng50-c8192
驱动程序及参数-c8192表示用8192K内存做cache
UID
DBA
数据库用户名
为使其他程序可用该ODBC源,在主键:
HKEY_CURRENT