`
wuhuizhong
  • 浏览: 686540 次
  • 性别: Icon_minigender_1
  • 来自: 中山
社区版块
存档分类
最新评论

Web Datawindow ActiveX使用经验

阅读更多

  其实,使用ActiveX本身实在是没有什么难度,Datawindow大家都很熟悉。这也是我没有把它写下来的动力的原因之一。不过在实施过程中,确实 还碰到过一些问题,也有一些心得,也还有解决不了的问题存在。我就做个总结吧,今天吃的比较饱,有些絮絮叨叨,希望大家忍了,哈哈。

    大家都知道,Web页面中做打印一般就两种方法:
    首先是写纯Web的打印,也就是使用Web自己的打印功能,用ExecWB命令,直接打印页面。说实在的我对HTML的语法是有些怵的,也只能算小半桶 水,经过一些了解,知道直接做Web页面打印难度对我来说很大,尤其是你要实现多层次的分组合计等等功能。项目紧迫也没有这个时间。

    那接下来,只能选择客户端打印控件了,我还真想去买一个好的控件用用,那多好啊,代码可以写的少些,代码执行效率,开发效率肯定也高,可惜我深知Boss的为人,这几K钱就给他省了吧。

    幸好我一直对PB的Web开发方案一直保持着兴趣,本人在n年前从PB6.5开始起就研究Web.PB,Window ActiveX,Datawindow ActiveX,到PowerJ,再到后来的Web Datawindow,虽然说,有些东东看起来象是玩具,有些么闭门造车,无法流行。不过勉为其难,土法上马还是可以解决些问题的。

    本来Web Datawindow还象个样子,不过Web Datawindow需要EAServer的支持。那就罢了,只有选择Web Datawindow ActiveX了。说实在的,它作为一个Web客户端打印工具还是非常好的,因为Datawindow功能是太强大了,哪怕ActiveX没有包含 Datawindow全部的功能,但是也足够打印使用了。其缺点就是界面比较难看单调,配不上那绚丽的Web页面效果。
  
    进入正题。
    首先要说明一下,我选择的是PB10版本的ActiveX控件。因为据我测试,从PB8到10都有些问题,PB8的ActiveX不支持WinXP, PB9的ActiveX竟然是已经过期了,IE上装不了(当然可能和我用盗版PB有关系,哦弥陀佛,罪过),而PB10是不支持Win98系统的。最后只 能不管Win98了,反正现在很少人用98了。
  
    首先必须有个页面来安装控件,把如下代码添加到html页面中。别忘记了将psdwc100.cab放到相应服务器目录下,因为Cab包比较大(2M多),这个页面作为一个独立的安装页面比较好。
    <OBJECT id="webdw" width="0" height="0" codeBase="/tmsweb/include/dwprint/psdwc100.cab#Version=10,0,1,3600" classid="CLSID:AAAA1503-AAAA-1000-8000-080009AC61A9" name="webdw">
  安装Web DataWindow控件失败!</OBJECT>

    页面写好了,发布到Web服务器,在客户端访问这个页面,安装插件即可。

    接下来在打印页面w_print.jsp中引用此控件:
     <OBJECT id="dw_print" height="0" width="0" classid="CLSID:AAAA1503-AAAA-1000-8000-080009AC61A9" name="dw_print">
     <PARAM NAME="SourceFileName" VALUE="">
     </PARAM>
     <PARAM NAME="DataWindowObject" VALUE="">
     </PARAM>
     <PARAM NAME="SuppressEvents" VALUE="false">
     </PARAM>
     <PARAM NAME="VScrollBar" VALUE="true">
     </PARAM>
     <PARAM NAME="HScrollBar" VALUE="true">
     </PARAM>
     <PARAM NAME="HSplitScroll" VALUE="true">
     </PARAM>

     以下都是javacript脚本:
      然后,设置打印用的datao b j e c t:
    dw_print.SourceFileName="/tmsweb/pdwo/trafficorder_record.pbd"
    dw_print.DataWindowObject="trafficorder_record"

    //我所使用的是有两个子报表的NestReport作为例子,其他报表更简单
    //这里获取子报表控件
    dw_print.GetChild("dw_header")
    print_h=dw_print.GetChildObject()
    dw_print.GetChild("dw_detail")
    print_d=dw_print.GetChildObject()

    //开始填入打印用的数据
    //因为是ActiveX客户端控件,因此不方便直接连接数据库来取数据,所以我这里是首先通过Web的方式
    //获取到打印用的数据到客户端的一个类似datawindow的对象中,然后复制给dw_print的。
    print_h.reset();print_d.reset()
    dw_header.rowscopy_a(1,1,print_h)
    dw_detail.rowscopy_a(1,dw_detail.rowcount(),print_d)
    其中,dw_header,dw_detail是页面中的htc客户端控件,rowscopy_a我想就不用解释了,后续会贴出其完整代码。

    在rowscopy后,如果还需要对dw_print中的某些字段赋值,则比如调用:
    setitem(print_h,1,"year_1",“2006”)
    其中setitem方法是一个js函数,稍后贴出其代码。

    现在,dw_print的子报表的数据都已经填充好了,可以预览打印了,
    因为这里是复合报表,datawindow自动预览的,因此就不需要设置预览属性了,
    如果是一般的grid类型窗口,最好是设置预览属性,这样可以看得出页面的大小,打印页数等。
    设置的时候用dw_print.modify()方法,用dw_print.Object.DataWindow.Print.Preview的方式是不行的,
    Activex不支持。

    最后,就可以打印了。
    if (confirm("是否打印?"))
        {
            dw_print.print(false)
        }
  
    很简单,是不是?

    附录:
    setitem方法:
    function setitem(dw_print,row,column,value)
{
    var datavalue,datatype
  
    datatype = dw_print.Describe(column+".Coltype")
          
    if (datatype.indexOf("char",0)>=0)
    {
        datavalue=value
    }else if (datatype.indexOf("decimal",0)>=0 || datatype.indexOf("number",0)>=0||datatype.indexOf("long",0)>=0)
    {
        datavalue=parseFloat(value)
    }else if (datatype.indexOf("integer",0)>=0)
    {
        datavalue=parseInt(value)
    }else if (datatype.indexOf("date",0)>=0)
    {
        alert("有系统不支持的Date,Datetime类型["+column+"],请检查打印数据源")
    }else
    {
        datavalue=value
    }
  
    dw_print.setitem(row,column,datavalue);
}

rowscopy_a方法:
function RowsCopy_A(ai_start,ai_end,aobj_dw)
{
    var ll_columncount
    var datatype
    var datavalue
  
    if (ai_start<=0) return -1;
    if (ai_end >RowCount()) ai_end=RowCount();
  
    ll_columncount=getColumnCount();
    for (var i=ai_start;i<=ai_end;i++)
    {
        row=aobj_dw.insertrow(0);  
        for (var k=0;k<ll_columncount;k++)
        {          
            if ((Columns[k].ColumnType!=null)&&
                (Columns[k].ColumnType.Trim().toLowerCase()=="computed")&&
                (typeof(Columns[k].ColumnType)!="undefined")) continue              
            datatype = aobj_dw.Describe(Columns[k].ColumnName+".Coltype")
            if (datatype.indexOf("char",0)>=0)
            {
                datavalue=getItemWithID(i,k+1)
            }else if (datatype.indexOf("decimal",0)>=0 || datatype.indexOf("number",0)>=0||datatype.indexOf("long",0)>=0)
            {
                datavalue=parseFloat(getItemWithID(i,k+1))
            }else if (datatype.indexOf("integer",0)>=0)
            {
                datavalue=parseInt(getItemWithID(i,k+1))
            }else if (datatype.indexOf("date",0)>=0)
            {
                alert("有系统不支持的Date,Datetime类型["+Columns[k].ColumnName+"],请检查打印数据源")
            }else
            {
                datavalue=getItemWithID(i,k+1)
            }
            datavalue = getDisplayValue(row,Columns[k].ColumnName,datavalue)
            aobj_dw.setitem(row,Columns[k].ColumnName,datavalue);
        }
    }
    return 1;
}

这里要说明一下,现在维一解决不了的问题是,我在javascript中无法找到一个类型能够匹配Datawindow的datatime类型列, 而如果不转换直接赋值,是没有效果的。可能是我对javascript的研究还不够吧?如果有那位兄弟知道解决办法,请告诉我。我现在只能在pbl中把 datatime列都先用convert转换为string类型。

分享到:
评论

相关推荐

    Datawindow Web ActiveX 应用实例

    2、本例子使用的技术是:Datawindow Web ActiveX + C# 3、由于Datawindow Web ActiveX的限制,本例子只能运行于IE浏览器 4、本例子采用SQLSERVER2008数据库,理论上支持SQLSERVER2005数据库,如果不使用真分页控件的...

    《PowerBuilder 9.0 Web开发篇》配书光盘实例

    第3章 Plug-in与Window ActiveX实现技术 第4章 Web DataWindow实现技术 第5章 Web ActiveX实现技术 第6章 Web Services实现技术 第7章 PowerBuilder与XML

    怎样用PowerBuilder开发WEB应用

    综上所述,PowerBuilder通过Web.PB、插件和ActiveX技术提供了在WEB环境下开发应用的解决方案,结合其强大的数据窗口和PowerScript语言,使得开发人员能够在浏览器端提供类似桌面应用的体验,同时利用服务器端的强大...

    datawindwo.net 程序

    脚本回调的关键在于,它利用了“Microsoft.XMLHTTP”ActiveX对象(非IE浏览器使用XMLHttpRequest对象)作为客户端回调管理器组件的底层协议,因此,XML RenderFormat与脚本回调有天然的兼容性。 XML RenderFormat...

    PB技巧大全汇总下载

    8. **高级功能**:如Web服务集成、ActiveX控件使用、用户自定义函数和类的创建等。 9. **版本控制与团队协作**:PB在版本控制工具如SVN或Git下的使用策略,以及如何在团队中有效协作。 10. **最佳实践与案例分析**...

    PB使用中的一些资料及技巧

    1. **Web服务**:PB可以调用Web服务(SOAP或RESTful),将PB应用程序与Web应用程序进行集成。 2. **DLL/ActiveX**:通过调用DLL或ActiveX组件,PB能与非PB环境下的代码进行交互,增强功能。 3. **Excel导出**:使用...

    PowerBuilder控件使用介绍

    Microsoft WebBrowser 控件是基于Internet Explorer的一个ActiveX控件,它允许开发者在应用程序中嵌入网页浏览器的功能。在PowerBuilder中使用该控件的步骤如下: - 在PowerBuilder的窗口中插入OLE对象。 - 通过...

    powerbuilder编程经验谈.

    - **DataWindow**:PB的核心特性之一,DataWindow是用于数据展示和操作的强大组件,能处理复杂的SQL查询,支持多种数据库系统。 2. **数据库连接与操作** - **ADO.NET与ODBC**:PB可以使用ADO.NET或ODBC进行...

    修改窗口对象属性

    在 PowerBuilder、Web DataWindow 和 Web ActiveX 中,该方法的语法为: ```plaintext string dwcontrol.Modify(string modstring) ``` - **dwcontrol**: 指向一个数据窗口控件、数据存储或子数据窗口的引用。 - *...

    PowerBuilder8.0 开发工具下载

    9. **ActiveX Control**:开发人员可以将PowerBuilder组件作为ActiveX控件发布,供其他应用程序使用。 10. **Internationalization and Localization**:支持多语言和全球化,便于构建适用于不同地区和文化的软件。...

    powerbuilder8.0

    7. **Applet和ActiveX Support**:PowerBuilder 8.0 可以生成Java Applet或ActiveX控件,使得应用程序能在Web浏览器中运行,拓展了应用程序的分发和使用范围。 8. **PBL(PowerBuilder Library)和Workshop**:PBL...

    1几种数据库开发工具的介绍[归类].pdf

    使用C++ Builder和Delphi,开发者可以利用VCL(Visual Component Library)或FireMonkey框架来构建高效的桌面、移动和Web应用程序。C++ Builder采用C++语言,支持COM、ActiveX等技术,Delphi则使用Object Pascal语言...

    PB的ppt教案

    9. **高级特性**:可能涉及PowerScript(PowerBuilder的内置脚本语言)、用户自定义函数(UDF)、ActiveX集成、Web服务等高级主题,提升开发能力。 10. **最佳实践和调试技巧**:学习如何编写高效、可维护的代码,...

    Power Builder6.5

    在6.5版本中,PowerBuilder开始支持Internet应用开发,引入了Web DataWindow,使得开发Web应用程序成为可能。Web DataWindow可以将数据窗口转换为HTML格式,通过HTTP协议传输到客户端,从而实现了B/S架构的应用开发...

    学习PowerBuilder必备教程

    PowerBuilder可以与其他系统进行接口集成,如通过COM/ActiveX组件与.NET或Java应用交互,或者使用Web服务接口与外部系统通信。 10. 实例分析与实战项目: 结合实例学习是最好的教学方式。通过完成实际项目,如...

    Appeon for PowerBuilder常见问题

    A: APB 在客户端使用的是 ActiveX 技术,服务器端使用的是 J2EE 技术,包括Servlet、EJB、JDBC。APB 综合使用了 ActiveX 技术和 J2EE 技术。JSP 则主要是服务器端的技术,给客户端传来的是 HTML 标记的文档,用于...

    PowerBuilder课件

    学会使用PowerBuilder的调试工具,定位和解决代码中的错误,同时了解性能优化策略,提高应用程序的运行效率。 9. **PowerBuilder的扩展与集成**: PowerBuilder支持与其他系统和工具的集成,例如.NET Framework、...

    PowerBuilder6.0用户参考手册

    9. **高级特性**:包括Web发布、ActiveX集成、远程数据服务(RDS)等,这些特性使PowerBuilder能够适应不断变化的技术环境。 10. **最佳实践与案例分析**:手册可能会提供一些实际项目案例,帮助读者将理论知识应用...

    黄国酬 dw2xls 最新版

    OCX(OLE Control Extension)是微软ActiveX技术的一部分,用于创建和使用ActiveX控件。 5. **PB9版本**:指的是该工具兼容PowerBuilder 9.0版本。PowerBuilder 9是Sybase公司发布的一个版本,它提供了许多新特性,...

    Powerbuilder技术精粹

    同时,可能还会涉及到Web服务、ActiveX控件的使用等。 8. **集成开发环境(IDE)**:熟悉PB的开发环境,如代码编辑器、调试器、版本控制工具的使用,提升开发效率。 9. **最佳实践和案例分析**:书中可能会提供...

Global site tag (gtag.js) - Google Analytics