问题描述
根据一个orderno在表中可以查到这个orderno的结果集放到dataset。现在需要返回这个orderno的状态。条件是:全是P就返回done,如有有一个其他的状态就返回对应的状态。状态值status有4种值R,A,E,P.分别代表的意思是R--readlyA--doingE--errorP--done.例如:表中查询的到结果集是ordernostatus1111P1111P返回done.ordernostatus1112P1112E返回error.foreach(datarowdrinds.table[0].rows){if(dr["status"].tostring()=="P"){return"done";}if(dr["status"].tostring()=="E"){return"error";}}这样写很不好啊,如果遇到结果集是ordernostatus1112P1112E1112P那就会返回done了,其实应该是error.
解决方案
解决方案二:
这么简单的逻辑还要问问问,很善意的告诉楼主,你不适合干这行,逻辑思维能力太差.
解决方案三:
你应该遍历值为E,遇到就中断遍历(循环)并返回E
解决方案四:
没找到E就是done,你的语句返回的最后一行的状态值status
解决方案五:
我表示看完之后大脑一片混乱
解决方案六:
好像你的表设计和你的代码是矛盾。。。我再瞧瞧
解决方案七:
foreach(datarowdrinds.table[0].rows){if(dr["status"].tostring()=="P"){return"done";}if(dr["status"].tostring()=="E"){return"error";}elseif(dr["status"].tostring()=="R"){return"readly";}elseif(dr["status"].tostring()=="A"){return"doing";}}
解决方案八:
不想用那么多IFELSE能不能用面向对象的思维解决啊
解决方案九:
很简单,设一变量flag=0,遍历DataTable的每一行,根据status的值做加法。R:3A:2E:1P:0stirng[]rs={"done","error","doing","ready"};然后returnflagStr[flag];就可以了。比如flag为0,说明全部是P,则取"done"。
解决方案十:
foreach(datarowdrinds.table[0].rows){}这个遍历是一行一行遍历的,而你的代码中明显是在数据库中的一行中进行比较而实际上你的需求是多行间进行比较
解决方案十一:
if(dr["status"].tostring()=="E"){return"error";}elseif(dr["status"].tostring()=="A"){return"doing";}else(dr["status"].tostring()=="p"){return"done";}这样是可以解决。可不可以不这样写。也不要用swtchcase.
解决方案十二:
stirng[]rs={"done","error","doing","ready"};stringflagStr="PEAR";intflag=0;foreach(....){flag+=flagStr.IndexOf(dr["status"].tostring();}returnflagStr[flag];就这样好了。
解决方案十三:
我算看明白了你这个需求一行代码都不用写一条sql语句即可搞定你就是想按orderno进行分组然后判断orderno对应的状态吧。。。应该用到groupbycase什么的我sql语句不太好高手帮忙给写个吧一条sql绝对能解决问题!
解决方案十四:
引用8楼的回复:
很简单,设一变量flag=0,遍历DataTable的每一行,根据status的值做加法。R:3A:2E:1P:0stirng[]rs={"done","error","doing","ready"};然后returnflagStr[flag];就可以了。比如flag为0,说明全部是P,则取"done"。
按你说的做加法。如果这样就不对了。ordernostatus1112P1112E1112A的到结果flag=3。其实应该是E。这里还有个优先级的意思。如果结果集里有E,不管其他有没。就是ERROR。其次就是A,R,P
解决方案十五:
引用12楼的回复:
我算看明白了你这个需求一行代码都不用写一条sql语句即可搞定你就是想按orderno进行分组然后判断orderno对应的状态吧。。。应该用到groupbycase什么的我sql语句不太好高手帮忙给写个吧一条sql绝对能解决问题!
不用分组查询,就更具当前ORDERNO来查出结果集,当然这个结果集存在多行记录。会有不同的状态。目的是返回这个订单的状态。只要有一个E的订单就要返回ERROR
解决方案:
引用14楼的回复:
引用12楼的回复:我算看明白了你这个需求一行代码都不用写一条sql语句即可搞定你就是想按orderno进行分组然后判断orderno对应的状态吧。。。应该用到groupbycase什么的我sql语句不太好高手帮忙给写个吧一条sql绝对能解决问题!不用分组查询,就更具当前ORDERNO来查出结果集,当然这个结果集存在多行记录。会有不同的状态。……
好吧用代码实现那楼上的方法可行只是优先级的的事情再改改呗思路很清晰了
解决方案:
stirng[]rs={"done","error","doing","ready"};stringflagStr="PEAR";intflag=0;foreach(....){flag+=flagStr.IndexOf(dr["status"].tostring();if(if(dr["status"].ToString()=="E"))flag+=100;}if(flag>=100)return"error";returnflagStr[flag];
解决方案:
100可能不够,那就用10000好了。
解决方案:
selectorderno,status=min(casewhenexists(select1fromtbwhereorderno=a.ordernoandstatus='E')then'E'elsestatusend)fromtbagroupbyorderno直接查出来可以吧
解决方案:
引用16楼的回复:
stirng[]rs={"done","error","doing","ready"};stringflagStr="PEAR";intflag=0;foreach(....){flag+=flagStr.IndexOf(dr["status"].tostring();if(if(dr["status"].ToString()=="E"))flag+=100;……
兄弟,思维很强,我希望能用面向对象的方式来解决,不希望有ifelse.你这个办法还是很好的。
解决方案:
引用18楼的回复:
selectorderno,status=min(casewhenexists(select1fromtbwhereorderno=a.ordernoandstatus='E')then'E'elsestatusend)fromtbagroupbyorderno直接查出来可以吧
家里没数据库,改天上班了调试看看。