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

por | 16 agosto, 2016

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.

¿ES POSIBLE UNA FORMACIÓN DE DYNAMICS NAV...
  • En español?
  • Que no me tome más de 15 minutos al día?
  • Que pueda entenderlo desde cero?
  • Que cubra Navision de punta a punta, desarrollando ejemplos para todas las opciones?

 

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

Dudas, preguntas, sugerencias >> Pregúntalo en el foro

Debes estar registrado para crear debates nuevos.

¿ES POSIBLE UNA FORMACIÓN DE DYNAMICS NAV...
  • En español?
  • Que no me tome más de 15 minutos al día?
  • Que pueda entenderlo desde cero?
  • Que cubra Navision de punta a punta, desarrollando ejemplos para todas las opciones?
Categoría: Técnico

Acerca de Laura Nicolàs

Soy Laura Nicolàs, una de las gemelas del Navision. Llevo más de 14 años trabajando con Business Central (antes conocido como Dynamics NAV o Navision). Hago consultoría, análisis, desarrollo, implantación, migraciones, actualizaciones de versión (upgrade), instalación, soporte y formación. La formación es una de mis pasiones, así que estoy siempre grabando cursos que tienes disponibles en ClipDynamics.com +40 cursos y +450 lecciones. Hay cursos para usuarios, para consultores y para programadores.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.