行式报表的录入用存储过程自动提交

楼主
我是社区第67823位番薯,欢迎点我头像关注我哦~
4月底5月初刚接触FR,感觉功能相当强大。
但是录入这一块,由于没有很好发挥数据库存储过程的作用。使惯于使用存储过程的我感觉有些遗憾。FR的功能精进,时不在我。为此,试图立足于当下,探索实现存储过程的写入。

以行式报表的录入为例。

列名分别为ID,公司名称(gs)、地址(dz)、电话(dh)、录入(修改)人(usr)、写入(修改)时间(tim)
分享扩散:
参与人数 +3 F豆 +2011 +60 F币 +30 理由
windy_gui + 1
苏莜 + 10 赞一个!
传说哥 + 2000 + 60 + 30 赞一个!

查看全部评分

沙发
发表于 2016-5-23 17:06:03
本帖最后由 gqmao 于 2016-5-24 08:40 编辑

取数本也可以用存储过程,传入用户名后,根据用户权限取出不同的数据,存储过程完成这项工作,相当出色。本专题按下不表。
且看写入过程:
ALTER proc [dbo].[fr_w](@usr varchar(50),@id int,@gs varchar(50),@dz varchar(50),@dh varchar(50))
---存储过程参数(用户名,ID,公司名,地址,电话)
as
    set nocount on
    declare @zt int  --设置状态变量


   select @zt=0  --初始为0
   if ISNULL(@id,0)=0  --如传入的ID为空或0,则视为新增数据,执行插入记录动作
   begin
       select @id=ISNULL(max(id),0)+1 from fr_gs    --ID取最大ID+1
       insert into fr_gs(id,gs,dz,dh,usr,tim) select @id,@gs,@dz,@dh,@usr,GETDATE() where len(isnull(@gs,''))>0   
       ---传入的公司名不能为空,这个可在这里作为条件,是否写入,在FR里也是可以设置限制条件的
       if @@ROWCOUNT>0  --如果新增成功
             select @zt=1   --设状态值为1
   end
   else
   begin
      --下面是修改数据的语句,可以根据接收到的参数值做各种条件的操作

      update fr_gs set gs=@gs,dz=@dz,dh=@dh,usr=@usr,tim=GETDATE()
          where
