SELECT (Begin a Select Group)

Free-Form Syntax SELECT {expression}
Código Tipo Datos Factor 2 Ampliado
SELECT Blanco {expression}

El grupo de selección procesa condicionalmente una de varias secuencias alternativas de operaciones.

Hay dos formularios para el grupo de selección.

  1. Para el primer formato, la sentencia SELECT no tiene un operando. El grupo de selección consta de:
  2. Para el segundo formato, la sentencia SELECT tiene un operando. El grupo de selección consta de:
    Nota:
    • La expresión especificada como operando para SELECT puede tener cualquier tipo de datos. No puede ser un nombre de estructura de datos, un nombre de matriz o una constante figurativa.
    • El valor del operando para la sentencia SELECT en el momento de la sentencia SELECT se utiliza para todas las comparaciones para las sentencias WHEN-IN y WHEN-IS en el grupo de selección. Si el valor de la expresión para la sentencia SELECT cambia durante una de las comparaciones para las sentencias WHEN-IN y WHEN-IS , el valor cambiado no se utiliza para las sentencias WHEN-IN y WHEN-IS posteriores. El valor original se utiliza para todas las comparaciones WHEN-IN y WHEN-IS .
Nota: En la siguiente discusión, el término "WHEN*" hace referencia a las operaciones WHENxx, WHEN, WHEN-INy WHEN-IS .

Después de la sentencia SELECT , el control pasa a la sentencia que sigue a la primera condición WHEN* que se cumple. A continuación, todas las sentencias se ejecutan hasta la siguiente sentencia WHEN* . El control pasa a la sentencia ENDSL (sólo se ejecuta un bloque WHEN* ). Si no se cumple ninguna condición WHEN* y se especifica una sentencia OTHER , el control pasa a la sentencia que sigue a las operaciones OTHER . Si no se cumple ninguna condición WHEN* y no se especifica ninguna operación OTHER , el control se transfiere a la sentencia que sigue a la operación ENDSL del grupo de selección.

Los indicadores de condicionamiento se pueden utilizar en la operación de SELECT . Si no se satisfacen, el control pasa inmediatamente a la sentencia que sigue a la operación ENDSL del grupo de selección. Los indicadores de condicionamiento no se pueden utilizar individualmente en las operaciones WHEN*, OTHER y ENDSL .

El grupo de selección se puede especificar en cualquier lugar de los cálculos. Se puede anidar en IF, DOu otros grupos de selección. Los grupos IF y DO se pueden anidar dentro de grupos seleccionados.

Si la comparación en más de una sentencia WHEN* es verdadera, el control pasa a las sentencias asociadas con la primera sentencia WHEN* verdadera.

Si se especifica una operación SELECT dentro de un grupo de selección, las operaciones WHEN* y OTHER se aplican al nuevo grupo de selección hasta que se especifica un ENDSL .

Para obtener más información, consulte Operaciones de programación estructurada.

Operación SELECT sin un operando

  • En el ejemplo siguiente:
    1. Si X es igual a 1, realice las operaciones siguientes a la primera sentencia WHEN* .
    2. Nota: No es necesaria ninguna operación de END antes de la siguiente operación de WHEN . El control pasa a la sentencia ENDSL .
    3. Si X NO es igual a 1, y si Y=2 y X<10, realice las operaciones siguientes a la segunda sentencia WHEN .
    4. Si ninguna condición es verdadera, realice las operaciones que siguen a la sentencia OTHER .
    
    SELECT;
    WHEN X = 1;  //  1 
       R = 1; //  1 
       S = 'A';
       //  2 
    WHEN ((Y = 2) AND (X < 10)); //  3 
       R = 2; //  3 
       S = 'B';
    OTHER; //  4 
       R = 3; //  4 
       S = 'C';
    ENDSL;
    
  • El ejemplo siguiente muestra un grupo de selección con indicadores de condicionamiento. Después de la operación CHAIN, si el indicador 10 está activado, el control pasa a la operación ADD. Si el indicador 10 está desactivado, se procesa el grupo de selección.
    *...1....+....2....+....3....+....4....+....5....+....6....+....7...+....
    CL0N01Factor1+++++++Opcode(E)+Factor2+++++++Result++++++++Len++D+HiLoEq....
    C     KEY           CHAIN     FILE                               10
    C  N10              SELECT
    C                   WHEN      X = 1
     *  Sequence 1
    C                   :
    C                   WHEN      Y = 2
     *  Sequence 2
    C                   :
    C                   ENDSL
    C                   ADD       1              N
    

Operación SELECT con un operando

  • En el ejemplo siguiente:
    1. Todas las sentencias WHEN-IS y WHEN-IN realizan las comparaciones utilizando el valor de la expresión family.child(c).pet(p).age.
    2. Si family.child(c).pet(p).age es igual a uno de los valores de la función incorporada %LIST , realice las operaciones siguientes a la sentencia WHEN-IN .
    3. Nota: No se necesita ninguna operación de END antes de la siguiente WHEN-IS. El control pasa a la sentencia ENDSL .
    4. Si family.child(c).pet(p).age es igual a 1, realice las operaciones siguientes a la sentencia WHEN-IS .
      Nota: Si family.child(c).pet(p).age tiene el valor 17, la primera comparación de WHEN-IN es verdadera, por lo que el control no alcanzaría esta sentencia.
    5. Si family.child(c).pet(p).age está entre 10 y 20, tal como especifica la función incorporada %RANGE , realice las operaciones siguientes a la sentencia WHEN-IN .
    6. Si ninguna de las condiciones es verdadera, realice las operaciones siguientes a la sentencia OTHER .
    
    DCL-DS family QUALIFIED;
       name VARCHAR(25);
       DCL-DS child DIM(10);
          name VARCHAR(25);
          age int(10):
          DCL-DS pets DIM(3);
             name VARCHAR(25);
             age int(10);
          END-DS:
       END-DS;
    END-DS;
    DCL-S c int(10);
    DCL-S p int(10);
    
    SELECT family.child(c).pet(p).age; //  1 
    WHEN-IN %LIST(2 : 5 : 17); /  2 
       R = 1; //  2 
       S = 'a';
       //  3 
    WHEN-IS 1; //  4 
       R = 2; //  4 
       S = 'B';
    WHEN-IN %RANGE(10 : 20); //  5 
       R = 3; //  5 
       S = 'C';
    OTHER; //  6 
       R = 4; //  6 
       S = 'D';
    ENDSL;
    

    Para obtener más ejemplos de la sentencia SELECT con un operando, consulte WHEN-IN (When the SELECT Operand is IN the WHEN-IN Operand) y WHEN-IS (When the SELECT Operand is Equal to the WHEN-IS Operand).