viernes, 4 de diciembre de 2020

Estas son las cosas que hacen que los informáticos se rían de nosotros

El título del post coincide con el de un artículo aparecido en la versión digital del periódico El Confidencial. En este artículo se reflejan anécdotas vividas por todos aquellos informáticos que se dedican al soporte. Y cuando decimos "soporte" no nos referimos al hecho de soportar (a veces puede que sí) sino al ámbito del soporte a usuario o, como se dice más técnicamente, asistencia técnica o soporte técnico.

Puedes leer el artículo pinchando aquí.

viernes, 6 de noviembre de 2020

COBOL - cómo terminar un programa cobol

Pensemos en la típica estructura de un programa Cobol:

          INICIO
          TRATAMIENTO hasta <<fin-fichero-entrada>>
          FIN

Dentro del párrafo FIN solemos tener el cierre de los ficheros utilizados por el programa (los de entrada y salida) y los display's necesarios para mostrar las estadísticas (si tienes costumbre de ponerlos para reflejar cuántos registros se han leído del fichero de entrada, cuántos registros se han grabado en el fichero de salida y alguna cosa más que resulte de interés).

Si el programa ha llegado al párrafo FIN y ha sido capaz tanto de cerrar correctamente los ficheros utilizados como de mostrar las estadísticas significa que el programa ha terminado correctamente. Pero necesitamos algo más para que el jcl donde se ejecuta se entere de que ese programa ha finalizado correctamente.

Y te preguntarás: "Y, ¿qué es lo que se necesita?". Pues la respuesta es muy sencilla. Incluir las siguientes dos sentencias:

          MOVE ZEROS TO RETURN-CODE
          GOBACK

Éste es todo el código que necesitas para indicar la correcta finalización del programa.

Ahora bien, imagínate que necesitas que el programa finalice con un código distinto (por ejemplo, un código de retorno 2) en determinadas situaciones como puede ser que el fichero de salida esté vacío o que el fichero de errores contenga información. Antes de que te preguntes cómo se hace te lo voy a contar ya. Se hace de la siguiente manera:

          IF CONT-GRAB-FIC-SALIDA = 0
              MOVE 2 TO RETURN-CODE
              GOBACK
          END-IF

          IF CONT-GRAB-FIC-ERRORES > 0
              MOVE 2 TO RETURN-CODE
              GOBACK
          END-IF

OJO!!! Las líneas de código que acabamos de indicar como ejemplo para finalizar el programa con un código de retorno distinto de 0 se deben codificar en el programa antes que las otras líneas de código de finalización correcta. Y, ¿por qué? Porque si invertimos el orden y pusiéramos primero el código que indica la correcta finalización del programa, siempre finalizaríamos el programa correctamente y NUNCA devolvería el código de retorno 2 aunque se cumplan las casuísticas indicadas.

viernes, 2 de octubre de 2020

MongoDB

Aquí os dejamos interesantes vídeos acerca de MongoDB (base de datos de tipo NoSQL).

MongoDB en 20 minutos


¿Qué es SQL y NoSQL?


NoSQL VS SQL


viernes, 4 de septiembre de 2020

HOST - comando unnum

Seguro que te ha pasado alguna que al final del fichero aparece los números de secuencia. Si quieres eliminarnos y poder editar el fichero sólo tienes que ejecutar el comando unnum o unnumber.

En la línea donde pone Command ===> sólo tienes que poner el comando indicado y solucionado.

Para más información acerca de este comando sólo tienes que pinchar aquí.

viernes, 14 de agosto de 2020

Fundamentos de la programación

Apuntes muy interesantes y completos de la asignatura Fundamentos de la programación de la Facultad de Informática (UCM).

Pinchar aquí para acceder a dichos apuntes en formato pdf (interesantes por la abstracción procedimental y por la visión completa de C++).

viernes, 10 de julio de 2020

Jcl - DISP=(OLD,DELETE,KEEP)

Habitualmente solemos ver lo siguiente en los pasos de sort de los jcl's:

          //SORT01 EXEC PGM=SORT
          //SORTIN    DD DSN=FICH.PRUEBA.ENTRADA,
          //               DISP=SHR
          //SORTOUT DD DSN=FICH.PRUEBA.SALIDA,
          //                     DISP=(,CATLG,DELETE),
          //                     SPACE=(CYL,1,1)
          //SORTWK01 DD SPACE=(CYL,(1,1),RLSE)
          //SYSOUT     DD SYSOUT=*
          //SYSIN        DD *
              SORT FIELDS=COPY

