⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 formulaedit.js

📁 学生档案与成绩管理(1)学生档案管理:记录每个学生的档案信息
💻 JS
字号:

//*****************************************************************
//带数据库字段的公式编辑、合法性检查
//*****************************************************************
//【版权所有·尊重他人创作】
// History:
// Created by 郭宝华(bob guo), bhguo@163.com, 2004 2 24 
	
	var FormulaErrDesc;	//公式合法性检查的错误描述

	//保存编辑栏的光标
	function storeCaret()
	{ 
		if (frmData.Description.createTextRange)  
		frmData.Description.caretPos = document.selection.createRange().duplicate();  
	} 

	//选择编辑栏的文字段
	function selectText (iStart, iEnd) 
	{ 
		var target;
		target=frmData.Description;
		switch(arguments.length) 
		{ 
			case 1: 
				target.select(); 
				break; 
			case 2: 
				iEnd = target.value.length; 
				//falls through 由 case3 继续处理 
			case 3: 
				var oRange = target.createTextRange(); 
				oRange.moveStart("character", iStart); 
				oRange.moveEnd("character", -target.value.length + iEnd); 
				oRange.select(); 
		} 
	} 

	//向编辑栏插入文字
	function insertText (text) 
	{ 
		var target;
		target=frmData.Description;
		if (target.createTextRange && target.caretPos) 
		{ 
			var caretPos = target.caretPos; 
			caretPos.text =caretPos.text.charAt(caretPos.text.length - 1) == ' ' ?text + ' ' : text;  
		}  
		else
		{
			target.value = text; 
		}
		target.focus();
		storeCaret();
	}  
	
	//向编辑栏加入一个字段
	function addField()
	{ 
		var index,caption;
		index=frmData.FieldToNumberFormula.selectedIndex;
		if(index>0)
		{
			caption=frmData.FieldToNumberFormula[index].text;
			caption='['+caption+']';
			insertText(caption);
			frmData.FieldToNumberFormula.selectedIndex=0;
		}
	}

	//验证公式的合法性,逻辑是:将所有的字段都替换成有效的哑数据,运算之。
	//成功,则说明公式正确,否则公式存在问题。
	function CheckFormula() 
	{
		var Desc;
		var ret;
		
		FormulaErrDesc=""
		
		Desc=frmData.Description.value;
		//验证公式合法性
		Desc=FormatToDummy(Desc);
		try
		{
			eval('ret='+Desc);
		}
		catch(e)
		{
			FormulaErrDesc="公式有错!请检查是否存在无法识别的字段名称、公式语法是否正确。";
			return(false);
		}
		if(isNaN(ret))
		{
			FormulaErrDesc="公式有错!请检查是否存在无法识别的字段名称、公式语法是否正确。";
			return(false);
		}
		
		//找出所有除数,如果其中带字段,拼出来。稍后将存入数据库,公式计算时需要先检查除数为0。
		var AllDivisor,Divisor;
		AllDivisor='';
		Desc=frmData.Description.value;
		pos = Desc.indexOf("/");
		while(pos!=-1)
		{
			Divisor=FindDivisor(Desc.substr(pos));
			//如果除数中不包含字段,则需要现在就验证是否除数为0;否则,只能在数据库的公式计算时再验证。
			if(Divisor.indexOf('[')==-1)
			{
				eval('ret='+Divisor);
				if(ret==0)
				{
					FormulaErrDesc="公式中除数为0!";
					return(false);
				}
			}
			else
				AllDivisor=AllDivisor+ItemSep+Divisor;

			pos = Desc.indexOf("/",pos+1);
		}

		if(AllDivisor!='')
			AllDivisor=AllDivisor.substr(1);
		AllDivisor=FormatToFieldID(AllDivisor);
		frmData.Divisor.value =AllDivisor;
		Desc=frmData.Description.value;
		Desc=FormatToFieldID(Desc);
		//去掉所有的空格
		Desc=Desc.replace(/ /g,'');
		frmData.SQLDesc.value =Desc;
		
		return(true);
	}
	
	//找出除数,Desc的格式为 /(12.34+34.56)-2,返回值为(12.34+34.56)
	//         Desc的格式为 /[月工作天数]+34.56,返回值为[月工作天数],以此类推
	function FindDivisor(Desc) 
	{
		var pos,c,Divisor;

		Divisor="";
	    c = Desc.charAt(1);
		if(c=='(')
		{
			//如果/后的字符是左括弧,找出对应的有右括弧,其中的内容即为除数
			var LeftQuotedCount;
			LeftQuotedCount=1;
			for(var i=2;i<=Desc.length-1;i++)
			{
		    c = Desc.charAt(i);
				if(c=='(')
					LeftQuotedCount=LeftQuotedCount+1;
				if(c==')')
				{
					LeftQuotedCount=LeftQuotedCount-1;
					if(LeftQuotedCount==0)
					{
						Divisor=Desc.substr(1,i);
						break;
					}
				}
			}
		}
		else if(c=='[')
		{
			//如果/后的字符是[,找出],其中的内容即为除数
			for(var i=2;i<=Desc.length-1;i++)
			{
		    c = Desc.charAt(i);
				if(c==']')
				{
					Divisor=Desc.substr(1,i);
					break;
				}
			}
		}
		else
		{
			//除数为完整的数值
			for(var i=2;i<=Desc.length-1;i++)
			{
		    c = Desc.charAt(i);
				if ( !AllCharsIsInBag(c, "0123456789."))
				{
					Divisor=Desc.substr(1,i-1);
					break;
				}
			}
			if(i==Desc.length)
				Divisor=Desc.substr(1);
			
		}
		return(Divisor);
	}
	
	//表达式中的字段名称[XXX]换成哑数据
	function FormatToDummy(Desc) 
	{
		var Dummy=" 12.34 "
		var Count,Caption;
		Count=frmData.FieldToNumberFormula.length
		for(var i=1;i<=Count-1;i++)
		{
			Caption=frmData.FieldToNumberFormula[i].text
			Caption='['+Caption+']'
			Desc=replace(Desc,Caption,Dummy);
		}
		return(Desc);
	}

	//表达式中的字段名称[XXX]换成字段id,可以在sql中直接运算
	function FormatToFieldID(Desc) 
	{
		var Count,Caption,FieldID;
		Count=frmData.FieldToNumberFormula.length
		for(var i=1;i<=Count-1;i++)
		{
			Caption=frmData.FieldToNumberFormula[i].text;
			Caption='['+Caption+']';
			FieldID=frmData.FieldToNumberFormula[i].value;
			FieldID='[Fld'+FieldID+']';
			Desc=replace(Desc,Caption,FieldID);
		}
		return(Desc);
	}

	//将公式条件变换成可在页面中显示的形式
	//公式条件采用与查询条件类似的内部存储结构,格式:Fldxxx ConItemSep Value GroupSep Fldxxx ConItemSep Value
	function FormatConditionToCaption(strConditions) 
	{
		var ConditionDescs
		var ConditionCount,Conditions,curCondition,curConditionDesc;
		var FieldID,Value,FieldCaption;

		ConditionDescs="";
		Conditions=strConditions.split(GroupSep);
		ConditionCount=Conditions.length;
		if(ConditionCount>0)
		{
			for(var i=0;i<=ConditionCount-1;i++)
			{
				curCondition=Conditions[i];
				curConditionDesc="";

				var parts;
				parts=curCondition.split(ConItemSep);
				if(parts.length==2)
				{
					var FldPos,RealFieldID;
					FieldID=parts[0];
					Value=parts[1];
					FldPos=FieldID.indexOf("Fld");
					RealFieldID=FieldID.substr(FldPos+3);
					FieldCaption=FormatToCaption("[Fld"+RealFieldID+"]");

					var curIndex;
					curIndex=SetIndex(FieldToCondition,RealFieldID);
					if(ConditionDataType[curIndex-1]==DataType_Option)
					{
						var Option;
						eval("Option=Fld"+RealFieldID);
						curConditionDesc=FieldCaption + "=" + GetAllOptionName(Option,Value);
					}
					else if(ConditionDataType[curIndex-1]==DataType_Number || ConditionDataType[curIndex-1]==DataType_Date || ConditionDataType[curIndex-1]==DataType_DateAndTime)
					{
						if(FldPos==4)	//条件中的From值,如:FromFld1
						{
							curConditionDesc=FieldCaption + ">=" + Value;
						}
						else if(FldPos==2)	//条件中的To值,如:ToFld1
						{
							curConditionDesc=FieldCaption + "<=" + Value;
						}
					}
				}
				if(curConditionDesc!="")
				{
					if(ConditionDescs=="")
						ConditionDescs=curConditionDesc;
					else
						ConditionDescs=ConditionDescs + " and " + curConditionDesc;
				}
			}
		}
		return(ConditionDescs);
	}

	//根据value 设置list的selectedIndex
	function SetIndex(list,value) 
	{
		var Count;
		Count=list.length;
		if(Count>0)
		{
			for(var i=0;i<=Count-1;i++)
			{
				if(value==list[i].value)
				{	
					list.selectedIndex=i;
					return(i);
				}
			}
		}
		list.selectedIndex=-1;
		return(-1);
	}

	function GetOptionName(Option,Value)
	{
		var Count,Caption;
		if(Value>0)
		{
			Count=Option.length;
			for(var i=0;i<=Count-1;i++)
			{
				if(Value==Option[i].value)
				{
					Caption=Option[i].text;
					return(Caption);
				}
			}
			return("");
		}
		else
		{
			return("");
		}
	}
	
	function GetAllOptionName(Option,Values)
	{
		var parts,ItemCount;
		var OptionCount,Caption;
		
		Caption="";
		parts=Values.split(",");
		ItemCount=parts.length;
		if(ItemCount>0)
		{
			for(var i=0;i<=ItemCount-1;i++)
			{
				if(parts[i]>0)
				{
					OptionCount=Option.length;
					for(var j=0;j<=OptionCount-1;j++)
					{
						if(parts[i]==Option[j].value)
						{
							if(Caption=="")
								Caption=Option[j].text;
							else
								Caption=Caption + "," + Option[j].text;
						}
					}
				}
			}
		}
		return(Caption);
	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -