永洪报表9.4.3.2b中,开发一个用户写入数据库的功能

1、为什么使用文本参数组件,作为用户自定义输入框

        如图所示,我本地安装的永洪个人桌面版10中,本身是有填报参数的,可以支持你直接上传一个表格,将其中数据显示在该表格组件内,然后设置按钮,写上脚本,将数据直接写入到数据库。但是显然,这个功能要花钱的,并且,我之前安装的个人桌面版9,也是同样如此。所以,我现在使用的企业购买的9.4.3.2b版本中,没有该功能,似乎也很合理,官方社区上有人回答说,是需要单独买的。

        所以,这里我不使用填报参数组件,尽管我之前是拿它去开发的;而使用大量的文本参数组件来作为用户输入的地方。

2、以报表为例:更新表格的某行中某列的值

        以如下页面为例,流程上,将表格展示出来的众多行,通过ID值搜索框判断选取一条,解析其中的“取值解释”列,之后依次打在下方的code框中,然后用户可以自由修改输入code、value框,之后点击提交按钮,将所有code、value框的值汇总在一起,执行update语句,到该行的“取值解释”列。

3、三处脚本的JavaScript的代码
//1、以下是报表脚本:变化时运行
//功能:将所有code/value输入框内的内容,一组一组地实时拼接起来

//定义一个码值字符串的拼接结果
var all_codes_values =''

//拼接所有的codeX、valueX文本参数组件的值
if(code1.getSelectedObjects()[0]  &&  value1.getSelectedObjects()[0]  ){
      all_codes_values=all_codes_values+code1.getSelectedObjects()[0]+':'+value1.getSelectedObjects()[0]+','
}
if(code2.getSelectedObjects()[0]   && value2.getSelectedObjects()[0]   ){
      all_codes_values=all_codes_values+code2.getSelectedObjects()[0]+':'+value2.getSelectedObjects()[0]+','
}
if(code3.getSelectedObjects()[0]  && value3.getSelectedObjects()[0]  ){
      all_codes_values=all_codes_values+code3.getSelectedObjects()[0]+':'+value3.getSelectedObjects()[0]+','
}
if(code4.getSelectedObjects()[0]   && value4.getSelectedObjects()[0]  ){
      all_codes_values=all_codes_values+code4.getSelectedObjects()[0]+':'+value4.getSelectedObjects()[0]+','
}
if(code5.getSelectedObjects()[0]  && value5.getSelectedObjects()[0]  ){
      all_codes_values=all_codes_values+code5.getSelectedObjects()[0]+':'+value5.getSelectedObjects()[0]+','
}
if(code6.getSelectedObjects()[0]  && value6.getSelectedObjects()[0]  ){
      all_codes_values=all_codes_values+code6.getSelectedObjects()[0]+':'+value6.getSelectedObjects()[0]+','
}
if(code7.getSelectedObjects()[0]   && value7.getSelectedObjects()[0]   ){
      all_codes_values=all_codes_values+code7.getSelectedObjects()[0]+':'+value7.getSelectedObjects()[0]+','
}
if(code8.getSelectedObjects()[0]   && value8.getSelectedObjects()[0]  ){
      all_codes_values=all_codes_values+code8.getSelectedObjects()[0]+':'+value8.getSelectedObjects()[0]+','
}
if(code9.getSelectedObjects()[0]   && value9.getSelectedObjects()[0]   ){
      all_codes_values=all_codes_values+code9.getSelectedObjects()[0]+':'+value9.getSelectedObjects()[0]+','
}
if(code10.getSelectedObjects()[0]   && value10.getSelectedObjects()[0]   ){
      all_codes_values=all_codes_values+code10.getSelectedObjects()[0]+':'+value10.getSelectedObjects()[0]+','
}
if(code11.getSelectedObjects()[0]   && value11.getSelectedObjects()[0]  ){
      all_codes_values=all_codes_values+code11.getSelectedObjects()[0]+':'+value11.getSelectedObjects()[0]+','
}
if(code12.getSelectedObjects()[0]   && value12.getSelectedObjects()[0]   ){
      all_codes_values=all_codes_values+code12.getSelectedObjects()[0]+':'+value12.getSelectedObjects()[0]+','
}
if(code13.getSelectedObjects()[0]  && value13.getSelectedObjects()[0]   ){
      all_codes_values=all_codes_values+code13.getSelectedObjects()[0]+':'+value13.getSelectedObjects()[0]+','
}
if(code14.getSelectedObjects()[0]   && value14.getSelectedObjects()[0]   ){
      all_codes_values=all_codes_values+code14.getSelectedObjects()[0]+':'+value14.getSelectedObjects()[0]+','
}
if(code15.getSelectedObjects()[0]   && value15.getSelectedObjects()[0]   ){
      all_codes_values=all_codes_values+code15.getSelectedObjects()[0]+':'+value15.getSelectedObjects()[0]+','
}
//去除最后一个逗号
if (all_codes_values.length>1) {
  all_codes_values = all_codes_values.slice(0, -1);
}