Sin embargo, también podemos poner algo como lo siguiente:

          //SORT02 EXEC PGM=SORT
          //SORTIN    DD DSN=FICH.PRUEBA.ENTRADA,
          //               DISP=(OLD,DELETE,KEEP)
          //SORTOUT DD DSN=FICH.PRUEBA.SALIDA,
          //                     DISP=(,CATLG,DELETE),
          //                     SPACE=(CYL,1,1)
          //SORTWK01 DD SPACE=(CYL,(1,1),RLSE)
          //SYSOUT     DD SYSOUT=*
          //SYSIN        DD *
              SORT FIELDS=COPY

Lo primero de todo: en ambos casos debe existir el fichero que se está utilizando en el SORTIN, es decir, el fichero FICH.PRUEBA.ENTRADA debe existir para que no falle ni el paso de sort SORT01 ni el paso de sort SORT02.

Ahora vamos a ver qué diferencia hay entre lo utilizado en el paso SORT01 y lo utilizado en el paso SORT02: DISP=SHR y DISP=(OLD,DELETE,KEEP).

DISP=SHR: Con esta disposición nos limitamos a utilizar el fichero, SHR viene del inglés SHARE (que significa 'compartir'). Resulta que seguirá existiendo el fichero FICH.PRUEBA.ENTRADA cuando finalice el jcl, por lo tanto, no nos tenemos que olvidar de incluir un paso de borrado al final del jcl para borrar este fichero de trabajo junto con todos los demás que se generen a lo largo del mismo jcl.
DISP=(OLD,DELETE,KEEP): Con esta disposición lo que conseguimos es que el fichero FICH.PRUEBA.ENTRADA se borre automáticamente cuando termine OK el paso SORT02; sin embargo, el mencionado fichero seguirá existiendo en el caso hipotético de fallo en el paso SORT02 (lo que nos permite relanzar desde ese mismo paso).

viernes, 19 de junio de 2020

Validar un XML

¿Quieres saber si un XML es correcto? Para validarlo puedes usar la herramienta XML Validator: https://www.w3schools.com/xml/xml_validator.asp

Si en algún momento no se pudiera acceder a dicho validador, puedes acceder a la página de w3schools existente en la sección Webs de interés de este mismo blog.

viernes, 5 de junio de 2020

HOST - TSO línea de comandos

Pinchando aquí accederás a un listado con los diferentes comandos que puedes usar cuando estés trabajando en el tso del host.

Es muy útil porque en ocasiones se nos olvida qué comando utilizar cuando queremos hacer algo en concreto y necesitamos un lugar dónde buscar algo que nos sirva.

viernes, 22 de mayo de 2020

¿Excel ante su ocaso?

Podríamos estar ante el ocaso de Excel debido a dos motivos: (1) se podría haber quedado obsoleto para muchas compañías y (2) otras aplicaciones están comenzado a ganar mercado.

Si te interesa este tema, puedes leer el artículo completo pinchando aquí.

viernes, 8 de mayo de 2020

Compilador cobol online

piaza.IO es un editor y compilador en línea donde puedes escribir y ejecutar código instantáneamente.

viernes, 24 de abril de 2020

Programación WEB

A la hora de aprender programación WEB hay una serie de cosas que viene bien saber y por ello os recomiendo los siguientes pdf's que tienen muy buena pinta:


Esto ha sido todo por hoy, si encuentro algo más y que sea de interés lo adjuntaré a continuación como actualización del post.

viernes, 3 de abril de 2020

Jcl - comprobar si un fichero tiene datos

Mediante jcl podemos comprobar si un fichero tiene datos.

Veamos un ejemplo:

          //*******************************************************
          //FICVACIO EXEC PGM=IDCAMS
          //FENTRADA DD DSN=DD.EE.JJJJJJJJ.FICHEROA.VERIFICA,
          //                      DISP=SHR
          //FSALIDA DD DUMMY
          //SYSPRINT DD SYSOUT=*
          //SYSIN DD *
               REPRO COUNT(1)      -
               INFILE(FENTRADA)    -
               OUTFILE(FSALIDA)
          //*******************************************************

Con este paso detectamos si el fichero DD.EE.JJJJJJJJ.FICHEROA.VERIFICA está vacío o, por el contrario, tiene datos. Simplemente tenemos que comprobar el código de retorno devuelto por este paso ya que si devuelve:

  • el valor 4 significa que está vacío
  • el valor 0 significa que tiene datos

