解决部分月份绩效无法显示的问题:timestamp\union al\autocommit等的用法

绩效部同事反映部分员工绩效在查询时无法显示,并给出了两个工号。这两个工号对应绩效全部正常审批完成,但在绩效管理模块却无法显示。绩效管理采用分页查询,查询语句为:

<!-- 绩效查询集合  -->
	<select id="queryList"	resultMap="PerformanceResultMap"  parameterType="com.fx.oa.module.per.performance.api.shared.domain.PerformanceEntity">
		select * from (
		select
		Performance.id,
		f_nd,
		f_khqj,
		f_staffname,
		f_staffid,
		f_bm,
		f_zw,
		f_sqrq,
		f_zf3,
		sum(f_zpf1+f_zpf2+f_zpf3+f_zpf4+f_zpf5+f_zpf9+f_zpf10+f_zpf11+f_zpf12+f_zpf13+f_zpf17+f_zpf18+f_zpf19+f_zpf20+f_zpf21)f_dqjxfs,
		sum(f_df1+f_df2+f_df3+f_df4+f_df5+f_df9+f_df10+f_df11+f_df12+f_df13+f_df17+f_df18+f_df19+f_df20+f_df21)f_syfszh,
		f_txrzjzgname,
		f_jxzzdf,
		f_jxdj,
		f_jxxs,
		f_zf1,
		f_zf2,
		releaseDate,
		zjzg,
		activityName,
       processExecutionId,
      dqspr,
      userNameandTaskid ,
       sortno, ‘普通‘jxlx  from (SELECT 
		<include refid="PerformanceAll_flow_column"/>
		<include refid="jx_tabale"/>
		<include refid="glflow"/>
		<include refid="select_Where"/>
		<include refid="sql_group_by"/>
		) Performance
		<include refid="out_select_Where"/> 
		group by id
		 union all
		select Performance.* from (
			SELECT ‘1‘as id,
						f_nd,
f_khqj,
f_staffname,
f_staffid,
f_bm,
f_zw,
f_sqrq,
f_zf3,
f_dqjxfs,
f_syfszh,
f_txrzjzgname,
f_jxzzdf,
f_jxdj,
f_jxxs,
f_zf1,
f_zf2,
releaseDate,
zjzg,
activityName,
processExecutionId,
dqspr,
userNameandTaskid,
sortno,
jxlx

					FROM
						t_per_his_performance Performance
					)Performance LEFT JOIN tree_node tree ON Performance.f_staffid = tree.id
         <include refid="out_select_Where"/>
       <if test="isAdmin !=‘‘ and isAdmin  != null">
			<![CDATA[
			 and tree.leftId >= (select leftId from tree_node treenode where treenode.id= #{currentUserStaffid}) and  tree.rightId <= (select rightId from tree_node treenode where treenode.id=#{currentUserStaffid})
				]]>
		    </if>
       	  ) Performance where  Performance.id !=0  
		<include refid="sql_order_by"/>
	</select>

语句中包含一个union,主要用于查询历史绩效(历史绩效指与绩效表结构完成相同,但主要用于存储OA上线前在moss上所填写的绩效数据,用于员工自行查询)。

截取的sql语句如下:

 select Performance.id from (SELECT 
		Performance.id,
		f_nd,
		f_khqj,
		f_staffname,
		f_staffid,
		f_bm,
		f_zw1 as f_zw,
		f_sqrq,
		f_zf3,
		f_dqjxfs,
		f_kpi,
		f_gs,
		ifnull(f_df1,0)f_df1,
		ifnull(f_df2,0)f_df2,
		ifnull(f_df3,0)f_df3,
		ifnull(f_df4,0)f_df4,
		ifnull(f_df5,0)f_df5,
		ifnull(f_df9,0)f_df9,
		ifnull(f_df10,0)f_df10,
		ifnull(f_df11,0)f_df11,
		ifnull(f_df12,0)f_df12,
		ifnull(f_df13,0)f_df13,
		ifnull(f_df17,0)f_df17,
		ifnull(f_df18,0)f_df18,
		ifnull(f_df19,0)f_df19,
		ifnull(f_df20,0)f_df20,
		ifnull(f_df21,0)f_df21,
		ifnull(f_zpf1,0)f_zpf1,
		ifnull(f_zpf2,0)f_zpf2,
		ifnull(f_zpf3,0)f_zpf3,
		ifnull(f_zpf4,0)f_zpf4,
		ifnull(f_zpf5,0)f_zpf5,
		ifnull(f_zpf9,0)f_zpf9,
		ifnull(f_zpf10,0)f_zpf10,
		ifnull(f_zpf11,0)f_zpf11,
		ifnull(f_zpf12,0)f_zpf12,
		ifnull(f_zpf13,0)f_zpf13,
		ifnull(f_zpf17,0)f_zpf17,
		ifnull(f_zpf18,0)f_zpf18,
		ifnull(f_zpf19,0)f_zpf19,
		ifnull(f_zpf20,0)f_zpf20,
		ifnull(f_zpf21,0)f_zpf21,
		f_txrzjzgname,
		f_jxzzdf,
		f_jxdj,
		f_jxxs,
		f_zf1,
		f_zf2,
		Performance.releaseDate,
		zjzginfo.staffName AS zjzg,
		case when exec.status=‘2‘ then ‘结束‘ when ISNULL(activityName)=1 then ‘绩效填写‘ else task.activityName END activityName,
        exec.id as processExecutionId,
      GROUP_CONCAT(distinct staff.staffname) as dqspr,
      CONCAT(‘[‘,GROUP_CONCAT(distinct CONCAT(‘{userName:‘,‘"‘,task.createUserCode,‘"‘,‘,taskid:‘,‘"‘,task.taskId,‘"‘,‘}‘)),‘]‘) as userNameandTaskid ,
      case 
      when activityName=‘start1‘ then 1 
      when activityName=‘工作行为考核人确认‘ then 2 
      when activityName=‘重新填写‘ then 3 
      when activityName=‘填写人自评‘ 
      then 4 when activityName=‘考核人评估‘ 
      then 5 else 6 END sortno
		,‘普通‘ as jxlx from T_DYMC_20150211170947  Performance 
		left join tree_node tree on Performance.f_staffid=tree.id
	left join t_bpm_process_execution exec on  Performance.id=exec.pkValue 
	left join t_bpm_process_define process on process.id=exec.processDefineId
	left join t_bpm_process_task task on exec.id=task.processExecutionId and task.status=‘0‘
	left join t_per_staffinfo staff on task.createUserCode=staff.staffcode and staffStatus=‘zz‘
	LEFT JOIN t_per_staffinfo zjzg ON Performance.f_staffid = zjzg.staffid
    LEFT JOIN t_per_staffinfo zjzginfo ON zjzg.directLeaderCode = zjzginfo.staffid 
where tree.leftId >= (select leftId from tree_node treenode where treenode.id= ‘FX004613‘) and  tree.rightId <= (select rightId from tree_node treenode where treenode.id= ‘FX004613‘)
GROUP BY pkValue ) Performance where Performance.f_staffName = ‘潘宇‘ 
and  Performance.id != 0

该语句经走读并未发现明显问题。

在数据库中进行比较,发现以下问题

  1. id(uuid)规律与其他明显不同;
  2. releaseDate为空;

    releaseDate用于最新更新时间,做为锁并行并发控制;之前有一篇博文介绍会签并发控制的。

    releaseDate是timestamp,对timeStamp的了解是1.有确定的表示时间的范围;2.相当于一个trigger,会随着数据变化取当前时间;3.mysql允许存在多个timestamp的属性,如有多个只有第一个可以正常更新当前时间;

参看:mysql之TIMESTAMP(时间戳)用法详解

查看创建表的语句,只保留releaseDate的创建

show create table t_dymc_20150211170947

..
  `releaseDate` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
..

releaseDate:第一,允许空,第二,创建时默认为空,第三,每次更新均自动更新为当前时间;

查询数据库的commit机制

show engine innodb status like ‘%commit%‘

所有的事务提交都是autocommit,考虑到可能出现这样的问题,即在审批时,表单表可能被锁,导致该事务未提交成功,而其他表的更新均成功,所以代码中如未对事务做准确的控制,这种情况是可能出现的。但如接受这思路,就无法解释三次提交均锁表的情况。

使用如下语句查看lock情况

show status like ‘%lock%’

查找锁表,未发现问题。

由于以上主要针对releaseDate为什么为空和id的创建规律为何突变。由于反复确认两个问题无果,以及两个问题均未导致流程的审批出现明显问题。所以,解决方向变为主攻查询语句。

经进一步确认,该查询是个分页查询,结果条数与下方显示的总数条数不同,始终少一,少的就应该是问题数据;使用compare对queryList和queryCount进行比较,发现两者不同之处有四;

  1. querylist在将流程数据和历史数据进行联合时使用union,queryCount使用的是unionAll。该思路一度让我对之前对两者最基本区别的认知产生动摇。实际上经过测试也并不是union/unionAll导致。参看:union和union all的区别
  2. queryList多了一个where id != 0该代码由其他已离职同事编写,用意不明(可能是因为在查询历史数据时,返回的Id不是其真正的id,而是统一为"0",这段代码也莫名其妙);
  3. queryList多了一个order;
  4. queryList中在一个返回属值“pxtl”前多了两个汉字,两个汉字也未加""

    分别对以上进行测试,发现只有2去掉之后问题不再出现

经测试,发现sql有如下规律

在sql中,当id为字符串且首字符是字母时,id !=数字0,当id的首字母为数字时,id=数字0。经确认,6-7日晚至6-8日填写的所有绩效,其id的生成规律均与其他明显不同;首字符为f,其他首字符为2,所以查询不到。目前已将id!=0拿掉,经测试问题解决。

经一步查询id开头非数字的,发现均在6月7日至6月8日,该问题产生原因目前不明。

时间: 2024-10-25 06:08:33

解决部分月份绩效无法显示的问题:timestamp\union al\autocommit等的用法的相关文章

解决Eclipse中C++代码显示Symbol &amp;#39;std&amp;#39; could not be resolved的问题

第一次在Eclipse中写C++代码,写了一个简单的hello world程序,还没有等我编译.就报出了各种错误,但是这么简单的代码.怎么可能这么多错误.于是没有理会.编译执行后,能够正常输出!!!Hello World!!!,但是我的代码中还是有非常多红叉,把鼠标放在上面显示:Symbol 'std' could not be resolved 这种信息. 于是问题来了.怎样解决? 方法:写完库函数以后立刻保存.这样写之后的代码就不会报错了 比如:-->首先写#include <iostre

解决Sublime Text 3中文显示乱码问题(转)

解决Sublime Text 3中文显示乱码问题(转) 1.打开Sublime Text 3,按Ctrl+-打开控制行,复制粘贴以下python代码,然后回车运行. 2. 复制并粘贴如下代码: import urllib.request,os,hashlib; h = '7183a2d3e96f11eeadd761d777e62404e330c659d4bb41d3bdf022e94cab3cd0'; pf = 'Package Control.sublime-package'; ipp = s

一键解决ScrollView嵌套ListView仅仅显示一行的问题

/** * 解决ScrollView嵌套ListView仅仅显示一行的问题 * * @param listView */ private void setListViewHeightBasedOnChildren(ListView listView) { ListAdapter listAdapter = listView.getAdapter(); if (listAdapter == null) { return; } int totalHeight = 0; for (int i = 0;

解决 PHPExcel 长数字串显示为科学计数

解决 PHPExcel 长数字串显示为科学计数 https://github.com/PHPOffice/PHPExcel/ 在excel中如果在一个默认的格中输入或复制超长数字字符串,它会显示为科学计算法,例如身份证号码,解决方法是把表格设置文本格式或在输入前加一个单引号. 使用PHPExcel来生成excel,也会遇到同样的问题,解决方法有三种: 1.设置单元格为文本 $objPHPExcel = new PHPExcel(); $objPHPExcel->setActiveSheetInd

解决Ubuntu系统中文乱码显示问题,终端打开文件及查看目录

解决Ubuntu系统中文乱码显示问题 [日期:2014-02-20] 来源:Linux社区  作者:njchenyi [字体:大 中 小] 我是先安装了Ubuntu 12.04 Server,然后安装桌面.进入以后发现中文有问题. 解决方法:一. Ubuntu默认的中文字符编码Ubuntu默认的中文字符编码为zh_CN.UTF-8,这个可以在/etc/environment中看到:sudo gedit /etc/environment可以看到如下内容:PATH="/usr/local/sbin:

解决dede搜索页面只能显示10条信息解决方案

解决dede搜索页面只能显示10条信息解决方案,感觉显示的信息太少,这时就要想办法去解决一下.看看有什么好办法来解决一下这个问题. dede搜索页模板中,默认只能显示10条记录. 打开dede搜索页模板search.htm,发现标签搜索{dede:list perpage='10'} 即使修改了参数,如{dede:list perpage='20'},发现dede搜索页搜索的结果依然是一页10条记录. 两种方法可以解决这个问题: 1.可以在dede模板的开始搜索按钮前加入<input type=

解决 cmd dos 下 无法显示中文

在做程序开发的时候经常需要在使用命令行进行操作, dos环境本身是不支持中文的,有时候中文编码的问题就像苍蝇一样讨厌,下面提供几种常用的手段解决win7环境下中文显示乱码的问题: 方法一: 修改注册表: Windows Registry Editor Version 5.00 [HKEY_CURRENT_USER\Console\%SystemRoot%_system32_cmd.exe] "CodePage"=dword:000003a8 双击执行,看到这样的提示框就表明ok了. 当

解决 PHPExcel 长数字串显示为科学计数[转]

解决 PHPExcel 长数字串显示为科学计数 在excel中如果在一个默认的格中输入或复制超长数字字符串,它会显示为科学计算法,例如身份证号码,解决方法是把表格设置文本格式或在输入前加一个单引号. 使用PHPExcel来生成excel,也会遇到同样的问题,解决方法有三种:1.设置单元格为文本 $objPHPExcel = new PHPExcel(); $objPHPExcel->setActiveSheetIndex(0); $objPHPExcel->getActiveSheet()-&

flexview模板中解决图表控件不能显示的问题

在flexview模板中的baseWidget.as中,填写如下代码: override public function get moduleFactory():IFlexModuleFactory { return FlexGlobals.topLevelApplication.moduleFactory; } flexview模板中解决图表控件不能显示的问题