如在搞不清楚如何管理状态

时间:2020-11-26 16:22:26
有张表.Header(摘要表),Detail(明细表),一对多关系.
Detail表结构如下(两个字段):
RMANumber     POType 
Header表两个字段(与明细表一样)
RMANumber     POType

其中用字母表示的状态是以下(存放在字段POType里)
O→D→C→P→S→G→F(状态字母意思是:O 打开,D 部分确认,C 完全确认,P 部份寄送,S 完全寄送,G 部分收件,F 完全收件 )
例如:
select * from detail 的结果如下:
RMANumber --   potype
PLC001242        D
PLC001242        S
PLC001242        P
PLC001242        F
PLC001242        G
PLC001242        O
PLC001242        C
select * from Header的结果如下:
RMANumber --    potype
PLC001242         F
Header表的POType是反应这条RMANumber=PLC001242的最终状态。

我打个比方,
第一种存在情况:
(注:按以下的箭头字母表示来更改状态:O→D→C→P→S→G→F)
假如明细表里的potype所有都等O的时候Header表里就状态就为O 
如果明细表里的potype所有都等C的时候Header表里就状态就为C
依此类推。。
第二种存在情况:
(注:按以下的箭头字母表示来更改状态:O→D→C→P→S→G→F)
如果明细表里的potype有些等C的有些等于O的时候Header表里的状态就为D(注:因为明细表里的所有状态还有存在有(O 打开状态)的记录,所以Header的状态正确应为D(部分确认),等明细表的所有状态都为C了header的状态才为C,上面以标注是按箭头字母来更改状态)
如果明细表里的potype有些等C的有些等于D的时候Header表里的状态就为D(部分确认).(注:因为detail表里还存在为D的记录,所以header的状态只能为D)
如果明细表里的potype有些等(S 寄送)的有些等于(C 完全确认)的时候Header表里的状态就为(P 部队寄送)(注:因为detail表里还存在为C的记录,所以header的状态只能为P)
依此类推下去。。

我想有存储过程来实现不知怎么写,,写了一半就觉得不知哪是哪了。。
我再说明一次,Header的状态是通过detail的状态来变动的。
detail表可以存在很多种状态(O→D→C→P→S→G→F)中的任何一种,但header表只能有一种状态,因为是一对多的关系.怎么通过detail的状态来判断header的状态呢。。。高手来帮帮我啊。。今晚要加班了。。。。。
O   →       D   →   C →      P→       S→       G→        F
打开状态  部分确认   完全确认   部分寄送  完全寄送  部分收件  完全收件

8 个解决方案

#1


会不会有这种情况:
同时存在这些状态:O D C  P

#2


#3


任一种都存在(O→D→C→P→S→G→F)
O D C P,G F C,S P F等等

#4


急啊

#5


if (明细存在 G or F )
begin
    if 明细全是 F then F ELSE G
end
else
begin
    if (明细存在 P OR S)
    begin
       if 明细全是 S then S ELSE P
    end
    else
    begin
        if (明细存在 D OR C)
        begin
         if 明细全是 c then C ELSE D
        end
        else
        begin
            if 明细全是 O then O ELSE null
        end        
    end
end    
----------------
拷出去自己加空格看的清楚点。

#6


不明白。。

#7


我再看了一遍,还是看不太懂,不过我想可以用case when 来实现。。

可否举个例试试。。

#8


我举个例子:
O→D→C→P→S→G→F(状态字母意思是:O 打开,D 部分确认,C 完全确认,P 部份寄送,S 完全寄送,G 部分收件,F 完全收件 )

这里明细表:
RMANumber --   potype
PLC001242        D
PLC001242        S
PLC001242        P
这是摘要表:
RMANumber --   potype
PLC001242        P
(注:O→D→C→P→S→G→F)
那么摘要的状态是要反应明细里的最后的状态,我上面的明细表里有一条记录是"完成寄送 S",其中两条还没有完全寄送或是在寄送之前的状态,D 是部分确认, P 是部分寄送.所以用摘要表的状态来反应明细表的最终状态呢...是不是以上的摘要状态是不是"部分寄送 P"的状态呢..
我在打个比方,明细有三条,其中一条是部分确认,一条是完全寄送,另一条是部分寄送,又有部分确认,又有部分寄送,又有完全寄送.说明明细表还存在没有寄送的信息,所以摘要的状态只能用部分寄送 P 这个来描述PLC001242在明细表的状态.
不知道我这样说大家明不明白...

#1


会不会有这种情况:
同时存在这些状态:O D C  P

#2


#3


任一种都存在(O→D→C→P→S→G→F)
O D C P,G F C,S P F等等

#4


急啊

#5


if (明细存在 G or F )
begin
    if 明细全是 F then F ELSE G
end
else
begin
    if (明细存在 P OR S)
    begin
       if 明细全是 S then S ELSE P
    end
    else
    begin
        if (明细存在 D OR C)
        begin
         if 明细全是 c then C ELSE D
        end
        else
        begin
            if 明细全是 O then O ELSE null
        end        
    end
end    
----------------
拷出去自己加空格看的清楚点。

#6


不明白。。

#7


我再看了一遍,还是看不太懂,不过我想可以用case when 来实现。。

可否举个例试试。。

#8


我举个例子:
O→D→C→P→S→G→F(状态字母意思是:O 打开,D 部分确认,C 完全确认,P 部份寄送,S 完全寄送,G 部分收件,F 完全收件 )

这里明细表:
RMANumber --   potype
PLC001242        D
PLC001242        S
PLC001242        P
这是摘要表:
RMANumber --   potype
PLC001242        P
(注:O→D→C→P→S→G→F)
那么摘要的状态是要反应明细里的最后的状态,我上面的明细表里有一条记录是"完成寄送 S",其中两条还没有完全寄送或是在寄送之前的状态,D 是部分确认, P 是部分寄送.所以用摘要表的状态来反应明细表的最终状态呢...是不是以上的摘要状态是不是"部分寄送 P"的状态呢..
我在打个比方,明细有三条,其中一条是部分确认,一条是完全寄送,另一条是部分寄送,又有部分确认,又有部分寄送,又有完全寄送.说明明细表还存在没有寄送的信息,所以摘要的状态只能用部分寄送 P 这个来描述PLC001242在明细表的状态.
不知道我这样说大家明不明白...