一些小贴士

2012-03-17 01:33 星期六
1.用远端桌面,输入用户名密码后,提示服务器已超出允许的最大连接数。
此时除了到机房去注销已登录用户,还可以用以下命令强行登陆到服务器:
mstsc /v:192.168.1.254 /console -admin


2.MSSQL字符串列值累加方法。数值列累加可以用SUM(),列值是字符串的时候,需要将符合条件的列值拼接起来该如何呢,
除了写函数,或是用UNION,还可以用下面的语句:

FName | FAddr
A | 江西
A | 江苏
B | 河南
B | 海南
B | 广东

select
FName, [FAddr]=stuff((select ','+[FAddr] from table t where FName=table.FName for xml path('')), 1, 1, '')
from
table
group by
FName

输出结果为:
A | 江西,江苏
B | 河南,海南,广东

详细方法可以查询 stuff() 函数。


3.定期删除指定目录下的旧文件,
可以用计划任务执行以下BAT:

@echo off
rem del 删除D:\ERPDATA 目录下6天前的 .7z后缀 文件
set SrcDir=D:\ERPDATA
set DaysAgo=6
forfiles /p %SrcDir% /s /m *.7z /d -%DaysAgo% /c "cmd /c del /f /q /a @path"

4.SQL或则REPORTINGSERVE中取特定日期:
SQL:
select DATEADD(yy, DATEDIFF(yy,0,getdate()),0) //本年第一天
SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0) //本月第一天
SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0))//本月最后一天
SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0))//本年的最后一天

