miércoles, 2 de noviembre de 2011

Cobol: Varchar

     Recuerdo que en una ocasión tuve que crear un módulo de servicio para una tabla DB2 y esa tabla tenía un campo que era un varchar. A la hora de manejar ese campo me daban una serie de errores debido a un manejo incorrecto del mismo. Por lo tanto, ¿cómo se debe manejar un dato de tipo varchar para que no se produzcan errores? Contestaré a esta pregunta mediante un ejemplo.

     Supongamos que tenemos una tabla DB2 llamada TPEDIDOS. En esta tabla tenemos los siguientes campos:

                    01 TPEDIDOS.
                         05 COD-PED     PIC X(06).
                         05 FECHA-PED  PIC X(10).
                         05 PROVEEDOR PIC X(15).
                         05 COD-PROD   PIC 9(03).
                         05 DIR-ENV.
                             49 DIR-ENV-E-LEN   PIC S9(4) COMP.
                             49 DIR-ENV-E-TEXT PIC X(500).

     En azul se ha marcado el campo de tipo varchar.

     Supongamos que el módulo de servicio de la tabla TPEDIDOS (o rutina cobol para realizar las operaciones básicas sobre la tabla como SELECT, INSERT, UPDATE y DELETE) tiene la siguiente copy:


                    01 R-PEDIDOS.
                         05 ENTRADA.
                             10 E-COD-PED     PIC X(06).
                             10 E-FECHA-PED  PIC X(10).
                             10 E-PROVEEDOR PIC X(15).
                             10 E-COD-PROD   PIC 9(03).
                             10 E-DIR-ENV.
                                 15 E-DIR-ENV-E-LEN   PIC S9(4) COMP.
                                 15 E-DIR-ENV-E-TEXT PIC X(500).
                         05 SALIDA.
                             10 S-COD-RETORNO PIC 9(01).
                             10 S-COD-SQLCODE PIC 9(03).
                             10 S-COD-MENSAJE  PIC X(50).


     En azul se ha marcado el campo de tipo varchar.

     A continuación vamos a ver cómo se debe informar el campo de tipo varchar antes de llamar al módulo de servicio (Informar campo de tipo varchar) y cómo se ven afectadas las sentencias SQL en el módulo de servicio al utilizarse un campo de este tipo (Ejecución de sentencias SQL en el módulo de servicio).

Informar campo de tipo varchar

     En el caso de querer realizar un alta (INSERT) o modificación (UPDATE) de la tabla mediante el módulo de servicio, lo primero que hay que hacer antes de llamar al módulo de servicio para ejecutar la sentencia SQL correspondiente es informar el campo de tipo varchar de la copy del módulo de servicio tal y como se indica a continuación:

          MOVE 35                                                        TO E-DIR-ENV-E-LEN
          MOVE 'C\ DESCONOCIDA Nº7 NAVE 1D CP 28045' TO E-DIR-ENV-E-TEXT

     Nótese que se está asignando una cadena a E-DIR-ENV-E-TEXT y, como su longitud es 35, se está asignando dicho valor a E-DIR-ENV-E-LEN. Es muy importante que la longitud de la cadena coincida con el valor numérico que se está asignando a E-DIR-ENV-E-LEN porque de lo contrario, cuando se quisiera mostrar el valor de la dirección, no se mostraría el texto tal cual sino una cadena menor o mayor. Es decir, si en lugar de asignar a E-DIR-ENV-E-LEN la longitud de la cadena, que dijimos es 35, se le asigna:
  • un valor menor, por ejemplo 20, por mucho que asignemos el texto anterior a E-DIR-ENV-E-TEXT lo que se mostraría cuando se hiciera un display de la dirección es un texto de longitud 20 cuyo valor sería el siguiente: C\ DESCONOCIDA Nº7 N
  • un valor mayor, por ejemplo 40, por mucho que asignemos el texto anterior a E-DIR-ENV-E-TEXT lo que se mostraría cuando se hieciera un display del campo es un texto de longitud 40 cuyo valor sería el mostrado anteriormente (C\ DESCONOCIDA Nº7 NAVE 1D CP 28045) con espacios en blanco al final hasta rellenar las otras 5 posiciones
Ejecución de sentencias SQL en el módulo de servicio

     En el módulo de servicio hay que tener en cuenta los siguientes puntos para poder manejar correctamente ese campo:
  • Tanto en el alta (INSERT) como en la modificación (UPDATE) se deben informar los dos campos que forman parte de E-DIR-ENV tal y como se ha indicado anteriormente, es decir, el campo en el que se guarda la longitud del texto (E-DIR-ENV-E-LEN) y el campo en el que se guarda el texto (E-DIR-ENV-E-TEXT). A la hora de ejecutar la sentencia SQL correspondiente (INSERT o UPDATE), es la variable E-DIR-ENV la que se inserta y/o modifica.
  • Cuando se realiza la consulta (SELECT) se lee el campo de tipo varchar. Tras haber ejecutado la correspondiente sentencia SQL, lo que se hace es asignar el valor de cada uno de los campos que componen el campo de tipo varchar de la tabla (el de la longitud y el del texto) a los correspondientes campos de salida de la copy del módulo de servicio: las cuales son E-DIR-ENV-E-LEN y E-DIR-ENV-E-TEXT (E-DIR-ENV).