`

动态生成SQL查询条件定制表单及语句的脚本

阅读更多
  最近使用AJAX技术来做东西,写了很多的JS代码,也分析了一些别人的JS程序,使用VS.net进行跟踪调试,积累了些经验,现在可以很流畅地使用JS来写些程序来满足自己的需要了。
  我做的东西里有一项是通用的表格展示,服务器端使用DOM4J来转换生成XML数据,在客户端使用JS解析XML数据,然后在插件中展示数据,附带添加、删除及修改功能,这部分功能已经实现,基本上使用一个页面和一个Action(struts里的东东)就可以对任何表进行展示、添加、删除和修改。但对于查询,不太容易做到通用,想了好长时间,还是使用XML与JS来解决了。也就是使用XML来定义要查询的字段、类型,然后在客户端自动解释成表单。目前的版本功能很简单,没有数据验证功能,仅能用AND连接查询条件(不过好象实际使用中,多数时候都是用AND),更多功能在以后会进一步完善。
  代码分为四个部分:
  一、核心是解析XML形式的表单定义数据、生成表单、拼接SQL语句、并对表单面板进行控制的JS文件;其中XML数据可以是数据岛中定义的,可以是网页中的字符串,也可以是单独的XML文件,另外,XML数据可以使用异步的方式进行加载(这个功能借鉴了dhtmlXTree中的方法);
  二、一个辅助的日期选择脚本,供日期类型字段选择日期用;
  三、一个样式表文件;
  四、一个例子网页;
  下面我的核心代码贴在这里,详细的代码请到我的网络硬盘下载http://wallimn.gbaopan.com ,或发邮件向我索取。
///////////////////////////////sqlgen.js///////////////////////////////////////
// JavaScript Document
 function sqlgen(fields){
  this.dateind=0;
  this.panelini=false;
  if(typeof fields=="object")
   this.fields=fields;
  else this.fields=null;
  this.panelini=false;
  this.contab=document.getElementById("conditiontabbody");
  this.whereclause="";
  this.onokafter=function(sql){alert("条件子句为:"+sql+"\n点击后处理事件尚未添加,请定义onokafter函数。");};
  this.test = function(){
   return this.onokafter.apply(null, this);
  };
 }
 function genbtnhook(self){
  var okbtn = document.getElementById('beginsearch');
  if(typeof okbtn!="undefined"){
   okbtn.onclick=function(){return self.onsqlok.apply(self, []);};
  }
 }
 sqlgen.prototype.onsqlok=function(){
  //return null;
  this.whereclause = this.getsqlstring();
  //alert(this.whereclause+this.dateind);
  if(this.onokafter!=null){
   //this.onokafter(this.whereclause);
   //alert(this.whereclause);
   return this.onokafter.apply(null, [this.whereclause]);
  }
 }
 sqlgen.prototype.getsqlstring=function(){
  //var contab = document.getElementById("conditiontabbody");
  if(this.fields==null || typeof this.contab=="undefined")return "";
  //alert(contab.tbody.innerHTML);
  var trs = this.contab.getElementsByTagName("tr");
  var onerow=null;
  var desc, type, name;
  var c1,c2,v1,v2;
  if(typeof trs == "undefined")return "";
  //var fields = document.all('xmlfields').XMLDocument.getElementsByTagName('Field');
  var field=null;
  var re="";
  for(var i=0; i<trs.length; i++){
   onerow = trs[i];
   c1 = onerow.getElementsByTagName("select")[0].value;
   if(c1=="")continue;
   desc = onerow.getElementsByTagName("span")[0].innerText;
   v1 = onerow.getElementsByTagName("input")[0].value;
   field = this.fields[i];
   type = field.getAttribute('Type');
   name = field.getAttribute('Name');
   if(type=="String")v1="'"+v1+"'";
   else if(type=="Date")v1="todate('"+v1+"','yyyy-mm-dd hh24:mi:ss')";
   else if(type=="Number")v1=v1;
   else continue;
   if(c1!="" && v1!="")re = re + "("+name + " "+ c1 +" "+  v1 + ") and ";
   //type = onerow.getElementById("fieldtype").innerText;
   //desc = onerow.getElementById("fielddesc");
   //alert(' desc='+desc+' c1='+c1+' v1='+v1+' type='+type+' name='+name);   
   //break;
  }
  if(re!="") re =re.substr(0, re.length-5);
  return re;
 }
 sqlgen.prototype.generatepanel=function(){
  //var fields = document.all('xmlfields').XMLDocument.getElementsByTagName('Field');
  var field=null;
  var desc="", type="";
  var newrow = null;
  var cell,arr;
  //var contab = document.getElementById("conditiontabbody");
  for(var i=0; i<this.fields.length; i++){
   field = this.fields[i];
   desc = field.getAttribute('Desc');
   type = field.getAttribute('Type');
   newrow = this.contab.insertRow();
   //newrow.setAttribute("height","20px");
   arr = this.getcondition(type,desc);
   cell = newrow.insertCell();
   cell.setAttribute("width","100px");
   cell.setAttribute("align","right");
   cell.innerHTML=arr[0];
   cell = newrow.insertCell();
   cell.setAttribute("width","290px");
   cell.innerHTML=arr[1];
   cell = newrow.insertCell();
   cell.setAttribute("width","290px");
   cell.innerHTML=arr[2];
  }
 }
 sqlgen.prototype.getcondition=function(type,desc){
 var arr = new Array(0);
 if(type=="String"){
  arr[0] = '<span class="a" id="fielddesc">'+desc+'</span>';
  
  arr[1] = '<select name="select" id="sqlcondition'+this.dateind+'" style="width:90px;">' +
     '<option value="">无限制</option>' +
     '<option value="=">等于</option>' +
     '<option value="like">象</option>' +
    '</select>' +
    '<input type="text" name="textfield" id="sqlvalue'+this.dateind+'" style="width:160px;" />';
    
  this.dateind++;//从0开始
  arr[2] = '&nbsp;';
  this.dateind++;//从0开始
 }
 else if(type=="Number"){
  arr[0] = '<span class="a" id="fielddesc">'+desc+'</span>';
  
  arr[1] =  '<select name="select" id="sqlcondition'+this.dateind+'" style="width:90px;">' +
      '<option value="">无限制</option>' +
      '<option value="=">等于</option>' +
      '<option value="<">小于</option>' +
      '<option value="<=">小于等于</option>' +
     '</select>' +
     '<input type="text" name="textfield" id="sqlvalue'+this.dateind+'" style="width:160px;" /> ';
  this.dateind++;//从0开始
      
  arr[2] =  '<select name="select" id="sqlcondition'+this.dateind+'" style="width:90px;">' +
      '<option value="">无限制</option>' +
      '<option value="=">等于</option>' +
      '<option value=">">大于</option>' +
      '<option value=">=">大于等于</option>' +
     '</select>' +
     '<input type="text" name="textfield" id="sqlvalue'+this.dateind+'" style="width:160px;" />' ;
  this.dateind++;//从0开始
  }
  else if(type=="Date"){
  arr[0] = '<span class="a" id="fielddesc">'+desc+'</span>';
  
  arr[1] =  '<select name="select" id="sqlcondition'+this.dateind+'" style="width:90px;">' +
     '<option value="">无限制</option>' +
     '<option value="=">等于</option>' +
     '<option value="<">小于</option>' +
     '<option value="<=">小于等于</option>' +
     '</select>' +
     '<input type="text" class="textInput" name="sqlvalue'+this.dateind+'" id="sqlvalue'+this.dateind+'" readonly ' +
     'style="width:140px;" onclick="javascript:DateControl20(document.getElementById(\'sqlvalue'+this.dateind+'\'))" />' +
     '<input type="button" value="×" onclick="javascript:document.getElementById(\'sqlvalue'+this.dateind+'\').value=\'\';"/>';
  this.dateind++;//从0开始
   
  arr[2] =  '<select name="select" id="sqlcondition'+this.dateind+'" style="width:90px;">' +
      '<option value="">无限制</option>' +
      '<option value="=">等于</option>' +
      '<option value=">">大于</option>' +
      '<option value=">=">大于等于</option>' +
     '</select>' +
     '<input type="text" class="textInput" name="sqlvalue'+this.dateind+'" id="sqlvalue'+this.dateind+'" readonly ' +
     'style="width:140px;" onclick="javascript:DateControl20(document.getElementById(\'sqlvalue'+this.dateind+'\'))" />' +
     '<input type="button" value="×" onclick="javascript:document.getElementById(\'sqlvalue'+this.dateind+'\').value=\'\';"/>';
  this.dateind++;//从0开始
  //alert(arr[1]+"\n"+arr[2]);   
  }
  else {
   arr[0]='类型不合法';
   arr[1]='类型不合法';
   this.dateind++;//从0开始
   arr[2]='类型不合法';
   this.dateind++;//从0开始
  }
  return arr;
 }
 function paneldisptoggle(){
  var panel = document.getElementById('searchpanel');
  //alert(this.panelini);
  var left = (document.body.clientWidth-700)/2;
  if(left<=0)left=1;
  panel.style.left=left+"px";
  //DispToggle('searchpanel');
     panel.style.display = panel.style.display=="none"?"":"none";
 }
 function paneldisptoggle2(){
  var panel = document.getElementById('searchpanel');
  //alert(this.panelini);
  panel.style.position="static";
  panel.style.margin="0 auto";
  //DispToggle('searchpanel');
     panel.style.display = panel.style.display=="none"?"":"none";
 }
 function placesqlgen(){
  document.write('<div id="searchpanel" style="display:none">');
  document.write('<div id="paneltitle">');
  document.write('  <table width="680px" border="0">');
  document.write(' <tr>');
  document.write('   <td><span style="color:#000000" class="a">查询条件定制面板</span></td>');
  document.write('   <td align="right"><input type="button" value="×" onclick="javascript:paneldisptoggle();"/></td>');
  document.write(' </tr>');
  document.write('  </table>');
  document.write('</div>');
  document.write('<div id="panelcontent">');
  document.write('<table width="680px" height="180" border="1" align="left" cellpadding="0" cellspacing="0" id="conditiontab">');
  document.write(' <tbody id="conditiontabbody">');
  document.write(' </tbody>');
  document.write('</table>');
  document.write('</div>');
  document.write('<div id="panelbottom">');
  document.write('  <table width="680px" border="0">');
  document.write(' <tr>');
  document.write('   <td align="center">');
  document.write('  <input type="button" value=" 确  定 " name="beginsearch" id="beginsearch" />');
  document.write('   </td>');
  document.write('   <td align="center">');
  document.write('  <input type="button" value=" 取  消 " name="cancelsearch" ');
  document.write('          id="cancelsearch" onclick="javascript:paneldisptoggle();"/>');
  document.write('   </td>');
  document.write(' </tr>');
  document.write('  </table>');
  document.write('</div>');
  document.write('</div>');
 }
 function docloadXML(xmlString){
     var xmldoc;
  try {
   xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
   xmlDoc.async=false;
   xmlDoc.loadXML(xmlString);
  }
  catch(e){
      var parser = new DOMParser();
      xmlDoc = parser.parseFromString(xmlString,"text/xml");
  }
  return xmlDoc;
    }
 //FileName也可以是个URL
 function docload(FileName){
     var xmldoc;
  try {
   xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
   xmlDoc.async=false;
   xmlDoc.load(FileName);
  }
  catch(e){
   //对于netscape不知如何处理。以后再添加。
   //下边的函数两个浏览器通用。纯属估计
   return null;
  }
  return xmlDoc;
    }
 
 function docloadURL(url){
   var xmlDoc=null;
   try{
     xmlDoc = new XMLHttpRequest();
  }
   catch(e){
    xmlDoc = new ActiveXObject("Microsoft.XMLHTTP");
  }
   xmlDoc.open("GET",url,false);
   xmlDoc.setRequestHeader('Content-type','application/x-www-form-urlencoded');
   xmlDoc.send(null);
   return xmlDoc.responseXML;
    }
 
 //异步装载XML数据。
 function xmlkit(asyn){
  if(typeof asyn=="undefined")this.asyn=true;
  else this.asyn=asyn;
  this.xmlDoc=null;
  this.dealxml=null;
  this.onloadAction=function(xmldoc){
   //alert("装载完成!"+xmldoc.xml);
    if(this.dealxml!=null){
     this.dealxml.apply(null,[xmldoc]);
    }
   };
 }
 xmlkit.prototype.loadurlover=function(myxmldoc){
   this.check=function(){
    if(myxmldoc.onloadAction!=null){
     if((!myxmldoc.xmlDoc.readyState)||(myxmldoc.xmlDoc.readyState == 4)){
     myxmldoc.onloadAction(myxmldoc.xmlDoc.responseXML);
     myxmldoc=null;
    }
   }
  };
  return this.check;
 }
 xmlkit.prototype.loadurl=function(filePath,postMode,postVars){
   try{
    if(this.xmlDoc==null)
     this.xmlDoc = new XMLHttpRequest();
    this.xmlDoc.open(postMode?"POST":"GET",filePath,this.asyn);
    if(postMode)
    this.xmlDoc.setRequestHeader('Content-type','application/x-www-form-urlencoded');
    this.xmlDoc.onreadystatechange=new this.loadurlover(this);
    this.xmlDoc.send(null||postVars);
  }
   catch(e){
    if(this.xmlDoc==null)
     this.xmlDoc = new ActiveXObject("Microsoft.XMLHTTP");
    this.xmlDoc.open(postMode?"POST":"GET",filePath,this.asyn);
    if(postMode)this.xmlDoc.setRequestHeader('Content-type','application/x-www-form-urlencoded');
    this.xmlDoc.onreadystatechange= new this.loadurlover(this);
    this.xmlDoc.send(null||postVars);
  }
 } 

/***********本人原创,欢迎转载,转载请保留本人信息*************/
作者:wallimn
电邮:wallimn@sohu.com
博客:http://wallimn.iteye.com  http://blog.csdn.net/wallimn
网络硬盘:http://wallimn.gbaopan.com
时间:2006-12-15
/***********本人原创,欢迎转载,转载请保留本人信息*************/
分享到:
评论

相关推荐

    可以自动生成sql语句的工具

    8. **自动化脚本**:支持批量生成和执行SQL脚本,尤其在数据库初始化或迁移时非常有用。 在给定的文件名称“QuickSearch”中,虽然没有具体说明,但可以推测这可能是一个快速搜索功能,或者是工具中的一个模块,...

    json、post请求、freemarker模拟生成sql、wsdl2Java生成客户代码

    例如,模拟生成SQL时,我们可以将数据库表结构和字段名等信息作为数据模型,然后在模板中定义SQL语句的结构,通过Freemarker的`process`方法生成动态的SQL脚本。 Wsdl2Java工具是Apache CXF框架的一部分,它用于从...

    E10查用SQL语句集合E10查用SQL语句集合

    名称:E10查用SQL语句集合 适用人群:ERP管理员 适用场景:E10ERP系统上线持续改善,SQL常用语句 功能描述:PO待交明细、出入库统计表、待领料清单、请购中品号无单价的品号清单、请购单中无品号采购信息的品号清单 ...

    sql.zip_sql_自动sql语句

    总的来说,"sql.zip_sql_自动sql语句"涉及的核心知识点包括SQL语言中的INSERT和UPDATE语句,以及如何通过ASP脚本进行数据库操作,特别是自动化生成SQL语句以提高工作效率。这样的工具对于数据库管理员和开发人员来说...

    OA系统常用SQL语句

    例如,"批复意见回填表单.doc"和"将处理人姓名与处理时间回填表单字段.doc"可能涉及到对审批流程记录的管理,通过SQL语句更新这些记录,确保流程的完整追踪。 3. **日常办公**:日常工作中,如文档权限管理是常见的...

    连接SQL数据库,自动生成Insert脚本(DELPHI源代码)

    2. **创建SQL查询**:要自动生成Insert脚本,我们需要获取数据库表的所有列名和数据。这可以通过TADOCommand组件的Execute方法执行SQL命令实现。例如,可以使用`SELECT * FROM TableName`获取所有数据,然后遍历结果...

    SQL网站脚本注入语句的经典总结

    SQL注入是一种攻击手段,攻击者通过将恶意SQL代码插入到查询字符串或表单输入字段中,从而操纵数据库执行非授权操作。这种攻击通常发生在Web应用中,当应用没有对用户输入进行足够的过滤和验证时,就可能成为攻击的...

    Loadrunner测试数据库性能测试SQL语句性能的脚本例子.pdf

    Loadrunner 测试数据库性能测试 SQL 语句性能的脚本例子 Loadrunner 是一款性能测试工具,用于测试软件应用程序的性能和可扩展性。该工具可以模拟大量用户同时访问应用程序,从而测试应用程序的性能和可靠性。 ...

    ASP的多条件动态查询

    ASP(Active Server Pages)是一种微软开发的服务器端脚本技术,用于创建动态、交互式的Web应用...了解这些知识点,你可以创建更复杂的ASP应用程序,不仅限于多条件查询,还可以扩展到数据的插入、更新和删除等操作。

    sql/查询修改删除翻页表单整合函数

    1. **条件查询**:`Query()` 函数展示了如何根据用户输入的条件进行SQL查询。它构建了一个SQL语句,筛选出`chaxun`表中`name`字段等于`combobox1`的值或`guige`字段等于`combobox2`的值的所有记录。这通常用于实现...

    动态sql创建表、列

    例如,如果有一个系统需要用户自定义表单,每个表单可能有不同的字段,这时就需要动态SQL。动态SQL创建表可能如下: ```sql DECLARE @sql NVARCHAR(MAX) = N'CREATE TABLE CustomForm ('; FOR EACH FIELD IN @...

    SQL住入原始脚本_SQL注入python脚本_

    标题中的“SQL住入原始脚本”指的是利用SQL注入技术来编写或执行的原始SQL命令,而“SQL注入python脚本”则表明我们将探讨如何使用Python编写脚本来自动化这一过程。 SQL注入攻击主要有三种类型:直列注入、延时...

    基于ASP+SQL公交查询系统(论文+源代码)

    在“基于ASP+SQL公交查询系统”中,ASP起到了数据处理和页面动态生成的关键作用。 在ASP中,开发者可以创建自定义的函数和过程,使用内置的对象如Request、Response、Server、Session和Application等。Request对象...

    PHP自定义表单生成

    PHP自定义表单生成是开发过程中一个实用的技术,它允许开发者根据需求动态创建各种类型的用户输入表单,如文本域、单选按钮、复选框以及下拉列表等。这使得网站能够灵活地收集和处理用户数据,提高了开发效率。 一...

    SQL注入技术和跨站脚本的安全检测

    SQL注入是一种常见的Web安全漏洞,它允许攻击者通过输入恶意SQL代码,来操控目标数据库的查询语句。这种攻击主要针对那些使用结构化查询语言(SQL)进行数据操作的Web应用程序。攻击者通常会寻找Web表单、URL参数或...

    web查询功能

    在本场景下,我们关注的焦点是支持条件查询、Oracle数据库动态获取数据以及新增数据的功能。以下是对这些知识点的详细解释: 1. **条件查询**: 条件查询是用户可以根据特定条件(如关键词、日期范围、分类等)来...

    学生信息查询 jsp+sql server2005

    - **读取(Read)**: 查询学生信息,用户输入查询条件,JSP发送请求到服务器,服务器执行SQL SELECT语句,返回结果集,再由JSP渲染成用户可读的形式。 - **更新(Update)**: 修改已存在的学生信息,用户选择要修改...

    java+servlet+mysql实现条件筛选(详情见文件sql脚本)

    这里的"Querrymore"可能是表示查询更多或者更复杂查询的文件名,可能包含了具体的SQL脚本,用于处理不同类型的筛选条件。在实际开发中,这些SQL语句可能会通过预编译的PreparedStatement来执行,以防止SQL注入攻击。...

    易语言SQL操作软件,生成源码

    1. **SQL语句生成**:根据用户输入的参数,如表名、字段名、操作类型(查询、插入、更新、删除),自动生成对应的SQL语句。 2. **模板支持**:提供预设的SQL模板,用户可以根据需求选择或自定义模板,简化生成过程。...

Global site tag (gtag.js) - Google Analytics