//2、显示按钮的脚本:提交后执行
//功能:根据ID输入框的内容,选取表格中对应ID值的记录,取出其中的码值字符串,然后依次截取分配到每一个文本参数组件code中去

//每次清除所有code、value文本参数框中之前的内容
code1.setSelectedObjects(null,STRING)
value1.setSelectedObjects(null,STRING)
code2.setSelectedObjects(null,STRING)
value2.setSelectedObjects(null,STRING)
code3.setSelectedObjects(null,STRING)
value3.setSelectedObjects(null,STRING)
code4.setSelectedObjects(null,STRING)
value4.setSelectedObjects(null,STRING)
code5.setSelectedObjects(null,STRING)
value5.setSelectedObjects(null,STRING)
code6.setSelectedObjects(null,STRING)
value6.setSelectedObjects(null,STRING)
code7.setSelectedObjects(null,STRING)
value7.setSelectedObjects(null,STRING)
code8.setSelectedObjects(null,STRING)
value8.setSelectedObjects(null,STRING)
code9.setSelectedObjects(null,STRING)
value9.setSelectedObjects(null,STRING)
code10.setSelectedObjects(null,STRING)
value10.setSelectedObjects(null,STRING)
code11.setSelectedObjects(null,STRING)
value11.setSelectedObjects(null,STRING)
code12.setSelectedObjects(null,STRING)
value12.setSelectedObjects(null,STRING)
code13.setSelectedObjects(null,STRING)
value13.setSelectedObjects(null,STRING)
code14.setSelectedObjects(null,STRING)
value14.setSelectedObjects(null,STRING)
code15.setSelectedObjects(null,STRING)
value15.setSelectedObjects(null,STRING)



//得到选中的id值
var tar_id=ID值.getSelectedObjects()[0]
//debug(tar_id)

//循环表格数据,取出id值对应的那一行的码值字符串
var tab=getData('图表1',DATA)
var code_values =[]
for(var i=0;   i<tab.size();   i++){
     //debug(tab.get(i,7))
     //如果id相同,就除去其中的空格、[、]、'三个字符,然后按逗号转化为数组
     if(tab.get(i,0)==tar_id){
            
         code_values=replaceRegex(tab.get(i,7),"'|\\s|\\[|\\]| ","").split(',')


        //循环该码值数组,并按顺序分配其中的码值到每一个文本参数组件code中去
        for(var j=0;j<code_values.length;j++){
             switch(j+1){
                case 1:
                  code1.setSelectedObjects([code_values[j]],STRING)
                  break;
                case 2:
                  code2.setSelectedObjects([code_values[j]],STRING)
                  break;
                case 3:
                  code3.setSelectedObjects([code_values[j]],STRING)
                  break;
                case 4:
                  code4.setSelectedObjects([code_values[j]],STRING)  
                  break;
                case 5:
                  code5.setSelectedObjects([code_values[j]],STRING)
                  break;
                case 6:
                  code6.setSelectedObjects([code_values[j]],STRING)
                  break;
                case 7:
                  code7.setSelectedObjects([code_values[j]],STRING)
                  break;
                case 8:
                  code8.setSelectedObjects([code_values[j]],STRING)
                  break;
                case 9:
                  code9.setSelectedObjects([code_values[j]],STRING)
                  break;
                case 10:
                  code10.setSelectedObjects([code_values[j]],STRING)
                  break;
                case 11:
                  code11.setSelectedObjects([code_values[j]],STRING)
                  break;
                case 12:
                  code12.setSelectedObjects([code_values[j]],STRING)
                  break;  
                case 13:
                  code13.setSelectedObjects([code_values[j]],STRING)
                  break;
                case 14:
                  code14.setSelectedObjects([code_values[j]],STRING)
                  break;
                case 15:
                  code15.setSelectedObjects([code_values[j]],STRING)
                  break;      
             }
         }
     }
 }


//debug('码值字符串为:'+code_values)
//刷新报表数据
refreshData()




