PB datawindows 动态创建数据窗口

2023-05-16


  在实际应用中,经常需要根据用户需求来动态创建数据窗,一般方法是这样的。
  在一个window中加入一个数据窗控件,如dw_new,但是该数据窗没有data object,(空白的)就可以用以下语法来创建:
  dw_new.create(ls_syntax,ls_error) // 创建语法,错误信息
  ls_syntax可以用以下三种方法来形成:

  一、动态由sql语法创建:
  // 连接到pb的example数据库
  string ls_sql,ls_syntax,ls_error
  ls_sql= 'select * from department'
  ls_syntax = sqlca.SyntaxFromSQL(ls_sql,'style(type=grid)',ls_error)
  if len(ls_error) >0 then
   messagebox('Error','SyntaxFromSQL Error:~r'+ls_error)
  else
   dw_new.create(ls_syntax,ls_error)
   if len(ls_error) >0 then
    MessageBox("Error", "Create have these errors: ~r" + ls_error)
   else
    dw_new.settransobject(sqlca)
    dw_new.retrieve()
   end if
  end if

  二、由另一个数据窗的syntax来创建
  string ls_syntax,ls_error
  ls_syntax = dw_test.describe('datawindow.syntax')
  dw_new.create(ls_syntax,ls_error)
  if ls_error <> '' then
   messagebox('Create Error',ls_error)
  else
   dw_new.settransobject(sqlca)
   dw_new.retrieve()
  end if

  三、读取psr文件来创建
  string ls_syntax,ls_error,ls_ret
  ls_ret = char(13)+char(10) //回车键
  int li_fileNum
  long li_length
  li_FileNum = FileOpen("efef.psr",Streammode!, read!, shared!, Replace!)

  if li_filenum >0 then
   FileSeek(li_FileNum, 158, FromBeginning!)
   li_length = fileRead(li_filenum,ls_syntax)
  end if
  fileclose(li_filenum)
  if li_length = 0 then return
  ls_syntax = "release 5;"+ls_ret+ls_syntax

  //截掉ls_syntax中的数据部分,5.0以"sparse(names="dept_name?) "作为参考位置
  //6.0以html(作为参考位置
  long pos1,pos2
  pos1 = pos(ls_syntax,'sparse(names="',1)
  pos2 = pos(ls_syntax,'"',pos1 +16)
  ls_syntax = left(ls_syntax,pos1) + mid(ls_syntax,pos1 +1,pos2 - pos1 +1)
  dw_New.create(ls_syntax,ls_error)
  if ls_error <> '' then
   messagebox('Create Error',ls_error)
  else
   dw_new.settransobject(sqlca)
   dw_new.retrieve()
  end if
  //pb6,pb7的代码可以参照pb5自己写,只是文件头和数据窗结束标记不同而已。

  PowerBuilder用Create()函数创建动态数据窗口,其语法格式为:dw.Create(Syntax[,ErrString])
  其中:dw为需创建的动态数据窗口名;Syntax为创建动态数据窗口的语法字符串;ErrString为可选参数,用来存放发生错误时的错误信息,若忽
略,发生错误时系统自动显示消息框,一般不符我们需要,所以需定义该参数。

  显然重点在Syntax, PowerBuilder提供LibraryExport()与SyntaxFromSQL()二个函数来达到这个目的:

  一、 LibraryExport()函数
  功能:从PowerBuilder库中输出一个对象,返回该对象的语法。
  语法格式:LibraryExport(LibName,ObjName,ObjType)
  其中:LibName 为带路径的PowerBuilder库名,若未指定路径,则按系统标准搜索路径搜索;ObjName为导出对象名,现为LibName中的数据窗口
对象名;ObjType为该对象的类型,现为数据窗口,值为ExportDataWindow!。示例如下:
  String ls_DwSyntax,ls_Error
  ls_DwSyntax=LibraryExport("C:\PBExam\dy_dw.pbl","d_tbl1", ExportDataWindow!)
  //数据窗口dw_1的产生下面将详细讨论,现暂略
  dw_1.Create(ls_DwSyntax,ls_Error)
  //以下语句与下面示例中的相同,故此处略。
  LibraryExport()函数是利用已有的数据窗口对象创建动态数据窗口,有一定的使用价值,但不多见。

  二、 SyntaxFromSQL()函数
  功能:基于SQL的SELECT 语句产生创建数据窗口的语法。
  语法格式:Transaction.SyntaxFromSQL(SqlString,StyleString,ErrorString)
  其中:Transaction.为已连接的事务对象,一般即为SQLCA;SqlString为SQL--SELECT 语句;Stylestring为数据窗口的显示风格字符串,比较复
