用PB开发报表系统

原创 2001年04月29日 01:02:00

用PB开发WEB下报表系统
作者:流方 主页:http://liulee.myrice.com

在建设某公司内部信息网的过程中,涉及到大量的DBF文件直接转换为HTML文件的应用,其他的文件格式(Excel,Access,以及大型数据库的查询)也有这方面的要求,由此用PB实现了基于ODBC查询的PSR文件生成工具。

此生成器的原理是:

1、通过取出表的结构,

2、生成查询的SQL语法,

3、SyntaxFromSQL()函数生成datawindow语法,

4、create()函数生成数据窗

5、将生成的数据窗进行修饰,包括增加对象、删除对象、修饰对象、布置对象等操作,进行数据窗的美化工作。

6、将生成的数据窗用SaveAs()函数另寸为 PSR 文件。

7、在HTML页中使用插件方式或直接连接方式显示该PSR文件。

在实现过程中,使用了数据窗函数Modify()的各种语法来实现对数据窗的修饰,如加入线条,加入文本、改变格式、颜色等。可修饰的内容如下图:

autopsr.gif

该工具主要有以下特点:

1、自动化

对某些部门而言,需要处理的数据是动态变化的,如某销售公司,每天处理十几报表,报表的形式基本稳定,因此只需将更新后的数据拷贝到指定的位置,或在形成SQL语法时加入一定的条件,即可实现自动化的报表处理。处理时,将需要的报表循环,自动设置ODBC连接参数(用写注册表的方法),自动连接好数据库,打开报表对应的数据窗,检索记录,然后另存为预定的PSR文件即可。

2、实用性

该工具特别针对查询而设计,可扩展到任何用ODBC连接的数据源,只要该数据源支持标准SQL查询即可。特别对于OA中或信息发布中需要将一些沿用已久FOX系统下的DBF文件发布而言,所做工作只要在一次定义后,按几个按钮即可完成。 特别是在NOTES中只要将 PSR 文件作为附件直接插入到文档中,在客户端定义好Plugin,即可实现 WEB 发布。

【技术要点参考】

1、创建数据窗子对象

通过数据窗的Modify()函数实现,语法:

dw_report.modify('create text(name=uc_text_001 x="10" y="20" width="300" ....')

通过对具体对象(static text,picture,rectangle,line,compute等)的属性赋值(注意括号的使用与匹配),如x,y,width,height,color,font,background.color,background.mode,expression,format等,即可实现对象的创建。创建对象时特别注意是加入 moveable=1 resizeable=1 语法,实际上是将对象设为可移动,可变大小,这对于对象的调整是比较重要的。

删除对象只需用如下语法:

dw_report.modify('destroy uc_text_001')

如何实现象PB开发环境下的创建对象的方式呢?

1、建立菜单(将bar的Toolbar的Object type 设为MenuCascade方式,Item项为各可创建对象),

2、各菜单Item的Clicked Event中写入:

parent.toolbarItemdown = false // 使该ToolbarItem处于压下状态

mf_createobject('STOP')

统一调用函数mf_create_object([对象类别]),[对象类别]可自定以好,如"text","line"等

3、mf_create_object函数如下(argument 为 string object_string)

window lw_sheet

lw_sheet = parentwindow.GetActiveSheet ()

if IsValid (lw_sheet) then

lw_sheet.triggerevent('ue_createobject',0,obj_string)

end if

该函数取得当前打开的sheet窗口lw_sheet,然后调用该窗口下的ue_createobject自定义事件。

4、在主窗口下,自定义ue_createobject事件,该事件主要响应如下:

string PassedString

PassedString = String(Message.LongParm, "address") // 取出创建类型

if isnull(passedstring) or passedstring = 'STOP' then

m_main.m_objects.toolbaritemdown = false

ib_creatingObject = false

return

end if

ib_creatingobject = True // 等待dw_report的click事件来触发

is_objectstring = passedstring // 告知当前触发对象

5、在dw_report的clicked事件中,写入以下语法:

if NOT ib_creating_object then return // instance 变量,记录是否处于创建状态

m_main.m_objects.toolbarItemdown = false // 恢复ToolbarItem状态

if isnull(is_objectstring) then return // 意外判断

ib_creatingobject = false // 停止创建

choose case is_objectstring

……

[具体创建语法]

2、选择对象

产生Windows风格的选择形式主要包括:单选,CTRL+单选,框选

单选:容易实现,在datawindow的Clicked事件中用GetObjectAtPointer()函数即可取得点取的对象,然后在该对象四周画rectangle标记即可(清除其他已选对象选中标记);

多选:在Clicked事件中判断是否有CTRL按下

if KeyDown(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: (自定义事件,Evend ID = pbm_dwnmousemove)(鼠标移动)

// 动态创建框选的矩形框

if NOT ib_rectselect then return

int li_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!)

string ls_mstring

ls_mstring =' create rectangle(band=foreground name=uc_rect_select x="'+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('destroy uc_rect_select') // 先删除旧的矩形框

dw_pre.modify(ls_mstring) // 再创建新的矩形框

dw_pre.setredraw(true)

ue_leftbuttonup: (自定义事件,Evend ID = pbm_lbuttonup) 鼠标左键抬起