Por lo tanto, el código de retorno 4 en el paso FICVACIO no debe significar la cancelación de este proceso.

viernes, 20 de marzo de 2020

Linux

Manual práctico de linux con ejercicios.

Si queréis un ejemplar sólo tenéis que pinchar aquí.

viernes, 6 de marzo de 2020

Cobol - foros de cobol

En la actualidad tenemos que internet está plagado de foros acerca de cualquier tema que nos podamos imaginar. Y "nuestro querido" lenguaje Cobol no podía ser una excepción.

Seguro que alguno de vosotros conoce alguno. O a lo mejor no. Sea como sea nos gustaría hablaros de COBOL Foro, un foro sobre Cobol (valga la redundancia).

¿Por qué queremos hablaros de este foro? Porque nos ha gustado el hecho de que no es necesario darse de alta para crear un post. Esto es muy útil, o al menos nos lo ha parecido desde Programación e Informática Fácil, cuando tienes una duda y quieres que te ayuden desde un foro pero no sabes cuándo será la próxima vez que vas a plantear otra duda.

viernes, 21 de febrero de 2020

Excel - vídeos en youtube

Youtube es un pozo sin fondo para aprender Excel a través de los diferentes vídeos existentes en dicha plataforma. Para muestra un botón:

30 trucos de Excel que todos deben saber

Cómo armar un dashboard en Excel

Espero que os resulten interesantes estos ejemplos.

viernes, 7 de febrero de 2020

Cobol - cruce de ficheros

Veamos cómo es el cruce de ficheros.

La estructura de un programa Cobol (o el cualquier otro lenguaje) suele ser:

     INICIO
     TRATAMIENTO hasta FIN-FICHERO-ENTRADA
     FINAL

En el cruce tendríamos:

     INICIO
     TRATAMIENTO hasta FIN-FICHERO1 y FIN-FICHERO2
     FINAL

En el párrafo INICIO tendríamos la primera lectura de ambos ficheros. En cada  una de las lecturas se debe tener en cuenta lo siguiente:
  1. Si el file-status es 0 se debe mover la clave leída del fichero a CLAVE1 (si hemos leído del FICHERO1) o a CLAVE2 (si hemos leído del FICHERO2).
  2. Si el file-status es 10, no sólo hay que activar el correspondiente switch que indica que se ha llegado a final de fichero, sino que además hay que mover HIHG-VALUES a CLAVE1 (si hemos leído del FICHERO1) o a CLAVE2 (si hemos leído del FICHERO2).

En el párrafo TRATAMIENTO (que se ejecuta hasta que finalicen ambos ficheros) tendríamos la comparación de claves:

     EVALUATE TRUE
           WHEN CLAVE1 = CLAVE2
                  DISPLAY 'HAY CRUCE. CLAVE1: ' CLAVE1 '. CLAVE2: ' CLAVE2
                  PERFORM LEER-FICHERO2
           WHEN CLAVE1 < CLAVE2
                  DISPLAY 'CLAVE1 no existe en FICHERO2'
                  PERFORM LEER-FICHERO1
           WHEN CLAVE1 > CLAVE2
                  DISPLAY 'CLAVE2 no existe en FICHERO1'
                  PERFORM LEER-FICHERO2
           WHEN OTHER
                  CONTINUE
     END-EVALUATE

          Nota: Se pone WHEN OTHER, aunque no llegue a ejecutarse nunca, por-
          que por temas de calidad todo EVALUATE tiene que tener WHEN OTHER.

Espero que os sirva de ayuda si tenéis que hacer un programa de cruce en Cobol.

viernes, 24 de enero de 2020

¿Buscando profesor particular de informática?

Como título de este post se ha realizado una pregunta muy clara, en caso afirmativo os vamos a realizar la siguiente recomendación: no dudéis en poneros en contacto con Sergio Lobo Del Olmo (pinchar aquí para concertar vuestra clase particular).

Da clases tanto a domicilio como online (webcam, skype, classgap). En el caso de las clases a domicilio se desplaza a Madrid capital, Leganés, Getafe, Alcorcón y Fuenlabrada.

En Programación e Informática Fácil le conocemos y os podemos asegurar que es un buen profesor. Si buscáis profesor, es una gran opción (o, incluso, nos atreveríamos a decir que la mejor).

viernes, 10 de enero de 2020

Jcl - OUTREC (1)

