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的语法,就能对数据窗口的对象进行修改