Sök…


Introduktion

Progress ABL stöder två kontroversiella uttalanden: IF/THEN/ELSE och CASE .

OM ... DÅ ... ELSE-uttalande

I IF THEN ELSE uttalandet kan resultatet vara antingen ett enda uttalande:

DEFINE VARIABLE i AS INTEGER     NO-UNDO.

IF i = 0 THEN
    MESSAGE "Zero".
ELSE 
    MESSAGE "Something else".

Eller ett block, till exempel genom att lägga till ett DO block:

DEFINE VARIABLE i AS INTEGER     NO-UNDO.

IF i = 0 THEN DO:
    RUN procedure1.
    RUN procedure2.
END.
ELSE DO: 
    RUN procedure3.
    RUN procedure4.
END.

Flera IF statistik kan kapslas med ELSE IF syntax:

DEFINE VARIABLE i AS INTEGER     NO-UNDO.

IF i = 0 THEN DO:
    RUN procedure1.
    RUN procedure2.
END.
ELSE IF i = 1 THEN DO:
    RUN procedure3.
    RUN procedure4.

END.
ELSE DO: 
    RUN procedure5.
    RUN procedure6.
END.

ELSE delen är inte obligatorisk:

DEFINE VARIABLE l AS LOGICAL     NO-UNDO.

l = TRUE.

IF l = TRUE THEN DO:
    MESSAGE "The l variable has the value TRUE" VIEW-AS ALERT-BOX.
END.

IF / ELSE IF kan jämföra flera villkor, med eller utan interna anslutningar. Detta ger dig fritt att röra upp din kod på flera sätt:

DEFINE VARIABLE i AS INTEGER     NO-UNDO.
DEFINE VARIABLE l AS LOGICAL     NO-UNDO.

IF i < 30 OR l = TRUE THEN DO:
    
END.
ELSE IF i > 30 AND l = FALSE OR TODAY = DATE("2017-08-20") THEN DO:

END.
ELSE DO:
    MESSAGE "I dont really know what happened here".
END.

FALL

CASE uppgiften är mycket striktare än IF/ELSE villkoret. Den kan bara jämföra en enda variabel och endast jämlikhet, inte stor / mindre än etc.

DEFINERA VARIABLE c SOM CHARACTER NO-UNDO.

CASE c:
    WHEN "A" THEN DO:
        RUN procedureA.
    END.
    WHEN "B" THEN DO:
        RUN procedureB.
    END.
    OTHERWISE DO:
        RUN procedureX.
    END.
END CASE.

Genom att använda en OR varje WHEN kan man jämföra olika värden:

DEFINE VARIABLE c AS CHARACTER   NO-UNDO.

CASE c:
    WHEN "A" THEN DO:
        RUN procedureA.
    END.
    WHEN "B" OR WHEN "C" THEN DO:
        RUN procedureB-C.
    END.
    OTHERWISE DO:
        RUN procedureX.
    END.
END CASE.

Precis som med IF statusen kan varje gren antingen vara ett enda uttalande eller ett block. Precis som med ELSE uttalandet är OTHERWISE obligatoriskt.

DEFINE VARIABLE c AS CHARACTER   NO-UNDO.

CASE c:
    WHEN "A" THEN
        RUN procedureA.
    WHEN "B" OR WHEN "C" THEN
        RUN procedureB-C.
END CASE.

Till skillnad från en c-stil switch klausul finns det inget behov att undkomma CASE uttalandet - endast en gren kommer att köras. Om flera WHEN matchar bara den första utlöser. OTHERWISE måste vara sista och kommer bara att trigga om ingen av grenarna ovan matchar.

DEFINE VARIABLE c AS CHARACTER   NO-UNDO.

c = "A".

CASE c:
    WHEN "A" THEN
        MESSAGE "A" VIEW-AS ALERT-BOX. //Only "A" will be messaged
    WHEN "A" OR WHEN "C" THEN
        MESSAGE "A or C" VIEW-AS ALERT-BOX.
END CASE.

OM ... DÅ ... ELSE-funktion

IF THEN ELSE kan också användas som en funktion för att returnera ett enda värde. Detta är mycket som ternary ? -operatör av C.

DEFINE VARIABLE i AS INTEGER     NO-UNDO.
DEFINE VARIABLE c AS CHARACTER   NO-UNDO.

/* Set c to "low" if i is less than 5 otherwise set it to "high"    
c = IF i < 5 THEN "low" ELSE "high".

Att använda parenteser kan underlätta läsbarheten för kod som denna.

DEFINE VARIABLE i AS INTEGER     NO-UNDO.
DEFINE VARIABLE c AS CHARACTER   NO-UNDO.

c = (IF i < 5 THEN "low" ELSE "high").

Värdet på IF delen och värdet på ELSE delen måste vara av samma datatyp. Det är inte möjligt att använda ELSE IF i det här fallet.

DEFINE VARIABLE dat                AS DATE        NO-UNDO.
DEFINE VARIABLE beforeTheFifth     AS LOGICAL   NO-UNDO.

dat = TODAY.

beforeTheFifth = (IF DAY(dat) < 5 THEN TRUE ELSE FALSE).

Flera jämförelser kan göras i IF statistik:

DEFINE VARIABLE between5and10 AS LOGICAL     NO-UNDO.
DEFINE VARIABLE i             AS INTEGER     NO-UNDO INIT 7.

between5and10 = (IF i >= 5 AND i <= 10 THEN TRUE ELSE FALSE).

MESSAGE between5and10 VIEW-AS ALERT-BOX.


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow