当前位置:编程学习 > C#/ASP.NET >>

这样的条件判断该如何设计???

根据一个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绝对能解决问题! --------------------编程问答--------------------
引用 8 楼  的回复:
很简单,设一变量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"。



按你说的做加法。  
如果这样就不对了。

orderno status

1112 P

1112 E

1112 A

的到结果flag = 3 。  其实应该是 E。

这里还有个优先级的意思。 如果结果集里有E, 不管其他有没。 就是ERROR。  其次就是A, R, P --------------------编程问答--------------------
引用 12 楼  的回复:
我算看明白了 你这个需求一行代码都不用写 一条sql语句即可搞定  
你就是想按orderno进行分组 然后判断orderno对应的状态吧。。。
应该用到group by case 什么的 我sql语句不太好 高手帮忙给写个吧 一条sql绝对能解决问题!



不用分组查询,  就更具当前ORDERNO来查出结果集, 当然这个结果集存在多行记录。 会有不同的状态。

目的是返回这个订单的状态。 只要有一个E的订单就要返回ERROR --------------------编程问答--------------------
引用 14 楼  的回复:
引用 12 楼 的回复:
我算看明白了 你这个需求一行代码都不用写 一条sql语句即可搞定
你就是想按orderno进行分组 然后判断orderno对应的状态吧。。。
应该用到group by case 什么的 我sql语句不太好 高手帮忙给写个吧 一条sql绝对能解决问题!



不用分组查询, 就更具当前ORDERNO来查出结果集, 当然这个结果集存在多行记录。 会有不同的状态。……

好吧 用代码实现 那楼上的方法可行 只是优先级的的事情再改改呗 思路很清晰了 --------------------编程问答-------------------- 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

直接查出来可以吧 --------------------编程问答--------------------
引用 16 楼  的回复:
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 else.  
你这个办法还是很好的。 --------------------编程问答--------------------
引用 18 楼  的回复:
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

直接查出来可以吧


家里没数据库, 改天上班了调试看看。
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,