1.日期控件的修改:
原来的日期控件返回的格式有'yyyy-mm-dd hh24:mi:ss'和'yyyy-mm-dd',在项目管理系统中还需要'yyyy-dd'这种格式,因此得修改该控件的返回格式,又不影响返回其他格式的函数。
解决方法:
写一个新函数,执行类似的计算(生成一个日期选择的界面div),重写选择事件函数οnclick=新函数。
不过当时的解决方法是 修改了onclick的函数。
问题:
1.修改的onclick函数增添了新的传入参数,如何传入。
解决:
触发事件的对象.onclick = function(){
return 修改的onclick函数名(增加的参数);
} ;
问题1解决了,伴随的问题出现了,修改的onclick函数内部有this引用,该this本意是指向触发事件的对象(day的选择单元格),即.οnclick=onclick函数名,可是为了传参,改为了.οnclick=function(){return onclick函数名(参数)},这样,onclick函数的域发生了变化,this指向了global。
解决:
触发事件的对象.onclick = function() {
function(that) {
return onclick函数名(增加的参数,that);
}(触发对象的事件);
} ;
对应的onclick函数也得修改:将this替换成that变量,判断是否传入了that参数,没有传入就将this变量值赋予that变量值,否则就用传入的that变量,这样该函数this的替代变量that始终指向了触发事件的对象。
2.写一个方法,传入<表名>参数,去调用数据库的存储过程,得到并返回该表的唯一id(递增的):
名为SP_SRM_GET_LOCAL_ID存储过程的作用是管理该数据库所有客户自定义表的ID生成,这样替代了oracle的sequence,mysql的auto_increment,统一了建表格式:
CREATE OR REPLACE PROCEDURE SP_SRM_GET_LOCAL_ID (
out_tablekey out varchar2,
in_tablename varchar2,
out_msg out varchar2) as
iCount number:=0;
begin
set transaction read write; --只能在一个transaction的最前面
select count(*) into iCount from bas_tablepk where tablename = in_tablename;
if iCount>0 then
update bas_tablepk set currentpk = currentpk + 1 where tablename = in_tablename;
select currentpk into out_tablekey from bas_tablepk where tablename = in_tablename;
else
insert into bas_tablepk (tablename,currentpk) values(in_tablename,1);
select currentpk into out_tablekey from bas_tablepk where tablename = in_tablename;
end if;
commit;
end SP_SRM_GET_LOCAL_ID;
Java调用:
CallableStatement cs = stmt.prepareCall("{call SP_SRM_GET_LOCAL_ID(?,?,?)}");
cs.registerOutParameter(1, Types.VARCHAR);
cs.registerOutParameter(3, Types.VARCHAR);
cs.setString(2, tabName);
cs.execute();
return cs.getString(1);
3.SQL:
UNION ALL 把两个拥有相同字段的视图拼成了一个视图,顺序按UNION ALL 前后顺序。
ROLLUP是ORACLE的统计函数,例如:GROUP BY ROLLUP(YEAR,MONTH,DAY),先按YEAR,MONTH,DAY分组,并统计每组之和,即不同的某年某月某天之和;再按YEAR,MONTH分组,并统计每组之和,即不同的某年某月之和;再按YEAR分组,并统计每组之和,即不同的某年之和;再汇总所有行的和。范围由小到大。
大部分情况下,SQL尽量避免子查询,可用表连接代替(join vs exist vs in区别)。
4.报表工具ChinaExcel的使用:
ChinaExcel报表WEB开发的使用步骤:
1.用chinaexcel stutio设计报表,生成.tab文件。
2.在后台写个方法,查询数据库表,把得到的数据组成个特定格式的String对象,返回该String对象。
3.在页面上用一个object标签嵌套chinaexcel的ActiveX插件(cab文件),用来处理从服务器端传来的String对象。
4.用chinaexcel的js开发库,编写实现报表功能的函数,展现,下载,图表等。
5.Ext浅接触:
Ext是一个Js框架,用于用js来控制browser端的用户界面,通过面向对象的方式。其中封装了很多的UI的js库,在项目中用到了:
多个Ext.Panel构成了界面的大框架,导航栏,显示区,底脚,横幅。
Ext.tree.treePanel和Ext.tree.AsyncTreeNode构成一棵异步树。
Ext.request.Ajax用于异步与服务端通信。
Ext.data.JsonStore更简便地用于接收服务器端传过来的json数据。其中服务器端传json数据时最好定义好它的MIME类型"application/json",一些浏览器会对没定义好MIME类型的json数据产生点小问题。
对于系统有多棵树,就把一个Ext.tree.treePanel再封装一下,分离出要变动的配置参数为传入参数,这样,只需new 封装了TreePanel的类(参数),就可得到一个自定义treePanel了,避免了代码的复写。注意,做包装类时不要使配置的id值相同,当该包装类的对象出现多个时会出错!