Bienvenidos a Iseries Venezuela

Las mejores prácticas, recursos, tips, enlaces, videos y artículos para informáticos relacionados con el Iseries y el As/400 lenguajes de programación RPG, ILE RPG y SQL.

The best practices, resources, tips, links, videoes and articles for computer related to the Iseries and the As/400 languages of programming RPG, ILE RPG and SQL.
Showing posts with label Mejores Prácticas en RPG. Show all posts
Showing posts with label Mejores Prácticas en RPG. Show all posts

Tuesday, April 29, 2025

Pareto Principle in RPG Development: The 20% That Causes 80% of the Errors/Principio de Pareto en el Desarrollo RPG: el 20% que causa el 80% de los errores

 

 

Pareto Principle in RPG Development: The 20% That Causes 80% of the Errors

 

*You can read this article in Spanish more down below in this same publish. (Puedes leer este artículo en español más abajo en esta misma publicación)

 

"The distribution of effort is not uniform: a minority of causes produce the majority of effects."
— Vilfredo Pareto

 

What is the Pareto Theorem?



The Pareto Theorem, also called the 80/20 Principle, states that 80% of results come from 20% of the causes.
For example:

  • 80% of sales may come from 20% of customers.
  • 80% of errors in a program may originate from 20% of the code.
  • 80% of problems can be solved by focusing on 20% of critical factors.

This principle is not always exactly 80/20, but it illustrates a natural imbalance that helps prioritize efforts intelligently.

In the world of software development, and specifically within the IBM i environment using RPGLE, it is essential to identify and address the most common errors to improve code quality and team efficiency.
Applying the Pareto Principle, which suggests that 80% of problems come from 20% of causes, allows us to focus our efforts on the areas that have the greatest impact.

 

Most Common Errors in RPGLE

Based on analysis of common errors in RPGLE, the following are identified as the most frequent:

  1. Decimal Data Errors (MCH1202): Occur when trying to use uninitialized numeric data or assigning non-numeric data to numeric variables.
  2. SQL Errors in RPGLE:
    • SQLCODE -204: Object not defined.
    • SQLCODE -803: Unique constraint violation.
    • SQLCODE -305: Null value not allowed.

 

Error Distribution and the Pareto Principle

Although exact statistics are not available, observation in development projects suggests the following approximate distribution:

  • Decimal data errors: 40%
  • SQL errors: 35%
  • Syntax and compilation errors: 15%
  • Other errors: 10%

Applying the Pareto Principle, it is observed that 75% of errors come from decimal data and SQL errors, which represent about 20% of the total possible causes.

 

Strategies to Mitigate the Most Common Errors

  1. Variable Initialization:
    Ensure that all numeric variables are properly initialized before use to avoid decimal data errors.
  2. Input Data Validation:
    Implement rigorous validations for incoming data, especially data interacting with the database.
  3. Proper SQL Error Handling:
    Use structures such as SQLCA to effectively capture and handle SQL errors.

 

3.1 Strategies to Mitigate Common Errors in SQLRPGLE

Based on field experience analysis, technical forums, and IBM publications, these are the most frequent errors:

Error

Description

Approximate % of Occurrence

SQLCODE -305

Attempt to insert NULL where not allowed

     30%

SQLCODE -204

Object (table or view) not found

     25%

SQLCODE -802

Arithmetic error (e.g., division by zero)

     15%

Data conversion errors

Assigning between incompatible types (e.g., char to dec)

     15%

Control flow logic errors

Misuse of fetch, open, or do while loops with cursors

     15%

Result: 70% of errors come from just two types of issues: inserting NULL values incorrectly and using nonexistent or improperly defined objects.
Exactly the 20% of error types generating 80% of the headaches.

 

Applying the Pareto Theorem

 If we educate and reinforce best practices in handling NULLs and validating the existence of SQL objects before using them, we could prevent up to 70–80% of execution errors in SQLRPGLE.

 

Practical Recommendations

1. Control the use of NULLs from the design phase:

  • Correctly declare columns with NOT NULL DEFAULT to avoid accidentally inserting NULL values.
  • Use %NULLIND and IF :NAME_IND = -1 in RPGLE to validate null input.

2. Validate SQL object existence:

  • Use SYSCOLUMNS or SYSTABLES before referencing a table/view.
  • Handle SQLSTATE and SQLCODE after each EXEC SQL.

exec sql

   select count(*) into :quantity

   from qsys2.systables

   where table_name = 'CLIENTES';

 

if quantity = 0;

   // Create table or throw error message

endif;

3. Use error monitors:

exec sql

   insert into clientes (nombre) values (:name);

 

if sqlcode < 0;

   // log error

endif;

 

Conclusion

