动态生成SQL查询条件定制表单及语句的脚本
来源:互联网 发布:人工智能的英文 编辑:程序博客网 时间:2024/06/08 15:35
/***********本人原创,欢迎转载,转载请保留本人信息*************/
作者:(wallimn
电邮:wallimn@sohu.com
博客:http://wallimn.bokee.com
http://blog.csdn.net/wallimn
网络硬盘:http://wallimn.gbaopan.com
时间:2006-12-15
/***********本人原创,欢迎转载,转载请保留本人信息*************/
最近使用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] = ' ';
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);
}
}
- 动态生成SQL查询条件定制表单及语句的脚本
- Jfinal适用于条件查询的动态SQL语句生成工具
- XsqlFilterResult----动态生成sql语句的类,过滤一些为空的查询条件
- XsqlFilterResult----动态生成sql语句的类,过滤一些为空的查询条件 .
- 存储过程生成动态条件查询语句
- 动态生成多条件查询语句
- 多项查询条件组合下的SQL语句生成
- 根据条件查询动态拼接sql语句
- 动态sql语句拼接查询条件
- 查询条件解析类,生成查询语句的查询条件
- sql查询条件语句
- MySQL中动态生成多条件查询语句
- oracle 查询语句根据参数值来动态生成条件
- MySQL中动态生成多条件查询语句
- 关于多条件查询的SQL语句
- SQL的多条件查询语句
- 求条件查询的sql语句
- SQL SERVER 条件语句的查询
- 字符转换为整型时,可能导致数据溢出
- NGN QoS探讨
- ASP.NET中的事件冒泡机制
- 使用反射前后的参数化工厂方法
- 一次不成功的汇编优化
- 动态生成SQL查询条件定制表单及语句的脚本
- 清华教授称中国与日本国民素质差距30年
- 一个现金流量表的代码,感谢琛(290911233)提供。
- 清华北大等名校博士联名倡议慎对圣诞节
- 淘宝上买家与卖家的对话
- JAVA的JAR文件包及jar命令详解
- 程序员修身养性的十大原则
- gloox将要发布0.9版
- 制作安装程序