数据库

本类阅读TOP10

·SQL语句导入导出大全
·SQL Server日期计算
·SQL语句导入导出大全
·SQL to Excel 的应用
·Oracle中password file的作用及说明
·MS SQLServer OLEDB分布式事务无法启动的一般解决方案
·sqlserver2000数据库置疑的解决方法
·一个比较实用的大数据量分页存储过程
·如何在正运行 SQL Server 7.0 的服务器之间传输登录和密码
·SQL中两台服务器间使用连接服务器

分类导航
VC语言Delphi
VB语言ASP
PerlJava
Script数据库
其他语言游戏开发
文件格式网站制作
软件工程.NET开发
用PB开发报表系统

作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站

用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()的各种语法来实现对数据窗的修饰,如加入线条,加入文本、改变格式、颜色等。可修饰的内容如下图:

该工具主要有以下特点:

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源名及分类

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




相关文章

相关软件