找回密码
 注册成为天翎用户
楼主: elong

[其他] SP8自定义函数报错【bugid:11209】

[复制链接]
kimi 发表于 2014-2-17 14:02:50 | 显示全部楼层
您好:不好意思,请问您具体的意思是说在数据库中创建了函数,然后再平台函数库中调用数据库中的函数,此时在平台表单中再去调用函数库中定义的函数就有问题么?
 楼主| elong 发表于 2014-2-19 11:09:18 | 显示全部楼层
对了 ,是在数据库创建了存储过程,通过在平台中定义函数调用,就出错了,以下是调用的类似代码,在早先的SP8版本里是好的,在最新的里面不行:
function PLFJFX(PID,YID,APID,UID,formid,deps){
  //获取连接
  var Ret = "error";
   var conn = getConnection(getApplication());
  var cs = null;
  try {
   cs = conn.prepareCall("{call SP_CreateRoomCGCost(?,?,?,?,?,?,?)}");
   cs.setString(1,PID);
   cs.setString(2,YID);
   cs.setString(3,APID);
   cs.setString(4,UID);
   cs.setString(5,formid);
   cs.setString(6,deps);
   cs.registerOutParameter(7, Packages.java.sql.Types.CHAR);
   cs.execute();
   Ret = cs.getString(7);
   $PRINTER.println("***************************Ret***"+Ret);
  } catch (e) {
  } finally {
   try {
    if(cs != null){
     cs.close();
    }
    if(conn != null){
     conn.close();
    }
   } catch (ex) {
   }
  }
  return Ret;
}
kimi 发表于 2014-2-19 22:16:38 | 显示全部楼层
本帖最后由 kimi 于 2014-2-19 22:22 编辑

您好:本地在sp8最新的补丁版本上面测试没有发现该问题
数据库创建的存储过程代码:
  1. create procedure kimitest(@p int out)
  2. as
  3. select @p=max(item_学生编号) from TLK_学生基本信息表单
复制代码
可以看如执行这个select语句的最大值效果如下图所示:
7.jpg

平台中函数库中调用存储过程的代码如:

  1. function getConnection(application){
  2. var approcess= createProcess("cn.myapps.core.deploy.application.ejb.ApplicationProcess");//实例化应用业务处理类
  3. var dtprocess= new Packages.cn.myapps.core.dynaform.dts.datasource.ejb.DataSourceProcessBean();//实例化数据源业务处理类
  4. var appvo = approcess.doView(application);//获取应用VO对象
  5. var sourceid =appvo.getDatasourceid();//获取应用数据源ID
  6. var dtvo=dtprocess.doView(sourceid);
  7.         if (dtvo != null) {
  8.                 var username = dtvo.getUsername();
  9.                 var password = dtvo.getPassword();
  10.                 var driver = dtvo.getDriverClass();
  11.                 var url = dtvo.getUrl();
  12.                 var poolsize = dtvo.getPoolsize();
  13.                 poolsize = poolsize!=null && poolsize.length()>0? dtvo.getPoolsize() : "10";
  14.                 var timeout = dtvo.getTimeout();
  15.                 timeout = timeout!=null && timeout.length()>0? dtvo.getTimeout() : "5000";
  16.                 var dataSource = new Packages.cn.myapps.base.dao.PersistenceUtils.getDBCPDataSource(username, password, driver, url, poolsize,timeout);
  17.                 return dataSource.getConnection();
  18.                 }
  19.         return null;
  20. }
  21. /**
  22.    * 调用存储过程
  23.    */
  24. function callMax(formname,fieldname){
  25.    //获取连接
  26.    var max=0;
  27.    var conn = getConnection(getApplication());
  28.    var cs = null;
  29.    try {
  30.     /*var statement = conn.createStatement();
  31.     var proced = "DROP PROCEDURE IF EXISTS sp1_"+formname+"_"+fieldname;
  32.     statement.executeUpdate(proced);
  33.     proced=" CREATE procedure sp1_"+formname+"_"+fieldname+"(out p int)";
  34.     proced+=" begin select max(item_"+fieldname+") into p from tlk_"+formname+";  end";
  35.     statement.executeUpdate(proced);*/

  36.     cs = conn.prepareCall("{call kimitest(?)}");
  37.     //设置第一个输入参数的值为110
  38.     cs.registerOutParameter(1, Packages.java.sql.Types.INTEGER);
  39.     cs.execute();
  40.     max= cs.getInt(1);
  41.    $PRINTER.println("sssssssssssssssss" + max);
  42.    } catch (e) {
  43.    } finally {
  44.     try {
  45.      if(cs != null){
  46.       cs.close();
  47.      }
  48.      if(conn != null){
  49.       conn.close();
  50.      }
  51.     } catch (ex) {
  52.     }
  53.    }
  54.    return max;
  55. }
复制代码
效果图如下:
11.jpg
表单中的控件调用函数库的函数,代码如下:
  1. #include "kimitest";
  2. callMax("学生基本信息表单","学生编号");  
复制代码
效果图如下:
9.jpg
前台成功效果:
10.jpg
既然这里只表单中调用该函数库中的函数可以得到值,那就证明函数库去调用数据库中的存储过程是可以正常的。

本版积分规则

手机版|天翎MyApps技术社区 ( 粤ICP备11093750号 )

GMT+8, 2026-9-27 19:51

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表