REPORTINGSERVE:
=DATEADD("m", DATEDIFF("m",#1/1/1900#,NOW), #1/1/1900#)//本月第一天
=DATEADD("d",-1,DATEADD("m", DATEDIFF("m",#1/1/1900#,NOW)+1, #1/1/1900#)) //本月最后一天
=DateAdd("m",DateDiff("m","1900-1-1",Now)-12, "1900-1-1") //上月的最后一天
=DateAdd("d",-1,DateAdd("m", DateDiff("m","1900-1-1",Now), "1900-1-1")) //12个月前的第一天

REPORTINGSERVE 对比SQL,基本就是将取现在时间的 getdate() 换成 Now ,将取日期起始值的 0 换用成 '1900-1-1'.
需要取其他的日期,可以查下DateAdd()和DateDiff()两个函数的用法,然后参考上面的例子灵活运用。

在Reporting Services 中处理NULL值与除数为零错误

2011-12-23 03:06 星期五
NULL 值暂时Reporting Services无好的处理方法,请在数据源中用 isnull(查询的内容,0) 处理。(MSSQL2005之前版本需要用 CASE WHEN 处理)
*Reporting Services 中也许可以用 isnothing() 处理?有好的处理方法请告诉我

报表预览时有除数为0错误,
比如报表有个栏位是要显示良品率 = 良品数/总数
当总数为0时,报表中此栏位会显示为‘#错误’ (如总数为NULL 则会显示为‘这不是一个数字’)
--NULL值按前面一段方法处理,在数据源中改为: isnull(总数,0)
除数为0处理:
=IIf(Fields!总数.Value<=0,"",Fields!良品数.Value/IIf(Fields!总数.Value<=0,1,Fields!总数.Value))

当总数<=0 时,此栏位会显示为空 --也可以将""按需要改为其他显示内容
值得注意的是,IIF 判断为 false 的那一段中,除数也还要增加判断,这个是奇怪的问题,不加判断,直接用 Fields!良品数.Value/Fields!总数.Value 的话,查询时会出错,提示除数为0。
--IIf(Fields!总数.Value<=0,1,Fields!总数.Value) ,这里的 1 可以改为任何大于0的数字,因为实际计算中根本不会成立这个条件。

另外还需注意,数据源中的where 筛选条件中,如果有出现除数式,如 where 良品数/总数 >0.5
那么此处的 总数 也需要进行处理,避免出现除数为0 或者为NULL的错误
改为 where (case when isnull(总数,0)<=0 then 0 else (良品数/总数) end > 0.5

PHP语言的表达式求值方案

2011-03-01 21:11 星期二
刚接到一个应用,需要根据给出的公式计算结果值。
参考了AWK写的PERL语言的一个例子 http://www.chinaunix.net/jh/24/738738.html
改编为PHP 的。
所参考的例子中没有 if($isof==1)array_push($OF,array_pop($OF).$a); //如果是连续数字,将上一数字出栈与当前数字组合再入栈: {1,2} = {12}
这一句,没有读懂例子中连续数字是如何处理的。

因我的应用中,表达式中还需可以用自订函数( 将计算值做特殊的取位处理后再继续与其他运算符计算),所以依样画瓢增加了中括号[]的处理,将中括号内的计算值丢进自订函数 pos_num 处理后再返回计算。只要你的表达式中不含中括号,以下代码不修改一样可以计算出正确结果。你也可以将有注释的与中括号处理有关的行及pos_num 函数删除。

目前此代码只能处理 +-*/% () ,数学函数不支持,因我目前的应用没有用到。
如果要支持,也有想到解决办法:判断数字/运算符处再增加字母的判断与处理。

当然,如果您的应用中不需要用到自订函数,只有单纯的+-*/% ()甚至基本的数学函数,你也可以用这个方案:SQL 方法解决表达式求值问题


< ?php
class exp2value{//表达式求值
var $symbol="+-*%/()[]@"; //运算符集合 @ 为计算中使用的辅助符号
//构造运算符优先级关系
//不使用中括号[]特殊处理函数的可删除含有[]的元素
var $oppr=array(
"++"=>">","+-"=>">","+*"=>"<","+/"=>"<","+%"=>"<","+("=>"<","+)"=>">","+["=>">","+]"=>">","+@"=>">",
"-+"=>">","--"=>">","-*"=>"<","-/"=>"<","-%"=>"<","-("=>"<","-)"=>">","-["=>">","-]"=>">","-@"=>">",
"*+"=>">","*-"=>">","**"=>">","*/"=>">","*%"=>"<","*("=>"<","*)"=>">","*["=>">","*]"=>">","*@"=>">",
"/+"=>">","/-"=>">","/*"=>">","//"=>">","/%"=>"<","/("=>"<","/)"=>">","/["=>">","/]"=>">","/@"=>">",
"%+"=>">","%-"=>">","%*"=>">","%/"=>">","%%"=>">","%("=>"<","%)"=>">","%["=>">","%]"=>">","%@"=>">",
"(+"=>"<","(-"=>"<","(*"=>"<","(/"=>"<","(%"=>"<","(("=>"<","()"=>"=","(["=>">",
")+"=>">",")-"=>">",")*"=>">",")/"=>">",")%"=>">","))"=>">",")]"=>">",")@"=>">",
"[+"=>"<","[-"=>"<","[*"=>"<","[/"=>"<","[%"=>"<","[("=>"<","[)"=>"<","[["=>"<","[]"=>"=",
"]+"=>">","]-"=>">","]*"=>">","]/"=>">","]%"=>">","])"=>">","]]"=>">","]@"=>">",
"@+"=>"<","@-"=>"<","@*"=>"<","@/"=>"<","@("=>"<","@%"=>"<","@["=>"<","@@"=>"="
);
var $debug=0; //调试模式
function exp2value($d=0){ //传入非0的参数则开启调试模式
$this->debug=$d;
}
function exp2v($o_string){
$symbol=str_split($this->symbol);
$s=array(); //字符串
$OP=array("@"); //运算符
$OF=array(); //数字
$o_string=str_replace(" ","",$o_string); //去除表达式中的空格
$string=$o_string."@"; //表达式最后加一字符"@" 计算辅助符号
$s=str_split($string);
$i=0;
$m=0;
$isof=0; //连续数字判断
while($s[$i]!="@" || end($OP)!="@"){
$m++;
if($m>300)return "表达式长度超过300";
$a=$s[$i];
if($this->debug<>0)echo "

".$m.":".substr($string,0,$i+1)."
";
if($this->debug<>0)echo "判断字符:".$a." 为";
if(!in_array($a,$symbol)){
if($this->debug<>0)echo "数字";
if($isof==1){
array_push($OF,array_pop($OF).$a); //如果是连续数字,将上一数字出栈与当前数字组合再入栈: {1,2} = {12}
}else{
array_push($OF,$a); //入栈
}
$isof=1;
$i++;
}else{
$isof=0;
if($this->debug<>0)echo "运算符 ";
$t=$this->oppr[end($OP).$s[$i]];//比较优先级别,可再增加异常判断
if($this->debug<>0)echo end($OP).$s[$i];
if($t=="<"){
if($this->debug<>0)echo " 小于";
array_push($OP,$s[$i]);
$i++;
}else if($t=="="){
if($this->debug<>0)echo " 等于";
if(end($OP)=="[" && $s[$i]=="]")array_push($OF,$this->pos_num(array_pop($OF))); //不使用中括号[]特殊处理函数的可删除此行
array_pop($OP);
$i++;
}else{
if($this->debug<>0)echo " 大于";
$str=array_pop($OP);
$y=array_pop($OF);
$x=array_pop($OF);
$r=$this->calculate($x,$str,$y);
if($this->debug<>0)echo "
计算式:".$x.$str.$y."=".$r;
array_push($OF,$r);
}
}
if($this->debug<>0)ECHO "
数字:";
if($this->debug<>0)PRINT_R($OF);
if($this->debug<>0)ECHO "
运算符:";
if($this->debug<>0)PRINT_R($OP);
}
if($this->debug<>0)echo "

最终结果为:".$o_string."=".end($OF)."
";
return end($OF);
}


function calculate($x,$st,$y){ //二元运算函数
if($st=="+")
return $x+$y;
else if($st=="-")
return $x-$y;
else if($st=="*")
return $x*$y;
else if($st=="%")
return $x%$y;
else if($st=="/")
return $x/$y;
}

function pos_num($m){ //对家具尺寸结算结果的个位数取数为0或5:012 34567 89
$m=round($m);//四舍五入为整数
$i=$m%10; //取个位数
switch($i){
case '0':
case '1':
case '2':
$n=$m-$i; //0
break;
case '3':
case '4':
case '5':
case '6':
case '7':
$n=$m-$i+5; //5
break;
case '8':
case '9':
$n=$m-$i+10; //0
break;
default:
$n=$m;
break;
}
return $n;
}

}//对象定义结束
$cc=new exp2value(1); //$cc=new exp2value(); 不显示调试信息
echo $cc->exp2v("[12.1*2]"); //结果为25
echo $cc->exp2v("(12.1*2)"); //结果为24.2
?>



这里可以下载完整代码:class_exp2value.zip

魅族M8新固件

2010-06-07 21:27 星期一
2010年发布的0.9.8.6版固件,魅族官网:www.meizu.com

锁定界面

解锁界面

桌面1

桌面3

桌面2

软件商店

skype 4.1 版本新增桌面共享功能

2009-11-22 20:32 星期日
SKYPE 最新的4.1版本新加了远程桌面共享功能,
在聊天界面点 ‘共享’-》‘共享你的界面’ ,然后有两个选项,
可以共享你的整个桌面或一部分


如果点‘共享部分桌面’,就会出现下图界面,你可以将共享的框框拖动到其他位置,或转换为全屏共享,很方便。



另外提示一下如何下载最新的SKYPE国际版,因为广告多多,死机多多的TOM版SKYPE还是一如既往的比国际版低一个版本,是还没有这个新功能的。
你可以打开台湾SKYPE官方网站 http://skype.pchome.com.tw 去下载最新的国际版SKYPE 4.1 .