By focusing on the areas that generate most of the errors, we can significantly improve software quality and development team efficiency.
Applying the Pareto Principle in RPGLE development allows us to prioritize efforts and resources where they are most needed.

Have you identified similar patterns in your projects?
Share your experiences and strategies for mitigating common errors in RPGLE and SQLRPGLE development!

 

If you find it interesting, share it or forward it to a friend. Knowledge is valuable, Share it!

Share your experience in the comments!

Until Next time!

_________________________________________________

Principio de Pareto en el Desarrollo RPG: el 20% que causa el 80% de los errores

 

"La distribución del esfuerzo no es uniforme: una minoría de causas produce la mayoría de los efectos."
— Vilfredo Pareto

 

¿Qué es el Teorema de Pareto?



El Teorema de Pareto, también llamado Principio 80/20, establece que el 80% de los resultados proviene del 20% de las causas.
Por ejemplo:

  • El 80% de las ventas puede venir del 20% de los clientes.
  • El 80% de los errores en un programa puede originarse en el 20% del código.
  • El 80% de los problemas puede solucionarse enfocándose en el 20% de los factores críticos.

Este principio no siempre es exactamente 80/20, pero ilustra una desigualdad natural que ayuda a priorizar esfuerzos de forma inteligente.

 

En el mundo del desarrollo de software, y específicamente en el entorno IBM i con RPGLE, es esencial identificar y abordar los errores más comunes para mejorar la calidad del código y la eficiencia del equipo. Aplicando el Principio de Pareto, que sugiere que el 80% de los problemas provienen del 20% de las causas, podemos focalizar nuestros esfuerzos en las áreas que más impacto tienen.

 

Errores más frecuentes en RPGLE

Basándonos en análisis de errores comunes en RPGLE, se identifican los siguientes como los más recurrentes:

  1. Errores de datos decimales (MCH1202): Ocurren cuando se intenta utilizar datos numéricos no inicializados o se asignan datos no numéricos a variables numéricas.
  2. Errores de SQL en RPGLE:
    • SQLCODE -204: Objeto no definido.
    • SQLCODE -803: Violación de restricción única.
    • SQLCODE -305: Valor nulo no permitido.

 

Distribución de errores y el Principio de Pareto

Aunque no se dispone de estadísticas exactas, la observación en proyectos de desarrollo sugiere la siguiente distribución aproximada:

  • Errores de datos decimales: 40%
  • Errores de SQL: 35%
  • Errores de sintaxis y compilación: 15%
  • Otros errores: 10%

Aplicando el Principio de Pareto, se observa que el 75% de los errores provienen de los errores de datos decimales y de SQL, que representan aproximadamente el 20% del total de posibles causas de errores.

 

Estrategias para mitigar los errores más comunes

  1. Inicialización de variables: Asegurarse de que todas las variables numéricas estén correctamente inicializadas antes de su uso para evitar errores de datos decimales.
  2. Validación de datos de entrada: Implementar validaciones rigurosas para los datos que ingresan al sistema, especialmente aquellos que interactúan con la base de datos.
  3. Manejo adecuado de errores SQL: Utilizar estructuras como SQLCA para capturar y manejar errores de SQL de manera efectiva.

 

3.1 Estrategias para mitigar los errores comunes en SQLRPGLE

Basado en análisis de experiencias en campo, foros técnicos y publicaciones de IBM, estos son los errores más frecuentes:

Error

Descripción

Aproximado % de incidencia

SQLCODE -305

Intento de insertar NULL donde no se permite

     30%

SQLCODE -204

Objeto (tabla o vista) no encontrado

     25%

SQLCODE -802

Error de aritmética (por ej. división por cero)

     15%

Errores de conversión de datos

Asignación entre tipos incompatibles (ej. char a dec)

     15%

Errores de lógica de control de flujo

Mal uso de fetch, open o bucles do while con cursores

     15%

Resultado: 70% de los errores provienen solo de dos tipos de fallos: inserción de datos NULL incorrectamente, y uso de objetos inexistentes o mal definidos. Exactamente el 20% del tipo de errores, generando el 80% de los dolores de cabeza.

 

Aplicando el Teorema de Pareto

🔧 Si educamos y reforzamos buenas prácticas en el tratamiento de NULL y en la validación de existencia de objetos SQL antes de usarlos, podríamos prevenir hasta el 70–80% de los errores de ejecución en SQLRPGLE.

 

Recomendaciones prácticas

1. Controla el uso de NULLs desde el diseño:

  • Declara correctamente columnas con NOT NULL DEFAULT para evitar insertar valores nulos accidentalmente.
  • Usa %NULLIND y IF :NOMBRE_IND = -1 en RPGLE para validar entrada nula.

 2. Verifica existencia de objetos SQL:

  • Usa SYSCOLUMNS o SYSTABLES antes de referenciar una tabla/vista.
  • Maneja SQLSTATE y SQLCODE luego de cada EXEC SQL.