//3、提交按钮的脚本:提交后执行
//功能:设置一个完整的数据库的连接,并去执行更新语句,依据ID值输入框的取值作条件,将实时拼接起来的字符串输入进去

var conn = null;
//debug(ID值.getSelectedObjects()[0])
try {
    conn = createConnection(CONNECTION, "test");
    if(trim(all_codes_values) && ID值.getSelectedObjects()[0] && trim(ID值.getSelectedObjects()[0])){
        var update_sql="update public.new_tab_col_name_test set code_values='"+all_codes_values+"'  where id="+toString(ID值.getSelectedObjects()[0])+";"
        var pstmt = conn.prepareStatement(update_sql);
        var update_row= pstmt.executeUpdate();
        //debug(update_sql)
        
        //刷新报告的数据
        refreshData()
    }else{
     debug('请检查:ID值、code和value值是否未填。')
    }
}
//捕获异常
catch (e) {
   try {
       if (conn != null) {
           conn.rollback();
       }
   } catch (e1) {
   }
   debug("Error: "+e);
} finally {
   if (conn != null) {
       try {
           conn.commit();
           conn.close();
       } catch (e2) {
       }
   }
}
4、永洪报表中写JavaScript脚本的各种函数示例

        表格组件的数据获取和遍历:

var tab=getData('表格组件的名字',DATA)
for(var i=0;   i<tab.size();   i++){
     //打印每行的第一个值
     debug(tab.get(i,0))
}

        下拉参数、文本参数组件的放值和取值:

组件名.setSelectedObjects(['put_string'],STRING)

组件名.getSelectedObjects()[0]

        文本框(辅助组件)的取值和放值(附加,文中无):

文本框名.DATA=''

        提交按钮的写入数据库的语法:

var conn = null;

try {
    //此处设置数据库连接时,后一个参数为,进入永洪后所配置的各种数据源的目录地址之一
    conn = createConnection(CONNECTION, "test");
    
    var update_sql="update public.new_tab_col_name_test set code_values='"+all_codes_values+"'  where id="+toString(ID值.getSelectedObjects()[0])+";"
    var pstmt = conn.prepareStatement(update_sql);
    var update_row= pstmt.executeUpdate();
 
    //刷新报告的数据
    refreshData()
}
//捕获异常
catch (e) {
   try {
       if (conn != null) {
           conn.rollback();
       }
   } catch (e1) {
   }
   debug("Error: "+e);
} finally {
   if (conn != null) {
       try {
           conn.commit();
           conn.close();
       } catch (e2) {
       }
   }
}

        字符串的处理函数

var rep_string = replaceRegex('[['aaa'], ['bbb'],   ['ccc']]', "'|\\s|\\[|\\]| ", "").split(',')

//rep_string 打印出来应该为['aaa','bbb','ccc']

//其实就是把源字符串,去除空格、引号、方括号,再按英文逗号拆解为数组
//永洪中写脚本,只能使用它指定的函数,其中,replace函数不好用,只能替换固定位置的固定字符串,所以使用replaceRegex函数

//这函数的正则的写法又与通行的JavaScript中的正则不一样,反复试过后,如上所示,表示单引号时,要用双引号规避;表示正反方括号时,前加双反斜杠\\

debug('sdfsdfsd'.length)

//打印字符串的长度

        注意:

报告上、按钮上等等地方的脚本输入框中,如果不额外加正反花括号{},是处于同一作用域的,即A处脚本设置的var a=1;B处脚本可以直接打印debug(a),结果为1,不为null的;因此要注意变量名规避,或者使用前要赋空值

5、缺点

该报表逻辑上,应该在显示、提交按钮上,加一个识别ID值是否为表格内的ID值的逻辑,如果输入不存在的ID值,会额外提醒


附加:

6、如何配置一个日期筛选组件

        在报告中,想要设置一个日期参数组件直接把用户选择的日期值传入SQL语句中,然后看到报告中的结果集改变;可以如下步骤操作:

        使用下列传参组件时,一般的规则是,其【设置】中的名称,要指定为SQL语句中的名称,二者一样;此处选择文本参数组件

        在报告中,先设置文本参数组件-日期模式来传日期值,再要在SQL语句(Oralce)中如下图所示直接使用该参数来调用,最后数据集中设置该参数的类型为日期类型(注意,前一步中就不要将参数由文本格式转为日期格式了(to_date函数),否则报错;反过来,前一步用了to_date(),这一步就不需要设置)。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值