id=@id and len(isnull(@gs,''))>0 and (
                    ISNULL(gs,'')<>ISNULL(@gs,'')
                    or ISNULL(dz,'')<>ISNULL(@dz,'')
                    or ISNULL(dh,'')<>ISNULL(@dh,'')
          )
     if @@ROWCOUNT>0
          select @zt=2  --修改成功,设为2
   end
   select @zt --返回状态值,(这里返回的可以根据需要返回数据,我这里只是简单返回不同值给FR判断用


板凳
发表于 2016-5-23 17:09:48
有了表,有了过程怎么用呢?我在FR中这样设置:
设计数据源及表样

地板
发表于 2016-5-23 17:13:20

删除提交与删除行按钮
下班喽,晚上再发完!
5楼
发表于 2016-5-23 17:17:38
先给精华,坐等楼主更新
6楼
发表于 2016-5-23 19:18:42
本帖最后由 gqmao 于 2016-5-23 19:23 编辑

哎呀,吃完饭,上坛子,发现传说哥竟然给帖子加了精华,非常开心,也非常感谢传说哥。说起来很惭愧,JS我没玩过,FR也是刚接触,我作为一名财务人,在FR论坛上难免有班门弄斧之嫌。本贴很多地方如果精通FR和JS,会更合理一些。
下面继续吧,不合理的地方,请大神指正,非常感谢FR大神们的热情指导。
7楼
发表于 2016-5-23 19:45:41

上图是填报页面加载结束事件的设置。
数据保存进数据库的基本思路是这样:
行式报表,一行为一条记录,录入数据是,换行意味着一条记录录入结束。
也就是换行即触发存储过程(把该行有关列的数据作为参数传给存储过程,与数据库交互完成提交入库动作)

8楼
发表于 2016-5-23 20:05:40
本帖最后由 gqmao 于 2016-12-23 11:08 编辑

//下面看看,加载结束的JS代码(声明下,对FR与JS全白,请大神不吝指正)
   contentPane.on("cellselect", function(td) {  //获取单元格被选中监听事件   
   var dqhang =contentPane.curLGP.getTDRow(td);  //当前选中行  
//var lasthang=contentPane.curLGP.getCellValue("A1"); //上次选中行,已初始化A1为5
//lasthang变量,是指上次操作的行,dqhang是当前操作的行。两行不同,即触发数据库入库的存储过程。
//由于JS白,所以第一个方案是,lasthang的初始量,保存到A1格。
//后来,对引入JS文件有所了解,把初始量5存入了JS文件,引入,从而初始化全局变量lasthang=5。
//有朋友反应这里有个坑,说是JS文件没看到,这里说一下JS文件的创建方法:新建一文本文件,内容为lasthang=5,保存。把文件名后缀改为js,然后在FR中引用这个文件,即可。
//感觉上应该还有其它方案,比如模版JS如何初始化全局变量,请大神指点。
  if ( dqhang != lasthang && lasthang >4 ){     //两次行不同,且上次行大于4 ,则执行
      contentPane.writeReport(); //提交为空,不实际改变数据库值
//这里仍然调用了提交动作,在报表提交属性中未设置数据与表字段的对应,不实际改变数据库值。
//仍然是因为对FR的JS不熟悉,本来是不用做这个提交动作的,
//但是不做这个虚拟提交,则下面的取值,有时候不成功,估计是FR的显示值与实际值的问题。
     var aa=contentPane.getCellValue(0,0,lasthang-1); //获取修改记录ID
     var c=contentPane.getCellValue(0,2,lasthang-1); //获取要公司名称(修改后的)的值
     var d=contentPane.getCellValue(0,3,lasthang-1); //地址
     var e=contentPane.getCellValue(0,4,lasthang-1); //电话
    a=(aa.length==0)?'0':aa; //如ID为空,则ID=0
//设计存储过程与传入参数值字符串
     var sql="{call fr_w('"+user+"',"+a+",'"+c+"','"+d+"','"+e+"')}"; //用user变量和各列数据构造SQL语句
     var v1=FR.remoteEvaluate('=SQL("fr","'+sql+'",1,1)');     //执行存储过程
//FR.remoteEvaluate这个方法藏得好深呀,是在一个帖子里提到了可以用FR.remoteEvaluate执行FR函数,具体不记得是哪个贴了,在此特别感谢。
//在帮助文档里,未见对该方法的介绍。
//有了这个方法,就可以在JS中用其调用FR的SQL函数,从而实现执行存储过程。这里是关键的关键。
   if ( dqhang >4){                                    
    //将上次选中行置入A1暂存   因前面说的已经通过引用创建的JS文件,建立了全局变量,这里不就再用了。注释掉。
    //contentPane.curLGP.setCellValue("A1",null,dqhang);//注释保留的目的是不熟FR的JS,留在这里备查和增强记忆。
    lasthang=dqhang;
   }
   if (v1 > 0 ){;
//根据存储过程动作的返回值,做刷新动作
setTimeout('location.reload()',500); //如果数据库有新增或修改,则刷新
     }
  }
});

PS:这里顺便提一句,应该可以把这里的JS设成通用JS函数 (JS不熟,暂时不管它)

比如:FR2SQL(参数1,参数2,参数3)   参数1定义为FR中的数据链接,参数2定义为行号,参数3定义为特定变量user及欲引用的数据所在列号组成的数组或字符串
实现FR数据到SQL的通用方法。

9楼
发表于 2016-5-23 20:11:51

上图是填报页面的提交设置,既然是换行录入,这一步本是不用做的。
但是上一楼提到的原因,需要做虚拟的提交动作,所以这里不做提交设置是不行的,
只是做了一个虚的设置,未实际做字段与单元格的关联。
10楼
发表于 2016-5-23 20:18:56
11楼
发表于 2016-5-23 20:32:51
本帖最后由 gqmao 于 2016-5-23 20:34 编辑

各位,既然虚化了FR的智能提交,那怎么删除数据呢?
实现的路径有很多,思路还是一样,获得相关删除数据记录的关键值,调用存储过程或SQL语句,删除之。
我这里是仅做了单行删除功能,即在序号列给记录增加了FR的超级链接,调用JS语句,执行SQL,删除数据。



为了使超级链接变为菜单式,下面还增加了一个"备用",以使用户在点击超级链接的时候,弹出删除菜单如下图:

12楼
发表于 2016-5-23 20:49:21
至此,行式报表调用存储过程提交数据介绍完成了。回头一看,其实还是很简单的。也不是实际业务的案例。由于本人实在JS、FR各种白,为了实现这简单的想法,查遍了坛子和帮助文档。
作为初学者的几点感受:
1、FR功能强大不用多说。
2、各位大神的指点,对我这种太白来说,如雾里看花。不过还是受益匪浅,感谢。如FR官方能组织客服技术人员给于更多指点,相信会有更多小白参与和加快进步。
3、如果FR来开发这项功能,相信设置会很简单,更实用。权且抛砖引玉,对有同种需要的同好,暂时如能有所进益,则欢喜之至。
4、也期待帮助文档更详细。
水平有限,还有大量的各种困惑,期待大神们不吝赐教!{:8_198:}
13楼
发表于 2016-5-24 12:20:07
楼主大大 好厉害,头一次知道还可以这么做呢。真是学习了。
但是个人实用上认为
简单的事情复杂化,效率会降低呢。
数据更新,刷新页面,交互性若感觉不是很好呢。
总之,期待楼主大大 再出精品

14楼
发表于 2016-5-26 10:11:48
感謝分享!!!
15楼
发表于 2016-5-26 14:08:59
楼主666,继续发帖啊
16楼
发表于 2016-6-9 20:14:39
楼主好厉害哟
17楼
发表于 2016-6-9 20:19:49
向楼主学习
18楼
发表于 2016-6-9 20:20:15
好好学习天天向上
19楼
发表于 2016-6-10 06:18:37
好好好好好好好好好好好
20楼
发表于 2016-6-15 23:21:19
5,支持一下 楼主加油
21楼
发表于 2016-6-26 19:31:25
厉害,解决了我一个大问题。
22楼
发表于 2016-6-28 16:49:58
不知道大数据填报 会不会受影响。
23楼
发表于 2016-6-28 21:15:15
好的,改天试试,刚好有这个需求。。。。。
24楼
发表于 2016-12-15 08:59:37
赞一个
25楼
发表于 2016-12-17 22:20:17
来自手机
{:8_209:}{:8_209:}{:8_209:}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

返回顶部 返回列表