根据一个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.
 
 

解决方案 »

  1.   

    没找到E就是done,你的语句返回的最后一行的状态值status
      

  2.   

    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";
      }
    }
      

  3.   

    不想用那么多IF ELSE  能不能用面向对象的思维解决啊
      

  4.   

    很简单,设一变量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"。
      

  5.   

    foreach(datarow dr in ds.table[0].rows)
    {
    }
    这个遍历是一行一行遍历的,而你的代码中 明显是在数据库中的一行中进行比较 
    而实际上你的需求是多行间进行比较
      

  6.   

    if(dr["status"].tostring() == "E")
    {
      return"error";
    }
    else if( dr["status"].tostring() == "A")
    {
      return"doing";
    }
    else (dr["status"].tostring() == "p")
    {
      return"done";
    }这样是可以解决。  可不可以不这样写。  也不要用swtch case.
      

  7.   

    stirng[] rs={"done","error","doing","ready"};
    string flagStr="PEAR";
    int flag=0;
    foreach(....)
    {
    flag+=flagStr.IndexOf(dr["status"].tostring();
    }
    return flagStr[flag];就这样好了。
      

  8.   

    我算看明白了 你这个需求一行代码都不用写 一条sql语句即可搞定  
    你就是想按orderno进行分组 然后判断orderno对应的状态吧
    应该用到group by   case 什么的  我sql语句不太好 高手帮忙给写个吧 一条sql绝对能解决问题!
      

  9.   

    按你说的做加法。  
    如果这样就不对了。orderno status1112 P1112 E1112 A的到结果flag = 3 。  其实应该是 E。这里还有个优先级的意思。 如果结果集里有E, 不管其他有没。 就是ERROR。  其次就是A, R, P
      

  10.   

    不用分组查询,  就更具当前ORDERNO来查出结果集, 当然这个结果集存在多行记录。 会有不同的状态。目的是返回这个订单的状态。 只要有一个E的订单就要返回ERROR
      

  11.   

    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];
      

  12.   

    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直接查出来可以吧
      

  13.   

    兄弟, 思维很强, 我希望能用面向对象的方式来解决, 不希望有if else.  
    你这个办法还是很好的。