exec sql

   select count(*) into :cantidad

   from qsys2.systables

   where table_name = 'CLIENTES';

 

if cantidad = 0;

   // Crear tabla o lanzar mensaje

endif;

 3. Usa monitores de error.

exec sql

   insert into clientes (nombre) values (:nombre);

if sqlcode < 0;

   // log de error

endif;

 

Conclusión

Al enfocarnos en las áreas que generan la mayoría de los errores, podemos mejorar significativamente la calidad del software y la eficiencia del equipo de desarrollo. Aplicar el Principio de Pareto en el desarrollo de RPGLE nos permite priorizar esfuerzos y recursos en las áreas que más lo necesitan.

¿Has identificado patrones similares en tus proyectos? Comparte tu experiencia y estrategias para mitigar errores comunes en el desarrollo de RPGLE y en SQLRPGLE.

Si te pareció interesante, compártelo o reenvíalo a un amigo. El conocimiento es valioso, compártelo. 

¡Comparte tu experiencia en los comentarios!

¡Hasta la próxima!

 

 

 


Tuesday, August 23, 2022

Pointers (Apuntadores) en RPGLE ¿Que son y para que sirven?

                       

Un apuntador o "pointer" es una variable que contiene la direccion de almacenamiento en memoria de otra variable o de un procedure. En la siguiente imagen tenemos un ejemplo hipotético de almacenamiento en memoria.

 

 

 

Supongamos que tenemos una variable tipo char declarada de 70 posiciones.

 A esa variable la llamaremos: mitexto char(70)

mitexto, según la siguiente imagen, comienza en la dirección de memoria:0000

Aunque en nuestro código de programación podemos manipular la varible mitexto, en realidad no sabemos en cual dirección de memoria es almacenada la data que contiene y, a decir verdad, a nadie le interesa saberlo a menos que, conocer su dirección en memoria y manipularla tuviese alguna utilidad.


En Rpgle Free la variable apuntador se declara asi:
dcl-s Apuntador pointer;

En Rpg No free:  D    Apuntador  S      *  //el asterisco indica que es tipo apuntador

Una variable tipo pointer puede contener la dirección en memoria de una variable o de un procedure. 

Para declarar un apuntador que apunta a un procedure: 

RPGLE NO Free: se agrega en la declaracion de la variable tipo apuntador la palabra clave PROCPTR

RPGLE FREE: se agrega la palabra clave POINTER(*PROC) en lugar de pointer

Un  apuntador que es utilizado para "apuntar a la dirección" de  una variable,  una estructura de datos o a un arreglo se denomina "Basing Pointer". 

 Veamos algunos de los beneficios que aporta utilizar apuntadores:

Monday, August 15, 2022

JSON para desarrolladores en RPGLE IBM, Iseries/JSON for RPGLE Developers

                         


JSON son las siglas de Java Script Object Notation

 Se trata de un Standard internacional para dar formato al envío de la data entre dos plataforma o entre dos lenguajes de programación.

 A partir del 2015 se popularizó este formato superando con creces al formato estandard XML que hasta ese entonces reinaba sin competencia alguna.

Algunos expertos coincide en que JSON ocupa menos espacio y es mas sencillo de interpretar que XML.

JSON soporta los siguiente tipos de data:

  • Numerico
  • String
  • Arreglos (Array)
  • Objetos (Ds= Data Structure, en el caso de RPGLE IBM)
  • Boleanos = true/false
  • Nulos = null       

Para identificar las estructuras de data la sintaxis es la siguiente:

  •  Inicio y fin de data structure (DS): { }  Llave que abre y cierra respectivamente
  •  Inicio y fin de un arreglo : [ ]  Corchete que abre y cierra respectivamente

Para identificar los elementos simples dentro de las estructuras:

  •    "Nombre del elemento": valor del elemento
  •     Los elementos se separan con coma. (,)
El stream de envio siempre comienza con { y termina con }

Veamos el siguiente ejemplo:

Supongamos que queremos enviar en formato JSON los datos contenidos en la siguiente estructura de RPG. DS = Data Structure

 


 Pasos a seguir:

1.-Entender el significado de la estructura que vamos a enviar. En este caso, vamos a enviar el saldo final y el saldo promedio de la cuenta de un cliente de los ultimos tres meses del año 2022 y 2021. Primero el año 2022 y luego el año 2021.

2.-Interpretar la estructura correctamente. Muy Importante!!!

 Se trata de enviar una estructura que contiene 

  • Un elemento simple:  ClientId 
  • Un arreglo de dos elementos: DS_Account. 
       Los elementos del arreglo DS_Account son a su vez, DS.

