PB数据管道的实用程序设计技术

上一篇 / 下一篇  2009-04-22 11:22:53 / 个人分类:PB

Powerbuilder(以下简称pb)提供强大数据管道技术(DataPipeline)。通过数据管道,我们可以在不同数据表之间移动数据,实现一个或多个表中的数据拷贝到一个新的或已经存在的目标数据表中。这种操作可以在同一数据中进行,也可以在不同数据,甚至可以在不同的DBMS之间进行。
我们通常使用数据管道的两种方式:

1、直接使用pb画板中提供的实用工具;

2、在应用程序中实现数据移动。

  本文着重结合具体实例讲述在应用程序中如何实现数据管道技术。在应用程序中使用数据管道有以下五个基本步骤:

1、 创建应用程序所需对象;

2、 执行数据管道初始化操作;

3、 启动数据管道;

4、 处理程序运行中移动数据的错误行;

5、 执行数据移动完毕后的收尾操作。

一、创建应用程序所需对象

  为了在应用程序中实现数据管道,需建立以下几个不同的对象:数据管道对象;支撑用户对象;窗口对象。

  创建数据管道对象。这是为实现管道功能所必须的,可在Powerbuilder提供的pipeline画板中创建并定义它的特征。示例在pipeline画板中创建应用程序需要的数据管道对象pipe_user_table01. 在此着重说明Commit和Max Errors文本框中参数的意义。 1、 Commit中选中ALL,为当所有行在管道操作完成后再向数据提交,如果操作过程中被终止,则撤消对表的所有操作。用户可以根据实际情况加以选择自己块操作的大小。

2、 Max Errors文本框中选中NO LIMIT,为不论有多少行出错都不终止管道操作。此处视实际编程需要可选其它数字。


  创建支撑用户对象。为了提供对属性、事件及函数的支持,需创建一个继承PB管道系统对象(pipelinesystem object)的用户对象,通过这个用户对象来管理管道操作。管道系统对象包括了不同的属性、事件及函数,在程序运行时可以用来管理一个管道对象。



下表为这些属性、事件及函数。

属性

DataObject,RowsRead,RowsWriten,RowsInError,Syntax

事件

PipeStart,PipeMeter,PipeEnd

函数

Start,Repair,Cancel



创建过程如下

(1)打开用户对象画板,单击New按钮,在New User Object 对话框中选择Class组框中的Standard作为用户对象类型。

(2)在Select Standard Class Type对话框中选取继承pipeline内置系统对象。

(3)声明管道监控实例。为使用户及时了解程序的运行情况,在创建支撑用户对象画板的工作区使用菜单项Declare Instance Variables中声明三个静态文本的监控实例:ist_status_read, ist_status_written, ist_status_error。编辑支撑对象的PipeMeter事件脚本,语句为:

ist_status_read.text=String(RowsRead)

ist_status_written.text=String(RowsWritten)

ist_status_error.text=String(RowsInError)

(4)保存用户对象。示例创建支撑用户对象命名为u_pipe_exchange。

  示例创建窗口对象w_yz_pipeline。为了完成与管道对象进行交互和监控,该窗口应完成以下基本操作:启动管道;发生错误,显示并修复错误;终止管道操作。在创建此对象时,必须包括一个数据窗口控件,此控件为数据管道提供错误行显示。并且,由应用程序提供此控件的数据窗口对象,不必由用户指定。 下表为窗口w_yz_pipeline中窗口控件说明:

控件类型

控件名

控件说明

单选按钮

Rb_create

创建新表

Rb_insert

插入到已有表

命令按钮

Cb_start

管道操作开始

Cb_stop

管道操作停止

Cb_close

关闭窗口

Cb_fixes

修复错误行

Cb_cancel

不修复错误行

数据窗口

Dw_written

写入数据信息数据窗口

Dw_errors

错误信息显示数据窗口

静态文本

St_status_connect

数据连接提示

St_status_read

已读行提示

St_status_written

写入行提示

St_status_error

错误行提示



二、执行数据管道初始化操作

执行初始化操作步骤

(1)连接管道操作的源数据和目标数据

首先在窗口w_yz_pipeline声明事务对象database_source和database_destination

连接数据脚本如下:

//连接源数据

database_source=Create transaction

// 为database_source 对象属性赋值

。。。

//连接语句

Connect using database_source;

//判断是否成功

if database_source.SQLCode $#@60;$#@62; 0 then

beep(1)

MessagBox(“系统出错:”,“源数据连接错误”, Exclamation!)

