fcRep.js
上传用户:mingda
上传日期:2017-06-20
资源大小:27691k
文件大小:128k
源码类别:

OA系统

开发平台:

Java

  1. {
  2. SaveoUndoOneRecord()
  3. //从外部复制来的数据
  4. var arrRow,arrCol
  5. arrRow=clipboard.split("n")
  6. for (var i=0 ;i<arrRow.length;i++) {
  7. arrCol=arrRow[i].split("t")
  8. for (var j=0;j<arrCol.length;j++) {
  9. var arr=PhyToLog(i+sRowSort,j+sColSort)
  10. var curTD=t.rows(arr[0]).cells(arr[1])
  11. //var logCol=physicalToLogic(i+sRow,j+sCol)
  12. try {
  13. curTD.innerText=arrCol[j]
  14. }
  15. catch (e) {}
  16. }
  17. }
  18. SaveoRedoOneRecord()
  19. clearBlueScale()
  20. }
  21. return
  22. //}
  23. //如果是选定单个单元格则用平铺的方法粘贴
  24. var blnBlockTile=false//块平铺
  25. var lngStatus=SelStatus(sRow,sCol,eRow,eCol)
  26. if (lngStatus==1){
  27. blnBlockTile=true
  28. }
  29. else{
  30. //检查区域是否匹配
  31. if ((eRowSort-sRowSort+1)*(eColSort-sColSort+1)!=(blockObjAry.length-2) || (eRowSort-sRowSort)!=blockObjAry[0] || (eColSort-sColSort)!=blockObjAry[1]){
  32. alert("复制的区域与粘贴的区域形状不同,不能完成粘贴,请选定一区域使该区域与源区域的大小和形状一致,再粘贴!")
  33. return
  34. }
  35. }
  36. //检查粘贴的区域中是否有合并的单元格
  37. /*
  38. if (oRect.documentElement.xml.length>13)
  39. {
  40. var eRowno,eColno
  41. if (blnBlockTile==false)
  42. eRowno=eRow
  43. else
  44. eRowno=sRow+blockObjAry[0]
  45. if (blnBlockTile==false)
  46. eColno=eCol
  47. else
  48. eColno=sCol+blockObjAry[1]
  49. var oSel=oRect.documentElement.selectSingleNode("//record[row0='" + sRow + "' and col0='" + sCol+ "' and row1='" + eRowno + "' and col1='" + eColno+ "']")
  50. if (oSel!=null)
  51. {
  52. //alert("重合拆分")
  53. //处理重合,拆分的情况,选中一个合并后的大格
  54. alert("粘贴的区域中有合并单元格,不能完成粘贴,请选定一区域使该区域与源区域的大小和形状一致,再粘贴!")
  55. return
  56. }
  57. else
  58. {
  59. for (i=0;i<=oRect.documentElement.childNodes.length-1;i++)
  60. {
  61. var oChild=oRect.documentElement.childNodes.item(i)
  62. if (parseInt(oChild.childNodes.item(0).text)>eRowno||parseInt(oChild.childNodes.item(1).text)>eColno||parseInt(oChild.childNodes.item(2).text)<sRow||parseInt(oChild.childNodes.item(3).text)<sCol) 
  63. {//没有相交
  64. }
  65. else
  66. {//有相交
  67. alert("粘贴的区域中有合并单元格,不能完成粘贴,请选定一区域使该区域与源区域的大小和形状一致,再粘贴!")
  68. return
  69. }
  70. }
  71. }
  72. }
  73. */
  74. //块粘贴
  75. SaveoUndoOneRecord()//在改变之前保存住位置,备undo时装入
  76. var i,j
  77. var inx=2
  78. var sColno,eColno
  79. var eRowno//结束行
  80. if (blnBlockTile==false)
  81. eRowno=eRowSort
  82. else
  83. eRowno=sRowSort+blockObjAry[0]
  84. for (i=sRowSort;i<=eRowno;i++){
  85. if (i>=t.rows.length)
  86. break
  87. sColno=sColSort
  88. if (blnBlockTile==false)
  89. eColno=eColSort
  90. else
  91. eColno=sColSort+blockObjAry[1]
  92. /*
  93. var osFind=oCoor.documentElement.selectNodes("//record[row='" + i + "' and col='" +sCol +"']")
  94. if (osFind.length>=1)
  95. sColno=parseInt(osFind.item(0).childNodes.item(2).text)
  96. var osFind=oCoor.documentElement.selectNodes("//record[row='" + i + "' and col='" +eColno +"']")
  97. if (osFind.length>=1)
  98. eColno=parseInt(osFind.item(0).childNodes.item(2).text)
  99. */
  100. for (j=sColno;j<=eColno;j++){
  101. var arr=PhyToLog(i,j)
  102. var curTD=t.rows(arr[0]).cells(arr[1])
  103. if (j>=t.rows(0).cells.length){
  104. inx=inx+sColno+blockObjAry[1]-j
  105. break
  106. }
  107. curTD.innerText=blockObjAry[inx]
  108. //curTD.replaceNode(blockObjAry[inx])
  109. //将粘贴的单元格的行高与列宽修改成本单元格的行高与列宽
  110. inx=inx+1
  111. }
  112. }
  113. //块删除
  114. blockObjAry=new Array()
  115. SaveoRedoOneRecord()//在改变之后保存住位置,备redo时装入
  116. //将选择单元的值给文本框tdtotxt
  117. /* var arr=PhyToLog(sRow,sCol)
  118. var curTD=t.rows(arr[0]).cells(arr[1])
  119. txtMyGrid.value=curTD.innerText
  120. ExitMe()
  121. */
  122. clearBlueScale()
  123. txtMyGrid.style.display="none"
  124. }
  125. /**
  126. *工具栏上的格式刷按钮的点击事件
  127. **/
  128. function cmdFormatBrush() {
  129. if(blnRunMode)return
  130. if (cmdBrush.getAttribute("fcDown")=="1") {
  131. cmdBrush.setAttribute("fcDown","0")
  132. cmdBrush.className="tblclassup"
  133. }
  134. else {
  135. cmdCopyFormat()
  136. cmdBrush.setAttribute("fcDown","1")
  137. cmdBrush.className="divmenutrue"
  138. }
  139. }
  140. /**
  141. *工具栏上的复制按钮的点击事件
  142. **/
  143. function cmdCopyFormat() {
  144. if (tc.style.display =="none")
  145. return
  146. // if (lngStatus==3 || lngStatus==4 ){
  147. // alert("选择的区域内有合并单元格,不能做块复制!")
  148. // return
  149. // }
  150. FormatRow=sRow
  151. FormatCol=sCol
  152. }
  153. /**
  154. *工具栏上的粘贴按钮的点击事件
  155. **/
  156. function cmdPasteFormat() {
  157. SaveoUndoOneRecord()
  158. var arrFormat=PhyToLog(FormatRow,FormatCol)
  159. var i,j
  160. for (i=sRowSort;i<=eRowSort;i++)
  161. {
  162. for (j=sColSort;j<=eColSort;j++) {
  163. var arr=PhyToLog(i,j)
  164. var curTD=t.rows(arr[0]).cells(arr[1])
  165. var gNodeTD=t.rows(arrFormat[0]).cells(arrFormat[1]).cloneNode(true)
  166. gNodeTD.rowSpan=curTD.rowSpan
  167. gNodeTD.colSpan=curTD.colSpan
  168. var sTmp=curTD.innerText
  169. curTD.replaceNode(gNodeTD)
  170. t.rows(arr[0]).cells(arr[1]).innerText=sTmp
  171. }
  172. }
  173. SaveoRedoOneRecord()
  174. }
  175. /**
  176. *删除所有的oUndo与oRedo对象中的节点
  177. **/
  178. function initoUndooRedo(){
  179. lngUndo=-1//childNodes.item(0)从0开始
  180. lngRedo=-1
  181. cmdUndo.disabled =true
  182. cmdRedo.disabled =true
  183. oUndo.loadXML("<root></root>")
  184. oRedo.loadXML("<root></root>")
  185. }
  186. /**
  187. *增加一行oRedo对象的记录,按先进先出的规则,保持只有8条记录
  188. **/
  189. function SaveoRedoOneRecord(){
  190. var root = oRedo.documentElement
  191. var newNode = oRedo.createNode (1, "record", "")
  192. root.appendChild(newNode)
  193. var newElem = oRedo.createElement("cell") //表格
  194. newNode.appendChild(newElem)
  195. newNode.lastChild.text = escape(t.outerHTML )
  196. var newElem = oRedo.createElement("cellcopy") //表格Copy
  197. newNode.appendChild(newElem)
  198. newNode.lastChild.text = escape(tCopy.outerHTML )
  199. var newElem = oRedo.createElement("oFormula")
  200. newNode.appendChild(newElem)
  201. newNode.lastChild.text = escape(oFormula.documentElement.xml)
  202. if (oRedo.documentElement.childNodes.length >8) {
  203. DeleteoRedoOneRecord(0)
  204. }
  205. }
  206. /**
  207. *增加一行oUndo对象的记录,按先进先出的规则,保持只有8条记录
  208. **/
  209. function SaveoUndoOneRecord(){
  210. var root = oUndo.documentElement
  211. var newNode = oUndo.createNode (1, "record", "")
  212. root.appendChild(newNode)
  213. var newElem = oUndo.createElement("cell") //表格
  214. newNode.appendChild(newElem)
  215. newNode.lastChild.text = escape(t.outerHTML )
  216. var newElem = oUndo.createElement("cellcopy") //表格
  217. newNode.appendChild(newElem)
  218. newNode.lastChild.text = escape(tCopy.outerHTML )
  219. var newElem = oUndo.createElement("oFormula")
  220. newNode.appendChild(newElem)
  221. newNode.lastChild.text = escape(oFormula.documentElement.xml)
  222. lngUndo=lngUndo+1
  223. cmdUndo.disabled =false//可以undo
  224. if (oUndo.documentElement.childNodes.length >8) {
  225. DeleteoUndoOneRecord(0)
  226. lngUndo=7//从0-7
  227. }
  228. }
  229. /**
  230. *读出一行oUndo对象的记录
  231. **/
  232. function ReadoRedoOneRecord(lngKey){
  233. t.outerHTML=unescape(oRedo.documentElement.childNodes.item(lngKey).childNodes.item(0).childNodes.item(0).xml)
  234. grid.reload(t.outerHTML)
  235. tCopy.outerHTML=unescape(oRedo.documentElement.childNodes.item(lngKey).childNodes.item(1).childNodes.item(0).xml)
  236. oFormula.loadXML (unescape(oRedo.documentElement.childNodes.item(lngKey).childNodes.item(2).childNodes.item(0).xml))
  237. }
  238. /**
  239. *读出一行oUndo对象的记录
  240. **/
  241. function ReadoUndoOneRecord(lngKey){
  242. t.outerHTML=unescape(oUndo.documentElement.childNodes.item(lngKey).childNodes.item(0).childNodes.item(0).xml)
  243. grid.reload(t.outerHTML)
  244. tCopy.outerHTML=unescape(oUndo.documentElement.childNodes.item(lngKey).childNodes.item(1).childNodes.item(0).xml)
  245. oFormula.loadXML (unescape(oUndo.documentElement.childNodes.item(lngKey).childNodes.item(2).childNodes.item(0).xml))
  246. }
  247. /**
  248. *删除Redo一行记录,按先进先删的规则,保持只有8条记录
  249. * intR=0删除第一个节点
  250. **/
  251. function DeleteoRedoOneRecord(intR){
  252. oRedo.documentElement.removeChild(oRedo.documentElement.childNodes.item(intR))
  253. }
  254. /**
  255. *删除Undo一行记录,按先进先删的规则,保持只有8条记录
  256. * intR=0删除第一个节点
  257. **/
  258. function DeleteoUndoOneRecord(intR){
  259. oUndo.documentElement.removeChild(oUndo.documentElement.childNodes.item(intR))
  260. }
  261. /**
  262. *工具栏上的Redo按钮的点击事件
  263. **/
  264. function cmdRedo(){
  265. var intMaxR=oRedo.documentElement.childNodes.length - 1//当前oRedo对象中的最大记录数
  266. if (lngRedo>=0 && lngRedo<=intMaxR){
  267. ReadoRedoOneRecord(lngRedo)//读出当前undo对应的值
  268. lngUndo=lngRedo
  269. lngRedo=lngRedo+1
  270. cmdUndo.disabled =false//做了一步redo则undo肯定可以做
  271. //强制表格宽高同步
  272. if(grid.autosize){
  273. grid.autosize=true
  274. }
  275. //clearBlueScale()
  276. }
  277. if (lngRedo>intMaxR && lngRedo<0){
  278. cmdRedo.disabled =true //肯定不能做redo的功能
  279. }
  280. }
  281. /**
  282. *工具栏上的Undo按钮的点击事件
  283. **/
  284. function cmdUndo(){
  285. var intMaxR=oUndo.documentElement.childNodes.length - 1//当前oRedo对象中的最大记录数
  286. if (lngUndo>=0 && lngUndo<=intMaxR){
  287. ReadoUndoOneRecord(lngUndo)
  288. lngRedo=lngUndo
  289. lngUndo=lngUndo - 1
  290. cmdRedo.disabled =true//做了一步undo则redo肯定可以做
  291. //强制表格宽高同步
  292. if(grid.autosize){
  293. grid.autosize=true
  294. }
  295. //clearBlueScale()
  296. }
  297. if (lngUndo<=0 && lngUndo>intMaxR){
  298. cmdUndo.disabled =true//undo肯定不可以做
  299. }
  300. if (lngUndo>=intMaxR && lngUndo<0){
  301. cmdRedo.disabled =true//redo肯定不可以做
  302. }
  303. }
  304. /**
  305. *公式处理
  306. *预处理公式,将公式中的B5 等标记变成GetCell(5,2)
  307. *公式中的SUM(A2:F8)等展开成一个个单元格的形式.
  308. *getcell(row(),2)之类的公式,将它的坐标中的公式值计算出来
  309. **/
  310. function replaceFormula(strFormula){
  311. var r
  312. var re
  313. var strSearch//
  314. var strReplace
  315. var lngPrePos
  316. var j
  317. var blnEnd=false
  318. //下面这行先不变大写20020627
  319. //strFormula=strFormula.toUpperCase()
  320. //下面将公式中的SUM(A2:F8)等展开成一个个单元格的形式.
  321. strFormula=getFunctionValue(strFormula)
  322. //------------------
  323. //getcell(row(),2)之类的公式,将它的坐标中的公式值计算出来
  324. //ROW() COL() + - * / 只支持前面这些操作符
  325. /*
  326. var sExp=/GETCELL((ROW()|COL()|d|+|-|*|/)*,(ROW()|COL()|d|+|-|*|/)*[,|)]/ig  //new RegExp("S","ig")
  327. var re=strFormula.match(sExp)
  328. if (re!=null) {
  329. for (var i=0;i<=re.length-1;i++){
  330. var s1=re[i]
  331. var endS=s1.substring(s1.length-1,s1.length)
  332. s1=s1.substring(8,s1.length-1)
  333. var arr=s1.split(",")
  334. s1="GETCELL("+eval(arr[0])+","+eval(arr[1])+endS
  335. strFormula=strFormula.replace(re[i],s1)
  336. //alert(strFormula)
  337. // alert("length:"+re.length+"   "+re[0]+"   "+re[1])
  338. }
  339. }
  340. */
  341. //-------------------
  342. strFormula=" " +strFormula+" "
  343. re=/(([a-z]|[A-Z])|([a-z]|[A-Z])([a-z]|[A-Z]))([1-9]|([1-9][0-9])|([1-9][0-9][0-9]))[^0-9]/ig
  344. r=strFormula.match(re)
  345. if(r!=null){
  346. var lngPrePos=0
  347. var lngPrePos1=0
  348. var strRet=""  //返回公式
  349. //加此循环是为了替代一个公式中的多个A2
  350. for (var i=0;i<=r.length-1;i++){
  351. strSearch=trim(r[i].substring(0,r[i].length-1))//取出的一个标志符
  352. var strChar,strInt
  353. var iLength=strSearch.length-1
  354. var sCurRow,sCurCol
  355. var lngA
  356. for (var ii=0;ii<=iLength;ii++){
  357. lngA=parseInt(strSearch.charCodeAt(ii))
  358. if (lngA>=49 && lngA<=57){
  359. var strChar=strSearch.substring(0,ii)
  360. var strInt=strSearch.substring(ii,iLength+1)
  361. break;
  362. }
  363. }
  364. //由B5==>行和列数
  365. sCurRow=strInt
  366. sCurCol=LblToInt(strChar)
  367. //-----------
  368. //将GetCellValue函数用getCell取代
  369. strReplace="GETCELL("+sCurRow+","+sCurCol+")"
  370. lngPrePos1=strFormula.indexOf(strSearch,lngPrePos)
  371. if (lngPrePos1>0){
  372. //替换字符
  373. strRet=strRet+strFormula.substring(lngPrePos,lngPrePos1)+strReplace
  374. lngPrePos=lngPrePos1+strSearch.length
  375. }
  376. else {
  377. //此行可能无用
  378. strRet=strRet+strFormula.substring(lngPrePos,strFormula.length-1)
  379. }
  380. }
  381. strRet=strRet+strFormula.substring(lngPrePos,strFormula.length-1)
  382. return trim(strRet)
  383. }
  384. return trim(strFormula)
  385. }
  386. /**
  387. *找本表页的单元格的值
  388. **/
  389. function GETCELL(iRow,iCol) {
  390. return GetCellData(iRow,iCol)
  391. }
  392. /**
  393. *设置单元值
  394. *@param iRow 物理行值
  395. *@param iCol 列值
  396. *@param vData 要设置单元值
  397. **/
  398. function SetCellData(iRow,iCol,vData) {
  399. //先计算出逻辑列,因逻辑行和物理行相同
  400. var arr=PhyToLog(iRow,iCol)
  401. var curObj1=t.rows(arr[0]).cells(arr[1])
  402. //给值时做小数位处理
  403. CellPoint(curObj1,vData)
  404. /*
  405. if (isSpace(curObj1.getAttribute("dec"))==false)
  406. curObj1.innerText=ContDec(vData,curObj1.getAttribute("dec"))
  407. else
  408. curObj1.innerText=vData
  409. */
  410. }
  411. /**
  412. *取得单元值
  413. *@param iRow 物理行值
  414. *@param iCol 列值
  415. *@return 单元值
  416. **/
  417. function GetCellData(iRow,iCol) {
  418. //先计算出逻辑列,因逻辑行和物理行相同
  419. var arr=PhyToLog(iRow,iCol)
  420. var s1=t.rows(arr[0]).cells(arr[1]).innerText
  421. //alert(s1)
  422. //让返回null是为了计算公式时""会使数值变成字符
  423. if(s1=="") return null
  424. //-----------
  425. if (isNaN(parseFloat(s1)))
  426. return s1
  427. else
  428. return parseFloat(s1)
  429. }
  430. /**
  431. //求出自定义公式的值
  432. **/
  433. function getFunctionValue(strFormula,strLblSelf){
  434. //strFormula=computeFunctionValue(strFormula,"getreportcell")//求表间取数
  435. strFormula=computeFunctionValue(strFormula,"sum")//求和
  436. strFormula=computeFunctionValue(strFormula,"avg")//求平均
  437. strFormula=computeFunctionValue(strFormula,"max")//求最大值
  438. strFormula=computeFunctionValue(strFormula,"min")//求最小值
  439. return strFormula
  440. }
  441. /**
  442. //求出自定义公式的值
  443. **/
  444. function computeFunctionValue(strFormula,strKey){
  445. //最大最小值未处理2001.12.21
  446. var i,j
  447. strKey=trim(strKey.toUpperCase())
  448. //if (strKey=="GETREPORTCELL")
  449. // var re=new RegExp(strKey+".([1-9]|([1-9][0-9])|([1-9][0-9][0-9])|([1-9][0-9][0-9][0-9]))"+","+"(([a-z]|[A-Z])|([a-z]|[A-Z])([a-z]|[A-Z]))([1-9]|([1-9][0-9])|([1-9][0-9][0-9]))[^0-9]","ig")
  450. //else
  451. var re=new RegExp(strKey+".(([a-z]|[A-Z])|([a-z]|[A-Z])([a-z]|[A-Z]))([1-9]|([1-9][0-9])|([1-9][0-9][0-9])):(([a-z]|[A-Z])|([a-z]|[A-Z])([a-z]|[A-Z]))([1-9]|([1-9][0-9])|([1-9][0-9][0-9]))[^0-9]","ig")
  452. var r=strFormula.match(re)
  453. if (r==null) 
  454. return strFormula
  455. var dblSum=""
  456. switch (strKey){
  457. /*case "GETREPORTCELL":
  458. for (i=0;i<=r.length-1;i++){
  459. var strQuote=r[i].substring(0,14)+"'"+r[i].substring(14,r[i].length -1) + "')" //插入单引号
  460. var strExpr=replaceString(r[i],r[i],strQuote)
  461. var dblCellValue=DealPoint(strExpr)
  462. //var dblCellValue=eval(strExpr)
  463. strFormula=replaceString(strFormula,r[i],dblCellValue)
  464. }
  465. break;*/
  466. case "SUM":
  467. for (i=0;i<=r.length-1;i++){
  468. var retAry=getAllLabelAry(r[i])//得到所有标签的公式的数组
  469. dblSum="("
  470. for (j=0;j<retAry.length;j++ ){
  471. // dblSum=dblSum+parseFloat(retAry[j])
  472. dblSum=dblSum+retAry[j]+"+"
  473. }
  474. dblSum=dblSum+"0)"
  475. strFormula=replaceString(strFormula,r[i],dblSum)
  476. }
  477. break;
  478. case "AVG":
  479. for (i=0;i<=r.length-1;i++){
  480. var retAry=getAllLabelAry(r[i])//得到所有标签的值的数组
  481. dblSum="(("
  482. for (j=0;j<retAry.length;j++ ){
  483. dblSum=dblSum+retAry[j]+"+"
  484. }
  485. var dblAvg=dblSum+"0)/"+retAry.length+")"
  486. strFormula=replaceString(strFormula,r[i],dblAvg)
  487. }
  488. break;
  489. case "MAX":
  490. for (i=0;i<=r.length-1;i++){
  491. var retAry=getAllLabelAry(r[i])//得到所有标签的值的数组
  492. if (retAry.length==1){
  493. strFormula=replaceString(strFormula,r[i],retAry[0])
  494. break;
  495. }
  496. for (j=1;j<retAry.length;j++ ){
  497. if (parseFloat(retAry[j-1])>parseFloat(retAry[j])){
  498. retAry[j]=retAry[j-1]
  499. }
  500. }
  501. var dblMax=retAry[j-1]
  502. strFormula=replaceString(strFormula,r[i],dblMax)
  503. }
  504. break;
  505. case "MIN":
  506. for (i=0;i<=r.length-1;i++){
  507. var retAry=getAllLabelAry(r[i])//得到所有标签的值的数组
  508. if (retAry.length==1){
  509. strFormula=replaceString(strFormula,r[i],retAry[0])
  510. break;
  511. }
  512. for (j=1;j<retAry.length;j++ ){
  513. if (parseFloat(retAry[j-1])<parseFloat(retAry[j])){
  514. retAry[j]=retAry[j-1]
  515. }
  516. }
  517. var dblMin=retAry[j-1]
  518. strFormula=replaceString(strFormula,r[i],dblMin)
  519. }
  520. break;
  521. }
  522. return strFormula
  523. }
  524. /**
  525. //返回取得所有标签公式的数组
  526. **/
  527. function getAllLabelAry(strExp){
  528. //strExp="Sum(A1:C2)"
  529. var ReturnArr=new Array()
  530. var strF,lngA,strL
  531. strExp=" " +strExp+" "
  532. var re=/(([a-z]|[A-Z])|([a-z]|[A-Z])([a-z]|[A-Z]))([1-9]|([1-9][0-9])|([1-9][0-9][0-9]))[^0-9]/ig
  533. var r=strExp.match(re)
  534. if (r==null) 
  535. return 
  536. strF=trim(r[0].substring(0,r[0].length-1))//取出第一个标志符
  537. var iLength=strF.length
  538. for (var i=0;i<iLength;i++){
  539. lngA=parseInt(strF.charCodeAt(i))
  540. if (lngA>=49 && lngA<=57){
  541. var strFChar=strF.substring(0,i)
  542. var strFInt=parseInt(strF.substring(i,iLength+1))
  543. break;
  544. }
  545. }
  546. strL=trim(r[1].substring(0,r[1].length-1))//取出第二个标志符
  547. iLength=strL.length
  548. for (var i=0;i<iLength;i++){
  549. lngA=parseInt(strL.charCodeAt(i))
  550. if (lngA>=49 && lngA<=57){
  551. var strLChar=strL.substring(0,i)
  552. var strLInt=parseInt(strL.substring(i,iLength+1))
  553. break;
  554. }
  555. }
  556. var iIndex=0
  557. for (var j=LblToInt(strFChar);j<=LblToInt(strLChar);j++){
  558. for (var i=strFInt;i<=strLInt;i++){
  559. var strCol=IntToLbl(j)
  560. var strSearch=trim(strCol)+i
  561. var strRe=new RegExp(strSearch,"i")
  562. //-----------将getCellValue函数的内容插入此
  563. var strChar1,strInt1
  564. var iLength1=strSearch.length-1
  565. var sCurRow,sCurCol
  566. var lngA1
  567. for (var ii=0;ii<=iLength1;ii++){
  568. lngA1=parseInt(strSearch.charCodeAt(ii))
  569. if (lngA1>=49 && lngA1<=57){
  570. var strChar1=strSearch.substring(0,ii)
  571. var strInt1=strSearch.substring(ii,iLength1+1)
  572. break;
  573. }
  574. }
  575. sCurRow=strInt1
  576. sCurCol=LblToInt(strChar1)
  577. //-----------
  578. //将GetCellValue函数用getCell取代
  579. strReplace="GETCELL("+sCurRow+","+sCurCol+")"
  580. //var strReplace="getCellValue('"+strSearch+"')"
  581. var retR=strSearch.replace(strRe,strReplace)
  582. //var retValue=DealPoint(retR)
  583. //改为返回GETCELL()样的公式,而不是值
  584. ReturnArr[iIndex]=retR//retValue
  585. iIndex=iIndex+1
  586. }
  587. }
  588. return ReturnArr
  589. }
  590. /**
  591. //处理小数点
  592. **/
  593. function DealPoint(strExpress){
  594. var dblResult
  595. //try{
  596. strExpress=trim(strExpress)
  597. dblResult=eval(strExpress)
  598. //}
  599. //catch (exception)
  600. //{
  601. // dblResult="#无效值"
  602. //}
  603. return dblResult
  604. }
  605. /**
  606. *宏函数
  607. **/
  608. function IF(strExpr,strTrue,strFalse) {
  609. if (strExpr)
  610. return strTrue
  611. else
  612. return strFalse
  613. }
  614. /**
  615. //sGetcell为要计算的单元串GETCELL(2,3)
  616. //计算GETCELL(2,3)此单元改动后的级联计算
  617. **/
  618. function SumOneCell(sGetcell) {
  619. var oFind=oFormula.documentElement.selectNodes("//record")
  620. for (var i=0;i<oFind.length;i++){
  621. var strRow=oFind.item(i).childNodes.item(0).text
  622. var strCol=oFind.item(i).childNodes.item(1).text
  623. var strPos="GETCELL("+trim(strRow)+","+trim(strCol)+")"
  624. bCheckFormula=false
  625. arrCheckFormula.length=0
  626. var sFor=ExpandFormula(strPos)
  627. if(bCheckFormula==true && arrCheckFormula.length>0){
  628. var s1=""
  629. for(var i=0;i<arrCheckFormula.length;i++){
  630. s1=s1+arrCheckFormula[i].RC+"="+arrCheckFormula[i].sFormula+" "
  631. }
  632. alert("公式循环调用:"+s1)
  633. break
  634. }
  635. if (sFor.indexOf(sGetcell)>-1) {
  636. // alert(sFor+" "+sGetcell)
  637. SetCellData(parseInt(strRow),parseInt(strCol),DealPoint(sFor))
  638. }
  639. }
  640. }
  641. /**
  642. //返回此单元r,c的展开后的公式串.
  643. **/
  644. function ExpandFormula(sGetcell) {
  645. //sGetcell="GETCELL(2,3)"
  646. var r,c
  647. var i=sGetcell.indexOf(",")
  648. if (i>0) {
  649. r=sGetcell.substring(8,i)
  650. c=sGetcell.substring(i+1,sGetcell.length-1)
  651. }
  652. //上面是将"GETCELL(2,3)"===>2 3
  653. var strFormula,initFormula
  654. var oFind=oFormula.documentElement.selectNodes("//record[row='" + r + "' and col='" + c + "']")
  655. if (oFind.length>0){
  656. //找到2 3单元的公式
  657. strFormula=oFind.item(0).childNodes.item(2).text
  658. initFormula=oFind.item(0).childNodes.item(4).text
  659. }
  660. else {
  661. //如无公式则返回"GETCELL(2,3)"
  662. return sGetcell
  663. }
  664. //查找公式中是否有GETCELL(x,y)
  665. var strR=strFormula
  666. var sExp=new RegExp("GETCELL.([1-9][0-9]*"+","+"[1-9][0-9]*).","ig")
  667. var re=strFormula.match(sExp)
  668. //如没有则返回"GETCELL(2,3)"
  669. if (re==null) return sGetcell
  670. for (var i=0;i<=re.length-1;i++){
  671. //先找此单元在数组中是否存在,不存在的话才加入
  672. var mRC=IntToLbl(c)+r
  673. var bFind=false
  674. for(var j=0;j<arrCheckFormula.length;j++){
  675. if(arrCheckFormula[j].RC==mRC){
  676. bFind=true
  677. }
  678. }
  679. if(bFind==false)
  680. arrCheckFormula[arrCheckFormula.length]=new ErrorFormula(sGetcell,initFormula,mRC)
  681. //---------------------
  682. for(var j=0;j<arrCheckFormula.length;j++){
  683. if (re[i]==arrCheckFormula[j].sGetcell ) {
  684. //自己调用自己
  685. bCheckFormula=true
  686. return ""
  687. }
  688. }
  689. //当单元串不等于最开始的单元串时才处理,以解决当改动的单元本身就是一个调用了其它单元的公式单元时的情况
  690. //利用递归找到公式中的GETCELL公式进行展开后的公式串
  691. var strReplace=ExpandFormula(re[i])
  692. //替代源串.
  693. strR=replaceString(strR,re[i],"("+strReplace+")")
  694. }
  695. return strR
  696. }
  697. /**
  698. //全表重算时检查公式是否有第归的情况
  699. //返回真表示可以进行公式计算
  700. **/
  701. function checkFormula(){
  702. if (oFormula.documentElement.childNodes.length <=0) 
  703. return false;
  704. var oFind=oFormula.documentElement.selectNodes("//record")
  705. for (var i=0;i<oFind.length;i++){
  706. var strRow=oFind.item(i).childNodes.item(0).text
  707. var strCol=oFind.item(i).childNodes.item(1).text
  708. var strPos="GETCELL("+trim(strRow)+","+trim(strCol)+")"
  709. bCheckFormula=false
  710. arrCheckFormula.length=0
  711. var sFor=ExpandFormula(strPos)
  712. if(bCheckFormula==true && arrCheckFormula.length>0){
  713. var s1=""
  714. for(var i=0;i<arrCheckFormula.length;i++){
  715. s1=s1+arrCheckFormula[i].RC+"="+arrCheckFormula[i].sFormula+" "
  716. }
  717. alert("公式循环调用:"+s1)
  718. return false
  719. }
  720. }
  721. return true
  722. }
  723. /**
  724. //将选中格的每行的起始列和结束列号位置增加到oPos中
  725. //strFormula为原始输入的公式
  726. //preFormula为预处理过后的公式
  727. **/
  728. function addoFormulaNodes(rowno,colno,preFormula,strFormula)
  729. {
  730. //删除保存在oFormula中的公式
  731. var oFind=oFormula.documentElement.selectNodes("//record[row='" + rowno + "' and col='" + colno + "']")
  732. if (oFind.length==1)
  733. oFormula.documentElement.removeChild(oFind.item(0))//删除找到的节点
  734. var root = oFormula.documentElement
  735. var newNode = oFormula.createNode (1, "record", "")
  736. root.appendChild(newNode)
  737. var newElem = oFormula.createElement("row") //物理行
  738. newNode.appendChild(newElem)
  739. newNode.lastChild.text = rowno
  740. var newElem = oFormula.createElement("col") //物理行
  741. newNode.appendChild(newElem)
  742. newNode.lastChild.text = colno
  743. var newElem = oFormula.createElement("formula") //物理行
  744. newNode.appendChild(newElem)
  745. newNode.lastChild.text = preFormula
  746. var newElem = oFormula.createElement("level") //重算的级别数
  747. newNode.appendChild(newElem)
  748. newNode.lastChild.text = "1"
  749. var newElem = oFormula.createElement("source") //处理前的公式
  750. newNode.appendChild(newElem)
  751. newNode.lastChild.text = strFormula
  752. }
  753. /**
  754. //装入所有的公式到oFormula对象
  755. **/
  756. function LoadAllFormula() {
  757. var sFormula="<root>"
  758. for(var i=1;i<t.rows.length;i++){
  759. for(var j=1;j<t.rows(0).cells.length;j++){
  760. var arr=PhyToLog(i,j)
  761. var s1=t.rows(arr[0]).cells(arr[1]).getAttribute("formula")
  762. if(s1!=null){
  763. var preFormula=replaceFormula(s1)
  764. sFormula=sFormula+"<record><row>"+i+"</row><col>"
  765. +j+"</col><formula>"+preFormula
  766. +"</formula><level></level><source>"
  767. +s1+"</source></record>"
  768. }
  769. }
  770. }
  771. sFormula=sFormula+"</root>"
  772. //装入DOM
  773.     oFormula=new ActiveXObject("Microsoft.XMLDOM")
  774.     oFormula.async ="false";
  775.     oFormula.loadXML(sFormula)
  776. }
  777. /**
  778. *全表重算的按钮的点击事件
  779. //公式计算的工作:1 全表重算,2 当改动一个单元格的值时自动执行调用此单元的公式
  780. //(即设置为自动重算时要做的工作).3 三级以上级联公式的处理.
  781. //重算
  782. **/
  783. function cmdCompute(){
  784. // if (SetReadOnly()) return
  785. var i,j,iLevel
  786. var strFormula
  787. if (checkFormula()==false){
  788. return;
  789. }
  790. window.status="正在重算整个表,请稍候..."
  791. // SaveoUndoOneRecord()
  792. //将上一当前行列保存进来以便恢复
  793. // curFormulaRow=presRow
  794. // curFormulaCol=presCol
  795. //先让所有的水平都为1
  796. for(i=0;i<oFormula.documentElement.childNodes.length;i++){
  797. oFormula.documentElement.childNodes(i).childNodes(3).text=1
  798. }
  799. //alert(oFormula.documentElement.xml)
  800. iLevel=1
  801. var oFind=oFormula.documentElement.selectNodes("//record[level='" + iLevel + "']") //
  802. while (oFind.length>0){
  803. for (i=0;i<oFind.length;i++){
  804. strFormula=oFind.item(i).childNodes.item(2).text
  805. for (j=0;j<oFind.length;j++){
  806. var strRow=oFind.item(j).childNodes.item(0).text
  807. var strCol=oFind.item(j).childNodes.item(1).text
  808. //注COL在前
  809. var strPos="GETCELL("+trim(strRow)+","+trim(strCol)+")"
  810. //查找公式中是否有GETCELL()之类的,如有则表示级别应加大.
  811. //查找公式中是否有B5之类的,如有则表示级别应加大.
  812. if (strFormula.indexOf(strPos)>-1){
  813. oFind.item(i).childNodes.item(3).text=parseInt(iLevel)+1
  814. break;
  815. }
  816. }
  817. }
  818. iLevel=iLevel+1
  819. var oFind=oFormula.documentElement.selectNodes("//record[level='" + iLevel + "']")
  820. //再在高一级的公式中查找更高一级的.
  821. }
  822. var colno
  823. //按oFormula对象中的层次关系由最低层的开始计算
  824. iLevel=1
  825. oFind=oFormula.documentElement.selectNodes("//record[level='" + iLevel + "']")
  826. while (oFind.length>0){
  827. for (i=0;i<oFind.length;i++){
  828. var strRow=oFind.item(i).childNodes.item(0).text
  829. var strCol=oFind.item(i).childNodes.item(1).text
  830. var strLblSelf=trim(IntToLbl(strCol))+trim(strRow)
  831. strFormula=oFind.item(i).childNodes.item(2).text
  832. //if (NotIsInRect(parseInt(strRow),parseInt(strCol))==true)//false在矩形之内的无对应td值的单元格;true不在矩形之内
  833. //{
  834. //带模版的公式的当前行列用此两个变量跟踪
  835. presRow=parseInt(strRow)
  836. presCol=parseInt(strCol)
  837. SetCellData(parseInt(strRow),parseInt(strCol),DealPoint(strFormula))
  838. //}
  839. oFind.item(i).childNodes.item(3).text="1"
  840. }
  841. iLevel=iLevel+1
  842. oFind=oFormula.documentElement.selectNodes("//record[level='" + iLevel + "']")
  843. }
  844. blnChange=true
  845. //将上一当前行列恢复
  846. //presRow=curFormulaRow
  847. //presCol=curFormulaCol
  848. //SaveoRedoOneRecord()
  849. window.status="计算完成!"
  850. }
  851. /**
  852. //增删列时要移动公式相对引用的
  853. **/
  854. function MoveFormula(startCol,iCols,iTag){
  855. var strFormula
  856. for (var k=0;k<oFormula.documentElement.childNodes.length;k++){
  857. strFormula=trim(oFormula.documentElement.childNodes(k).childNodes(4).text)
  858. strFormula=" " +strFormula+" "
  859. re=/(([a-z]|[A-Z])|([a-z]|[A-Z])([a-z]|[A-Z]))([1-9]|([1-9][0-9])|([1-9][0-9][0-9]))[^0-9]/ig
  860. r=strFormula.match(re)
  861. if(r!=null){
  862. var lngPrePos=0
  863. var lngPrePos1=0
  864. var strRet=""  //返回公式
  865. //加此循环是为了替代一个公式中的多个A2
  866. for (var i=0;i<=r.length-1;i++){
  867. strSearch=trim(r[i].substring(0,r[i].length-1))//取出的一个标志符
  868. //alert(strSearch)
  869. var strChar,strInt
  870. var iLength=strSearch.length-1
  871. var sCurRow,sCurCol
  872. var lngA
  873. for (var ii=0;ii<=iLength;ii++){
  874. lngA=parseInt(strSearch.charCodeAt(ii))
  875. if (lngA>=49 && lngA<=57){
  876. var strChar=strSearch.substring(0,ii)
  877. var strInt=strSearch.substring(ii,iLength+1)
  878. break;
  879. }
  880. }
  881. //由B5==>行和列数
  882. sCurRow=parseInt(strInt)
  883. sCurCol=LblToInt(strChar)
  884. if(sCurCol>startCol) {
  885. //=1表示移行,否则移动列
  886. if(iTag==1)
  887. sCurRow=sCurRow+iCols
  888. else
  889. sCurCol=sCurCol+iCols
  890. //-----------替代  B5===>F5
  891. strReplace=IntToLbl(sCurCol)+sCurRow
  892. //alert(strReplace)
  893. lngPrePos1=strFormula.indexOf(strSearch,lngPrePos)
  894. if (lngPrePos1>0){
  895. //替换字符
  896. strRet=strRet+strFormula.substring(lngPrePos,lngPrePos1)+strReplace
  897. lngPrePos=lngPrePos1+strSearch.length
  898. }
  899. else {
  900. strRet=strRet+strFormula.substring(lngPrePos,strFormula.length-1)
  901. }
  902. //alert(i+":"+strRet)
  903. }
  904. }
  905. //alert(strRet)
  906. var iRow=parseInt(trim(oFormula.documentElement.childNodes(k).childNodes(0).text))
  907. var iCol=parseInt(trim(oFormula.documentElement.childNodes(k).childNodes(1).text))
  908. var arr=PhyToLog(iRow,iCol)
  909. t.rows(arr[0]).cells(arr[1]).setAttribute("formula",trim(strRet))
  910. }
  911. }
  912. }
  913. //表函数
  914. /**
  915. *表函数,取当前列号
  916. **/
  917. function COL() {
  918. return sCol
  919. }
  920. /**
  921. *表函数,取当前行号
  922. **/
  923. function ROW() {
  924. return sRow
  925. }
  926. /**
  927. *表函数,取总列数
  928. **/
  929. function COLS() {
  930. return t.rows(0).cells.length
  931. }
  932. /**
  933. *表函数,取总行数
  934. **/
  935. function ROWS() {
  936. return t.rows.length
  937. }
  938. function col() {
  939. return COL()
  940. }
  941. function cols() {
  942. return COLS()
  943. }
  944. function row() {
  945. return ROW()
  946. }
  947. function rows() {
  948. return ROWS()
  949. }
  950. /**
  951. *表函数,取SQL语句的返回值
  952. **/
  953. function getdb(strConnection,strSql){
  954. return GETDB(strConnection,strSql)
  955. }
  956. /**
  957. *输入公式按扭的点击事件
  958. **/
  959. function cmdFormula(){
  960. //输入公式
  961. var arySend=new Array()
  962. arySend[0]=IntToLbl(sCol)+sRow //当前单元格的位置
  963. var arr=PhyToLog(sRow,sCol)
  964. arySend[1]=t.rows(arr[0]).cells(arr[1]).getAttribute("formula") //公式串
  965. if(arySend[1]==null)arySend[1]=""
  966. var strReturn=window.showModalDialog("dsnsetformula.htm",arySend,"status:no;dialogHeight:265px;dialogWidth:405px;dialogTop:200;dialogLeft:150px") 
  967. if (isSpace(strReturn)==false){
  968. txtMyGrid.value ="="+strReturn//返回的公式串
  969. grid.txtTotd()
  970. blnChange=true
  971. }
  972. }
  973. //*****************************************************************************************
  974. //公式处理 end
  975. //*****************************************************************************************
  976. /**
  977. //设置固定行列
  978. **/
  979. function FixRowsCols() {
  980. var arr=new Array()
  981. arr[0]=grid.FixRows
  982. arr[1]=grid.FixCols
  983. arr[2]=t.getAttribute("queryorder")
  984. if(arr[2]==null)arr[2]="0"
  985. var sRet=window.showModalDialog("fixrowscols.htm",arr,"status:no;dialogHeight:180px;dialogWidth:300px;dialogTop:180;dialogLeft:250px") 
  986. grid.FixRows=sRet[0]
  987. grid.FixCols=sRet[1]
  988. //存入表格属性中
  989. t.setAttribute("fixrows",sRet[0])
  990. t.setAttribute("fixcols",sRet[1])
  991. t.setAttribute("queryorder",sRet[2])
  992. blnChange=true
  993. }
  994. /**
  995. *调用设置事件的页面
  996. **/
  997. function InputRunPara() {
  998. //输入报表运行时设置的参数
  999. var sRet=window.showModalDialog("setevent.htm",t,"status:no;scroll:no;dialogHeight:270px;dialogWidth:300px;center:yes;") 
  1000. blnChange=true
  1001. return
  1002. var arySend=t.getAttribute("runpara")
  1003. if(arySend==null)arySend=""
  1004. var sRet=window.showModalDialog("dsninputrunpara.htm",arySend,"status:no;scroll:no;dialogHeight:340px;dialogWidth:695px;dialogTop:20;dialogLeft:20px") 
  1005. if(sRet!=""){
  1006. t.setAttribute("runpara",sRet)
  1007. blnChange=true
  1008. }
  1009. }
  1010. function AfterRunSql() {
  1011. //设置运行查询之后要运行的命令
  1012. var arySend=t.getAttribute("afterrunsql")
  1013. if(arySend==null)arySend=""
  1014. var sRet=window.showModalDialog("dsnafterrunsql.htm",arySend,"status:no;scroll:no;dialogHeight:340px;dialogWidth:695px;dialogTop:20;dialogLeft:20px") 
  1015. if(sRet!=""){
  1016. t.setAttribute("afterrunsql",sRet)
  1017. blnChange=true
  1018. }
  1019. }
  1020. function PageRun() {
  1021. //输入报表翻页时运行的命令
  1022. var arySend=t.getAttribute("pagerun")
  1023. if(arySend==null)arySend=""
  1024. var sRet=window.showModalDialog("dsnpagerun.htm",arySend,"status:no;scroll:no;dialogHeight:340px;dialogWidth:695px;dialogTop:20;dialogLeft:20px") 
  1025. if(sRet!=""){
  1026. t.setAttribute("pagerun",sRet)
  1027. blnChange=true
  1028. }
  1029. }
  1030. function AddLineRun() {
  1031. //输入自动加行后要运行的命令
  1032. var arySend=t.getAttribute("addlinerun")
  1033. if(arySend==null)arySend=""
  1034. var sRet=window.showModalDialog("dsnaddlinerun.htm",arySend,"status:no;scroll:no;dialogHeight:340px;dialogWidth:695px;dialogTop:20;dialogLeft:20px") 
  1035. if(sRet!=""){
  1036. t.setAttribute("addlinerun",sRet)
  1037. blnChange=true
  1038. }
  1039. }
  1040. function SetReportUserData() {
  1041. //输入报表的用户数据
  1042. var arySend=t.getAttribute("userdata")
  1043. if(arySend==null)arySend=""
  1044. arySend=unescape(arySend)
  1045. var sRet=window.showModalDialog("dsnuserdata.htm",arySend,"status:no;scroll:no;dialogHeight:200px;dialogWidth:280px;dialogTop:20;dialogLeft:20px") 
  1046. if(isSpace(sRet)==false && typeof sRet!="undefined"){
  1047. t.setAttribute("userdata",escape(sRet))
  1048. blnChange=true
  1049. }
  1050. }
  1051. /**
  1052. *设置单元格只读或可写
  1053. //设置按回车键后进入哪个单元格
  1054. **/
  1055. function PressEnter() {
  1056. if(tc.style.display=="none") return
  1057. var arr=PhyToLog(sRow,sCol)
  1058. var curTD=t.rows(arr[0]).cells(arr[1])
  1059. var s1=curTD.getAttribute("pressenter")
  1060. if(s1==null)s1=""
  1061. var s2=curTD.getAttribute("cellreadonly")
  1062. if(s2==null)s2=""
  1063. //alert(s1+" : "+s2)
  1064. var arr1=new Array()
  1065. arr1[0]=s1
  1066. arr1[1]=s2
  1067. var sRet=window.showModalDialog("dsnsetenter.htm",arr1,"status:no;dialogHeight:160px;dialogWidth:400px;dialogTop:180;dialogLeft:100px") 
  1068. if(sRet!=null){
  1069. if(isSpace(sRet[0])==false)
  1070. curTD.setAttribute("pressenter",sRet[0])
  1071. else
  1072. curTD.removeAttribute("pressenter")
  1073. if(sRet[1]==1)
  1074. curTD.setAttribute("cellreadonly",sRet[1])
  1075. else
  1076. curTD.removeAttribute("cellreadonly")
  1077.            
  1078.            blnChange=true
  1079.         }
  1080. }
  1081. /**
  1082. //设置小数位数
  1083. **/
  1084. function SetPointNum() {
  1085. if(tc.style.display=="none") return
  1086. SaveoUndoOneRecord()
  1087. var arr=PhyToLog(sRow,sCol)
  1088. var curTD=t.rows(arr[0]).cells(arr[1])
  1089. var s1=curTD.getAttribute("pointnum")
  1090. if(s1==null)s1=""
  1091. var sRet=window.showModalDialog("dsnpointnum.htm",s1,"status:no;dialogHeight:110px;dialogWidth:250px;dialogTop:180;dialogLeft:250px") 
  1092. for(var i=sRowSort;i<=eRowSort;i++){
  1093. for(var j=sColSort;j<=eColSort;j++){
  1094. arr=PhyToLog(i,j)
  1095. curTD=t.rows(arr[0]).cells(arr[1])
  1096. if(isSpace(sRet)==false){
  1097. curTD.setAttribute("pointnum",sRet)
  1098. curTD.innerText=ContDec(curTD.innerText,sRet)
  1099. }
  1100. else {
  1101. curTD.removeAttribute("pointnum")
  1102. }
  1103. }
  1104. }
  1105. hideTxt()
  1106. SaveoRedoOneRecord()
  1107. blnChange=true
  1108. }
  1109. /**
  1110. //设置超级链接
  1111. **/
  1112. function SetHref() {
  1113. if(tc.style.display=="none") return
  1114. var arr=PhyToLog(sRow,sCol)
  1115. var curTD=t.rows(arr[0]).cells(arr[1])
  1116. var s1=curTD.getAttribute("sethref")
  1117. if(s1==null)s1=""
  1118. var sRet=window.showModalDialog("dsnhref.htm",s1,"status:no;dialogHeight:110px;dialogWidth:350px;dialogTop:180;dialogLeft:250px") 
  1119. if(typeof sRet=="undefined") return
  1120. SaveoUndoOneRecord()
  1121. if(isSpace(sRet)==false){
  1122. //alert(sRet)
  1123. curTD.setAttribute("sethref",sRet)
  1124. curTD.innerHTML="<a href="+sRet+">"+curTD.innerText+"</a>"
  1125. }
  1126. else {
  1127. curTD.removeAttribute("sethref")
  1128. curTD.innerHTML=""
  1129. }
  1130. alert(curTD.innerHTML)
  1131. SaveoRedoOneRecord()
  1132. blnChange=true
  1133. }
  1134. /**
  1135. //输入数据装入的Sql条件
  1136. **/
  1137. function ShowSetSql() {
  1138. var arySend=new Array()
  1139. arySend[0]=t.getAttribute("buttonxml")
  1140. if(arySend[0]==null)
  1141. arySend[0]=""
  1142. else
  1143. arySend[0]=unescape(arySend[0])
  1144. arySend[1]=t.getAttribute("initwhere")
  1145. if(arySend[1]==null)
  1146. arySend[1]=""
  1147. else
  1148. arySend[1]=unescape(arySend[1])
  1149. arySend[2]=t.getAttribute("recordsetxml")
  1150. if(arySend[2]==null)
  1151. arySend[2]=""
  1152. else
  1153. arySend[2]=unescape(arySend[2])
  1154. var sRet=window.showModalDialog("dsnsetsql.htm",arySend,"status:no;scroll:no;dialogHeight:450px;dialogWidth:600px;dialogTop:20;dialogLeft:20px") 
  1155. if(sRet!=""){
  1156. var arr=sRet.split(";")
  1157. t.setAttribute("buttonxml",arr[0])
  1158. t.setAttribute("initwhere",arr[1])
  1159. t.setAttribute("recordsetxml",arr[2])
  1160. blnChange=true
  1161. }
  1162. }
  1163. /**
  1164. //装入HTML表格
  1165. **/
  1166. function LoadHtml() {
  1167. var sRet=window.showModalDialog("dsnloadhtml.htm","","status:no;scroll:no;dialogHeight:340px;dialogWidth:695px;dialogTop:20;dialogLeft:20px") 
  1168. if(sRet!=""){ //下面的内容和newreport类似
  1169. //先检查是否要保存当前报表
  1170. CheckReportChange()
  1171. var sTab=sRet
  1172. t.outerHTML=sTab
  1173. CopytHtml()
  1174. document.title=""
  1175. grid.reload(sTab)
  1176. initoUndooRedo()
  1177. oFormula=new ActiveXObject("Microsoft.XMLDOM")
  1178. oFormula.async ="false";
  1179. oFormula.loadXML("<root></root>")
  1180. oGraph=new ActiveXObject("Microsoft.XMLDOM")
  1181. oGraph.async ="false";
  1182. oGraph.loadXML("<root></root>")
  1183. blnChange=false
  1184. //另加,内有滚动条的处理
  1185. grid.initGrid()
  1186. }
  1187. }
  1188. function InputCheck() {
  1189. //输入检查条件
  1190. var arySend=t.getAttribute("check")
  1191. if(arySend==null)arySend=""
  1192. var sRet=window.showModalDialog("dsninputcheck.htm",arySend,"status:no;scroll:no;dialogHeight:340px;dialogWidth:695px;dialogTop:20;dialogLeft:20px") 
  1193. if(sRet!=""){
  1194. t.setAttribute("check",sRet)
  1195. blnChange=true
  1196. }
  1197. }
  1198. /**
  1199. //执行检查条件
  1200. **/
  1201. function ExecCheck() {
  1202. var arySend=t.getAttribute("check")
  1203. if(arySend==null) {
  1204. alert("无检查条件!")
  1205. return
  1206. }
  1207. else {
  1208. eval(unescape(arySend))
  1209. }
  1210. }
  1211. /**
  1212. //重算此表的所有图形
  1213. **/
  1214. function setAllGraph(){
  1215.    for(var i=1;i<t.rows.length;i++){
  1216.     for(var j=1;j<t.rows(i).cells.length;j++){
  1217.         var curTD=t.rows(i).cells(j)
  1218.         var s1=curTD.getAttribute("graph")
  1219.         if(s1!=null){
  1220.         s1=unescape(s1)
  1221.         if(isSpace(s1)==false){
  1222.            setGraph(1,s1)
  1223.         }
  1224.         }
  1225.     }
  1226.    }
  1227. }
  1228. /**
  1229. //设置新的图形  
  1230. //iRun==1表示不出现对话框,重算此表的所有图形
  1231. //iRun==0表示出现对话框,
  1232. //生成的图形自动放到当前TD中
  1233. //取值范围,标签范围只能采用命令来写,且应存入TD的属性中.其它用属性窗的方式.将所有的属性拼成一个XML串存在TD的属性中.
  1234. //然后由此XML串得到一个图形串.
  1235. //有一个可扩充的参数,将它插入到</applet>前面.
  1236. //参数: samplevalues:B1:B5,samplelabels:B1:B5,graphposition:C4,width:100,height:200,
  1237. //TD:graphxml:
  1238.    <root>
  1239.       <type>直方图</type>
  1240.       <samplevalues>B1:B5</samplevalues>
  1241.       <samplelabels>B1:B5</samplelabels>
  1242.       <graphposition>C4</graphposition>
  1243.       <width>100</width>
  1244.       <height>200</height>
  1245.       <other></other>   //其它属性,要先escape
  1246.       <opt>行</opt> //填行/列两个值,用于控制循环拼数时是先行后列还是先列后行
  1247.    </root>
  1248. **/
  1249. function setGraph(iRun,sGraphAttribute) {
  1250.    var sXml=sGraphAttribute
  1251.    if(iRun==0) {
  1252. if(tc.style.display=="none") return
  1253. var arr=PhyToLog(sRow,sCol)
  1254. var curTD=t.rows(arr[0]).cells(arr[1])
  1255. var arySend=curTD.getAttribute("graph")
  1256. if(arySend==null)arySend=""
  1257. arySend=unescape(arySend)
  1258.         sXml=window.showModalDialog("dsnsetgraph.htm",arySend,"status:no;scroll:no;dialogHeight:500px;dialogWidth:700px;dialogTop:20;dialogLeft:20px") 
  1259.         if(sXml==null || sXml=="") return
  1260.     } 
  1261.     //alert(sXml)
  1262.     var oXml=new ActiveXObject("Microsoft.XMLDOM")
  1263.     oXml.async="false";
  1264.     oXml.loadXML(sXml)
  1265. //-----------------------------------------------------------------------------------
  1266. //计算放图的TD
  1267.     var iPosRow,iPosCol //放图形的单元的行列
  1268.    
  1269.     var arr1=TransAto1(oXml.documentElement.childNodes(3).text)  //C3,放图的单元格
  1270.     iPosRow=arr1[0]
  1271.     iPosCol=arr1[1]
  1272.     var arr=PhyToLog(iPosRow,iPosCol)
  1273.     var curTD=t.rows(arr[0]).cells(arr[1])
  1274. //-----------------------------------------------------------------------------------
  1275. //计算samplevalues串和samplelabels串
  1276. var sRowTmp,sColTmp,eRowTmp,eColTmp //放数据的起止单元
  1277. var sData=oXml.documentElement.childNodes(1).text //A1:C2
  1278. var s1=""
  1279. if(isSpace(sData)==false){
  1280. var arrData=sData.split(":")
  1281. var arrS=TransAto1(arrData[0])
  1282. sRowTmp=parseInt(arrS[0])
  1283. sColTmp=parseInt(arrS[1])
  1284. var arrE=TransAto1(arrData[1])
  1285. eRowTmp=parseInt(arrE[0])
  1286. eColTmp=parseInt(arrE[1])
  1287.    
  1288. var iRows=eRowTmp-sRowTmp+1
  1289. var iCols=eColTmp-sColTmp+1
  1290. var ssamplevalue="sampleValues"
  1291. var ss1='<param name="'
  1292. var ii=0
  1293. s1=''
  1294. if(oXml.documentElement.childNodes(7).text=="行"){
  1295. if(sColTmp<eColTmp){
  1296. ssamplevalue="sampleValues_0"
  1297. //多列时加上列数属性
  1298. //s1+='<param name=seriesCount value="'+(eRowTmp-sRowTmp+1)+'">'
  1299. }
  1300. for (var j=sColTmp;j<=eColTmp;j++) {
  1301. s1+='<param name="'+ssamplevalue+'" value=" '
  1302. for (var i=sRowTmp;i<=eRowTmp ;i++) {
  1303. var arr3=PhyToLog(i,j)
  1304. s1+=t.rows(arr3[0]).cells(arr3[1]).innerText+ ","
  1305. }
  1306. s1=s1.substring(0,s1.length-1);   //去掉最后的,号  
  1307. s1+='">'
  1308. ii++;
  1309. ssamplevalue="sampleValues_"+ii;
  1310. }
  1311. }else{
  1312. if(sRowTmp<eRowTmp){
  1313. ssamplevalue="sampleValues_0"
  1314. //多列时加上列数属性
  1315. //s1+='<param name=seriesCount value="'+(eColTmp-sColTmp+1)+'">'
  1316. }
  1317. for (var i=sRowTmp;i<=eRowTmp ;i++) {
  1318. s1+='<param name="'+ssamplevalue+'" value=" '
  1319. for (var j=sColTmp;j<=eColTmp;j++) {
  1320. var arr3=PhyToLog(i,j)
  1321. s1+=t.rows(arr3[0]).cells(arr3[1]).innerText+ ","
  1322. }
  1323. s1=s1.substring(0,s1.length-1);   //去掉最后的,号  
  1324. s1+='">'
  1325. ii++;
  1326. ssamplevalue="sampleValues_"+ii;
  1327. }
  1328. }
  1329. //计算samplelabels
  1330. var s2=""
  1331. var sData=oXml.documentElement.childNodes(2).text //A1:C2
  1332. if(isSpace(sData)==false){
  1333. var arrData=sData.split(":")
  1334. var arrS=TransAto1(arrData[0])
  1335. sRowTmp=parseInt(arrS[0])
  1336. sColTmp=parseInt(arrS[1])
  1337. var arrE=TransAto1(arrData[1])
  1338. eRowTmp=parseInt(arrE[0])
  1339. eColTmp=parseInt(arrE[1])
  1340.    
  1341. var iRows=eRowTmp-sRowTmp+1
  1342. var iCols=eColTmp-sColTmp+1
  1343. s2='<param name="sampleLabels" value=" '
  1344. for (var i=sRowTmp;i<=eRowTmp ;i++) {
  1345. for (var j=sColTmp;j<=eColTmp;j++) {
  1346. var arr3=PhyToLog(i,j)
  1347. s2+=t.rows(arr3[0]).cells(arr3[1]).innerText+ ","
  1348. }
  1349. }
  1350. s2=s2.substring(0,s2.length-1)    
  1351. s2+='">'
  1352. }
  1353. //-----------------------------------------------------------------------------------
  1354. var sType=""
  1355. switch (oXml.documentElement.childNodes(0).text)  {
  1356.    case "折线图" :
  1357.        sType=" code=cn.com.fcsoft.chart.LineChartApplet "
  1358.        break;
  1359.    case "圆饼图" :
  1360.        sType=" code=cn.com.fcsoft.chart.PieChartApplet "
  1361.        break;
  1362.    default :
  1363.        sType=" code=cn.com.fcsoft.chart.BarChartApplet "
  1364. }
  1365. var sAll='<Applet archive=chart.jar '
  1366. if(isSpace(oXml.documentElement.childNodes(4).text)==false)
  1367. sAll+=" width=" +oXml.documentElement.childNodes(4).text+" "
  1368. if(isSpace(oXml.documentElement.childNodes(5).text)==false)
  1369. sAll+=" height=" +oXml.documentElement.childNodes(5).text+" "
  1370. sAll+=sType
  1371. sAll+=' >'
  1372. sAll+=s1+s2
  1373. sAll+=unescape(oXml.documentElement.childNodes(6).text) //其它属性
  1374. sAll+='</Applet>'
  1375. curTD.setAttribute("graph",escape(sXml))
  1376. //alert(sAll)
  1377. curTD.innerHTML=sAll
  1378. //t.rows(3).cells(2).innerHTML='<applet code=cn.com.fcsoft.chart.BarChartApplet archive=chart.jar width=200 height=140><param name=sampleValues value="'+t.rows(3).cells(1).innerText+',20,30,40,50"><param name=chartTitle value="chart title"><param name=titleFont value="Courier, bold, 20"></Applet>'
  1379. return
  1380. }
  1381. //--------------------------------------------------------------------------------------  
  1382. function showGraph(strGraph,iRun) {
  1383. setGraph(0,"")
  1384. return
  1385. //sRet为选择对话框后的返回值 0:标题 1:图形类型 2:放图的单元格 3 为0表示垂直方向
  1386.  //graph.Labeltext="车间名称";//X轴标题的内容  
  1387.  //type=4
  1388.  
  1389.  graph.top="1"
  1390.  graph.left="1"
  1391.  graph.ArcLeft=100
  1392.  graph.ArcTop=150
  1393.  graph.ArcRadius=50
  1394.  graph.ImgWidth=450
  1395.  graph.ImgHeight=300
  1396.  graph.ImgMargin=40  
  1397. var hostname=location.hostname
  1398. //显示设置界面
  1399. var ary=""
  1400. if(arguments.length>0)
  1401. ary=strGraph
  1402. if(arguments.length==2)
  1403. var strReturn=strGraph //直接运行
  1404. else
  1405. var strReturn=window.showModalDialog("dsngraph.htm",ary,"status:no;scroll:no;dialogHeight:365px;dialogWidth:405px;dialogTop:100;dialogLeft:150px") 
  1406. if (isSpace(strReturn)) return
  1407. if (strReturn=="del"){
  1408. //删除当前图形
  1409. if(arguments.length==0) return
  1410. //从表格的双击事件进入
  1411. var o=event.srcElement 
  1412. if(o.tagName=="IMG"){
  1413. o=o.parentNode
  1414. if(o.tagName=="TD"){
  1415. o.removeAttribute("graph")
  1416. o.innerHTML=""
  1417. }
  1418. }
  1419. return
  1420. }
  1421. var arrWin=strReturn.split(";")
  1422. var sTitle=arrWin[0] //graph title
  1423. var iType=parseInt(arrWin[1])// graph type
  1424. if (isNaN(iType)) iType=1
  1425. var sRowTmp,sColTmp,eRowTmp,eColTmp //放数据的起止单元
  1426. var sData=arrWin[6] //A1:C2
  1427. var arrData=sData.split(":")
  1428. var arrS=TransAto1(arrData[0])
  1429. sRowTmp=parseInt(arrS[0])
  1430. sColTmp=parseInt(arrS[1])
  1431. var arrE=TransAto1(arrData[1])
  1432. eRowTmp=parseInt(arrE[0])
  1433. eColTmp=parseInt(arrE[1])
  1434. //alert(sRowTmp+" "+sColTmp+" "+eRowTmp+" "+eColTmp)      
  1435.     var iPosRow,iPosCol //放图形的单元的行列
  1436.    
  1437.     var arr1=TransAto1(arrWin[2])
  1438.     iPosRow=arr1[0]
  1439.     iPosCol=arr1[1]
  1440.     var arr=PhyToLog(iPosRow,iPosCol)
  1441.     var curTD=t.rows(arr[0]).cells(arr[1])
  1442. graph.imgWidth=curTD.offsetWidth //-20
  1443. if (graph.imgWidth<10)graph.imgWidth=10
  1444. graph.imgHeight=curTD.offsetHeight //-20
  1445. if (graph.imgHeight<10)graph.imgHeight=10
  1446. var s1="<r>"
  1447. if (arrWin[3]=="0") {
  1448. //垂直方向
  1449. var iCols=eRowTmp-sRowTmp+1
  1450. var iRows=eColTmp-sColTmp+1
  1451. for (var j=sColTmp;j<=eColTmp ;j++) {
  1452. s1=s1+"<a" + j + ">"
  1453. for (var i=sRowTmp;i<=eRowTmp;i++) {
  1454. var arr3=PhyToLog(i,j)
  1455. s1=s1+"<a" + j+""+i  + ">"+t.rows(arr3[0]).cells(arr3[1]).innerText+"</a" + j+""+i  + ">"
  1456. }
  1457. s1=s1+"</a" + j + ">"
  1458. }
  1459. }
  1460. else {
  1461. var iRows=eRowTmp-sRowTmp+1
  1462. var iCols=eColTmp-sColTmp+1
  1463. for (var i=sRowTmp;i<=eRowTmp ;i++) {
  1464. s1=s1+"<a" + i + ">"
  1465. for (var j=sColTmp;j<=eColTmp;j++) {
  1466. var arr3=PhyToLog(i,j)
  1467. s1=s1+"<a" + i+""+j  + ">"+t.rows(arr3[0]).cells(arr3[1]).innerText+"</a" + i+""+j  + ">"
  1468. }
  1469. s1=s1+"</a" + i + ">"
  1470. }
  1471. }
  1472. s1=s1+"</r>"
  1473. //建IMG标记
  1474. curTD.innerHTML="<IMG></IMG>"
  1475. var img1=curTD.childNodes.item(0)
  1476. img1.style.width=graph.imgWidth
  1477. img1.style.height=graph.imgHeight
  1478. img1.src=graph.ShowGraphXml(img1,s1,iType,sTitle,iRows,iCols)
  1479. //将画图参数保存
  1480. curTD.setAttribute("graph",strReturn)
  1481. addoGraph(iPosRow,iPosCol,strReturn)
  1482. blnChange=true
  1483. }
  1484. /**
  1485. //将选中格的每行的起始列和结束列号位置增加到oPos中
  1486. //strFormula为原始输入的公式
  1487. //preFormula为预处理过后的公式
  1488. **/
  1489. function addoGraph(rowno,colno,strGraph)
  1490. {
  1491. //删除保存在oFormula中的公式
  1492. var oFind=oGraph.documentElement.selectNodes("//record[row='" + rowno + "' and col='" + colno + "']")
  1493. if (oFind.length==1)
  1494. oGraph.documentElement.removeChild(oFind.item(0))//删除找到的节点
  1495. var root = oGraph.documentElement
  1496. var newNode = oGraph.createNode (1, "record", "")
  1497. root.appendChild(newNode)
  1498. var newElem = oGraph.createElement("row") //物理行
  1499. newNode.appendChild(newElem)
  1500. newNode.lastChild.text = rowno
  1501. var newElem = oGraph.createElement("col") //物理行
  1502. newNode.appendChild(newElem)
  1503. newNode.lastChild.text = colno
  1504. var newElem = oGraph.createElement("graph") //物理行
  1505. newNode.appendChild(newElem)
  1506. newNode.lastChild.text = strGraph
  1507. }
  1508. /**
  1509. //装入显示图形
  1510. **/
  1511. function LoadGraph(iTag){
  1512. if(iTag==1){ //装入报表时装入
  1513. var sGraph=t.getAttribute("graph")
  1514. if(sGraph==null )return
  1515. oGraph.loadXML(unescape(sGraph))
  1516. }
  1517. for(var i=0;i<oGraph.documentElement.childNodes.length;i++){
  1518. var s1=oGraph.documentElement.childNodes(i).childNodes(2).text
  1519. showGraph(s1,1) //1为一个标志,表示不出现对话框
  1520. return  //暂时这样
  1521. //延时
  1522. //for(var j=0;j<100000;j++){
  1523. // var s="s";
  1524. //}
  1525. }
  1526. }
  1527. /**
  1528. //用于拖动修改行高时删除图形
  1529. **/
  1530. function DelAllGraphTag(){
  1531. for(var i=0;i<oGraph.documentElement.childNodes.length;i++){
  1532. var sRowTmp=oGraph.documentElement.childNodes(i).childNodes(0).text
  1533. var sColTmp=oGraph.documentElement.childNodes(i).childNodes(1).text
  1534. var arr=PhyToLog(parseInt(sRowTmp),parseInt(sColTmp))
  1535. t.rows(arr[0]).cells(arr[1]).innerHTML=""
  1536. }
  1537. }
  1538. function SetCondition() {
  1539. //设置查询窗口的条件串
  1540. var arySend=t.getAttribute("condition")
  1541. if(arySend==null)arySend=""
  1542. var sRet=window.showModalDialog("dsnsetcondition.htm",arySend,"status:no;scroll:no;dialogHeight:340px;dialogWidth:695px;dialogTop:20;dialogLeft:20px") 
  1543. if(sRet!=""){
  1544. t.setAttribute("condition",sRet)
  1545. blnChange=true
  1546. }
  1547. }
  1548. function SetConditionAct() {
  1549. //设置查询条件的处理方式
  1550. var arySend=t.getAttribute("conditionact")
  1551. if(arySend==null)arySend=""
  1552. var sRet=window.showModalDialog("dsnsetconditionact.htm",arySend,"status:no;scroll:no;dialogHeight:340px;dialogWidth:695px;dialogTop:20;dialogLeft:20px") 
  1553. if(sRet!=""){
  1554. t.setAttribute("conditionact",sRet)
  1555. blnChange=true
  1556. }
  1557. }
  1558. /**
  1559. *装入查询条件对话框
  1560. **/
  1561. function fc_getwhere() {
  1562. var arr=new Array()
  1563. // arr[0]=t.getAttribute("condition")
  1564. arr[0]=t.getAttribute("filter")
  1565. if(isSpace(arr[0])){
  1566. alert("请设置条件对话框!")
  1567. return
  1568. }
  1569. if(arr[0]!=null)
  1570. arr[0]=unescape(arr[0])
  1571. else
  1572. arr[0]=""
  1573. arr[1]=fc_wherexml
  1574. //得到此表的条件串
  1575. var sRet=window.showModalDialog("fc_condition.htm",arr,"status:no;dialogHeight:330px;dialogWidth:655px;dialogTop:50;dialogLeft:50px") 
  1576. if (sRet!=null) {
  1577. // alert(sRet)
  1578. fc_wherexml=sRet //保存到全局变量中
  1579. //fc_wherexml的节点格式为:字段中文名,值1,值2
  1580. fc_curpage=1
  1581. fc_executesql(1,sRet)//1 为页号,sRet为条件数据的XML串
  1582. }
  1583. }
  1584. // no use
  1585. function LoadWhereToSql() {
  1586. //用于打开统计表时,需要装入缺省条件进行查询
  1587. if(isSpace(t.getAttribute("initwhere")))
  1588. fc_wherexml=""
  1589. else 
  1590. fc_wherexml=t.getAttribute("initwhere")
  1591. fc_wherexml=unescape(fc_wherexml)
  1592. fc_curpage=1
  1593. fc_executesql(1,fc_wherexml)//1 为页号,fc_wherexml为条件数据的XML串
  1594. }
  1595. /**
  1596. //下一页
  1597. **/
  1598. function fc_nextpage() {
  1599. if(fc_curpage<fc_allpages) {
  1600. fc_curpage++
  1601. fc_executesql(fc_curpage,fc_wherexml)
  1602. var arySend=t.getAttribute("pagerun")
  1603. if(arySend!=null){
  1604. eval(unescape(arySend))
  1605. }
  1606. }
  1607. }
  1608. /**
  1609. //下一页0,最后一页
  1610. **/
  1611. function fc_nextpage0() {
  1612. if(fc_allpages>0) {
  1613. fc_curpage=fc_allpages
  1614. fc_executesql(fc_curpage,fc_wherexml)
  1615. var arySend=t.getAttribute("pagerun")
  1616. if(arySend!=null){
  1617. eval(unescape(arySend))
  1618. }
  1619. }
  1620. }
  1621. /**
  1622. //上一页
  1623. **/
  1624. function fc_prevpage() {
  1625. if(fc_curpage>1) {
  1626. fc_curpage--
  1627. fc_executesql(fc_curpage,fc_wherexml)
  1628. var arySend=t.getAttribute("pagerun")
  1629. if(arySend!=null){
  1630. eval(unescape(arySend))
  1631. }
  1632. }
  1633. }
  1634. /**
  1635. //上一页
  1636. **/
  1637. function fc_prevpage0() {
  1638. if(fc_curpage>0) {
  1639. fc_curpage=1
  1640. fc_executesql(fc_curpage,fc_wherexml)
  1641. var arySend=t.getAttribute("pagerun")
  1642. if(arySend!=null){
  1643. eval(unescape(arySend))
  1644. }
  1645. }
  1646. }
  1647. /**
  1648. //保存用户报表
  1649. **/
  1650. function SaveUserReport() {
  1651. t.setAttribute("initwhere",escape(fc_wherexml)) //在打开用户报表时应将"initwhere"属性值给变量fc_wherexml
  1652. SaveAsReport()
  1653. }
  1654. /**
  1655. *执行SQL语句查询
  1656. //将表属性中的结果集串一个个取出来运行.
  1657. //PageNo当前要显示的数据页号,=-1表示要显示所有数据页
  1658. //curWhereXml当前条件框中生成的条件XML节点串,不含根节点
  1659. **/
  1660. function fc_executesql(PageNo,curWhereXml) {
  1661. //加上根节点
  1662. curWhereXml="<root>"+curWhereXml+"</root>"
  1663.     
  1664.     hideTxt()
  1665. //用于保存条件对话窗中的三种条件。
  1666. var sSql2000=""
  1667. var sSql2001=""
  1668. var sSql2002=""
  1669. var sXml=t.getAttribute("recordsetxml")
  1670. if (isSpace(sXml)) return
  1671. sXml=unescape(sXml)
  1672.     var oData=new ActiveXObject("Microsoft.XMLDOM")
  1673.     oData.async="false";
  1674.     oData.loadXML("<root>"+sXml+"</root>")
  1675.     
  1676.     
  1677. //--------------------------------------------------------------
  1678.     //取节点名为record的节点:表格记录
  1679. var oRec=oData.documentElement.selectNodes("//record")
  1680.     for (var iii=0;iii<oRec.length;iii++) {
  1681.      var curNode=oRec.item(iii)
  1682.      //alert(curNode.xml)
  1683.      var curRow=curNode.childNodes.item(0).text
  1684.      var curCol=curNode.childNodes.item(1).text
  1685.      var oGroup=curNode.selectNodes("group")
  1686. //fcnull表示此XML节点为空,因为直接空会影响JAVA节点取数
  1687. var curGroup1="fcnull"
  1688. var curGroupField1="fcnull"
  1689. var curGroup2="fcnull"
  1690. var curGroupField2="fcnull"
  1691. if(oGroup.length>0){
  1692. curGroup1=oGroup.item(0).childNodes(0).text
  1693. curGroupField1=oGroup.item(0).childNodes(1).text
  1694. }
  1695. if(oGroup.length>1){
  1696. curGroup2=oGroup.item(1).childNodes(0).text
  1697. curGroupField2=oGroup.item(1).childNodes(1).text
  1698. }
  1699. //     var curSql=curNode.childNodes.item(5).childNodes(0).text
  1700.      var oMain=curNode.selectNodes("mainsql")
  1701.      var curSql=oMain.item(0).childNodes(0).text
  1702.      //3 为页尺寸 4 为在字段值--->表格中的值之间的转换的节点
  1703.      //暂时注释,等做小计行时再做
  1704.      /*if (curNode.childNodes.length>4 && curNode.childNodes.item(4).tagName=="events" ) {
  1705.      var oEvent=curNode.childNodes.item(4)
  1706.      if (oEvent.childNodes.length>0) {
  1707.      var iFieldNo=oEvent.childNodes(0).text
  1708.      var iFieldNo=oEvent.childNodes(1).text
  1709.      }
  1710.      }*/
  1711.      //----------------------
  1712. /*
  1713.     //找到curSql的表名
  1714. var sExp=/s(from|join)s+[A-Za-z0-9]+s*  /ig
  1715. var re=curSql.match(sExp)
  1716. if (re!=null) {
  1717. var arrTab=new Array()//保存表名的数组
  1718. for (var i=0;i<=re.length-1;i++){
  1719. var s1=re[i]
  1720. arrTab[i]=trim(s1.substring(5,s1.length))
  1721. //alert(arrTab[i])
  1722. }
  1723. }
  1724. else {
  1725. //Sql语句中无表名,有错,待处理
  1726. }
  1727. //curWhereXml为保存对话框中条件的XML串
  1728. if (curWhereXml!="" && curWhereXml!="<root></root>") {
  1729.      //如条件中有2000=2000 则要替代成条件框中生成的条件
  1730.     var newWhere=""//保存结果SQL串
  1731.     var oX=new ActiveXObject("Microsoft.XMLDOM")
  1732.     oX.async="false";
  1733.     oX.loadXML(curWhereXml)
  1734.     for (var ii=0;ii<oX.documentElement.childNodes.length;ii++) {
  1735. var sField=oX.documentElement.childNodes.item(ii).childNodes.item(0).text
  1736. for (var jj=0;jj<arrTab.length;jj++) {
  1737. if (fc_FieldInTable(sField,arrTab[jj])=="") {
  1738. //多次用带表名的字段名替代条件串中的字段名
  1739. var sAfterReplace=fc_RepStr(oX.documentElement.childNodes.item(ii).childNodes.item(1).text,sField,arrTab[jj]+"."+trim(sField))
  1740. newWhere=newWhere+" and "+sAfterReplace
  1741. break
  1742. }
  1743. }
  1744. }
  1745. //去掉前面的" and "
  1746. if (newWhere.length>6)
  1747. newWhere =newWhere.substring(5,newWhere.length)
  1748.      //如条件中有fcsoft=fcsoft 则要替代成条件框中生成的条件
  1749.     curSql=fc_RepStr(curSql,"2000=2000",newWhere)
  1750.     }
  1751.     */
  1752. if (curWhereXml!="" && curWhereXml!="<root></root>") {
  1753.      //如条件中有2000=2000 则要替代成条件框中生成的条件
  1754.     var newWhere=""//保存结果SQL串
  1755. //给输入参数的值
  1756. //alert(curWhereXml)
  1757. sActFieldIn=curWhereXml
  1758. ConditionAct()
  1759. //var sActField=t.getAttribute("conditionact")
  1760. //if(sActField!=null)
  1761. // sActField=unescape(sActField)
  1762. //else
  1763. // sActField=""
  1764. //运行用户定义的字段拼条件的方式,参数为sActFieldIn,将结果放入sActFieldOut变量中
  1765. //eval(sActField)
  1766. //alert(sActFieldOut)
  1767.     var oX=new ActiveXObject("Microsoft.XMLDOM")
  1768.     oX.async="false";
  1769.     oX.loadXML("<root>"+sActFieldOut+"</root>")
  1770.     newWhere=unescape(oX.documentElement.childNodes(0).text)
  1771. if(isSpace(newWhere)==false){
  1772. var tmp1=newWhere
  1773. sSql2000=tmp1
  1774. //alert(sSql2000+curSql)
  1775. curSql=fc_RepStr(curSql,"2000=2000",tmp1)
  1776. //alert("qqq"+curSql)
  1777. curGroup1=fc_RepStr(curGroup1,"2000=2000",tmp1)
  1778. curGroup2=fc_RepStr(curGroup2,"2000=2000",tmp1)
  1779. }
  1780.     newWhere=unescape(oX.documentElement.childNodes(1).text)
  1781. if(isSpace(newWhere)==false){
  1782. var tmp1=newWhere
  1783. sSql2001=tmp1
  1784. curSql=fc_RepStr(curSql,"2001=2001",tmp1)
  1785. curGroup1=fc_RepStr(curGroup1,"2001=2001",tmp1)
  1786. curGroup2=fc_RepStr(curGroup2,"2001=2001",tmp1)
  1787. }
  1788.     newWhere=unescape(oX.documentElement.childNodes(2).text)
  1789. if(isSpace(newWhere)==false){
  1790. var tmp1=newWhere
  1791. sSql2002=tmp1
  1792. //alert(sSql2002)
  1793. curSql=fc_RepStr(curSql,"2002=2002",tmp1)
  1794. curGroup1=fc_RepStr(curGroup1,"2002=2002",tmp1)
  1795. curGroup2=fc_RepStr(curGroup2,"2002=2002",tmp1)
  1796. }
  1797. }
  1798. //show(curSql+"OOOOOOOO"+curGroup1+"oooooooo"+curGroup2)    
  1799.     //alert("ddd:"+curSql)
  1800.      //----------------------
  1801.      if(PageNo==-1){
  1802.      var blnNoPages=true  //分页标志,供后使用
  1803.      var curPageSize=99999999 //表示不分页,尽可能最大值
  1804.      PageNo=1
  1805.      //设置的页尺寸要供后使用
  1806.      var curPageSizeOld=parseInt(curNode.childNodes.item(2).text)
  1807.      if (isNaN(curPageSizeOld) || curPageSizeOld==0)
  1808.      curPageSizeOld=10  //如页尺寸不合法则置为10
  1809.      }
  1810.      else {
  1811.      var blnNoPages=false
  1812.      var curPageSize=parseInt(curNode.childNodes.item(2).text)
  1813.      if (isNaN(curPageSize) || curPageSize==0)
  1814.      curPageSize=10  //如页尺寸不合法则置为10
  1815. }
  1816.      if(curGroup1=="fcnull") {
  1817.      //无分组
  1818.      //此XML串的SQL节点顺序决定返回数据的顺序
  1819.      var allXml="<page><pageno>"+PageNo+"</pageno><pagesize>"+curPageSize+"</pagesize></page>"
  1820. allXml+="<source><datasource>webgrid</datasource><username>sa</username><password></password></source>"     
  1821. //找开始的SQL语句,
  1822. //<mainsql><sql>...</sql>...<start>...<sql>...</sql><sql>...</sql></start></mainsql>
  1823.      var oEnd=oMain.item(0).selectNodes("start")
  1824.      if (oEnd.length>0){
  1825.      var oEndSql=oEnd.item(0).selectNodes("sql")
  1826.      if(oEndSql.length>0){
  1827.      for(var iEndSql=0;iEndSql<oEndSql.length;iEndSql++){
  1828. var sEndSql=oEndSql.item(iEndSql).text
  1829. if(isSpace(sSql2000)==false)
  1830. sEndSql=fc_RepStr(sEndSql,"2000=2000",sSql2000)
  1831. if(isSpace(sSql2001)==false)
  1832. sEndSql=fc_RepStr(sEndSql,"2001=2001",sSql2001)
  1833. if(isSpace(sSql2002)==false)
  1834. sEndSql=fc_RepStr(sEndSql,"2002=2002",sSql2002)
  1835.      allXml=allXml+"<sql>"+TransXml(sEndSql)+"</sql>"
  1836.      }
  1837.      }
  1838.      }
  1839.      allXml=allXml+"<sql>"+TransXml(curSql)+"</sql>"
  1840. //找结束的SQL语句,
  1841. //<mainsql><sql>...</sql>...<end>...<sql>...</sql><sql>...</sql></end></mainsql>
  1842.      var oEnd=oMain.item(0).selectNodes("end")
  1843.      if (oEnd.length>0){
  1844.      var oEndSql=oEnd.item(0).selectNodes("sql")
  1845.      if(oEndSql.length>0){
  1846.      for(var iEndSql=0;iEndSql<oEndSql.length;iEndSql++){
  1847. var sEndSql=oEndSql.item(iEndSql).text
  1848. if(isSpace(sSql2000)==false)
  1849. sEndSql=fc_RepStr(sEndSql,"2000=2000",sSql2000)
  1850. if(isSpace(sSql2001)==false)
  1851. sEndSql=fc_RepStr(sEndSql,"2001=2001",sSql2001)
  1852. if(isSpace(sSql2002)==false)
  1853. sEndSql=fc_RepStr(sEndSql,"2002=2002",sSql2002)
  1854.      allXml=allXml+"<sql>"+TransXml(sEndSql)+"</sql>"
  1855.      }
  1856.      }
  1857.      }
  1858.      //alert(allXml)
  1859.      var curDataXml=fc_select1(allXml)
  1860.      //alert(curDataXml)
  1861.      //var curDataXml=fc_select(curSql,PageNo,curPageSize)
  1862. }
  1863. else {
  1864. //有分组
  1865.      var allXml="<page><pageno>"+PageNo+"</pageno><pagesize>"+curPageSize+"</pagesize></page>"
  1866. allXml+="<source><datasource>webgrid</datasource><username>sa</username><password></password></source>"     
  1867.      allXml+="<mainsql><sql>"+TransXml(curSql)+"</sql>"
  1868. //找开始的SQL语句,
  1869. //<mainsql><sql>...</sql>...<start>...<sql>...</sql><sql>...</sql></start></mainsql>
  1870.      allXml+="<start>"
  1871.      var oEnd=oMain.item(0).selectNodes("start")
  1872.      if (oEnd.length>0){
  1873.      var oEndSql=oEnd.item(0).selectNodes("sql")
  1874.      if(oEndSql.length>0){
  1875.      for(var iEndSql=0;iEndSql<oEndSql.length;iEndSql++){
  1876. var sEndSql=oEndSql.item(iEndSql).text
  1877. if(isSpace(sSql2000)==false)
  1878. sEndSql=fc_RepStr(sEndSql,"2000=2000",sSql2000)
  1879. if(isSpace(sSql2001)==false)
  1880. sEndSql=fc_RepStr(sEndSql,"2001=2001",sSql2001)
  1881. if(isSpace(sSql2002)==false)
  1882. sEndSql=fc_RepStr(sEndSql,"2002=2002",sSql2002)
  1883.      allXml=allXml+"<sql>"+TransXml(sEndSql)+"</sql>"
  1884.      }
  1885.      }
  1886.      }
  1887.      allXml+="</start>"
  1888. //找结束的SQL语句,
  1889. //<mainsql><sql>...</sql>...<start>...<sql>...</sql><sql>...</sql></start></mainsql>
  1890.      allXml+="<end>"
  1891.      var oEnd=oMain.item(0).selectNodes("end")
  1892.      if (oEnd.length>0){
  1893.      var oEndSql=oEnd.item(0).selectNodes("sql")
  1894.      if(oEndSql.length>0){
  1895.      for(var iEndSql=0;iEndSql<oEndSql.length;iEndSql++){
  1896. var sEndSql=oEndSql.item(iEndSql).text
  1897. if(isSpace(sSql2000)==false)
  1898. sEndSql=fc_RepStr(sEndSql,"2000=2000",sSql2000)
  1899. if(isSpace(sSql2001)==false)
  1900. sEndSql=fc_RepStr(sEndSql,"2001=2001",sSql2001)
  1901. if(isSpace(sSql2002)==false)
  1902. sEndSql=fc_RepStr(sEndSql,"2002=2002",sSql2002)
  1903.      allXml=allXml+"<sql>"+TransXml(sEndSql)+"</sql>"
  1904.      }
  1905.      }
  1906.      }
  1907.      allXml+="</end>"
  1908.     
  1909.      allXml+="</mainsql>"
  1910.      allXml+="<group><sql>"+TransXml(curGroup1)+"</sql><groupfield>"
  1911.      +curGroupField1+"</groupfield></group>"
  1912.      allXml=allXml+"<group><sql>"+TransXml(curGroup2)+"</sql><groupfield>"
  1913.      +curGroupField2+"</groupfield></group>"
  1914.      //alert(allXml)
  1915.      var curDataXml=fc_select2(allXml)
  1916. }
  1917.     
  1918. if(curDataXml=="<root></root>") {
  1919. alert("无符合条件的记录!")
  1920. return
  1921. }
  1922. //alert(curDataXml)
  1923. //在换页时将表格的界面恢复,注意:全局变量没恢复
  1924. //div1.innerHTML=LoadDiv1Html()
  1925. //----------------------
  1926. //将数据给表格中
  1927.     var oD=new ActiveXObject("Microsoft.XMLDOM")
  1928.     oD.async="false";
  1929.     oD.loadXML(curDataXml)
  1930.     var allRows=parseInt(oD.documentElement.childNodes.item(oD.documentElement.childNodes.length-1).text)
  1931.     var intCols=oD.documentElement.childNodes(0).childNodes.length
  1932.     if(blnNoPages){ //不分页显示,一次把数据都显示出来
  1933.      //curPageSizeOld
  1934.     var blnInsertRow=false
  1935.     for (var j=0;j<oD.documentElement.childNodes.length-1;j++) {
  1936. if(j>=curPageSizeOld && blnInsertRow==false){
  1937. //插入空行
  1938. AutoAddLines=oD.documentElement.childNodes.length-1-curPageSizeOld
  1939. for(var kk=0;kk<AutoAddLines;kk++){
  1940. grid.InsertRow(parseInt(curRow)+j)
  1941. }
  1942. CopytHtml()
  1943. //运行外部设置的命令
  1944. //AutoAddLines为此命令的参数
  1945. var arySend=t.getAttribute("addlinerun")
  1946. if(arySend!=null){
  1947. eval(unescape(arySend))
  1948. }
  1949. //---------------
  1950. blnInsertRow=true
  1951. }
  1952. if(j<curPageSizeOld)
  1953.      SetRowbgColor(parseInt(curRow)+j,parseInt(curCol),intCols,"")
  1954.      var curO=oD.documentElement.childNodes.item(j)
  1955. //如当前行为汇总行,则给底色
  1956. if(curO.tagName=="recordsum1"){
  1957. SetRowbgColor(parseInt(curRow)+j,parseInt(curCol),intCols,"yellow")
  1958. }
  1959. else if(curO.tagName=="recordsum2"){
  1960. SetRowbgColor(parseInt(curRow)+j,parseInt(curCol),intCols,"gray")
  1961. }
  1962.     for (var k=0;k<oD.documentElement.childNodes.item(0).childNodes.length;k++) {
  1963. //如标记名为fcnull,则此列不能给值
  1964.      if (curO.childNodes.item(k).tagName!="fcnull") {
  1965. //从XML串中往界面上给值
  1966. SetCellData(parseInt(curRow)+j,parseInt(curCol)+k,curO.childNodes.item(k).text)
  1967. }
  1968. }
  1969.      } //for end
  1970.      //
  1971. var arySend=t.getAttribute("pagerun")
  1972. if(arySend!=null){
  1973. eval(unescape(arySend))
  1974. }
  1975.     
  1976.     }
  1977.     else { //分页显示
  1978.     if (isNaN(allRows))
  1979.      fc_allpages=0
  1980.     else 
  1981.      fc_allpages=Math.ceil(allRows/curPageSize) //给页尺寸
  1982. //加上当前页和总页数的显示,如1/3
  1983. fcPage.childNodes(2).value=fc_curpage+"/"+fc_allpages
  1984. //------------
  1985.     //最后一个子节点为行数
  1986.     for (var j=0;j<curPageSize;j++) {
  1987.      SetRowbgColor(parseInt(curRow)+j,parseInt(curCol),intCols,"")
  1988. if(j<oD.documentElement.childNodes.length-1){
  1989.      var curO=oD.documentElement.childNodes.item(j)
  1990. //如当前行为汇总行,则给底色
  1991. if(curO.tagName=="recordsum1"){
  1992. SetRowbgColor(parseInt(curRow)+j,parseInt(curCol),intCols,"yellow")
  1993. }
  1994. else if(curO.tagName=="recordsum2"){
  1995. SetRowbgColor(parseInt(curRow)+j,parseInt(curCol),intCols,"gray")
  1996. }
  1997.     for (var k=0;k<oD.documentElement.childNodes.item(0).childNodes.length;k++) {
  1998. //如标记名为fcnull,则此列不能给值
  1999.      if (curO.childNodes.item(k).tagName!="fcnull") {
  2000. //从XML串中往界面上给值
  2001. SetCellData(parseInt(curRow)+j,parseInt(curCol)+k,curO.childNodes.item(k).text)
  2002. }
  2003. }
  2004. }
  2005. else { //清空,以免数据重叠
  2006.     for (var k=0;k<oD.documentElement.childNodes.item(0).childNodes.length;k++) {
  2007. //如标记名为fcnull,则此列不能给值
  2008.      if (curO.childNodes.item(k).tagName!="fcnull") {
  2009. //从XML串中往界面上给值
  2010. SetCellData(parseInt(curRow)+j,parseInt(curCol)+k,"")
  2011. }
  2012. }
  2013. }
  2014.      } //for end
  2015. } //分页显示if end
  2016.     } //record node for end
  2017. //--------------------------------------------------------------
  2018. //alert(fc_wherexml)
  2019. var arySend=t.getAttribute("afterrunsql")
  2020. if(arySend!=null){
  2021. eval(unescape(arySend))
  2022. }
  2023. }
  2024. /**
  2025. //点显示全部页数据的自定义按钮时运行此
  2026. **/
  2027. function fc_ShowAll() {
  2028. fc_executesql(-1,fc_wherexml)
  2029. }
  2030. /**
  2031. //装入用于开发的一排按钮
  2032. **/
  2033. function LoadButton() {
  2034. var sR='<table border=1 id=queryToolbar bordercolordark="#ffe5d5" bordercolorlight="#808080" style="display:none;LEFT: 5px; POSITION: absolute; TOP: 3px" cellpadding=0 cellspacing=0><tr>'
  2035. sR=sR+'<td style="display:none" id=fcPage >'
  2036. sR=sR+'<INPUT class="buttonpage" type=button value="|<" onclick=fc_prevpage0()>'
  2037. sR=sR+'<INPUT class="buttonpage" type=button value="<" onclick=fc_prevpage()>'
  2038. sR=sR+'<INPUT class="buttonpageno" disabled  style="width:40" value="">'
  2039. sR=sR+'<INPUT class="buttonpage" type=button value=">" onclick=fc_nextpage()>'
  2040. sR=sR+'<INPUT class="buttonpage" type=button value=">|" onclick=fc_nextpage0()>'
  2041. sR=sR+'</td>'
  2042. sR=sR+'<td style="display:none" id=fcShowAll><INPUT class="button" type=button value="显示全部" onclick=fc_ShowAll() ></td>'
  2043. var s1='<td><INPUT id=fcButton class="button" style="display:none" type=button ></td>'
  2044. for(var i=0;i<5;i++) {sR=sR+s1}
  2045. sR=sR+'</tr></table>'
  2046. document.write(sR)
  2047. }
  2048. /**
  2049. //初始化功能按钮
  2050. **/
  2051. function initButton() {
  2052. var s1=t.getAttribute("buttonxml")
  2053. if(isSpace(s1)==false) {
  2054. var ii=0
  2055. s1=unescape(s1)
  2056.     var oXml=new ActiveXObject("Microsoft.XMLDOM")
  2057.     oXml.async="false";
  2058. oXml.loadXML(s1)
  2059. for(var i=0;i<oXml.documentElement.childNodes.length;i++) {
  2060. if (oXml.documentElement.childNodes(i).childNodes(0).text=="fcpage"){
  2061. fcPage.style.display="block"
  2062. }
  2063. else if (oXml.documentElement.childNodes(i).childNodes(0).text=="fcshowall"){
  2064. fcShowAll.style.display="block"
  2065. }
  2066. else {
  2067. fcButton[ii].outerHTML='<INPUT id=fcButton class="button" type=button '
  2068. +' onclick='+oXml.documentElement.childNodes(i).childNodes(1).text
  2069. +' value='+oXml.documentElement.childNodes(i).childNodes(0).text+'>'
  2070. ii++
  2071. }
  2072. }
  2073. }
  2074. }
  2075. /**
  2076. //设行背景色
  2077. **/
  2078. function SetRowbgColor(iRow,iCol,intCols,vColor) {
  2079. for(var i=0;i<intCols;i++){
  2080. t.rows(iRow).cells(i+iCol).bgColor=vColor
  2081. }
  2082. }
  2083. /**
  2084. //直接运行输入的命令,可用于设置表格背景等功能
  2085. **/
  2086. function RunCommand() {
  2087. var sRet=window.showModalDialog("dsncommand.htm","","status:no;scroll:no;dialogHeight:340px;dialogWidth:695px;dialogTop:20;dialogLeft:20px") 
  2088. if(sRet!=""){
  2089. eval(sRet)
  2090. blnChange=true
  2091. }
  2092. }
  2093. /**
  2094. //检查报表是否变化了,提示保存
  2095. **/
  2096. function CheckReportChange() {
  2097. if(blnRunMode)return
  2098. if(blnChange){
  2099. var ret = window.confirm("报表内容已改变,需要保存吗?");
  2100. if (ret) {
  2101. SaveReport()
  2102. }
  2103. else {
  2104. blnChange=false
  2105. }
  2106. }
  2107. }
  2108. /**
  2109. //从fcRep.htm中移过来的
  2110. *表格的cellchange事件
  2111. **/
  2112. function grid_onCellChange() {
  2113. var curTD=event.oldTD //当前修改的TD
  2114. var newValue=curTD.innerText
  2115. var strV=trim(newValue)
  2116. if(curTD.innerText==event.BeforeChangeText && trim(strV.substring(0,1))!="=") return
  2117. curTD.innerText=event.BeforeChangeText
  2118. SaveoUndoOneRecord()
  2119. curTD.innerText=newValue
  2120. //检查左边是否有"="
  2121. var strFormula
  2122. var curRow,curCol
  2123. if (trim(strV.substring(0,1))=="="){
  2124. //计算公式的结果和保存公式至oFormula对象中
  2125. strFormula=strV.substring(1,strV.length)
  2126. //保存公式
  2127. curTD.setAttribute("formula",strFormula)
  2128. //preFormula为预处理过后的公式
  2129. var preFormula=trim(replaceFormula(strFormula))
  2130. addoFormulaNodes(curTD.parentNode.rowIndex,curTD.cellIndex,preFormula,strFormula)
  2131. var v=DealPoint(preFormula)
  2132. CellPoint(curTD,v)
  2133. }
  2134. else {
  2135. //清空公式
  2136. curTD.removeAttribute("formula")
  2137. //删除保存在oFormula中的公式
  2138. var oFind=oFormula.documentElement.selectNodes("//record[row='" + curTD.parentNode.rowIndex + "' and col='" + curTD.cellIndex + "']")
  2139. if (oFind.length==1)
  2140. oFormula.documentElement.removeChild(oFind.item(0))//删除找到的节点
  2141. }
  2142. //将调用此单元的所有单元格重算一遍
  2143. SumOneCell("GETCELL("+curTD.parentNode.rowIndex+","+LogToPhy(curTD.parentNode.rowIndex,curTD.cellIndex)+")")
  2144. SaveoRedoOneRecord()
  2145. blnChange=true
  2146. }
  2147. /**
  2148. *查询条件的处理函数,将curWhereXml中的条件串,根据字段表达式拼成SQL语句
  2149. *@date 2003-06-06
  2150. *@param sActFieldIn 输入参数,条件串, =curWhereXml
  2151. *@return sActFieldOut 输出参数,
  2152. **/
  2153. function ConditionAct(){
  2154. var sFilter=t.getAttribute("filter")
  2155. if(isSpace(sFilter)) return
  2156. sFilter=unescape(sFilter)
  2157. //alert(sFilter)
  2158. var oFilter=new ActiveXObject("Microsoft.XMLDOM");
  2159. oFilter.async ="false";
  2160. oFilter.loadXML("<root>"+sFilter+"</root>");
  2161. var sRet="";
  2162. var sRet2000="";
  2163. var sRet2001="";
  2164. var sRet2002="";
  2165. // var s1=" format(fintYear,'0000')+'.'+format(fintPeriod,'00') ";
  2166. oXml=new ActiveXObject("Microsoft.XMLDOM");
  2167. oXml.async ="false";
  2168. oXml.loadXML(sActFieldIn);
  2169. for (var i=0;i<oXml.documentElement.childNodes.length;i++) {
  2170. var sValue1=oXml.documentElement.childNodes(i).childNodes(1).text;
  2171. var sValue2=oXml.documentElement.childNodes(i).childNodes(2).text;
  2172. if (isSpace(sValue1)==false || isSpace(sValue2)==false) {
  2173. for (var j=0;j<oFilter.documentElement.childNodes.length;j++) {
  2174. //名称相同
  2175. if(oFilter.documentElement.childNodes(j).childNodes(0).text == oXml.documentElement.childNodes(i).childNodes(0).text ) {
  2176. var oField =oFilter.documentElement.childNodes(j).childNodes(2)  //字段表达式节点
  2177. if(oField.childNodes(0).childNodes(0).text=="否" || isSpace(sValue1)==false ){
  2178. var sF=" and "+fc_RepStr(oField.childNodes(0).childNodes(1).text,":get_value1",sValue1)
  2179. for(var k=0;k<oField.childNodes(0).childNodes(2).childNodes.length;k++){
  2180. if(oField.childNodes(0).childNodes(2).childNodes(k).text=="2000=2000"){
  2181. sRet2000+=sF
  2182. }
  2183. if(oField.childNodes(0).childNodes(2).childNodes(k).text=="2001=2001"){
  2184. sRet2001+=sF
  2185. }
  2186. if(oField.childNodes(0).childNodes(2).childNodes(k).text=="2002=2002"){
  2187. sRet2002+=sF
  2188. }
  2189. }
  2190. }
  2191. //处理第二个字段表达式
  2192. if(oField.childNodes.length>1){
  2193. if(oField.childNodes(1).childNodes(0).text=="否" || isSpace(sValue2)==false ){
  2194. var sF=" and "+fc_RepStr(oField.childNodes(1).childNodes(1).text,":get_value2",sValue2)
  2195. for(var k=0;k<oField.childNodes(1).childNodes(2).childNodes.length;k++){
  2196. if(oField.childNodes(1).childNodes(2).childNodes(k).text=="2000=2000"){
  2197. sRet2000+=sF
  2198. }
  2199. if(oField.childNodes(1).childNodes(2).childNodes(k).text=="2001=2001"){
  2200. sRet2001+=sF
  2201. }
  2202. if(oField.childNodes(1).childNodes(2).childNodes(k).text=="2002=2002"){
  2203. sRet2002+=sF
  2204. }
  2205. }  // end for k
  2206. }
  2207. }
  2208. break;
  2209. }   //end if
  2210. }  //end for j
  2211. }  //end if
  2212. }  //end for i
  2213. if(sRet2000.length>5){
  2214. sRet2000=sRet2000.substring(5,sRet2000.length);
  2215. }
  2216. if(sRet2001.length>5){
  2217. sRet2001=sRet2001.substring(5,sRet2001.length);
  2218. }
  2219. if(sRet2002.length>5){
  2220. sRet2002=sRet2002.substring(5,sRet2002.length);
  2221. }
  2222. //alert(sRet2000)
  2223. sActFieldOut="<fc>"+escape(sRet2000)+"</fc>"+"<fc>"+escape(sRet2001)+"</fc>"+"<fc>"+escape(sRet2002)+"</fc>";
  2224. }
  2225. /**
  2226. *另存Excel文件
  2227. *@date 2003-11-30
  2228. **/
  2229. function SaveAsExcel(){
  2230. var sRet=window.showModalDialog("saveasexcel.htm",s1,"status:no;dialogHeight:120px;dialogWidth:400px;dialogTop:180;dialogLeft:250px") 
  2231. if(typeof sRet=="undefined") return
  2232. var s1=sRet+".csv"
  2233. grid.SaveExcel(s1)
  2234. //alert("报表成功的另存到"+s1)
  2235. }