杂,一般常用"Style(Type=Grid)";ErrorString用来存放发生错误时的错误信息。
  一般来说,SyntaxFromSQL()函数灵活性高、功能强,因此创建动态数据窗口大都使用该函数,下面的示例也是使用该函数。

  三、创建动态数据窗口的一般步骤
  创建动态数据窗口的一般步骤如下:
  1、在某窗口(如w_main)上用鼠标点建一个数据窗口控件(如dw_1),其DataObject为空。
  2、构造SyntaxFromSQL()函数的语法字符串。这是PowerBuilder动态数据窗口的关键,稍为复杂一些,具体做法请见下面实例。
  3、用Create()函数创建动态数据窗口dw_1,并用SetTransObject()函数为其分配事务对象,具体做法请见下面实例。
  这种方法的主要缺点是必须在设计阶段先建数据窗口控件,运行时无法增减,这对于一些较为特殊的应用(如设计阶段尚不知需几个数据窗口)
就不太适合了。那如何解决这个问题呢?经过一番摸索并查阅了一些资料,终于找到了二种解决方法,现分别介绍如下:   1、创建一个标准可视数据窗口用户对象u_d_sample
  PowerBuilder6.0/6.5中步骤为:点击工具栏上的UserObject图标,在弹出的Select User Object窗口中点击New按钮,出现New User Object窗口,双击其中Visual下的Standard图标, 在弹出的Select Standard Visual Type窗口中双击datawindow选项,即出现User Object(Untitled)窗口,点击工具栏上的Save图标,弹出的Save User Object窗口,在User Objects: 中输入u_d_sample回车即进入User Object---u_d_sample窗口,关闭该窗口,标准可视数据窗口用户对象u_d_sample即告建成。

  PowerBuilder7.0中步骤为:点击工具栏上的New图标,在弹出的New窗口中选择Object页面,双击其中的Standard Visual图标, 在弹出的Select Standard Visual Type窗口中双击datawindow选项,出现User Object(Untitled)inherited from datawindow窗口,将其右边的Title栏中的none删除,再点击左边空白区,然后点击工具栏上的Save图标,以后的操作步骤与PowerBuilder6.0/6.5大致相同。至于PowerBuilder8.0则与PowerBuilder7.0大体相同,不再赘述。

  2、直接定义DataWindow型变量dw_1如下:
  DataWindow dw_1
  dw_1=Create DataWindow
  其实第1种方法还须定义dw_1,形式如下:
  u_d_sample dw_1
  dw_1=Create u_d_ sample //此句可省略
  这二种方法的关键都是使用OpenUserObject()函数,其功能即为打开一个用户对象,语法格式:w_name.OpenUserObject(ObjName[,x,y]) 其中ObjName为需打开的用户对象名;x、y为用户对象的打开位置,省略时值均为0。
  下面请见具体实例, 该实例在Win98、PowerBuilder8.0/PowerBuilder7.0/PowerBuilder6.5下通过,ODBC数据源已配置,为FoxPro25(可根据需要使用其他数据库),数据表为bb.dbf。请先建窗口w_main,在其Open事件中写入以下代码:(注意:PowerBuilder8.0中先须创建WorkSpace(*.pbw),其他操作基本同PowerBuilder7.0)

  //动态数据窗口dw_1创建实例
  string lserr,lsSQLstr,lsDWsyntax,lserrC
  SQLCA.DBMS="ODBC"
  SQLCA.DBParm="ConnectString='DSN=FoxPro25'" //本例使用FoxPro25数据库,可根据需要用其他数据库
  Connect;
  //下面3条语句即为关键,若dw_1为鼠标点建请删除这3条语句,否则会出错。
  DataWindow dw_1 //若采用数据窗口用户对象u_d_sample,则可改为:u_d_sample dw_1
  dw_1=Create DataWindow //若采用数据窗口用户对象u_d_sample,此句应去除。
  OpenUserObject(dw_1)
  //Select…As…的As可将列标题显示为As之后的字符,较为灵活方便。
  //可根据实际情况设计生成Select语句及Where子句的可视化界面
  lsSQLstr="Select A12 As 主管部门,A01 As 法人代码,mc As 企业名称,A06 From bb Where A12 <'1'"
  lsDwsyntax=SQLCA.SyntaxFromSQL(lsSQLstr,"style(type=Grid)",lserr) //构造SyntaxFromSQL()函数
  If Len(lserr)>0 Then
   //如果构造SyntaxFromSQL()函数失败,则显示错误信息并退出
   messagebox("错误信息!",lserr)
   Return
  end if
  dw_1.Create(lsDwsyntax,lserrC) //创建动态数据窗口dw_1
  If Len(lserrC)>0 Then
   //如果创建动态数据窗口dw_1失败,则显示错误信息并退出
   messagebox("错误信息!",lserrC)
   Return
  end if
  //以下设置dw_1的一些属性,可根据实际需要设置。
  dw_1.X=5
  dw_1.Y=5
  dw_1.width=1500
  dw_1.height=650
  dw_1.Visible=True
  dw_1.Enabled=True
  dw_1.HScrollBar=True
  dw_1.VScrollBar=True
  //为dw_1分配事务对象SQLCA
  dw_1.SetTransObject(SQLCA)
  //提取数据
  dw_1.Retrieve()

  第2种方法的优点大家一看即知,不必费劲去创建一个标准可视数据窗口用户对象,但存在不足之处:不能在窗口w_main的其他事件或控件中引用dw_1。解决方法很简单:将dw_1定义为实例变量(Instance Variable)。PowerBuilder6.0/6.5中:在窗口画笔(w_main)的菜单上点击Declareà Instance Variables…,在弹出窗口Declare Instance Variables中输入datawindow dw_1, 点击Ok按钮即告完成。PowerBuilder7.0/8.0中:打开窗口画笔,在其下半部的窗口Declare Instance Variables中输入datawindow dw_1, 点击工具栏上的Save图标即告完成。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PB datawindows 动态创建数据窗口 的相关文章

  • 将UIColor转换为RGB值

    objc view plain copy 将UIColor转换为RGB值 NSMutableArray changeUIColorToRGB UIColor color NSMutableArray RGBStrValueArr 61 NS
  • 业余时间你在做什么,你就会变成什么样的人?

    改变 xff0c 从业余时间开始 博客定位 xff1a 技术 43 思考 其余统统不要 2017 xff0c 我来了 xff01
  • Xcode9 无证书真机调试

    写在前面 公司分配了新的测试机 证书99台名额已满 所以上网找教程 学习了一下如何使用Xcode无证书进行真机调试 一 创建证书 1 运行Xcode xff0c Xcode Preference 添加账号 xff08 能在appstore下
  • CSP考试复习:第一单元 C++语言基础 1.1 程序结构

    第一单元 C 43 43 语言基础 1 1 程序结构 1 程序框架 注释 xff1a 注释有两种 xff0c 一种是 xff0c 另一种是 必须单独放置一行 xff0c 或代码所在行 的后面 xff1b 而 成对存在 xff0c 可以插入到
  • Intel Realsense T265开箱测试

    前言 xff1a 最近因为要做VIO xff0c 在实验室蹭到一个Realsense T265来用 xff0c 仅此记录下简单测试过程 xff08 官方文档写非常清楚 xff0c 建议详细阅读 xff0c 链接 xff1a https gi
  • posix thread介绍

    xfeff xfeff posix thread是 操作系统级 xff08 OS level xff09 的API规范 xff0c 主要用来定义线程及线程间同步的相关操作 xff0c 采用C语言定义 posix规范主要在unix like类
  • PX4飞控之自主起飞Takeoff控制逻辑

    本文主要以PX4飞控1 5 5版本为例 xff0c 介绍Navigator中自主起飞 xff08 Takeoff xff09 算法控制逻辑 注 xff1a mission任务中的自主起飞与此模块不同 Takeoff与导航中的其他模块类似 x
  • PX4飞控之导航及任务架构

    本文重点介绍PX4飞控的Navigator和mission控制框架和逻辑 Navigator导航部分是无人机自主飞行控制的核心所在 xff0c 其中包括自主起飞 自主降落 自主返航 自主任务以及GPS失效保护等各个部分 搞懂这个部分有助于理
  • PX4飞控之位置控制(1)整体架构

    位置控制是无人机飞控的核心算法之一 xff0c 一方面根据commander中的flag标志位和Navigator中提供的航点信息进行控制 xff08 自主模式下 xff09 xff0c 另一方面得到期望姿态角 xff08 setpoint
  • spring整合ehcache找不到org.springframework.cache.ehcache.EhCacheCacheManager的解决方案

    一般org springframework cache ehcache EhCacheCacheManager和org springframework cache ehcache EhCacheManagerFactoryBean会同时找不
  • CC3200之GPIO引脚分析

    预备知识 xff1a xff08 1 xff09 volatile关键字 xff1a volatile定义的变量一般为无需开发者自己赋值 xff0c 会自动改变的变量 在普通的程序中 xff0c 编译器都具有优化功能 xff0c 为了避免浪
  • OpenStack 之 OVS介绍

    一 概述 Open vSwitch的官方定义 xff1a Open vSwitch是一个具有工业级质量的多层虚拟交换机 通过可编程扩展 xff0c 可以实现大规模网络的自动化 xff08 配置 管理 维护 xff09 它支持现有标准管理接口
  • OVN是OVS 5倍的性能--性能测试报告

    我们已经对OVN做了许多次的性能测试 xff0c 但是缺少一个OVN和 xff08 ML2 43 OVS xff09 的性能对比测试 我和许多人一起对比了这2种后端 本文是第一部分 xff1a 控制平面的性能对比 后面会另外发文公布数据平面
  • OpenStack 中的5种分配IPv6地址的方式

    在OpenStack Pike版本中创建IPv6子网时 xff0c 有五种设置地址方式供选择 上图中这五种方式显示不全 xff0c 现将其全部展示 No options specified xff08 Default xff09 xff0c
  • STM32 | TCP通信实例分析

    1024G 嵌入式资源大放送 xff01 包括但不限于C C 43 43 单片机 Linux等 关注微信公众号 嵌入式大杂烩 xff0c 回复1024 xff0c 即可免费获取 xff01 前言 关于socket的笔记 xff0c 之前已经
  • RT-Thread和Freertos的区别?

    关注 嵌入式大杂烩 xff0c 选择 星标公众号 一起进步 xff01 Freertos是一个国外推出的一个迷你的实时操作系统内核 xff0c 开源 xff0c 功能包括 xff1a 任务管理 时间管理 信号量 消息队列 内存管理 记录功能
  • C语言 | 函数指针作为函数的参数

    1024G 嵌入式资源大放送 xff01 包括但不限于C C 43 43 单片机 Linux等 关注微信公众号 嵌入式大杂烩 xff0c 回复1024 xff0c 即可免费获取 xff01 函数指针有两种常用的用法 xff0c 一种是作为结
  • 解析I2C通信协议

    一 I2C的概念 1 I2C总线是PHLIPS公司推出的一种串行总线 xff0c I2C总线只有两根双向信号线 其中一根是数据线SDA xff0c 另一根是时钟线SCL 2 每个接到I2C总线上的器件都有唯一的地址 发送数据到总线上的称为发
  • uCOS-II任务间通信之信号量 [转载]

    uCOS II任务间通信之信号量 信号量是什么 xff1f 信号量有什么用 xff1f 信号量是可以用来表示一个或多个事件的发生 xff0c 还可以用来对共享资源的访问 uCOS II提供了5个对信号量进行操作的函数 如下所示 xff1a
  • 关于STM32串口3的使用,接收并解析一帧数据

    关于STM32串口3的使用 xff0c 接收并解析一帧数据 当stm32的串口1被使用时 xff0c 我们可以使用其他串口来使用 步骤 xff1a 串口3定义 初始化 xff1b 串口3中断服务函数 接收的一帧数据并判断是否正确 xff1b

随机推荐