PB 动态创建数据窗口_powerbuilder 动态分组-程序员宅基地

    在实际应用中,经常需要根据用户需求来动态创建数据窗,一般方法是这样的。
    在一个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_syntax = '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,ls_present,ls_syntax
    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 A120
    ls_present = "style(type=tabular)"
    ls_syntax = SQLCA.SyntaxFromSQL(lsSQLstr, ls_present , lserr)
    
    if len(lserr) > 0 then
       messageBox('Error', ‘Create DW syntax failed! ~r~n’ + lserr)
       return -1
    end if
    dw_1.Create(ls_syntax,lserr) //创建动态数据窗口dw_1
    If Len(lserr)>0 Then
      //如果创建动态数据窗口dw_1失败,则显示错误信息并退出
      messagebox("错误信息!",lserr)
      Return
    end if
    dw_1.SetTransobject(SQLCA)
    dw_1.retrieve( )
    //以下设置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图标即告完成。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/xiaokaibupabupa/article/details/20542997

智能推荐

2024最新计算机毕业设计选题大全-程序员宅基地

文章浏览阅读1.6k次,点赞12次,收藏7次。大家好!大四的同学们毕业设计即将开始了,你们做好准备了吗?学长给大家精心整理了最新的计算机毕业设计选题,希望能为你们提供帮助。如果在选题过程中有任何疑问,都可以随时问我,我会尽力帮助大家。在选择毕业设计选题时,有几个要点需要考虑。首先,选题应与计算机专业密切相关,并且符合当前行业的发展趋势。选择与专业紧密结合的选题,可以使你们更好地运用所学知识,并为未来的职业发展奠定基础。要考虑选题的实际可行性和创新性。选题应具备一定的实践意义和应用前景,能够解决实际问题或改善现有技术。

dcn网络与公网_电信运营商DCN网络的演变与规划方法(The evolution and plan method of DCN)...-程序员宅基地

文章浏览阅读3.4k次。摘要:随着电信业务的发展和电信企业经营方式的转变,DCN网络的定位发生了重大的演变。本文基于这种变化,重点讨论DCN网络的规划方法和运维管理方法。Digest: With the development oftelecommunication bussiness and the change of management of telecomcarrier , DCN’s role will cha..._电信dcn

动手深度学习矩阵求导_向量变元是什么-程序员宅基地

文章浏览阅读442次。深度学习一部分矩阵求导知识的搬运总结_向量变元是什么

月薪已炒到15w?真心建议大家冲一冲数据新兴领域,人才缺口极大!-程序员宅基地

文章浏览阅读8次。近期,裁员的公司越来越多今天想和大家聊聊职场人的新出路。作为席卷全球的新概念ESG已然成为当前各个行业关注的最热风口目前,国内官方发布了一项ESG新证书含金量五颗星、中文ESG证书、完整ESG考试体系、名师主讲...而ESG又是与人力资源直接相关甚至在行业圈内成为大佬们的热门话题...当前行业下行,裁员的公司也越来越多大家还是冲一冲这个新兴领域01 ESG为什么重要?在双碳的大背景下,ESG已然成...

对比传统运营模式,为什么越拉越多的企业选择上云?_系统上云的前后对比-程序员宅基地

文章浏览阅读356次。云计算快速渗透到众多的行业,使中小企业受益于技术变革。最近微软SMB的一项研究发现,到今年年底,78%的中小企业将以某种方式使用云。企业希望投入少、收益高,来取得更大的发展机会。云计算将中小企业信息化的成本大幅降低,它们不必再建本地互联网基础设施,节省时间和资金,降低了企业经营风险。科技创新已成时代的潮流,中小企业上云是创新前提。云平台稳定、安全、便捷的IT环境,提升企业经营效率的同时,也为企业..._系统上云的前后对比

esxi网卡直通后虚拟机无网_esxi虚拟机无法联网-程序员宅基地

文章浏览阅读899次。出现选网卡的时候无法选中,这里应该是一个bug。3.保存退出,重启虚拟机即可。1.先随便选择一个网卡。2.勾先取消再重新勾选。_esxi虚拟机无法联网

随便推点

在LaTeX中使用.bib文件统一管理参考文献_egbib-程序员宅基地

文章浏览阅读913次。在LaTeX中,可在.tex文件的同一级目录下创建egbib.bib文件,所有的参考文件信息可以统一写在egbib.bib文件中,然后在.tex文件的\end{document}前加入如下几行代码:{\small\bibliographystyle{IEEEtran}\bibliography{egbib}}即可在文章中用~\cite{}宏命令便捷的插入文内引用,且文章的Reference部分会自动排序、编号。..._egbib

Unity Shader - Predefined Shader preprocessor macros 着色器预处理宏-程序员宅基地

文章浏览阅读950次。目录:Unity Shader - 知识点目录(先占位,后续持续更新)原文:Predefined Shader preprocessor macros版本:2019.1Predefined Shader preprocessor macros着色器预处理宏Unity 编译 shader programs 期间的一些预处理宏。(本篇的宏介绍随便看看就好,要想深入了解,还是直接看Unity...

大数据平台,从“治理”数据谈起-程序员宅基地

文章浏览阅读195次。本文目录:一、大数据时代还需要数据治理吗?二、如何面向用户开展大数据治理?三、面向用户的自服务大数据治理架构四、总结一、大数据时代还需要数据治理吗?数据平台发展过程中随处可见的数据问题大数据不是凭空而来,1981年第一个数据仓库诞生,到现在已经有了近40年的历史,相对数据仓库来说我还是个年轻人。而国内企业数据平台的建设大概从90年代末就开始了,从第一代架构出现到..._数据治理从0搭建

大学抢课python脚本_用彪悍的Python写了一个自动选课的脚本 | 学步园-程序员宅基地

文章浏览阅读2.2k次,点赞4次,收藏12次。高手请一笑而过。物理实验课别人已经做过3、4个了,自己一个还没做呢。不是咱不想做,而是咱不想起那么早,并且仅有的一次起得早,但是哈工大的服务器竟然超负荷,不停刷新还是不行,不禁感慨这才是真正的“万马争过独木桥“啊!服务器不给力啊……好了,废话少说。其实,我的想法很简单。写一个三重循环,不停地提交,直到所有的数据都accepted。其中最关键的是提交最后一个页面,因为提交用户名和密码后不需要再访问其..._哈尔滨工业大学抢课脚本

english_html_study english html-程序员宅基地

文章浏览阅读4.9k次。一些别人收集的英文站点 http://www.lifeinchina.cn (nice) http://www.huaren.us/ (nice) http://www.hindu.com (okay) http://www.italki.com www.talkdatalk.com (transfer)http://www.en8848.com.cn/yingyu/index._study english html

Cortex-M3双堆栈MSP和PSP_stm32 msp psp-程序员宅基地

文章浏览阅读5.5k次,点赞19次,收藏78次。什么是栈?在谈M3堆栈之前我们先回忆一下数据结构中的栈。栈是一种先进后出的数据结构(类似于枪支的弹夹,先放入的子弹最后打出,后放入的子弹先打出)。M3内核的堆栈也不例外,也是先进后出的。栈的作用?局部变量内存的开销,函数的调用都离不开栈。了解了栈的概念和基本作用后我们来看M3的双堆栈栈cortex-M3内核使用了双堆栈,即MSP和PSP,这极大的方便了OS的设计。MSP的含义是Main..._stm32 msp psp

推荐文章

热门文章

相关标签