//鼠标左键抬起,如果处于ib_rectselect状态,则结束选择状态

if NOT ib_rectselect then return

dw_pre.setredraw(false)

dw_pre.modify('destroy uc_rect_select')

dw_pre.setredraw(true)

ib_rectselect = false

…… // 处理选择对象

通过以上三个事件的协同工作,就可实现多对象的框选。

3、自动连接ODBC

自动连接ODBC是指不需要用户自己定义ODBC连接参数,通过程序自动实现连接,一方面简化了用户的操作,另一方面,使批量定制报表成为可能。

自动连接ODBC的实现是通过写注册表来实现的,主要用到的函数有两个:

Registryset()

Registryget()

通过Registryset()函数,改写注册表主键及相关键值:

HKEY_CURRENT_USER/Software/ODBC/ODBC.INI/[ODBC源名称]

HKEY_CURRENT_USER/Software/ODBC/ODBC.INI/ODBC Data Sources

[ODBC源名称] 即要创建或修改的ODBC source,如

HKEY_CURRENT_USER/Software/ODBC/ODBC.INI/system

该主键下有若干键值记录了该连接的参数,如Sybase SQL anyway 5.0 的典型设置:

键值名

含义

Autostop

Yes

程序调用结束后自动终止连接

DatabaseFile

C:/Program Files/DBF自动报表/system.DB

数据库文件

DatabaseName

system

连接名称

Description

自动生成ODBC

描述

Driver

C:/Program Files/DBF自动报表/WOD50T.DLL

驱动程序语法解释

PWS

SQL

用户口令

Start

C:/Program Files/DBF自动报表/dbeng50 -c8192

驱动程序及参数 -c8192表示用8192K内存做cache

UID

DBA

数据库用户名

为使其他程序可用该ODBC源,在主键:

HKEY_CURRENT_USER/Software/ODBC/ODBC.INI/ODBC Data Sources

下加入相应键值:

键值名

含义

system

Sybase SQL Anywhere 5.0

ODBC源名及分类

做好如上手脚后,在程序中即可直接连接了。

用PB开发报表系统

  • zgqtxwd
  • zgqtxwd
  • 2008年05月01日 03:00
  • 207

“智能报表系统”的建设经验--东北证券

证券行业是中国计算机应用高度密集的行业之一,如何利用好各项数据是券商摆脱低层次的同质化竞争,走向差异化服务优势的重要途径。那么以数据为基础,通过数据分析指导服务和决策就显得尤为重要。...
  • u014514254
  • u014514254
  • 2017年06月14日 10:35
  • 493

pb一步步开发APP

APP越来越流行,客户需要开发APP,对习惯了pb开发者来说,如何开发APP是个让人头大的问题。其实pb开发APP是完全可行的。 下面就通过示例,一步步都大家如何开发一个APP。先上几张最后的效果图 ...
  • pcwe2002
  • pcwe2002
  • 2017年01月18日 17:29
  • 2649

pb开发web应用

说到pb开发web,一般是将pb发布成webservice,或者转成webform,两者都有很多限制,比如需要iis安装维护麻烦,调试困难,经常遇到莫名的错误,找不到资料,样式调整困难等问题。 随着互...
  • pcwe2002
  • pcwe2002
  • 2016年11月22日 16:43
  • 2691

python制作报表

本文将介绍如何通过python制作报表
  • WuyouJie2008
  • WuyouJie2008
  • 2016年02月28日 17:27
  • 3310

PB编程通俗快速入手(自己2002年教别人PB时随手写的,很多年了,放上来送给新手们)

PB编程通俗快速入手张金柱第一章   一般使用 1、  程序的开始,application的open事件。退出程序例程:halt为退出函数int SureQuitSureQuit = 2SureQui...
  • freeheart1977
  • freeheart1977
  • 2004年11月23日 20:31
  • 6538

pb 11.5 web开发 - 第一个应用

新建worksapce - pb115test,没什么可说的,和其他版本没什么差别新建target :    ...
  • xys_777
  • xys_777
  • 2009年07月31日 16:14
  • 6461

PB开发winCE

1.首先打开"New Platform",  2.在"Step 2"中选择"EMULATOR: X86"。在这里强调一点:能够运行PB创建的CE平台的环境有三种。第一种是真实环境,包括某一种CPU和支...
  • gkyh899
  • gkyh899
  • 2013年10月23日 23:37
  • 500

PB开发笔记(4)

//常用API函数例解1.如何使PB窗口总在最上层(Always On Top)  通过SetWindowPos函数把窗口的显示层次修改为HWND—TOPMOST,就可使指定窗口永远不会被其它窗口覆盖...
  • bjash
  • bjash
  • 2007年07月08日 11:02
  • 2949

pb三层架构

我们的pb程序很多是以前开发的,采用典型的CS架构,由程序直接连接数据库。现在需要改成在外网可以直接操作软件。先把数据库搬到了阿里云上,测试发现直接连数据库和VPN连接测试速度很慢,直连还容易掉线。服...
  • pcwe2002
  • pcwe2002
  • 2016年09月22日 00:46
  • 3103
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用PB开发报表系统
举报原因:
原因补充:

(最多只允许输入30个字)