首页 > 技术文章 > PB中外部数据源数据窗口中动态创建列

szxiaofei14 2016-09-01 10:04 原文

   公司原来做的横向报表用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的语法,就能对数据窗口的对象进行修改

推荐阅读