📄 formulaedit.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 + -