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

agosto 16, 2016
Categoría: Técnico

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