复件 WebPrint.java
上传用户:mingda
上传日期:2017-06-20
资源大小:27691k
文件大小:40k
源码类别:

OA系统

开发平台:

Java

  1. /**
  2. 公司:北京方成科技发展有限公司
  3. 作者:梅勇
  4. 日期:2001.08.24
  5. */
  6. import java.io.*;
  7. import java.text.*;
  8. import java.util.*;
  9. import javax.servlet.*;
  10. import javax.servlet.http.*;
  11. import java.sql.*;
  12. import explato.database.*;
  13. import sun.io.ByteToCharConverter; 
  14. import org.xml.sax.* ;
  15. import org.apache.xerces.dom.TextImpl;
  16. import org.w3c.dom.Attr;
  17. import org.w3c.dom.Document;
  18. import org.w3c.dom.NamedNodeMap;
  19. import org.w3c.dom.Node;
  20. import org.w3c.dom.NodeList;
  21. import dom.DOMParserWrapper;
  22. import dom.wrappers.DOMParser;
  23. public class WebPrint extends HttpServlet {
  24. private int iPosition=1; //用于fc_select类查询中传位置参数
  25. //数据源名称,用户名,密码.用于报表查询时连接另外的数据源使用,用于fc_select1,fc_select2
  26. private String strDataSource=""; 
  27. private String strUserName="";
  28. private String strPassword="";
  29. private String strXml="";
  30. private ResultSet rs = null;
  31. private ResultSet rs1 = null;
  32. private ResultSet rs2 = null;
  33. private Connection con = null;
  34. private ConnectionManager cm=null;
  35. private Document document=null;
  36.     public void doPost(HttpServletRequest req,
  37.                       HttpServletResponse res)
  38.         throws IOException, ServletException
  39.     {
  40. //设置演示版,
  41.      /*
  42.      long Time1=1026000000+23328000;
  43.      long curTime=0;
  44.      curTime=System.currentTimeMillis();
  45.      curTime=curTime/1000;
  46.     
  47.      //每天的时间为 86400
  48. if(curTime>Time1){ 
  49.      System.out.println("演示版已到期,系统将不正常!"); 
  50.      return ;
  51. }
  52. //------------------
  53. */
  54.         res.setContentType("text/html;charset=UTF-8");
  55.         PrintWriter out = res.getWriter();
  56. try {
  57.        ServletContext application = getServletContext();
  58. //ConnectionManager cm= (ConnectionManager)application.getAttribute("fcConPoolManager");
  59. cm=(ConnectionManager)application.getAttribute ( "fcConPoolManager" );
  60. //demo是配置文件中逻辑数据库的名字,同时也是连接池的名字
  61. // String sDBDriver = "sun.jdbc.odbc.JdbcOdbcDriver"; 
  62. // String sConnStr = "jdbc:odbc:ereport"; 
  63. // Class.forName(sDBDriver);
  64. // con = DriverManager.getConnection(sConnStr,"sa",""); 
  65. con = cm.getConnection( "demo" );     //或者  con = cm.getConnection( "demo", 30000 );   //30000是不能马上取到连接时的等待时间(以毫秒计)
  66. } catch (Exception e){
  67. //out.println("读表发生错误");
  68. }
  69. finally {
  70. if( con != null ){
  71. cm.freeConnection( "demo", con );
  72. }
  73. }
  74. //-------------------------------------------------------
  75. //strKey为?后的值
  76. String strKey=new String(req.getQueryString());
  77. //计算前台SEND来的XML串 存入strXml中
  78. BufferedReader in = req.getReader();
  79. String line = null;
  80. strXml="";
  81. while ((line = in.readLine()) != null) {
  82.       strXml=strXml+line;
  83.     }        
  84. //parse XML串
  85.     try {
  86.         DOMParserWrapper parser =
  87.         (DOMParserWrapper)Class.forName("dom.wrappers.DOMParser").newInstance();
  88.         document = parser.parseXml(strXml);
  89. }
  90. catch (Exception e) {
  91.     }
  92. //--------------------------------------------------------
  93. //用一个CASE语句来处理各种方法
  94. if (strKey.equals("fillcombox")) out.print(fillcombox());
  95. //用于用SQL语句填充combox
  96. if (strKey.equals("checksql")) out.print(checksql());
  97. //用于检查SQL语句是否合法
  98. if (strKey.equals("GetReportCell")) out.print(GetReportCell()); //跨表取数
  99. if (strKey.equals("fc_insert")) out.print(fc_insert());
  100. if (strKey.equals("fc_insert1")) out.print(fc_insert1()); //新增主子表
  101. if (strKey.equals("fc_update1")) out.print(fc_update1()); //新增主子表
  102. if (strKey.equals("fc_select")) out.print(fc_select());
  103. if (strKey.equals("fc_FieldToTable")) out.print(fc_FieldToTable());
  104. if (strKey.equals("GetDB")) out.print(GetDB());
  105. if (strKey.equals("fc_select1")) out.print(fc_select1()); //多个SQL同时查的查询
  106. if (strKey.equals("fc_select2")) out.print(fc_select2()); //明细和汇总都要的查询
  107. if (strKey.equals("twors")) out.print(twors());//两个结果集的测试
  108. if (strKey.equals("sqltoxml")) out.print(sqltoxml());//两个结果集的测试
  109. if (strKey.equals("dsnSetSession")) 
  110. {
  111. Node root = document.getChildNodes().item(0);
  112.         String strName=root.getChildNodes().item(0).getChildNodes().item(0).getNodeValue();
  113.         String strValue="";
  114.         try {
  115.          //当此节点值为空时
  116.          strValue=root.getChildNodes().item(1).getChildNodes().item(0).getNodeValue();
  117. }
  118. catch (Exception e) {   }
  119. HttpSession session = req.getSession(true);
  120. session.setAttribute(strName, strValue);
  121. out.print("");
  122. }
  123. if (strKey.equals("dsnGetSession")) 
  124. {
  125. Node root = document.getChildNodes().item(0);
  126.         String strName=root.getChildNodes().item(0).getChildNodes().item(0).getNodeValue();
  127. HttpSession session = req.getSession(true);
  128. String strSR=session.getAttribute(strName).toString();;
  129. out.print(strSR);
  130. }
  131. if (strKey.equals("loadprint")) { 
  132. String strX="function%20detachPage%28%29%7B%20htmlToptmp%3DhtmlTop%3B%20htmlBottomtmp%3DhtmlBottom%3B%20var%20iStart%3D0%3B%20var%20iEnd%3D0%3B%20var%20lngEndLine%3Dt.rows.length-tabCauda%3B%20var%20colwidthXML%3DLoadUserData%28%22setcolwidth%22%2C%22ReportColWidth%22+ReportName%29%3B%20effectiveWidth%3DparseInt%28repWidth-tabLeft-tabRight%29%3B%20var%20oXML1%3Dnew%20ActiveXObject%28%22Microsoft.XMLDOM%22%29%3B%20oXML1.async%3D%22false%22%3B%20oXML1.loadXML%28%22%3Croot%3E%22%20+colwidthXML+%22%3C/root%3E%22%29%3B%20sumcol%3D0%3B%20var%20compressRate%3D1%3B%20if%28prnSet.compressWidth%3D%3D1%29%20%7B%20for%20%28var%20j%3D0%3Bj%3CMaxCols%3Bj++%29%7B%20if%20%28oXML1.documentElement.childNodes.item%28j%29.getAttribute%28%22colSelect%22%29%3D%3D%22block%22%29%7B%20sumcol%3Dsumcol+parseInt%28oXML1.documentElement.childNodes.item%28j%29.getAttribute%28%22colWidth%22%29%29%3B%20%7D%20%7D%20compressRate%3DeffectiveWidth/%28sumcol+MaxCols%29%3B%20if%28compressRate%3E%3D1%20%29%20%7B%20compressRate%3D1%3B%20%7D%20compressColWidth%28compressRate%29%3B%20%7D%20var%20hcompressRate%3D1%3B%20var%20t_outerHTMLbak%3Dt.outerHTML%3B%20if%28prnSet.compressHeight%3D%3D1%29%20%7B%20cur1%3D0%3B%20for%20%28var%20i%3DtabHead%3Bi%3ClngEndLine%3Bi++%29%20%7B%20cur1%3Dcur1+parseInt%28t.rows%28i%29.style.height%29%3B%20%7D%20hcompressRate%3D%28repHeight-tabBottom-tabTop-PageHeadHeight-PageCaudaHeight-heightTop-heightBottom%29/%28cur1+lngEndLine-tabHead%29%20%3B%20if%28hcompressRate%3E%3D1%20%29%20%7B%20hcompressRate%3D1%3B%20%7D%20compressRowHeight%28hcompressRate%2CtabHead%2ClngEndLine%29%3B%20%7D%20if%20%28prnSet.compressFont%21%3D1%29%20%7B%20var%20compressFont%3D0%3B%20if%28hcompressRate%3CcompressRate%29%20%7B%20compressFont%3DhcompressRate%3B%20%7D%20else%20%7B%20compressFont%3DcompressRate%3B%20%7D%20if%28compressFont%3C1%29%7B%20t.style.fontSize%3DparseFloat%28t.style.fontSize%29*compressFont%3B%20%7D%20%7D%20setAutoturnRow%28%29%3B%20cur1%3D0%3B%20for%20%28var%20i%3DtabHead%3Bi%3ClngEndLine%3Bi++%29%20%7B%20cur1%3Dcur1+parseInt%28t.rows%28i%29.style.height%29%3B%20if%20%28cur1%3E%3DrepHeight-tabBottom-tabTop-PageHeadHeight-PageCaudaHeight-heightTop-heightBottom%7C%7C%20i%3D%3DlngEndLine-1%29%7B%20if%20%28cur1%3D%3DrepHeight-tabBottom-tabTop-PageHeadHeight-PageCaudaHeight-heightTop-heightBottom%29%20%7B%20cur1%3D0%3B%20%7D%20else%20%7B%20cur1%3DparseInt%28t.rows%28i%29.style.height%29%3B%20%7D%20sumcol%3D0%3B%20var%20bFind%3Dfalse%3B%20iStart%3D0%3B%20iEnd%3D0%3B%20if%20%28i%3D%3DlngEndLine-1%29%7B%20perPageHTML%3DperPageHTML+t.rows%28i%29.outerHTML%20%3B%20%7D%20for%20%28var%20j%3D0%3Bj%3CMaxCols%3Bj++%29%7B%20if%20%28oXML1.documentElement.childNodes.item%28j%29.getAttribute%28%22colSelect%22%29%3D%3D%22block%22%29%7B%20sumcol%3Dsumcol+parseInt%28oXML1.documentElement.childNodes.item%28j%29.getAttribute%28%22colWidth%22%29%29*compressRate%3B%20%7D%20if%20%28sumcol%3E%3DeffectiveWidth%20%7C%7C%20j%3D%3DMaxCols-1%29%7B%20if%20%28sumcol%3C%3DeffectiveWidth%29%7B%20iEnd%3Dj%3B%20sumcol%3D0%3B%20%7D%20else%20%7B%20iEnd%3Dj-1%3B%20sumcol%3DparseInt%28oXML1.documentElement.childNodes.item%28j%29.getAttribute%28%22colWidth%22%29%29*compressRate%3B%20%7D%20var%20s1%3DHideCol%28strCol%2CiStart%2CiEnd%29%3B%20bFind%3Dtrue%3B%20PageDataAdd%28Pages%29%3B%20arrPage%5BPages%5D%3DhtmlTop+htmlBottom+tabstyle+s1%3B%20arrPage%5BPages%5D%3DarrPage%5BPages%5D+PageHeadHTML%3B%20arrPage%5BPages%5D%3DarrPage%5BPages%5D+perPageHTML+PageCaudaHTML+%22%3C/Table%3E%22%20+%22%3Cimg%20%3E%22%3B%20if%20%28i%3D%3DlngEndLine-1%29%7B%20if%28cur1%3ErepHeight-tabBottom-tabTop-PageHeadHeight-PageCaudaHeight-heightTop-heightBottom%29%7B%20PageDataAdd%28Pages+1%29%3B%20arrPage%5BPages+1%5D%3DhtmlTop+htmlBottom+tabstyle+s1%3B%20arrPage%5BPages+1%5D%3DarrPage%5BPages+1%5D+PageHeadHTML+PageCaudaHTML+%22%3C/Table%3E%22+%22%3Cimg%20%3E%22%3B%20biglabel.innerHTML%3Dbiglabel.innerHTML%20+%22%3Cdiv%20class%3DpreviewDiv%20%3E%u6B63%u5728%u8BA1%u7B97...%3C/DIV%3E%22%3B%20Pages%3DPages+1%3B%20%7D%20%7D%20biglabel.innerHTML%3Dbiglabel.innerHTML%20+%22%3Cdiv%20class%3DpreviewDiv%20%3E%u6B63%u5728%u8BA1%u7B97...%3C/DIV%3E%22%3B%20Pages%3DPages+1%3B%20if%20%28%28j%3D%3DMaxCols-1%20%29%20%26%26%20%28iEnd%3D%3Dj-1%29%20%29%7B%20var%20s1%3DHideCol%28strCol%2CMaxCols-1%2CMaxCols-1%29%3B%20bFind%3Dtrue%3B%20PageDataAdd%28Pages%29%3B%20arrPage%5BPages%5D%3DhtmlTop+htmlBottom+tabstyle+s1%3B%20arrPage%5BPages%5D%3DarrPage%5BPages%5D+PageHeadHTML%3B%20arrPage%5BPages%5D%3DarrPage%5BPages%5D+perPageHTML+PageCaudaHTML+%22%3C/Table%3E%22+%22%3Cimg%20%3E%22%3B%20if%20%28i%3D%3DlngEndLine-1%29%7B%20if%28cur1%3ErepHeight-tabBottom-tabTop-PageHeadHeight-PageCaudaHeight-heightTop-heightBottom%29%7B%20PageDataAdd%28Pages+1%29%3B%20arrPage%5BPages+1%5D%3DhtmlTop+htmlBottom+tabstyle+s1%20%3B%20arrPage%5BPages+1%5D%3DarrPage%5BPages+1%5D+PageHeadHTML+PageCaudaHTML+%22%3C/Table%3E%22+%22%3Cimg%20%3E%22%3B%20biglabel.innerHTML%3Dbiglabel.innerHTML%20+%22%3Cdiv%20class%3DpreviewDiv%20%3E%u6B63%u5728%u8BA1%u7B97...%3C/DIV%3E%22%3B%20Pages%3DPages+1%3B%20%7D%20%7D%20biglabel.innerHTML%3Dbiglabel.innerHTML%20+%22%3Cdiv%20class%3DpreviewDiv%20%3E%u6B63%u5728%u8BA1%u7B97...%3C/DIV%3E%22%3B%20Pages%3DPages+1%3B%20%7D%20iStart%3DiEnd+1%3B%20%7D%20%7D%20perPageHTML%3D%22%22%3B%20%7D%20perPageHTML%3DperPageHTML+t.rows%28i%29.outerHTML%20%3B%20%7D%20mdblRate%3D1%3B%20htmlTop%3D%22%22%3B%20htmlBottom%3D%22%22%3B%20t.outerHTML%3Dt_outerHTMLbak%3B%20t.style.display%3D%22none%22%3B%20for%28var%20i%3D0%3Bi%3CPages%3Bi++%29%7B%20arrPage%5Bi%5D%3Dfc_RepStr%28arrPage%5Bi%5D%2C%22%28P%29%22%2CPages+%22%22%29%3B%20%7D%20%7D%20";
  133. out.println(strX);
  134. }
  135. }
  136. //下面是自定义的方法
  137. //--------------------------------------
  138. //两个结果集的示例,第一个用连接池打开,第二个用一般方式打开
  139. private String twors() {
  140. // Node root = document.getChildNodes().item(0);
  141.  //   String sField=root.getChildNodes().item(0).getChildNodes().item(0).getNodeValue();
  142.   //  String sTable=root.getChildNodes().item(1).getChildNodes().item(0).getNodeValue();
  143. String strSql="select flngVoucherID,fstrVoucherTypeName from Voucher" ;
  144. String sTmp="";
  145. try {
  146. Statement stmt = con.createStatement();
  147. rs = stmt.executeQuery(strSql);
  148. while (rs.next()) {
  149. String sDBDriver = "sun.jdbc.odbc.JdbcOdbcDriver"; 
  150. String sConnStr = "jdbc:odbc:ereport"; 
  151. Class.forName(sDBDriver);
  152. Connection con1 = DriverManager.getConnection(sConnStr,"sa",""); 
  153. String sT=rs.getString(1);
  154. Statement stmt1 = con1.createStatement();
  155. rs1 = stmt1.executeQuery("select fstrAccountName from voucherdetail Where flngVoucherId="+sT);
  156. while (rs1.next()) {
  157. System.out.println("科目:"+rs1.getString(1));
  158. }
  159. }
  160. }
  161. catch (Exception e){
  162. sTmp=e.getMessage() ;
  163. }
  164. return sTmp;
  165. }
  166. //--------------------------------------
  167. private String fc_FieldToTable() {
  168. Node root = document.getChildNodes().item(0);
  169.     String sField=root.getChildNodes().item(0).getChildNodes().item(0).getNodeValue();
  170.     String sTable=root.getChildNodes().item(1).getChildNodes().item(0).getNodeValue();
  171. String strSql="select "+sField+" From "+sTable ;
  172. String sTmp="";
  173. try {
  174. Statement stmt = con.createStatement();
  175. rs = stmt.executeQuery(strSql);
  176. }
  177. catch (Exception e){
  178. sTmp=e.getMessage() ;
  179. }
  180. return sTmp;
  181. }
  182. //--------------------------------------
  183. private String GetDB() {
  184. Node root = document.getChildNodes().item(0);
  185.         String sConnect=root.getChildNodes().item(0).getChildNodes().item(0).getNodeValue();
  186.         String sSql=root.getChildNodes().item(1).getChildNodes().item(0).getNodeValue();
  187.         sSql=fcTrans(sSql);
  188.         //System.out.println(sSql);
  189.         String sR="";
  190.         String sDBDriver = "sun.jdbc.odbc.JdbcOdbcDriver"; //建立数据库连接
  191. String sConnStr = "jdbc:odbc:"+sConnect ; 
  192. try {
  193. Class.forName(sDBDriver);
  194. con = DriverManager.getConnection(sConnStr,"sa",""); 
  195. Statement stmt = con.createStatement();
  196. rs = stmt.executeQuery(sSql);//执行查询建立结果集
  197. if (rs.next()) {
  198. sR=rs.getString(1);
  199. }
  200. rs.close();
  201. stmt.close();
  202. }
  203. catch (Exception e){
  204. sR=e.getMessage();
  205. }
  206. return sR;
  207. }
  208. //--------------------------------------
  209. private String fc_select() {
  210. Node root = document.getChildNodes().item(0);
  211.     String strSql=root.getChildNodes().item(0).getChildNodes().item(0).getNodeValue();
  212.     String strPageNo=root.getChildNodes().item(1).getChildNodes().item(0).getNodeValue();
  213. int iPageNo=Integer.parseInt(strPageNo,10);//页号
  214.     String strPageSize=root.getChildNodes().item(2).getChildNodes().item(0).getNodeValue();
  215. int iPageSize=Integer.parseInt(strPageSize,10);//页尺寸
  216. strSql=fcTrans(strSql);
  217. //System.out.println(strSql);
  218. String strX = "<root>";
  219. String sTmp = "";
  220. int iField=1;
  221. int iCount=1;
  222. int i=1;
  223. try {
  224. Statement stmt = con.createStatement();
  225. rs = stmt.executeQuery(strSql);
  226.         ResultSetMetaData rsmd=rs.getMetaData();
  227. while (rs.next()) {
  228. //每页30行
  229. if (i>(iPageNo-1)*iPageSize && i<=iPageNo*iPageSize) {
  230.         strX = strX + "<record>";
  231. iCount=rsmd.getColumnCount();
  232.         for (iField = 1 ; iField<=iCount ;iField++ ) 
  233. {
  234. //当有NULL字段名时,表示此则无需给值.用fcnull标记名区分.
  235. String colName=rsmd.getColumnName(iField);
  236. if (colName==null) {
  237. strX = strX + "<fcnull></fcnull>" ;
  238. }
  239. else {
  240. String sT=rs.getString(iField);
  241. if (sT==null) sT="";
  242.             strX = strX + "<fc>" + sT +"</fc>" ;
  243.             }
  244. }
  245.         strX = strX + "</record>";
  246.         }
  247.         i = i + 1;
  248. }
  249. i=i-1;
  250. if (i>0) {
  251. strX = strX + "<pages>"+i+"</pages>";
  252. }
  253. strX = strX + "</root>";
  254. rs.close();
  255. }
  256. catch (Exception e){
  257. sTmp=e.getMessage() ;
  258. System.out.println(sTmp);
  259. e.printStackTrace();
  260. }
  261. return strX ;
  262. }
  263. //--------------------------------------
  264. private String fc_select1() {
  265. //将页号和页尺寸两个节点从第一个子节点和第二个子节点改为第一个子节点下的第一个子节点和第二个子节点
  266. //将第二个子节点空出来给设置数据源用.
  267. //第二个子节点下将有三个子节点:数据源名称,用户名,密码.
  268. Node root = document.getChildNodes().item(0);
  269.     String strPageNo=root.getChildNodes().item(0).getChildNodes().item(0).getChildNodes().item(0).getNodeValue();
  270. int iPageNo=Integer.parseInt(strPageNo,10);//页号
  271.     String strPageSize=root.getChildNodes().item(0).getChildNodes().item(1).getChildNodes().item(0).getNodeValue();
  272. int iPageSize=Integer.parseInt(strPageSize,10);//页尺寸
  273. //数据源
  274.     strDataSource=root.getChildNodes().item(1).getChildNodes().item(0).getChildNodes().item(0).getNodeValue();
  275.     strUserName=root.getChildNodes().item(1).getChildNodes().item(1).getChildNodes().item(0).getNodeValue();
  276.     try {
  277.      strPassword=root.getChildNodes().item(1).getChildNodes().item(2).getChildNodes().item(0).getNodeValue();
  278.     }
  279.     catch (Exception e){
  280.      strPassword="";
  281.     }
  282. //-------
  283. //多SQL查询
  284. String strX = "<root>";
  285. int ii=0;
  286. int i=1;
  287. //按顺序取出SQL节点
  288. for(ii=2;ii<root.getChildNodes().getLength();ii++){
  289.     String strSql=root.getChildNodes().item(ii).getChildNodes().item(0).getNodeValue();
  290. strX=strX+fc_selectTmp(iPageNo,iPageSize,i,strSql);
  291. i=iPosition;
  292. } //For循环结束
  293. i=i-1;
  294. if (i>0) {
  295. strX = strX + "<pages>"+i+"</pages>";
  296. }
  297. strX = strX + "</root>";
  298. return strX ;
  299. }
  300. //--------------------------------------
  301. //计算一个SQL查询,供fc_select1 fc_select2类函数使用
  302. private String fc_selectTmp(int iPageNo,int iPageSize,int iPos,String strSql) {
  303. //iPageNo为起始页号,iPageSize为页尺寸,iPos为所有查询结果的行位置,strSql为要执行的SQL语句
  304. //返回SQL语句的运行结果,结果为以<record>...</record>形式的XML串
  305. //
  306. strSql=fcTrans(strSql);
  307. System.out.println("fc_selectTmp:"+strSql);
  308. String sTmp = "";
  309. String strX = "";
  310. int iField=1;
  311. int iCount=1;
  312. int i=iPos;
  313. try {
  314. String sDBDriver = "sun.jdbc.odbc.JdbcOdbcDriver"; 
  315. String sConnStr = "jdbc:odbc:"+strDataSource; 
  316. Class.forName(sDBDriver);
  317. Connection conTmp = DriverManager.getConnection(sConnStr,strUserName,strPassword); 
  318. Statement stmtTmp = conTmp.createStatement();
  319. ResultSet rsTmp = stmtTmp.executeQuery(strSql);
  320.         ResultSetMetaData rsmdTmp=rsTmp.getMetaData();
  321. while (rsTmp.next()) {
  322. //每页30行
  323. if (i>(iPageNo-1)*iPageSize && i<=iPageNo*iPageSize) {
  324.         strX = strX + "<record>";
  325. iCount=rsmdTmp.getColumnCount();
  326.         for (iField = 1 ; iField<=iCount ;iField++ ) 
  327. {
  328. //当有NULL字段名时,表示此则无需给值.用fcnull标记名区分.
  329. String colName=rsmdTmp.getColumnName(iField);
  330. if (colName==null) {
  331. strX = strX + "<fcnull></fcnull>" ;
  332. }
  333. else {
  334. String sT=rsTmp.getString(iField);
  335. if (sT==null) sT="";
  336.             strX = strX + "<fc>" + sT +"</fc>" ;
  337.             }
  338. }
  339.         strX = strX + "</record>";
  340.         }
  341.         i = i + 1;
  342. }
  343. rsTmp.close();
  344. stmtTmp.close();
  345. conTmp.close();
  346. }
  347. catch (Exception e){
  348. sTmp=e.getMessage() ;
  349. System.out.println("0712:"+sTmp);
  350. System.out.println("0712:"+strSql);
  351. }
  352. iPosition=i; //用iPosition全局变量将i值传到调用函数中.
  353. //System.out.println("strX="+strSql);
  354. return strX;
  355. }
  356. //--------------------------------------
  357. //带分组小计的多SQL查询
  358. private String fc_select2() {
  359. //sXml的结构:
  360. //1页号 2页尺寸 3主SQL<1SQL语句 2<before... > > 4Group<1SQL语句 2GroupField >
  361. int i=1;
  362. String beforeSum="0"; //=0表示合计行在后,=1表示合计行在前。
  363. String strX = "";
  364. String strX1 = "";
  365. String strRetXml = ""; //返回的总的Xml串
  366. //将页号和页尺寸两个节点从第一个子节点和第二个子节点改为第一个子节点下的第一个子节点和第二个子节点
  367. //将第二个子节点空出来给设置数据源用.
  368. //第二个子节点下将有三个子节点:数据源名称,用户名,密码.
  369. Node root = document.getChildNodes().item(0);
  370.     String strPageNo=root.getChildNodes().item(0).getChildNodes().item(0).getChildNodes().item(0).getNodeValue();
  371. int iPageNo=Integer.parseInt(strPageNo,10);//页号
  372.     String strPageSize=root.getChildNodes().item(0).getChildNodes().item(1).getChildNodes().item(0).getNodeValue();
  373. int iPageSize=Integer.parseInt(strPageSize,10);//页尺寸
  374. //数据源
  375.     strDataSource=root.getChildNodes().item(1).getChildNodes().item(0).getChildNodes().item(0).getNodeValue();
  376.     strUserName=root.getChildNodes().item(1).getChildNodes().item(1).getChildNodes().item(0).getNodeValue();
  377.     try {
  378.      strPassword=root.getChildNodes().item(1).getChildNodes().item(2).getChildNodes().item(0).getNodeValue();
  379.     }
  380.     catch (Exception e){
  381.      strPassword="";
  382.     }
  383. //-------
  384. //第3个子节点的第1个子节点的值用如下求法.
  385.     String strSql=root.getChildNodes().item(2).getChildNodes().item(0).getChildNodes().item(0).getNodeValue();
  386. //strSql=fcTrans(strSql);
  387. //System.out.println(strSql);
  388. //第3个子节点的第2个子节点下的第1个子节点的值用如下求法.
  389.     String strStartXml=""; //首合计行的xml串
  390.     //总计行之类的
  391.     try {
  392.      //如有一个节点表示首合计行,如有二个节点表示第一为首合计行,第二为尾合计行
  393.     String sStartSql=root.getChildNodes().item(2).getChildNodes().item(1).getChildNodes().item(0).getChildNodes().item(0).getNodeValue();
  394. //此处现只假定只有一个查询,如有多个,则此处要用循环
  395. strStartXml=fc_selectTmp(iPageNo,iPageSize,i,sStartSql);
  396. i=iPosition;
  397. }
  398. catch (Exception e){
  399. }
  400. //-----------------
  401. String sGroup1="";
  402. String sGroup2="";
  403. //String sGroup3="";
  404. //第一个分组
  405.     sGroup1=root.getChildNodes().item(3).getChildNodes().item(0).getChildNodes().item(0).getNodeValue();
  406. sGroup1=fcTrans(sGroup1);
  407. //分组字段名
  408.     String sGroupField1=root.getChildNodes().item(3).getChildNodes().item(1).getChildNodes().item(0).getNodeValue();
  409. //第二个分组
  410.     sGroup2=root.getChildNodes().item(4).getChildNodes().item(0).getChildNodes().item(0).getNodeValue();
  411. sGroup2=fcTrans(sGroup2);
  412.     String sGroupField2=root.getChildNodes().item(4).getChildNodes().item(1).getChildNodes().item(0).getNodeValue();
  413. String sTmp = "";
  414. int iField=1;
  415. int iCount=1;
  416. String sGroupKey1=""; //保存分组字段的值
  417. String sGroupKey2="";
  418. String tmpsGroup="";
  419. try {
  420. String sDBDriver = "sun.jdbc.odbc.JdbcOdbcDriver"; 
  421. String sConnStr = "jdbc:odbc:"+strDataSource; 
  422. Class.forName(sDBDriver);
  423. Connection con1 = DriverManager.getConnection(sConnStr,strUserName,strPassword); 
  424. Statement stmt1 = con1.createStatement();
  425. Connection con2 = DriverManager.getConnection(sConnStr,strUserName,strPassword); 
  426. Statement stmt2 = con2.createStatement();
  427. rs1 = stmt1.executeQuery(sGroup1);
  428.         ResultSetMetaData rsmd1=rs1.getMetaData();
  429. while (rs1.next()) {
  430. //strX="";
  431. //strX1="";
  432. sGroupKey1=rs1.getString(1);
  433. //算出第一个分组的合计行值
  434. //if (i>(iPageNo-1)*iPageSize && i<=iPageNo*iPageSize) {
  435.         strX = "<recordsum1>"; //设特别tagName用于在前台设底色等属性
  436. iCount=rsmd1.getColumnCount();
  437.         //第一个字段是分组字段值,所以从2开始
  438.         for (iField = 2 ; iField<=iCount ;iField++ ) 
  439. {
  440. //当有NULL字段名时,表示此则无需给值.用fcnull标记名区分.
  441. String colName=rsmd1.getColumnName(iField);
  442. if (colName==null) {
  443. strX = strX + "<fcnull></fcnull>" ;
  444. }
  445. else {
  446. String sT=rs1.getString(iField);
  447. if (sT==null) sT="";
  448. if(iField == 2)
  449. strX = strX + "<fc>小计 " + sT +"</fc>" ;
  450. else 
  451.              strX = strX + "<fc>" + sT +"</fc>" ;
  452.             }
  453. }
  454.         strX = strX + "</recordsum1>";
  455.         //}
  456.         
  457. if(sGroup2.equals("fcnull")){
  458. //只有一级分组
  459. //准备下一个的SQL语句
  460. tmpsGroup=fc_RepStr(strSql,"1999=1999","1999=1999"+" and " +sGroupField1+"='"+sGroupKey1+"'");
  461. //此处定合计行在明细行的前面还是后面
  462. if(beforeSum.equals("1")){
  463. //-------合计行在前
  464. if (i>(iPageNo-1)*iPageSize && i<=iPageNo*iPageSize) {
  465. strRetXml+=strX;
  466. }
  467. i++;
  468. strRetXml+=fc_selectTmp(iPageNo,iPageSize,i,tmpsGroup);
  469. i=iPosition;
  470. }
  471. else {
  472. //-------合计行在后
  473. strRetXml+=fc_selectTmp(iPageNo,iPageSize,i,tmpsGroup);
  474. i=iPosition;
  475. if (i>(iPageNo-1)*iPageSize && i<=iPageNo*iPageSize) {
  476. strRetXml+=strX;
  477. }
  478. i++;
  479. }
  480. }
  481. else { //有二级分组
  482. //准备下一个的SQL语句
  483. tmpsGroup=fc_RepStr(sGroup2,"1999=1999","1999=1999"+" and " +sGroupField1+"='"+sGroupKey1+"'");
  484. //System.out.println("my:"+tmpsGroup);
  485. rs2 = stmt2.executeQuery(tmpsGroup);
  486.         ResultSetMetaData rsmd2=rs2.getMetaData();
  487. if(beforeSum.equals("1")){
  488. //-------合计行在前
  489. if (i>(iPageNo-1)*iPageSize && i<=iPageNo*iPageSize) {
  490. strRetXml+=strX;
  491. }
  492. i++;
  493. }
  494. while (rs2.next()) {
  495. sGroupKey2=rs2.getString(1);
  496. //算出第二个分组的合计行值
  497.         strX1 =  "<recordsum2>";
  498. iCount=rsmd2.getColumnCount();
  499.         //第一个字段是分组字段值,所以从2开始
  500.         for (iField = 2 ; iField<=iCount ;iField++ ) 
  501. {
  502. //当有NULL字段名时,表示此则无需给值.用fcnull标记名区分.
  503. String colName=rsmd2.getColumnName(iField);
  504. if (colName==null) {
  505. strX1 = strX1 + "<fcnull></fcnull>" ;
  506. }
  507. else {
  508. String sT=rs2.getString(iField);
  509. if (sT==null) sT="";
  510. if(iField == 2)
  511. strX1 = strX1 + "<fc>小 计 " + sT +"</fc>" ;
  512. else 
  513.             strX1 = strX1 + "<fc>" + sT +"</fc>" ;
  514.             }
  515. }
  516.         strX1 = strX1 + "</recordsum2>";
  517. //-------------------------------
  518. //准备下一个的SQL语句
  519. tmpsGroup=fc_RepStr(strSql,"1999=1999","1999=1999"+" and " +sGroupField1+"='"+sGroupKey1+"'"+" and " +sGroupField2+"='"+sGroupKey2+"'");
  520. //此处定合计行在明细行的前面还是后面
  521. if(beforeSum.equals("1")){
  522. //-------合计行在前
  523. if (i>(iPageNo-1)*iPageSize && i<=iPageNo*iPageSize) {
  524. strRetXml+=strX1;
  525. }
  526. i++;
  527. strRetXml+=fc_selectTmp(iPageNo,iPageSize,i,tmpsGroup);
  528. i=iPosition;
  529. }
  530. else {
  531. //-------合计行在后
  532. strRetXml+=fc_selectTmp(iPageNo,iPageSize,i,tmpsGroup);
  533. i=iPosition;
  534. if (i>(iPageNo-1)*iPageSize && i<=iPageNo*iPageSize) {
  535. strRetXml+=strX1;
  536. }
  537. i++;
  538. }
  539. }//二级分组的循环结束
  540. if(beforeSum.equals("0")){
  541. //-------合计行在后
  542. if (i>(iPageNo-1)*iPageSize && i<=iPageNo*iPageSize) {
  543. strRetXml+=strX;
  544. }
  545. i++;
  546. }
  547. } //判断有无二级分组的IF结束
  548. }//一级分组的循环结束
  549. //----- loop end
  550. //第3个子节点(mainsql)的第3个子节点下(end)的第1个子节点(sql)的值用如下求法.
  551.     String strEndXml=""; //首合计行的xml串
  552.     //总计行之类的
  553.     try {
  554.      //如有一个节点表示首合计行,如有二个节点表示第一为首合计行,第二为尾合计行
  555.     String sStartSql=root.getChildNodes().item(2).getChildNodes().item(2).getChildNodes().item(0).getChildNodes().item(0).getNodeValue();
  556. //System.out.println("endsql:"+sStartSql);
  557. //此处现只假定只有一个查询,如有多个,则此处要用循环
  558. strEndXml=fc_selectTmp(iPageNo,iPageSize,i,sStartSql);
  559. i=iPosition;
  560. }
  561. catch (Exception e){
  562. }
  563. //-----------------
  564. i=i-1;
  565. if (i>0) {
  566. strRetXml = strStartXml+strRetXml +strEndXml+ "<pages>"+i+"</pages>";
  567. }
  568. strRetXml = "<root>"+strRetXml + "</root>";
  569. //rs.close();
  570. }
  571. catch (Exception e){
  572. e.printStackTrace() ;
  573. sTmp=e.getMessage() ;
  574. System.out.println("071201"+sTmp);
  575. }
  576. return strRetXml ;
  577. }
  578. //--------------------------------------
  579. private String fc_insert() {
  580. Node root = document.getChildNodes().item(0);
  581.     String strSql=root.getChildNodes().item(0).getChildNodes().item(0).getNodeValue();
  582. strSql=fcTrans(strSql);
  583. String sTmp = "";
  584. // CallableStatement cstmt=null;
  585. try {
  586. Statement stmt = con.createStatement();
  587. // stmt.executeQuery(strSql);
  588. stmt.executeUpdate(strSql);
  589. /*
  590. cstmt=con.prepareCall("{call sp_getID(?)}");
  591. cstmt.registerOutParameter(1,java.sql.Types.INTEGER,1);
  592. cstmt.executeUpdate();
  593. sTmp="<dsnID>"+ cstmt.getInt(1)+"</dsnID>";
  594. */
  595. }
  596. catch (Exception e){
  597. sTmp=e.getMessage() ;
  598. }
  599. return sTmp ;
  600. }
  601. //--------------------------------------
  602. private String fc_insert1() {
  603. //凭证增加
  604. Node root = document.getChildNodes().item(0);
  605. String sTmp = "";
  606. CallableStatement cstmt=null;
  607. try {
  608. Statement stmt = con.createStatement();
  609. int i;
  610. //System.out.println(root.getChildNodes().getLength());
  611.     String strSql=root.getChildNodes().item(0).getChildNodes().item(0).getNodeValue();
  612. strSql=fcTrans(strSql);
  613. stmt.executeUpdate(strSql);
  614. String sID="1"; //存主表新生成的ID
  615. try {
  616. //SQL Server 的存储过程,用于计算自动ID
  617. cstmt=con.prepareCall("{call sp_getID(?)}");
  618. cstmt.registerOutParameter(1,java.sql.Types.INTEGER,1);
  619. cstmt.executeUpdate();
  620. sID=""+cstmt.getInt(1);
  621. }
  622. catch (Exception e1){
  623. try {
  624. //计算MS Access数据库的主表ID
  625. String sDBDriver = "sun.jdbc.odbc.JdbcOdbcDriver"; 
  626. String sConnStr = "jdbc:odbc:webprint"; 
  627. Class.forName(sDBDriver);
  628. Connection con1 = DriverManager.getConnection(sConnStr,"sa",""); 
  629. Statement stmt1 = con1.createStatement();
  630. rs1 = stmt1.executeQuery("select max(flngSendOutID) From SendOut");
  631. if (rs1.next()) {
  632. sID=rs1.getString(1);
  633. }
  634. }
  635. catch (Exception e2){
  636. }
  637. }
  638. //追加子表内容
  639. for(i=1;i<root.getChildNodes().getLength();i++) {
  640.     strSql=root.getChildNodes().item(i).getChildNodes().item(0).getNodeValue();
  641. strSql=fcTrans(strSql);
  642. strSql=strSql+sID+" )";
  643. stmt.executeUpdate(strSql);
  644. }
  645. }
  646. catch (Exception e){
  647. System.out.println(e.getMessage()) ;
  648. }
  649. return sTmp ;
  650. }
  651. //--------------------------------------
  652. private String fc_update1() {
  653. //凭证修改
  654. Node root = document.getChildNodes().item(0);
  655. String sTmp = "";
  656. String strSql="";
  657. try {
  658. Statement stmt = con.createStatement();
  659. int i;
  660. for(i=0;i<root.getChildNodes().getLength();i++) {
  661.     strSql=root.getChildNodes().item(i).getChildNodes().item(0).getNodeValue();
  662. strSql=fcTrans(strSql);
  663. stmt.executeUpdate(strSql);
  664. }
  665. }
  666. catch (Exception e){
  667. System.out.println(e.getMessage()) ;
  668. }
  669. return sTmp ;
  670. }
  671. //--------------------------------------
  672. /**
  673. *检查SQL语句是否为合法的SQL语句
  674. *@param sql 要检查的SQL语句.
  675. *@return 是则返回空,否则返回非空
  676. *@date 2002-05-20
  677. **/
  678. private String checksql() {
  679. Node root = document.getChildNodes().item(0);
  680.     String strSql=root.getChildNodes().item(0).getChildNodes().item(0).getNodeValue();
  681. strSql=fcTrans(strSql);
  682. //System.out.println(strSql);
  683. String strX = "";
  684. try {
  685. Statement stmt = con.createStatement();
  686. rs = stmt.executeQuery(strSql);
  687. rs.close();
  688. }
  689. catch (Exception e){
  690. strX=e.getMessage() ;
  691. }
  692. return strX ;
  693. }
  694. //--------------------------------------
  695. private String fillcombox() {
  696. //拼成的XML串的节点名为option,可以直接填入combox中
  697. //返回的XML串无根节点.
  698. Node root = document.getChildNodes().item(0);
  699.     String strSql=root.getChildNodes().item(0).getChildNodes().item(0).getNodeValue();
  700. /*
  701.     String strPageNo=root.getChildNodes().item(1).getChildNodes().item(0).getNodeValue();
  702. int iPageNo=Integer.parseInt(strPageNo,10);//页号
  703.     String strPageSize=root.getChildNodes().item(2).getChildNodes().item(0).getNodeValue();
  704. int iPageSize=Integer.parseInt(strPageSize,10);//页尺寸
  705. */
  706. strSql=fcTrans(strSql);
  707. //System.out.println(strSql);
  708. String strX = "";
  709. String sTmp = "";
  710. int iField=1;
  711. int iCount=1;
  712. int i=1;
  713. try {
  714. Statement stmt = con.createStatement();
  715. rs = stmt.executeQuery(strSql);
  716.          ResultSetMetaData rsmd=rs.getMetaData();
  717. iCount=rsmd.getColumnCount();
  718.                 String sT="";
  719. while (rs.next()) {
  720. //每页30行
  721. //if ((i>(iPageNo-1)*iPageSize && i<=iPageNo*iPageSize) || iPageSize==-1) {
  722.         //strX = strX + "<option>";
  723. if(iCount>1){
  724. //假定两列时,第一列为value,第二列为text
  725.    sT=rs.getString(1);
  726.    if (sT==null) sT="";
  727.    strX+="<option value='" +sT;
  728.    sT=rs.getString(2);
  729.    if (sT==null) sT="";
  730.    strX+="' >"+sT+"</option>";
  731. }else {
  732. //一列时则value和text相同
  733.    sT=rs.getString(1);
  734.    if (sT==null) sT="";
  735.    strX+="<option value='" +sT;
  736.    strX+="' >"+sT+"</option>";
  737. }
  738. //                 }
  739.                 i = i + 1;
  740. }
  741. //strX = strX + "</root>";
  742. rs.close();
  743. }
  744. catch (Exception e){
  745. sTmp=e.getMessage() ;
  746. System.out.println(sTmp);
  747. }
  748. return strX ;
  749. }
  750. //--------------------------------------
  751. private String SqlToField(String strSql) {
  752. //用一个SQL语句返回一个字段的第一个记录值
  753. String strR =  "";
  754. try {
  755. Statement stmt = con.createStatement();
  756. rs = stmt.executeQuery(strSql);
  757. if (rs.next()) {
  758.     strR = rs.getString(1) ;
  759. }
  760. rs.close();
  761. stmt.close();
  762. }
  763. catch (Exception e){
  764. //out.println("读表发生错误");
  765. }
  766. return strR;
  767. }
  768. //--------------------------------------
  769. //报表增加
  770. //--------------------------------------
  771. private String GetReportCell() {
  772. //找到指定位置的单元的值.
  773. Node root = document.getChildNodes().item(0);
  774. String sRow = root.getChildNodes().item(0).getChildNodes().item(0).getNodeValue();
  775. int iRow=Integer.parseInt(sRow,10);
  776. String sCol =root.getChildNodes().item(1).getChildNodes().item(0).getNodeValue();
  777. int iCol=Integer.parseInt(sCol,10);
  778. String strTableName =root.getChildNodes().item(2).getChildNodes().item(0).getNodeValue();
  779. strTableName=fcTrans(strTableName);
  780. //int iRow=Integer.parseInt(sRow,10);
  781. String strSql="";
  782. //String strID=TableNameToID(strTableName);
  783. //strSql = "Select fstrDiv1 From cellsheet where flngID=" + strID + " and flngSheetNo=" + strPage  ;
  784. strSql = "Select fstrTable1 From fcCell where fstrTableName='" + strTableName+"'"  ;
  785. //String sLogCol=ToLogCol(sRow,sCol,"Select fstroCoor From cellsheet where flngID=" + strID + " and flngSheetNo=" + strPage );
  786. //int iCol=Integer.parseInt(sLogCol,10);
  787. String strR="";
  788. String strR1="";
  789. int iStart=0;
  790. int iStartTmp=0;
  791. int iTmp=0;
  792. int iEnd=0;
  793. try {
  794. Statement stmt = con.createStatement();
  795. rs = stmt.executeQuery(strSql);
  796. if (rs.next()) {
  797.     strR = rs.getString(1) ;
  798. }
  799. rs.close();
  800. stmt.close();
  801. //strR1=strR;
  802. //查找定位TR TD
  803. //iStart=strR.indexOf("%20id%3Dt%20",0);//查找 id=t 
  804. for (int i=0;i<=iRow;i++) {
  805. iStartTmp=strR.indexOf("%3CTR",iStart+1);//TR开始符
  806. if (iStartTmp>0) {
  807. iStart=iStartTmp;
  808. }
  809. }
  810. if (iStartTmp>0) {
  811. for (int i=0;i<=iCol;i++) {
  812. iStartTmp=strR.indexOf("%3CTD",iStart+1); //TD开始符
  813. if (iStartTmp>0) {
  814. iStart=iStartTmp;
  815. }
  816. }
  817. iStart=strR.indexOf("%3E",iStart);//TD后的第一个>
  818. iEnd=strR.indexOf("%3C/TD%3E",iStart);//TD结束符
  819. if (iEnd>iStart && iStart>0) {
  820. strR=strR.substring(iStart+3,iEnd);
  821. }
  822. }
  823. }
  824. catch (Exception e){
  825. System.out.println(e.getMessage());
  826. }
  827. //return Integer.toString(iEnd) ;
  828. System.out.println(strR);
  829. return "<root>"+strR+"</root>";
  830. }
  831. //--------------------------------------
  832. //--------------------------------------
  833. //通用函数
  834. private  String fc_RepStr(String mainStr,String findStr,String replaceStr){
  835. //多次替代
  836. int iStart=0;
  837. int iEnd=0;
  838. String sRet="";
  839. while (iStart<mainStr.length()) {
  840. iEnd=mainStr.indexOf(findStr,iStart);
  841. if (iEnd<0) {
  842. iEnd=mainStr.length();
  843. sRet=sRet+mainStr.substring(iStart,iEnd);
  844. }
  845. else {
  846. sRet=sRet+mainStr.substring(iStart,iEnd)+replaceStr;
  847. }
  848. iStart=iEnd+findStr.length();
  849. }
  850. return sRet;
  851. }
  852. private String rTrim(String str){
  853.      String rstr = str;
  854.   if(str == null)
  855.          {
  856.     rstr = "";
  857.   }
  858.          else
  859.          {
  860.     if(str.length() == 0) rstr = "";
  861.     if(str.length() > 0)
  862.     {
  863.       for(int i = str.length() ; i  >  0 ; i--)
  864.              {
  865.      if(str.substring(i-1,i).equals(" "))  
  866.        rstr = rstr.substring(0,i-1);
  867.      else break;
  868.    }
  869.      } 
  870.        
  871.   }
  872.   return rstr;
  873. //--------------------------------------------
  874. private String  XmlOut(ResultSet oRs , String sRowEntityName,long EntFormat ) 
  875. {
  876. String sSet="";
  877. try {
  878. //oRs.first();
  879. while (oRs.next())
  880. {
  881.     sSet = sSet + RecordToXMLEntity(oRs, sRowEntityName, EntFormat) ;
  882. }
  883. }
  884. catch (Exception e)
  885. {
  886. return e.getMessage();
  887. }
  888. return sSet ;
  889. }
  890. private String  RecordToXMLEntity(ResultSet oRs , String EntityName,long EntFormat)
  891. {
  892. String sEty ="";
  893. int iField=1;
  894. int iCount=1;
  895.     try {
  896.     ResultSetMetaData rsmd=oRs.getMetaData();
  897. iCount=rsmd.getColumnCount();
  898. if (EntFormat==1) 
  899. {
  900. //属性
  901.         sEty = "<" + EntityName ;
  902.         for (iField = 1 ; iField<=iCount ;iField++ ) 
  903. {
  904.             sEty = sEty + " " + rsmd.getColumnName(iField) +"='" + oRs.getString(iField) +"'" ;
  905. }
  906.         sEty = sEty + "/>" + "n";
  907. }
  908. else
  909. {
  910. //节点
  911.     sEty = "<" + EntityName +">" +"n" ;
  912.         for (iField = 1 ; iField<=iCount ; iField++) 
  913.         {
  914.             sEty = sEty +"<" +  rsmd.getColumnName(iField) +">" + oRs.getString(iField) +"</" + rsmd.getColumnName(iField) +">";
  915.         }
  916.         sEty = sEty +"n" +"</" + EntityName +">" +"n";
  917. }
  918. }
  919. catch (Exception e)
  920. {
  921. }
  922. return sEty;
  923. }
  924. //-----------------------------------------------------
  925. private Attr[] sortAttributes(NamedNodeMap attrs) {
  926.     int len = (attrs != null) ? attrs.getLength() : 0;
  927.     Attr array[] = new Attr[len];
  928.     for ( int i = 0; i < len; i++ ) {
  929.         array[i] = (Attr)attrs.item(i);
  930.     }
  931.     for ( int i = 0; i < len - 1; i++ ) {
  932.         String name  = array[i].getNodeName();
  933.         int    index = i;
  934.         for ( int j = i + 1; j < len; j++ ) {
  935.             String curName = array[j].getNodeName();
  936.             if ( curName.compareTo(name) < 0 ) {
  937.                 name  = curName;
  938.                 index = j;
  939.             }
  940.         }
  941.         if ( index != i ) {
  942.             Attr temp    = array[i];
  943.             array[i]     = array[index];
  944.             array[index] = temp;
  945.         }
  946.     }
  947.     return(array);
  948. } // sortAttributes(NamedNodeMap):Attr[]
  949. private  String fcTrans(String sSource) 
  950. {
  951. //
  952. //XML节点中的汉字经8859_1==>UTF-8转换后用System.out.println输出正常
  953. String unicodesR ="";
  954. try {
  955. byte [] by = sSource.getBytes("8859_1"); //GB2312
  956. unicodesR = new String(by,"UTF-8");
  957. }
  958. catch (Exception e)
  959. {
  960. }
  961. //System.out.println(unicodesR);
  962. return unicodesR;
  963. ///
  964. }
  965. //--------------------------------------------
  966. //WebCode中用
  967. private  String sqltoxml() 
  968. {
  969. Node root=document.getChildNodes().item(0);
  970. String strpage=root.getChildNodes().item(0).getChildNodes().item(0).getNodeValue();
  971. String strsql=root.getChildNodes().item(1).getChildNodes().item(0).getNodeValue();
  972. strsql=fcTrans(strsql);
  973. String strsearch=root.getChildNodes().item(2).getChildNodes().item(0).getNodeValue();
  974. String strrownum=root.getChildNodes().item(3).getChildNodes().item(0).getNodeValue();
  975. String showcheckbox=root.getChildNodes().item(4).getChildNodes().item(0).getNodeValue();
  976. String blnempty=root.getChildNodes().item(5).getChildNodes().item(0).getNodeValue();
  977. //加空行
  978. showcheckbox=showcheckbox.toUpperCase();
  979. int intpage=Integer.parseInt(strpage);//开始页
  980. int intrownum=Integer.parseInt(strrownum);//页尺寸
  981. String strX="";
  982. try {
  983. //建立数据库连接
  984. strDataSource="webgrid";
  985. strUserName="sa";
  986. strPassword="";
  987. String sDBDriver = "sun.jdbc.odbc.JdbcOdbcDriver"; 
  988. String sConnStr = "jdbc:odbc:"+strDataSource; 
  989. Class.forName(sDBDriver);
  990. Connection con1 = DriverManager.getConnection(sConnStr,strUserName,strPassword); 
  991. Statement stmt = con1.createStatement();
  992. //原来的
  993. //Statement stmt = con.createStatement();
  994. //执行查询建立结果集
  995. //-----------------
  996. //System.out.print(strsearch);
  997. int i=1;
  998. if (strsearch.compareTo("###")!=0){
  999. rs = stmt.executeQuery(strsql);
  1000. boolean bfind=false;
  1001. while(rs.next()){
  1002. String searchone=rs.getString(1);
  1003. //out.print(searchone);
  1004. if (searchone.equals(strsearch)){
  1005. bfind=true;
  1006. break;
  1007. }
  1008. i=i+1;
  1009. }
  1010. rs.close();
  1011. if (bfind==true){
  1012. if (i<=intrownum){
  1013. intpage=1;
  1014. }
  1015. else {
  1016. if (i%intrownum>0){
  1017. intpage=i/intrownum+1;
  1018. }
  1019. else {
  1020. intpage=i/intrownum;
  1021. }
  1022. }
  1023. }
  1024. //自动定位到当前选择所在值的页
  1025. }
  1026. //out.print("intpage="+intpage);
  1027. //-----------------
  1028. // System.out.print(intpage);
  1029. rs = stmt.executeQuery(strsql);
  1030. ResultSetMetaData rsmd=rs.getMetaData();
  1031. strX="<root>";
  1032. String sLabel="";
  1033. int k=0;
  1034. int thisrow=0;
  1035. int pagenumber=0;//总页数
  1036. int iFind=0; //控制在开始处插入一个空白行
  1037. while (rs.next()) {
  1038. if (blnempty.equals("true") && iFind==0) {
  1039. //插入一个空白行
  1040. strX=strX+"<tr height='16'>";
  1041. for (i=1;i<=rsmd.getColumnCount();i++) {
  1042.         strX = strX + "<td></td>";
  1043. }
  1044. strX=strX+"</tr>";
  1045. iFind=1;
  1046. }
  1047. if (k>=(intpage-1)*intrownum && k<(intpage)*intrownum){
  1048. strX = strX + "<tr>";
  1049. for (i=1;i<=rsmd.getColumnCount();i++) {
  1050.         sLabel=rsmd.getColumnLabel(i);
  1051.         //System.out.println(rsmd.getColumnTypeName(i));
  1052. String sT=rs.getString(i);
  1053. if (sT==null) sT="";
  1054.         strX = strX + "<td>" + sT + "</td>";
  1055. }
  1056. if (showcheckbox.equals("TRUE"))
  1057.   strX = strX + "<td width='30'><input type='checkbox'></input></td>"+"</tr>";
  1058.                 else 
  1059.                     strX = strX + "</tr>";
  1060. }
  1061. k=k+1;
  1062. }
  1063. if (k%intrownum>0)
  1064.      pagenumber=k/intrownum+1;
  1065.         else 
  1066.             pagenumber=k/intrownum;
  1067. strX=strX+"<pagenumber>"+pagenumber+"</pagenumber><intpage>"+intpage+"</intpage></root>";
  1068. } catch (Exception e){
  1069. strX=e.getMessage();
  1070. }
  1071. return strX;
  1072. }
  1073. }