今天又发现OA的一个问题:修改已经做好单据时,不能删除已有的重复表格的内容,但可以添加新行和删除刚添加的行。打售后服务执线反应,对方竟然说他那边测试没这问题。我晕,我用的可是用友公司的人上门拿来的安装盘,SP1也是官方网站下载的,居然跟他那边的不一样!!!
不知他要什么时候才解决,只能自己先搞了,哎,幸福全靠自己双手创啊~~
问题产生原因:
打开已有单据时,系统是通过客户端Javascript脚本再现单据的,其中有一个生成重复性表格(专业点说是主从表的从表)的过程(函数:init、initDetail),初始化函数中把从表的第一行应该设成是当前行,记录在变量currentRow中,然后调用setAbsolute(currentRow)函数把“添加删除重复行”的浮标显示在该行旁边。
添加行的时候是在第一行插入的(又一个bug,旧行会不断向下移,新行老插在旧行上)。
删除行时调用delRow函数进行删除,但delRow函数会检查是否在第一行,是则不允许删除(估计原意是保证从表必须有数据),结果呢,旧的行统统删除不了。
解决方法:
要解决问题就要修正currentRow的值,我采取方法的是监控从表点击事件,判断落在从表哪一行上,把它设成当前行。这样也存在一个问题,如果用户是通过键盘换行的,currentRow的值将不会变化,不过OA这样的WEB应用不用鼠标操作真不太现实。
修改的文件:
OA目录下common/js/form/form.js
修改内容:
在文件开头添加以下函数:
修改单据时单据时,“删除/添加重复行”浮标默认显示在第一行,致使后面的内容无法删除
增加此函数在从表控件点击事件中动态调整浮标位置和currentRow,保证资料可随意删除(剩一行时不允许删除,由delRow函数限制)
此函数在initDetail函数中设置响应detail表onclick事件
彭国辉 2008-01-11
************************************************************************************************ */
function _setCurRow()
{
var obj = window.event.srcElement;
while (obj && obj.tagName != " TR " && obj.tagName != " TABLE " && obj.tagName != " BODY " )
{
obj = obj.parentNode;
}
if (obj && obj.tagName == " TR " )
{
/* var tb = obj.parentNode;
while (tb && tb.tagName!="TABLE")
tb = tb.parentNode;
alert(tb.name);
if (tb.name == "detail")
{ */
currentRow = obj;
setAbsolute(currentRow);
// }
}
}
找到initDetail函数(有两个),在函数开头添加以下代码:
// 彭国辉 2008-01-11
var _tb_detail = document.getElementById( ' detail ' );
if (_tb_detail)
_tb_detail.onclick = _setCurRow;
OK,收工!