Упрощенный случай, когда если затем заявление - PullRequest
0 голосов
/ 12 марта 2019

Мне было предоставлено следующее заявление CASE WHEN от нашего провайдера MIS.Я смотрю на упрощение, так как я не эксперт, поэтому мне легче читать, тем больше у меня шансов понять и научиться.

Текущее утверждение:

,CASE SopOrderItem.SoiProcessMethod:WHEN 0 
THEN IF SopOrderItem.SoiReplenishmentOrder 
THEN DO: IF SopProduct.SopPrePostPaid = 0 
THEN ASSIGN lv-ProcessMethod = "Replenishment Pay on Replenishment".
ELSE ASSIGN lv-ProcessMethod = "Replenishment Pay on Delivery".
END.
ELSE lv-processmethod = "Call Off":U.
WHEN 1 THEN lv-processmethod = "On Demand":U.
WHEN 2 THEN lv-processmethod = "Personalised":U.
END CASE

Вот чтоя был в состоянии написать, от которого я знаю, что работает часть, на которой я застрял, является WHEN SopOrderItem.SoiProcessMethod = 0.На данный момент я не понимаю утверждение.Из того, что я могу сказать по-английски, он говорит, что когда SopOrderItem.SoiProcessMethod равен 0, проверьте, не равняется ли SopProduct.SopPrePostPaid также 0, если оба значения истинны, тогда «Заполнение при пополнении», если не тогда «Пополнение при доставке».

Есть ли способ, которым я могу упростить утверждение, чтобы мне было легче его понять.

В данный момент у меня есть приведенное ниже утверждение, но это привело к тому, что мой запрос упал и потребовалось много времени, чтобы обновить:

CASE WHEN SopOrderItem.SoiProcessMethod = 1 THEN 'On Demand'
WHEN SopOrderItem.SoiProcessMethod = 2 THEN 'Personalised'
WHEN SopOrderItem.SoiProcessMethod = 0 AND SopProduct.SopPrePostPaid = 0 THEN "Replenishment Pay on Replenishment"
WHEN SopOrderItem.SoiProcessMethod = 0 AND SopProduct.SopPrePostPaid <> 0 THEN "Replenishment Pay on Delivery"
ELSE 'Call Off'
END

1 Ответ

3 голосов
/ 12 марта 2019

Лично я бы отделил CASE и IF, а не объединил их.Но это только улучшит читабельность.Если это часть какого-то запроса, в котором вы зависите от этих значений, я думаю, вам нужно переосмыслить его, поскольку он не будет очень эффективным.

(Вы должны убедиться, что этот код действительно дает тот же результат - это довольно сложно без данных и без определений SopOrderItem + SopProduct).

CASE SopOrderItem.SoiProcessMethod:
    WHEN 0 THEN DO :
        IF SopOrderItem.SoiReplenishmentOrder THEN DO:
            IF SopProduct.SopPrePostPaid = 0 THEN
                ASSIGN lv-ProcessMethod = "Replenishment Pay on Replenishment".
            ELSE 
                ASSIGN lv-ProcessMethod = "Replenishment Pay on Delivery".
        END.
        ELSE lv-processmethod = "Call Off":U.
    END.

    WHEN 1 THEN lv-processmethod = "On Demand":U.
    WHEN 2 THEN lv-processmethod = "Personalised":U.
END CASE.

Вы также можете сделать этоЕСЛИ только:

IF SopOrderItem.SoiProcessMethod = 0 THEN DO :
    IF SopOrderItem.SoiReplenishmentOrder THEN DO:
        IF SopProduct.SopPrePostPaid = 0 THEN
            ASSIGN lv-ProcessMethod = "Replenishment Pay on Replenishment".
        ELSE 
            ASSIGN lv-ProcessMethod = "Replenishment Pay on Delivery".
    END.
    ELSE lv-processmethod = "Call Off":U.
END.
ELSE IF SopOrderItem.SoiProcessMethod = 1 THEN lv-processmethod = "On Demand":U.
ELSE IF SopOrderItem.SoiProcessMethod = 2 THEN lv-processmethod = "Personalised":U.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...