新框架之SAP

从目前所看的内容来看,SAP基本上也是一种MVC的架构,相对于SSH少了很多配置文件的定义,而且集成的东西更多,对于视图这块,少了很多HTML文件的编写,使我们把注意力更加的放在处理业务逻辑上,从这个意义上讲,对于大型的mis系统,业务流程多,细节多,而对页面要求不高的系统来说,使用这个架构还是比较好的,比较方便的能够与oracle等大型数据库进行集成。

所使用的开发工具也是在eclipse的基础上改进而成的,增加了相应的开发视角。

 

 

从编码方面,主要使用的是SAP框架的wdContext, wdThis,  wdControllerAPI以及wdComponent,一般以wd开头的都是框架自带的方法。

其中,wdThis可以用来实现页面的跳转,可以调用controller里面的方法,而controller无法直接调用外面的方法。wdContext可以对node进行控制,可以获取table当前所在的行,对于view中属性是都可以绑定的,也就是可以通过变量进行动态的控制,在创建node时要注意设置1….1,1….n等几个集合属性。

对于DB方面,一般是在service进行DB操作,而由于SAP并未使用ORM的框架,所以对于增删改查操作需要写sql语句,通过jdbc来进行执行。Service可以用来定义数据库逻辑,定义poi等。

SAP无法直接在console里面打印语句,可通过以下方法在浏览器进行显示:
wdComponentAPI.getMessageManager().reportSuccess("成功");//页面打印信息

对于model与bean,可以由bean生成model,然后再继续通过context生成table。

页面属性都可以与context中的属性进行bind,这样就可以达到动态改变的目的,context中mapping到的属性应该也是特定属性。

 

 

利用原生SQl进行数据库的操作,采用ODBC数据库驱动,工具使用的是PL/SQL,进行数据库连接时,由于是一般共有的操作,所以就将数据库连接池单独进行封装,而无须进行重复的代码操作。Sap框架导入jar文件时,没有在eclipse中那么方便,一般是需要将所有数据库连接所需要的jar文件整合为单独的作为一个项目,然后再在项目中进行依赖,javaBean+service。在table中想要通过改变某一行来达到控制这一行其它数据的目的,有onChange和onEnter等方法,创建方法需要引入特定的参数。

 

 

7.4---7.8   关键信息修改审批流程的实现

这是第一个要完成的FD,属于养老部分,所关联的几个表也就是离退信息表,异动表,审批表等几个关键的表,由于该功能是与其它流程有交叉,所以在进行信息修改时需要判断当前的申请人是否已有申请处在流程中,若已经有申请处在流程中,则当前申请无法继续,需等其他流程结束后再继续,这是从功能来说需要注意的地方。

 

从SAP整个框架来说,所需要的基本控件基本都用到了,包括下拉菜单、table、checkbox,导入导出,文件上传,弹出框等等,下拉菜单绑定的是simpleType中的枚举类型,table绑定的是context中的结点,checkbox绑定的是布尔类型的context,而对于导入导出报表来说,则需要导入相应的poi.jar,在连接数据库时由于这块已经做了封装,所以只需导入poi.jar。

 

在开发中也遇到了一些问题,下面依次罗列出比较容易出问题的地方。在进行sql查询时,由于我们所使用的是原生的sql,所以大部分的sql都需要我们进行拼接,而拼接的时候是比较容易出问题的,比如字段属性不对应,字段值不对应,查询的结果集不存在(多次出现,容易怀疑是sql拼接出现了问题),所以解决办法最好是先在数据库的工具中查询一遍,没有问题后再对应到代码中。第二个问题就是导入导出报表时候出现的问题,这个时候我们绑定的context是系统自带的simpleType中resource,但是要注意需将其集合属性改为1….1,如果按照其默认的集合属性,就会出现问题。第三个问题是弹出框,之前一直在试弹出框的用法,代码都没有错,可就是出不来,具体实现可参照王成的经验总结。弹出框分为两种,一种是可以继续展示信息的,另外一种是只起提示作用的confirm window,两者各有其作用,第二种没有什么问题,对于第一种后来发现是弹出框中的按钮没有指定对应的按钮事件。

Sap框架在导入jar包时,没有在eclipse中方便,他所用的方法是首先将所要用的所有jar包新建一个项目,然后再导出,然后当有项目需要用到这个jar时,需将此项目依赖上去。

除此之外,还使用了一下这个开发平台的debug功能,这个功能要求同一时间,只能有一个人 进行调试,不用时需点击disconnect,其它的调度步骤与常规的无异。

在bean方面,目前我们都是自己写bean,同时将所有的自己定义的一些与数据库相关,导入导出等功能都写到一个service类当中。Sap也可以由数据库表反向生成bean,但是过程比较繁琐,所以没有用那种方法。

Sap也有自带的工作流引擎,但是配置比较麻烦,所以也没有用工作流引擎,而是采用结点流转表的形式。

