• PB中外部数据源数据窗口中动态创建列


       公司原来做的横向报表用pb的外部数据源的做的,只支持固定列,列数相当于是在数据窗口中固定好的,横向的数据项一多,列就支持不了,需要自己在跑到数据窗口中增加,改程序,于是想列的创建能不能改成动态的呢?通过数据窗口的语法工具,发现有办法:

    <DW Control Name>.Modify(&
    "create  column( id=<an integer> tabsequence=<an integer> accelerator='<a single letter>' moveable=<0 - False, 1 - True> resizeable=<0 - Fals...."

    然后用edit source打开数据窗口,发现每一列都有对应的语法,

    column(band=detail id=1 alignment="0" tabsequence=32766 border="0" color="33554432" x="9" y="8" height="68" width="411" format="[general]" html.valueishtml="0"  name=szybh01 visible="1" edit.limit=14 edit.case=any edit.focusrectangle=no edit.autoselect=yes edit.autohscroll=yes edit.imemode=0  font.face="宋体" font.height="-9" font.weight="400"  font.family="0" font.pitch="2" font.charset="134" background.mode="1" background.color="536870912" )

    按理说,通过在该语法的前边加上create ,然后放到Modify中就可以了,但是没有效果,

    然后通过ls_syntax = adw_main.Describe("datawindow.syntax"),查开语法,列的语法已经在数据窗口的语法中了,原来Modify函数,就是对数据窗口语法的增加或修改的函数,经查看,发现原因是出现在id上,每一个数据窗口的列,对应的是数据窗口语法table中column中的id,而这个id就是列的序号,这样就需要在table中,将需要增加列到table的语法中,而id就以 Long(adw_main.object.datawindow.column.count) + 1 为开始的id。

    这样算法就确定了

    //获取数据窗口语法
    String ls_syntax
    ls_syntax = adw_main.Describe("datawindow.syntax")
    Long ll_table_start,ll_table_end
    //获取table内容开始的字符串位置
    ll_table_start = Pos(ls_syntax, "table(") + len("table(")
    IF ll_table_start <= 0 THEN
        as_error = "数据窗口中没有表数据!"
        RETURN -1
    END IF
    
    //获取table内容的结束位置,以)~r~n)为结束
    ll_table_end = Pos(ls_syntax, ")~r~n)",ll_table_start)
    
    String ls_table_syntax
    ls_table_syntax = Mid (ls_syntax,ll_table_start, ll_table_end - ll_table_start + 1)
    
    //获取数据窗口列的个数,确定id
    Long ll_old_col_count
    ll_old_col_count = Long(adw_main.object.datawindow.column.count)
    IF ll_old_col_count <= 0 THEN
        as_error = "数据窗口中没有列!"
        RETURN -1
    END IF
    
    Long ll_last_colname
    ll_last_colname = al_last_colname
    Long ll_add_count
    ll_add_count = al_add_count
    IF ll_add_count < 1 THEN
        as_error = "增加的列数必须大于0"
        RETURN -1
    END IF
    
    pfc_n_cst_string lnv_string
    
    Long i
    String ls_col_syntax
    //增加一般项目字段
    //增加table中的字段
    FOR i = 1 TO ll_add_count
        ls_col_syntax = "column=(type=decimal(3) updatewhereclause=no name=xm" + String(ll_last_colname + i) + " dbname=~"xm" +  String(ll_last_colname + i) + "~")"
        ls_col_syntax = "~r~n" + ls_col_syntax
        IF NOT lnv_string.of_isempty(ls_col_syntax) THEN
            ls_table_syntax  = ls_table_syntax + ls_col_syntax
        END IF
    NEXT
    
    //把增加的table列写回到数据窗口的语法中
    ls_syntax = Replace (ls_syntax, ll_table_start, ll_table_end - ll_table_start + 1, ls_table_syntax )
    String ls_syntax_error
    adw_main.Create(ls_syntax, ls_syntax_error)
    IF Len(ls_syntax_error) > 0 THEN
        as_error = "创建数据窗口出错!" + ls_syntax_error
        RETURN -1 
    END IF

    总结:Modify函数是对datawindow语法的修改,数据窗口的每一列,是与table语法中定义的column对应的,这个对应是通过id来实现的,这个id实际上就是table中 column的序号,只要修改datawindow的语法,就能对数据窗口的对象进行修改

  • 相关阅读:
    centos7 安装kafka Manager
    MySql Table错误:is marked as crashed and last (automatic?) 和 Error: Table "mysql"."innodb_table_stats" not found
    安装prometheus+grafana监控mysql redis kubernetes等
    centos7 安装kubernetes1.4
    linux ip 转发设置 ip_forward
    开启Tomcat远程调试(转)
    SSH自动断开连接的原因、配置(转)
    解决mysql启动时报The server quit without updating PID file 的错误(转)
    supervisor的集中化管理搭建
    supervisor安装配置
  • 原文地址:https://www.cnblogs.com/szxiaofei14/p/5828600.html
Copyright © 2020-2023  润新知