Cómo usar CASE para un código de Dynamics NAV más limpio

agosto 16, 2016
Categoría: Sin categorizar

La instrucción CASE es una instrucción de control en C/AL.

Al igual que la instrucción IF, CASE es una instrucción condicional. Se evalúa una condición y se ejecutan distintos bloques de código según el resultado.

CASE se utiliza cuando hay más de dos opciones.

Nunca uses IF anidados si lo puedes sustituir por CASE

Los IF anidados se usan cuando la condición que se está evaluando es distinta. Si la condición es la misma, entonces hay que usar CASE.

La razón es muy sencilla: Tu código se podrá leer de forma mucho más fácil.

Diagrama de flujo para la instrucción CASE - Dynamics NAV

Fíjate en los siguientes bloques de código. Los dos hacen lo mismo. Ahora dime, ¿cuál de los dos te parece más fácil de leer?

//*** BLOQUE 1 ***********  CASE SalesLine.Type OF    SalesLine.Type::Item         : ;//Código    SalesLine.Type::"G/L Account": ;//Código    SalesLine.Type::" "          : ;//Código    SalesLine.Type::"Fixed Asset": ;//Código    ELSE      //Código  END;
//*** BLOQUE 2 **********  IF SalesLine.Type = SalesLine.Type::Item THEN BEGIN    // Código  END ELSE     IF SalesLine.Type = SalesLine.Type::"G/L Account" THEN BEGIN      // Código    END ELSE      IF SalesLine.Type = SalesLine.Type::" " THEN BEGIN        // Código      END ELSE        IF SalesLine.Type = SalesLine.Type::"Fixed Asset" THEN BEGIN          // Código        END;

Está claro que el BLOQUE 1 es mucho más elegante y fácil de seguir. Sobre todo cuando el código no se limita a una sola línea, sino a un bloque más o menos grande.

[magicactionbox id=”313″]

Sintaxis de la instrucción CASE en C/AL

La sintaxis es sencilla. Puedes ver la definición oficial en la página de la MSDN C/AL Conditional Statements.

// SINTAXI DE CASE  CASE Campo/Variable/Expresión OF    Valor 1:      Bloque código 1;    Valor 2:      Bloque código 2;    [...]      ELSE      Bloque de código  END;
  • Detrás del CASE se pone el campo, variable o expresión que se quiere evaluar y que tiene más de 2 resultados posibles.
  • El campo / variable / expresión puede ser de cualquier tipo de dato: bool, integer, text, option, decimal, etc.
  • El apartado ELSE es opcional.
  • Si los bloques de código contienen más de una instrucción, estas se tienen que encapsular con un BEGIN – END.
  • El CASE ejecuta el primer bloque de código válido y después sale. Si una segunda condición es cierta ya no se ejecuta ese bloque.

Ejemplos de CASE en objetos estándard de Navision

En el siguiente ejemplo:

  • Se está haciendo CASE sobre el campo “VAT Rounding Type”, que es de tipo Option
  • El campo puede contener 3 valores distintos.
  • Se ejecuta una única instrucción por cada opción
// OBJECT Table 4 Currency  // PROCEDURE VATRoundingDirection      CASE "VAT Rounding Type" OF  	"VAT Rounding Type"::Nearest:  	  EXIT('=');  	"VAT Rounding Type"::Up:  	  EXIT('>');  	"VAT Rounding Type"::Down:  	  EXIT('<');    END;

En el ejemplo de abajo:

  • Se ejecutará el mismo código para los valores 1, 2 y 3. Para ello se ponen los valores separados por comas.
// OBJECT Table 14 Location  // PROCEDURE GetBinCode      CASE FlushingMethod OF  	FlushingMethod::Manual,  	FlushingMethod::"Pick + Forward",  	FlushingMethod::"Pick + Backward":  	  EXIT("To-Production Bin Code");  	    	    	FlushingMethod::Forward,  	FlushingMethod::Backward:  	  EXIT("Open Shop Floor Bin Code");    END;

Para darle una vuelta más de tuerca, revisa el siguiente CASE TRUE OF.

  • El primero que evalúe a TRUE será el que se ejecutará
// OBJECT Table 37 Sales Line  // PROCEDURE UpdateWithWarehouseShip    CASE TRUE OF    ("Document Type" IN ["Document Type"::Quote,"Document Type"::Order]) AND (Quantity >= 0):             // CODIGO      ("Document Type" IN ["Document Type"::Quote,"Document Type"::Order]) AND (Quantity < 0):              // CODIGO    ("Document Type" = "Document Type"::"Return Order") AND (Quantity >= 0):            // CODIGO      ("Document Type" = "Document Type"::"Return Order") AND (Quantity < 0):            // CODIGO    END;

Para entender definitivamente cómo funciona, intenta re-escribir esto usando IF y verás como se empieza a complicar…

  1. Pedido Y Cantidad positiva –> código 1
  2. Pedido Y Cantidad negativa –> código 2
  3. Devolución Y Cantidad positiva –> código 3
  4. Devolución Y Cantidad negativa –> Código 4

 

Esto es todo por hoy. Espero que te haya resultado útil.
Si me he dejado algún detalle, deja un comentario y lo revisaré.

Salut!
Laura Nicolàs

Debe iniciar sesión para crear nuevos temas.

Comentarios