下一步需要完善就是对一些操作需要添加相应的验证的问题。

 

 

最近在做的是关于养老离退待遇停发相关流程的开发,这个流程是与之前关键信息修改的流程是差不多的,所以相比较而言力求做的好一点。其中的一些问题是,在点击查看详情时总是容易出现的是同一条数据,而应该是每个按钮对应所在的行的数据,修改方法为在按钮事件中添加这个table元素的参数,然后再进行mapping,在代码中直接用这个choice参数就好了:

 

对于这种每行都有按钮的情况,table元素的集合属性应为1….1

第二种情况是按钮操作的是整个表格这个时候,窗口的创建统一放在showWin中,而要关闭窗口时,应该调用destroyInstance,销毁每个实例,这样的话就会清除上一次的数据。

 

 

获取UUID:

 

String uuid=UUID.randomUUID().toString();

 

获取当前系统用户:

IUserloginUser=null;

loginUser=WDClientUser.getCurrentUser().getSAPUser();

if(loginUser!=null) {

         createid=loginUser.getUniqueName();

         updateid=loginUser.getUniqueName();

}

 

几个问题:

1、  申请时关闭按钮失效

2、  归档时时间的问题

3、  插入流程

 

 

1.连续两次关闭失效问题解决:

这是由于我们在show的时候,将创建窗口的代码写在了if外面,这样的话导致每调用一次窗口都会创建窗口,这样的话会创建多个同名的窗口,之后要显示窗口时会导致找不到窗口,所以解决办法是将创建窗口分别对应到各个if当中,确保每个窗口只创建一次。

2.  插入流程,基本上采用的还是插入统一审批表的形式,无论编辑、审批、申请都应该有相应的操作记录,不同操作可能插入的字段不一样,有些字段的值是要先从数据库中进行查询。新建了一个sequence,如果总是用同一个,会造成sequence不连续

几个问题:

4、  通知待办

5、  权限验证,是否有申请 查看的权限

 

4,5解决

 

6、归档增加归档失败

 

问题:

1、  在进行信息修改时,数据库修改成功后页面信息也应当进行更新,可采用的方法是在component controller中增加inittable方法,修改完成后先消除之前table里面的数据,然后再重新查询一遍

2、  之前做的项目,进行删除,修改时注意信息在页面与数据库之间的同步

3、  权限的控制,用户所操作的数据应继续校验,只允许操作当前登录用户所在部门或者下级部门的数据,所以在查询时可进行控制

4、  日期类型,注意yyyyMMddyyyymmdd的区别,MM指月份,mm指分钟。

 

 

 

加throw  e,将异常打印出来,抛出异常将异常信息打印出来

/**生成注释

所有的查询是否应该考虑是模糊查询(未确定)

 

 

所有查询已改成模糊查询,同时将所有异常都打印出来

 

sap中定位错误是仍然可以定位到java文件的错误所在行,如下图所示进行错误定位:

 

将app发布到系统中,主要是在项目下面的iview和角色中进行相应的添加,先在iview中将app粘贴为pcd对象,然后在角色中将app添加为增量链接

 

目前还存在的问题有:

1、  导入时增加导入模板的下载

2、  对导入导出信息的验证,登录员工所在部门只能操作本部门及下级部门的数据,查询也是一样,只查本部门及下级部门的数据

3、增加全选/取消全选的功能

4、当增删改查数据操作完之后页面减少元素,是否应该考虑重新从数据库查询加载的方式(特别是数据量多的时候),而如果简单的在页面remove元素,数据量大时速度较慢。

5、申请流程过程中,在途申请对应的是哪几个状态,反馈驳回后是直接插入新的数据还是修改后重新变为待审批的状态。



Oracle获取系统时间戳:systimestamp

select systimestamp from dual

 

 

动态在下拉菜单张增加选项:

IWDAttributeInfo attrInfo2 = wdContext.getNodeInfo().getChild("common").getAttribute("month");

                  IModifiableSimpleValueSetvalues2 =attrInfo2.getModifiableSimpleType().getSVServices().getModifiableSimpleValueSet();

                  List<Map<String,String>> list3=PlanMonthService.queryDictionaryOrder("MonthCN","");

                      values2.clear();

                      for (int i = 0; i < list3.size(); i++) {

                      Map<String,String> map=list3.get(i);

                      values2.put(map.get("FKEY"),map.get("FVALUE"));

                         }

查询条件中有时间时,应该先检查是否为空,若为空,就不能用那种simpleformat的形式

供养遗属减少查询,时间为空时,将开始时间设为1900,结束时间为9999

 

将app添加到系统当中,先是在iview中将app添加为pcd对象,然后添加为增量链接,然后再在角色当中调整目录

 

StringBuffer查询效率比String的效率高

Where 1=1 避免多余的and

数据库中Exists比in的查询效率高,因为exists用了索引


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值