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

时间: 2024-08-28 09:42:14

PB中外部数据源数据窗口中动态创建列的相关文章

WPF中使用WindowChrome自定义窗口中遇到的最大化问题

原文:WPF中使用WindowChrome自定义窗口中遇到的最大化问题 FrameWork 4.5 之后,内置了WindowChrome类,官方文档: https://msdn.microsoft.com/en-us/library/system.windows.shell.windowchrome.aspx 如果你是旧版本,可以去搜索单独的dll. 上方的页面,解释和例子也都是旧版本的,如果新版本,比如和我一样,是4.6.2,可以继续往下看新的用法,相比文档中的旧方式,新的用法的确更简单有效了

Android 中保存数据到文件中

1.在安卓开发中,会遇到保存数据到手机中以及从手机中获取数据的情况 /** * 把数据存放到手机内存中 * * @param number * @param password * @return */ public static boolean saveUserInfo(Context context, String number, String password) { try { // getCacheDir()方法用于获取/data/data/<package name>/cache目录

第二十二篇:在SOUI中使用代码向窗口中插入子窗口

使用SOUI开发客户端UI程序,通常也推荐使用XML代码来创建窗口,这样创建的窗口使用方便,当窗口大小改变时,内部的子窗口也更容易协同变化. 但是最近不断有网友咨询如何使用代码来创建SOUI子窗口,特此在这里统一解答. 要回答这个问题,首先要了解SOUI窗口创建及布局的流程. 先从swnd.cpp里抄一段创建子窗口的代码: 1 BOOL SWindow::CreateChildren(pugi::xml_node xmlNode) 2 { 3 TestMainThread(); 4 for (p

将Execl中的数据导入Sqlite3中

获取CVS文件:          选择Execl的文件菜单,选择save as选项,出现保存文件对话框,在保存文件类型中选择Text CVS(.cvs)文件类型, 勾选Edit Filter settings选项,按save按钮,会出现一个对话框,这个对话框可以对保存文件的格式进行设定, 字体自己选(Unicode ,Weatern Europe等等),区域分割符可以选择','(逗号)也可以选择';'(分号),前提是 Execl源文件中不包含该符号,其它选项自己选择想要的格式,然后点击'OK'

js获取表格中的数据 以及 表格中checkbox选中一行数据

前言 不知道是不是大家也遇到过类似的表单,但我绝对是第一次见,如下图所示,表单中包含了表格. 上图中的表格数据是根据数据库中学生表而变化的,这增加了获取表中数据的复杂程度,这里仅仅是记录js如何获取数据传值到后端的办法,所以,仅以表格中张三.李四为例. 示例代码 html <div class="modal-body"> <form id="exam-score-add-form" class="smart-form">

详解用Navicat工具将Excel中的数据导入Mysql中

第一步:首先需要准备好有数据的excel: 第二步:选择"文件"->"另存为",保存为"CSV(逗号分隔)(*.csv)",将excel表另存为csv文档  第三步:(很重要):如果你的数据中有中文,那么需要将CSV文件处理一下,负责会导入失败:用editplus或者其他编辑器(另存时可以选择保存编码的编辑器)打开CSV文件,然后另存为,选择utf-8(你的数据库也是utf-8哦),点击保存. 第四步:开始导入了,使用mysql图形化工具(

VBA 练习-从两个库中调用数据到活动表中

练习VBA Sub 入库() Dim basedb As String, cpdb As String, wb As Workbook, ws As Worksheet, curWs As Worksheet basedb = ThisWorkbook.Path & "\分析数据.xlsx" cpdb = ThisWorkbook.Path & "\成品抽检信息.xlsx" '分析数据库中提取 If Len(Dir(basedb)) = 0 Then

导出数据库中所有数据到Excle中

1 Workbook wb = new HSSFWorkbook();//创建工作簿 2 Connection conn = DataSourceUtils.getDataSource().getConnection();//获取数据库连接 3 Statement stmt = conn.createStatement(); 4 DatabaseMetaData dbmd = conn.getMetaData();//获取结果集conn的所有信息 5 ResultSet dnset = dbmd

从MySQL中导入数据到MongoDB中

从sql中导出需要的数据为csv格式的数据 select field1,field2,...,fieldn from TABLE into outfile '/test.csv' fields terminated by ',' optionally enclosed by "" escaped by "" lines terminated by '\r\n'; 将test.csv数据导入到mongodb中,本人使用的是mongodb-3.2 mongoimport