Antes de empezar a hablar del OUTREC, vamos a recordar ciertos conceptos tales como los siguientes: los diferentes tipos de dato que hay y la longitud de los mismos.

Para repasar los diferentes tipos de dato que hay podéis pinchar aquí. En dicha entrada se explica cómo ordenar un fichero mediante un sort en un jcl, y de paso se explicó lo de los tipos de dato existentes.

Y para repasar la longitud de los mismos podéis pinchar aquí. Bien es verdad que se está explicando desde el enfoque de Cobol pero se puede hacer extensible a los jcl's ya que:

     - un alfanumérico (CH) que sea de 10 posiciones, su longitud es 10.
     - un numérico editado (ZD) que sea de 9 posiciones, su longitud es 9.
     - un numérico COMP tenga o no tenga signo (BI), hay que tener en cuenta
       las posiciones decimales ya que:
              - si no tiene decimales, su longitud se corresponde con el resultado
                de dividir la parte entera entre 2 despreciando los decimales que
                se obtengan en la división
                Ejemplo 1: 7/2 = 3'5 - longitud 3
                Ejemplo 2: 8/2 = 4    - longitud 4
              - si tiene decimales, su longitud se obtiene con la siguiente fórmula:
                    PASO 1. Sumamos la parte entera y los decimales:
                      Ejemplo 1: 7 + 2 = 9
                      Ejemplo 2: 8 + 2 = 10
                    PASO 2. Al anterior resultado le sumamos 1 y obtenemos un 
                    nuevo resultado al que dividimos entre 2:
                      Ejemplo 1: 9 + 1 = 10 ----- 10/2
                      Ejemplo 2: 10 + 1 = 11 ---- 11/2
                    PASO 3. Si el resultado da decimales se redondea al mayor y lo 
                    que se obtiene es la longitud
                       Ejemplo 1: 10/2 = 5
                       Ejemplo 2: 11/2 = 5'5 - se redondea a 6
     - un numérico COMP-3 tenga o no tenga signo (PD), hay que tener en
       cuenta las posiciones decimales como en el caso anterior ya que:
              - si no tiene decimales, partiríamos de la parte entera y le aplicamos
                los pasos 2 y 3 de la fórmula anterior
              - si tiene decimales, su longitud se obtiene aplicando todos los pasos
                de la fórmula anterior.

Bien, ahora que hemos refrescado estos conceptos vayamos a por el OUTREC. Vamos a familiarizarnos con su funcionamiento a base de ejemplos práctios, para ello, vamos a suponer que el campo comienza en la primera posición.

Conversión 9(8) a S9(9) COMP-3 y viceversa

OUTREC FIELDS=(1,8,ZD,TO=PD,LENGTH=5)
OUTREC FIELDS=(1,5,ZD,TO=PD,LENGTH=8)

Conversión 9(8) COMP a 9(8) y viceversa

OUTREC FIELDS=(1,4,BI,TO=ZD,LENGTH=8)
OUTREC FIELDS=(1,8,ZD,TO=BI,LENGTH=4)

Cambiar datos

Imaginemos que tenemos un fichero de entrada como el siguiente:



Para sustituir los espacios por ceros con OUTREC:

OUTREC FIELDS=(1,9,10,10,
           CHANGE=(10,C'          ', C'0000000000'),NOMATCH=(10,10))


Otra forma:

OUTREC FIELDS=(1,9,10,10,CHANGE=(10,C'40404040404040404040'
           C'0000000000'),NOMATCH=(10,10))

Y el fichero de salida quedaría así:



Continuemos con el siguiente OUTREC.

Máscaras de edición


Imaginemos que tenemos un fichero de entrada como el siguiente:



Donde tenemos lo siguiente:

     - una fecha (posiciones del 5 al 10)
     - una hora (posiciones del 20 al 25)
     - importe 1 comprimido (posiciones del 21 al 31)
     - importe 2 (posiciones del 32 al 35)
     - importe 3 (posiciones del 36 al 45)
     - importe 4 (posiciones del 46 al final)

Utilizamos máscaras:

OUTREC FIELDS=(01,04,
                           05,06,ZD,M9,LENGTH=8,
                           11,09,
                           20,06,ZD,M8,LENGTH=8,
                           26,06,PD,
                           32,04,ZD,M18,LENGTH=4,
                           36,10,ZD,M4,LENGTH=11,
                           46,10,ZD,M26,LENGTH=11)

Tras la utilización de las máscaras mostradas obtenemos el siguiente fichero de salida:



Esto ha sido todo por hoy.