Halt

End if

//连接目标数据

database_destination=Create transaction

// 为database_ destination 对象属性赋值

。。。

//连接语句

Connect using database_ destination;

if database_destination.SQLCode$#@60;$#@62;0 then

beep(1)

MessagBox(“系统出错:”,“目标数据连接错误”, Exclamation!)

Halt

End if

(2)创建支撑用户对象实例。

//首先声明变量iuo_pipe_exchange:

u_pipe_exchange iuo_pipe_exchange

然后再在uevent_pipe_setup用户事件中创建u_pipe_exchange的实例并赋值给iuo_pipe_exchange变量:

iuo_pipe_exchange=CREATE u_pipe_exchange

(3)定义需使用的特定管道对象,即在相应事件脚本中把某一管道对象的字符串赋给支撑用户对象实例的DataObject属性值。本例中使用了两个不同的管道对象:pipe_user_table01和pipe_user_table02。Cb_start命令按钮的事件操作根据单选按钮的值来决定启动哪个管道对象进行操作,代码为:

if rb_create.checked=true then

iuo_pipe_exchange.dataobject=’pipe_user_table01’

else iuo_pipe_exchange=’pipe_user_table02’

end if


三、启动数据管道

  在做好初始化工作后,就可以启动管道操作了。为了实现这一功能首先需在相应的事件脚本中写入启动程序代码,利用支撑用户对象的Start函数来启动指定的管道操作。Start函数需指明如下参数:

数据的事务对象;

目标数据的事务对象;

显示错误信息的数据窗口控件;

在管道对象中定义的检索参数。缺省时,程序运行中自动让用户输入该参数值。

启动管道后,还需验证Start函数的值来判断操作成功与否。

示例脚本:

//database_source为源数据的事务对象

//database_destination为目标数据的事务对象

// dw_errors为显示错误信息的数据窗口控件

interger pipe_start_result

pipe_start_result=iuo_pipeline_exchange.Start(database_source,database_destination,&

dw_errors)

choose case pipe_start_result

case ?1

Beep(1)

MessageBox(“程序运行错误”,”管道打开失败”, Exclamation!)

Return

case ?3

Beep(1)

MessageBox(“程序运行错误”,”pipe_user_table01表已经存在”, Exclamation!)

Return

Case ?4

Beep(1)

MessageBox(“程序运行错误”,”pipe_user_table01表不存在”, Exclamation!)

Return

End choose

在写入数据信息窗口可以浏览管道操作成功的数据项,在此不再详细说明,用户可以参照数据窗口控件进行编程。


四、处理程序运行中移动数据的错误行

  Start函数把所有的错误行都放置于dw _errors数据窗口控件中,此数据窗口控件为每一行提供了一个错误信息列。

  数据窗口控件中一旦有错误行,用户可以进行修复或删除操作。注意将修复按钮和不修复按钮的enable属性赋值为true。同时,为监控程序进行的情况,在窗口w_yz_pipeline的open事件脚本中加入如下代码:

iuo_pipe_exchange.ist_status_read=St_status_read

iuo_pipe_exchange.ist_status_written=St_status_written

iuo_pipe_exchange.ist_status_error=St_status_error

  修复操作调用Repair函数,然后根据函数的返回值判断修复成功与否。相关按钮Clicked事件脚本如下:

if u_pipe_exchange.repair(database_destination) $#@60;$#@62; 1 then

beep(1)

MessageBox(“修复操作:”,“程序运行错误”,Exclamation!)

Return

End if

  不修复操作按钮Clicked事件脚本如下:

dw_errors.Reset()

五、执行数据移动完毕后的收尾操作

  当应用程序完成管道操作后,退出应用程序时,应释放管道操作开始时获得的一些资源。窗口w_yz_pipeline的close事件脚本如下:

//清除支撑用户对象实例

DESTROY u_pipe_exchange

//关闭与源数据的连接

DISCONNECT USING database_source

If database_source.SQLCode = -1 then

Beep(1)

MessageBox(“程序出错:”,”无法关闭源数据”,Exclamation!)

End if

//清除源事物对象实例

DESTROY database_source

//关闭与目标数据的连接

DISCONNECT USING database_destination;

If database_destination.SQLCode = -1 then

Beep(1)

MessageBox(“程序出错:”,”无法关闭目标数据”,Exclamation!)

End if

//清除目标事物对象实例

DESTROY database_destination

TAG: PB pipeline

 

评分:0

我来说两句

Open Toolbar