3.-Colocar la sintaxis correspondiente.

     Enviar un objeto (DS) que tiene:

 {  "Ds_client": {

       A.- Un campo simple (Clientid)  "ClientId": "EX-8976531234" 

       B.- Un arreglo: DS-Account   [

          Cada elemento del arreglo es una DS: {

           B.1-Account_number.  "Account_number":89712345,

           B.2-Year. "Year":2022,

           B.3-Un arreglo Ds-balance de tres elementos. [

           Cada elemento del arreglo es a su vez una DS. {

                  La DS contiene dos elementos simples

                   B.3.1- Balance "Balance": 146.34,

                   B.3.2  Average  "Average": 125.78

         Fin de la DS del primer elemento del arreglo interno  },

          //Segundo elemento del arreglo interno

                   {
                       "Balance": 288.50,
                       "Average": 145.98  
                    },

          //Tercer elemento del arreglo interno

                   {
                           "Balance": 426.80,
                           "Average": 375.95
                   }  

                   ]  //cierra arreglo Ds-balance
               },     //cierra primer elemento del arreglo DS-Account

                .......

                .......

                .......

               Repetimos el proceso para el año 2021, que sería el segundo elemento 

               del arreglo Ds-Account

           A continuación generamos el formato completo de la DS en JSON:

          

Tuesday, July 12, 2022

Recordando Un Viejo Truco. Desarrollo RPGLE. AS400

                           


Vamos a recordar un viejo truco para utilizarlo cuando estamos desarrollando un programa que permita al usuario modificar la data por pantalla.

 Supongamos que tenemos un archivo llamdo MovCuentas conformado por cuatro campos:

  • Fecha  (Key)
  • Cuenta (Key)
  • Monto
  • Moneda

 Luego de mostrar la pantalla al usuario, ejecutando en el programa un EXFMT, debemos validar la data ingresada. Generalmente declaramos los campos en pantalla con nombres distintos a los campos del archivo para no perder los cambios introducidos por el usuario. 

La Secuencia de instrucciones sería algo como esto:

1.-Chain (fecha:Cuenta) MovCuentas

2.-Si el registro existe:

          Movemos los campos del archivo a los campos de pantalla.

     sino

          Mensaje de error

     Endif

3.- El usuario ingresa la data

4.- Chain (fecha:Cuenta) MovCuentas

5.- Movemos los campos de la pantalla al archivo.

6.- Update Movcuentas

El ejemplo anterior es sencillo porque tenemos cuatro campos en pantalla. Sin embargo podemos tener 15 campos o muchos mas. Se vuelve realmente pesado mover los campos de la pantalla al archivo y del archivo a la pantalla y ademas, se genera mucho mas código en el programa del que realmente es necesario.

Para ahorrar código y agilizar nuestro desarrollo podemos hacer lo siguiente:

 

Monday, May 23, 2022

Mejores Prácticas para mejorar el performance -I-

                            


En este oportunidad, tres sencillos tips para mejorar el performance del programa Rpg

 

 

 

 

1.-Subrutinas versus Subprocedures.


El uso de Subprocedure ofrece las siguiente facilidades:

  • Uso de variables locales
  • Pase de parámetros
  • Puede ejecutarse como funciones (Built-in)
  • Puede ser exportado a otros programas.

Si no es necesario utilizar las facilidades que brinda el uso de subprocedures es preferible utlizar subrutinas. 

En general el EXSR se ejecuta más rapidamente que la invocación a un subprocedure.

 

 2.-El uso de SETLL en lugar de CHAIN.

  SETTL y %Equal responde más rapidamente que CHAIN.

Si solamente se  requiere determinar si un registro con cierta clave existe o no existe, es preferible utilizar el settl.

Algunos autores esgrimen que la diferencia es insignificante, sin embargo cuando se trabaja con millones o billones de registros puede ser significativo ahorrar tiempo tanto como sea posible.


3.-Registros Retenidos (Allocated)

Aunque este punto no es una mejora del performance de por sí, es conveniente prestar atención a esto para evitar fallas y retrasos a tiempo de ejecución.

Supongamos que tenemos un archivo declarado update y realizamos la siguiente operación:

        chain (clave1: clave2)  archivo;

        If campo1 = 'Y';

          campo2 = '001';

          update archivo;

       Endif;

 Esta secuencia de instrucciones aparentemente inofensivas puede dejar "allocated" un registro si la condición CAMPO1 = 'Y' no se cumple ya que no hay un ELSE que libere (unlock) el registro retenido con el chain.

      

 

        

     Si te pareció interesante, reenvíalo a un amigo haciendo click en el sobrecito que está al final del artículo o en el enlace de Linkedin que está encima de este mensaje.  El conocimiento es valioso, compártelo. 

    Autor: Ing. Liliana Suárez