这样的条件判断该如何设计???
根据一个orderno在表中可以查到这个orderno的结果集放到dataset。 现在需要返回这个orderno的状态。 条件是:全是P就返回done, 如有有一个其他的状态就返回对应的状态。状态值status有4种值R,A,E,P.分别代表的意思是
R--readly
A--doing
E--error
P--done.
例如:
表中查询的到结果集是
orderno status
1111 P
1111 P
返回done.
orderno status
1112 P
1112 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 status
1112 P
1112 E
1112 P
那就会返回done了, 其实应该是error.
--------------------编程问答-------------------- 这么简单的逻辑还要问问问,很善意的告诉楼主,你不适合干这行,逻辑思维能力太差. --------------------编程问答-------------------- 你应该遍历值为E ,遇到就中断遍历(循环)并返回E --------------------编程问答-------------------- 没找到E就是done,你的语句返回的最后一行的状态值status --------------------编程问答-------------------- 我表示看完之后大脑一片混乱 --------------------编程问答-------------------- 好像你的表设计和你的代码是矛盾。。。我再瞧瞧 --------------------编程问答-------------------- foreach(datarow dr in ds.table[0].rows)
{
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";
}
} --------------------编程问答-------------------- 不想用那么多IF ELSE 能不能用面向对象的思维解决啊 --------------------编程问答-------------------- 很简单,设一变量flag=0,遍历DataTable的每一行,根据status的值做加法。
R:3
A:2
E:1
P:0
stirng[] rs={"done","error","doing","ready"};
然后
return flagStr[flag];
就可以了。
比如flag为0,说明全部是P,则取"done"。 --------------------编程问答-------------------- foreach(datarow dr in ds.table[0].rows)
{
}
这个遍历是一行一行遍历的,而你的代码中 明显是在数据库中的一行中进行比较
而实际上你的需求是多行间进行比较 --------------------编程问答-------------------- if(dr["status"].tostring() == "E")
{
return"error";
}
else if( dr["status"].tostring() == "A")
{
return"doing";
}
else (dr["status"].tostring() == "p")
{
return"done";
}
这样是可以解决。 可不可以不这样写。 也不要用swtch case. --------------------编程问答-------------------- stirng[] rs={"done","error","doing","ready"};
string flagStr="PEAR";
int flag=0;
foreach(....)
{
flag+=flagStr.IndexOf(dr["status"].tostring();
}
return flagStr[flag];
就这样好了。 --------------------编程问答-------------------- 我算看明白了 你这个需求一行代码都不用写 一条sql语句即可搞定
你就是想按orderno进行分组 然后判断orderno对应的状态吧。。。
应该用到group by case 什么的 我sql语句不太好 高手帮忙给写个吧 一条sql绝对能解决问题! --------------------编程问答--------------------
按你说的做加法。
如果这样就不对了。
orderno status
1112 P
1112 E
1112 A
的到结果flag = 3 。 其实应该是 E。
这里还有个优先级的意思。 如果结果集里有E, 不管其他有没。 就是ERROR。 其次就是A, R, P --------------------编程问答--------------------
不用分组查询, 就更具当前ORDERNO来查出结果集, 当然这个结果集存在多行记录。 会有不同的状态。
目的是返回这个订单的状态。 只要有一个E的订单就要返回ERROR --------------------编程问答--------------------
好吧 用代码实现 那楼上的方法可行 只是优先级的的事情再改改呗 思路很清晰了 --------------------编程问答-------------------- stirng[] rs={"done","error","doing","ready"};
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];
--------------------编程问答-------------------- 100可能不够,那就用10000好了。 --------------------编程问答-------------------- select orderno,
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
直接查出来可以吧 --------------------编程问答--------------------
兄弟, 思维很强, 我希望能用面向对象的方式来解决, 不希望有if else.
你这个办法还是很好的。 --------------------编程问答--------------------
家里没数据库, 改天上班了调试看看。
补充:.NET技术 , C#