根据一个orderno在表中可以查到这个orderno的结果集放到dataset。 现在需要返回这个orderno的状态。 条件是:全是P就返回done, 如有有一个其他的状态就返回对应的状态。状态值status有4种值R,A,E,P.分别代表的意思是R--readlyA--doingE--errorP--done. 例如:表中查询的到结果集是orderno status1111 P1111 P返回done. orderno status1112 P1112 E返回error.
foreach(datarow dr in ds.table[0].rows)
{
if(dr["status"].tostring() == "P")
{
return "done";
}
if(dr["status"].tostring() == "E")
{
return "error";
}
}这样写很不好啊, 如果遇到结果集是orderno status1112 P1112 E1112 P那就会返回done了, 其实应该是error.
foreach(datarow dr in ds.table[0].rows)
{
if(dr["status"].tostring() == "P")
{
return "done";
}
if(dr["status"].tostring() == "E")
{
return "error";
}
}这样写很不好啊, 如果遇到结果集是orderno status1112 P1112 E1112 P那就会返回done了, 其实应该是error.
{
if(dr["status"].tostring() == "P")
{
return "done";
}
if(dr["status"].tostring() == "E")
{
return "error";
} else if(dr["status"].tostring() == "R")
{
return "readly";
} else if(dr["status"].tostring() == "A")
{
return "doing";
}
}
R:3
A:2
E:1
P:0
stirng[] rs={"done","error","doing","ready"};
然后
return flagStr[flag];
就可以了。比如flag为0,说明全部是P,则取"done"。
{
}
这个遍历是一行一行遍历的,而你的代码中 明显是在数据库中的一行中进行比较
而实际上你的需求是多行间进行比较
{
return"error";
}
else if( dr["status"].tostring() == "A")
{
return"doing";
}
else (dr["status"].tostring() == "p")
{
return"done";
}这样是可以解决。 可不可以不这样写。 也不要用swtch case.
string flagStr="PEAR";
int flag=0;
foreach(....)
{
flag+=flagStr.IndexOf(dr["status"].tostring();
}
return flagStr[flag];就这样好了。
你就是想按orderno进行分组 然后判断orderno对应的状态吧
应该用到group by case 什么的 我sql语句不太好 高手帮忙给写个吧 一条sql绝对能解决问题!
如果这样就不对了。orderno status1112 P1112 E1112 A的到结果flag = 3 。 其实应该是 E。这里还有个优先级的意思。 如果结果集里有E, 不管其他有没。 就是ERROR。 其次就是A, R, P
string flagStr="PEAR";
int flag=0;
foreach(....)
{
flag+=flagStr.IndexOf(dr["status"].tostring();
if(if(dr["status"].ToString()=="E"))
flag+=100;
}
if(flag>=100)
return "error";
return flagStr[flag];
status=min(case when exists(select 1 from tb
where orderno=a.orderno and status='E') then 'E' else status end)
from tb a group by orderno直接查出来可以吧
你这个办法还是很好的。