Ir al Portal Ir al Foro
 

Campo numerico en transaccion Cics

Todo lo relacionado con Cobol en ambientes batch, online(CICS,IMS) con bases de datos(DB2, Adabas) etc.

Campo numerico en transaccion Cics

Notapor sunnver » 29 Mar 2008, 08:43

Hola:
Soy nuevo en esto del Cobol. Me han encargado realizar un programa para ejecutar una nueva transaccion Cics. En dicha transacción tengo basicamente dos opciones alta y modificacion de los registros de una bbdd.
El caso es que alguno de los campos de dicha bbdd, tiene un formato numerico 9(9) comp. Mi problema surge a la hora de aceptar un nuevo datos para dichos campos, ya que no se como hacer para validar que el dato teclado sea numerico, que tenga dos decimales, que solo admida coma...
Gracias por vuesta ayuda, anticipadamente
sunnver
 

Re: Campo numerico en transaccion Cics

Notapor lucaspolidori » 30 Mar 2008, 00:16

Mira, no se si te sirve de ayuda, lo que entiendo es que lo que queres hacer es validar ese campo una vez que vas a procesarlo para cargar o modificar la tabla.
Pues bien, si es eso, debes realizar una validación del campo que envias al COBOL, para eso puedes usar la opción NUMERIC, mediante un if.
Ej:
IF "campo" IS NUMERIC .....
aca deberías validar tambièn lo de la coma y no el punto.
....
....
ELSE
.....
.....
END-IF.

Lo que no puede ayudarte es con el tema de la validaciòn de la coma.
Lo que te recomendaría es que dejes que el usuario ingrese lo que quiera y luego tu dentro del COBOL remplazas el punto por la coma o bien no segunte convenga.
Bueno, espero te sea de utilidad y alguien pueda ayudarte un poco más.
lucaspolidori
 

Re: Campo numerico en transaccion Cics

Notapor sunnver » 30 Mar 2008, 06:33

Gracias por tu respuesta. Tengo un campo definido en el mapa BMS de 10 posiciones y un campo en la tabla 9(9) comp. El el mapa deberia presentar el dato en formato pic zzzzzzz9,99. El problema esta en que cuando entras en el mapa se posiciona en la primera posicion ya que la variable de intercambio de datos con el mapa es x(10). Por lo que he de pasar de un x(10) con un coma incluida a un 9(9) sin coma despues de haber validado que es numerico. Si verifico la entrada de la varible de intercambio con el mapa me dice que no es numerica al contener una coma. Ademas esta coma puede estar en diferentes posiciones despendiendo del numero.
sunnver
 

Notapor carlossperoni » 30 Mar 2008, 16:17

Hola Sunver,

Para ayudarte lo primero es entender bien tu problema.

Esto es lo que yo entiendo de tu descripcion, por favor corregirme si no es lo correcto:

a) tienes un campo de entrada pic x(10) que puede contener cualquier cosa.
b) quieres validar que contenido de este campo representa un valor numerico.
c) puede contener espacios al comienzo y/o al final.
c) el numero representado puede incluir o no una coma decimal.
d) el valor numerico representado en ese campo se debe trasladar a un campo PIC 9(9).

Ahora mis preguntas:

1) se acepta un signo +/- en la entrada?, si es asi que hacer con el '-' dado que el campo receptor es sin signo.
2) dado que el campo receptor es entero sin decimales que se hace con la parte decimal del valor, se trunca, se redondea o que?
3) dado que el campo de entrada es X(10), el mismo puede contener espacios embebidos entre los digitos, que se hace con esto espacios se los ignora o se los considera como ceros.
4) existe alguna restriccion en cuanto a que verbos COBOL se pueden utilizar? por ejemplo INSPECT.

Espero tu respuesta mientras pienso en algun ejemplo para pasarte.
Carlos Emilio Speroni
Vicente Lopéz - Argentina

El GoTo no es el malo de la película, los malos son algunos programadores.
Si no existiese la instrucción branch (GoTo) los procesadores no servirían para nada.
Avatar de Usuario
carlossperoni
Colaborador
Colaborador
 
Mensajes: 106
Registrado: 10 Jun 2005, 19:05
País: Argentina
Ciudad: Vicente Lopéz
Ocupación: System Programmer

Notapor sunnver » 30 Mar 2008, 17:38

Hola:
Gracias por tu ayuda. Te aclaro: El campo de entrada es efectivamente un x(10) para poder contener un un 9(9) expresado en zzzzzz9,99. El valor del campo esta en centeuros es decir euros multiplados por 100. Ejem
9,50 Euros = 950 Centeuros. En ningun momento podra contener un valor inferior a cero. Podra contener un valor entrero, pero sera expresado con dos decimales: por lo que en el proceso de entrada podran teclearnos un valor entero o un valor con decimales y tendremos que validar la coma. Los espacios restantes del valor tecleado seran despreciados. No hay restricciones en cuanto al cobol. Usamos Cobol II para mvs.
sunnver
 

Saludos ....¡¡¡

Notapor hdezmm » 31 Mar 2008, 14:56

Hola, en el mapa en donde lo definiste en uno de los atributos ponle num,
adicionalmente puedes ponerle PICIN(zzzzzz9.00) y/o Picout.

AL ponerle el atributo NUM, cuando lo ensambles veras que en el copy en vez de poner PIC X(10) le debe poner Pic 9(10).

todo esto esta en el manual de cics en el capitulo de BMS (basic mapping support)


NUM
ensures that the data entry keyboard is set to numeric shift for this field unless the operator presses the alpha shift key, and prevents entry of nonnumeric data if the Keyboard Numeric Lock feature is installed.



PICIN (COBOL and PL/I only)
specifies a picture to be applied to an input field in an IN or INOUT map; this picture serves as an editing specification that is passed to the application program, thus permitting the user to exploit the editing capabilities of COBOL or PL/I. BMS checks that the specified characters are valid picture specifications for the language of the map.



However, the validity of the input data is not checked by BMS or the high-level language when the map is used, so any desired checking must be performed by the application program. The length of the data associated with "value" should be the same as that specified in the LENGTH operand if LENGTH is specified. If both PICIN and PICOUT (see below) are used, an error message is produced if their calculated lengths do not agree; the shorter of the two lengths is used. If PICIN or PICOUT is not coded for the field definition, a character definition of the field is automatically generated regardless of other operands that are coded, such as ATTRB=NUM.
Saludos desde Mexico DF
----------------------------------------------------
Lo importante no es saber ..... sino tener el telefono del que sabe .... :-))
hdezmm
Colaborador
Colaborador
 
Mensajes: 110
Registrado: 16 Jun 2007, 02:49
País: Mexico
Ciudad: Sin especificar
Ocupación: Programador

Notapor sunnver » 31 Mar 2008, 16:47

Gracias hdezmm por la colaboracion. Para unificar toda la instalacion, el mapa bms lo definimos sin formato de salida y es en el programa donde definimos la salida de la variable. Pero mi problema es como validar la entrada tecleada por el usuario.
sunnver
 

Saludos

Notapor hdezmm » 02 Abr 2008, 19:50

Ok, entiendo que cuando ensamblaste el mapa el copy que genera en donde te pone campos de entrada y campos de salido, no lo ocupaste y tu definiste el tuyo.

Pero el atributo que te comento de define en la declaracion del mapa y es independiente del copy de datos.

Cuando queda el modulo de carga del mapa, aun sin tener una solo linea de codigo puedes probar el mapa y verificar la entrada de campos, si tu definiste un campo en el mapa con el atributo numerico, cuando intentes meter letras o la pantalla marca error y aun sin existir programa, estos es lo que hace BMS te valida cada campo de acuerdo a la definicion del campo.

Tambien por atributo de mapa puedes ponerle zeros de inicio, justificarlo a la derecha o izquierda, que rellene con ceros los campos faltantes

Esto te asegura que el usuario solo podra poner numero en el campo que quieres y no es necesario que el usuario digite ceros a la izquierda para introducir un dato.

Ahora como complemento de esto si tu definiste tu copy, en el programa puedes usar la instruccion BIF DEEDIT para normalizarlo.
Saludos desde Mexico DF
----------------------------------------------------
Lo importante no es saber ..... sino tener el telefono del que sabe .... :-))
hdezmm
Colaborador
Colaborador
 
Mensajes: 110
Registrado: 16 Jun 2007, 02:49
País: Mexico
Ciudad: Sin especificar
Ocupación: Programador

Notapor carlossperoni » 02 Abr 2008, 22:50

Hola sunnver.

Te copio un programa de ejemplo que te puede servir yo lo probe en mi PC y me funciona OK.

De alli deberias corta y pegar en tu programa:

- toda la parte de la Working definida en '01 AREA-TRABAJO-VALIDAR.'
- toda la parte de la Procedure definida como ' VALIDAR-ENTRADA SECTION.'

Luego en tu programa para validar el campo deberas incluir:

MOVE tu campo de entrada TO CAMPO-ENTRADA.
PERFORM VALIDAR-ENTRADA.
IF NOT ENTRADA-OK GO TO tratar el error......

En el campo CODIGO-ERROR te queda el codigo del error, y si no hubo error (es decir que el campo de entrada es valido) en el CAMPO-SALIDA queda el valor convertido al formato que tu necesitas.

Espero que te sirva como base para lo que tu quieres resolver.

Quedo a tu disposicion para cualquier consulta o aclaracion que consideres necesaria.

------------ Programa Ejemplo de validacion -----------
Código: Seleccionar todo
IDENTIFICATION DIVISION.
 PROGRAM-ID. CARLOS.
 ENVIRONMENT DIVISION.
 CONFIGURATION SECTION.
 SOURCE-COMPUTER. IBM-PC.
 OBJECT-COMPUTER. IBM-PC.
 INPUT-OUTPUT SECTION.
 FILE-CONTROL.
 DATA DIVISION.
 FILE SECTION.
 WORKING-STORAGE SECTION.

 01 AREA-TRABAJO-VALIDAR.
    03 INDICE-ENTRADA                     PIC S9(4) COMP.
    03 PROXIMO-BYTE                       PIC S9(4) COMP.

    03 PRIMER-DIGITO-ENTERO               PIC S9(4) COMP.
    03 LONGITUD-ENTERO                    PIC S9(4) COMP.
    03 PRIMER-DIGITO-DECIMAL              PIC S9(4) COMP.
    03 LONGITUD-DECIMAL                   PIC S9(4) COMP.

    03 CAMPO-ENTRADA                      PIC X(10).
    03 CAMPO-ENTRADA-ABIERTO   REDEFINES CAMPO-ENTRADA.
       05 BYTE-ENTRADA         OCCURS 10  PIC X.

    03 CAMPO-SALIDA                       PIC 9(9).

    03 CODIGO-ERROR                       PIC X.
       88 ENTRADA-OK                      VALUE '0'.
       88 ERROR-SOLO-ESPACIOS             VALUE '1'.
       88 ERROR-CAMPO-NO-NUMERICO         VALUE '2'.
       88 ERROR-ESPACIOS-EMBEBIDOS        VALUE '3'.
       88 ERROR-FALTAN-LOS-DECIMALES      VALUE '4'.
       88 ERROR-MAS-DE-UNA-COMA           VALUE '5'.
       88 ERROR-ENTERO-MAS-DE-7-DIGITOS   VALUE '6'.
       88 ERROR-DECIMAL-MAS-DE-2-DIGITOS  VALUE '7'.   

 PROCEDURE DIVISION.

 PEDIR-DATOS.
     MOVE SPACES TO CAMPO-ENTRADA.
     ACCEPT CAMPO-ENTRADA FROM CONSOLE.
     IF CAMPO-ENTRADA EQUAL 'FIN' STOP RUN.
     PERFORM VALIDAR-ENTRADA.
     DISPLAY '!' CAMPO-SALIDA '!' UPON CONSOLE.
     GO TO PEDIR-DATOS.

     
 VALIDAR-ENTRADA  SECTION.

*-----------------------------------------------------------------
* Valida que el contenido de CAMPO-ENTRADA PIC X(10) represente
* un numero de la forma 'x' o 'x,y'. 
* Luego la entrada es dejada como el valor numerico 'xy' en el
* campo CAMPO-SALIDA PIC 9(9).
*
* Donde:
*  - en la entrada:
*        x es la parte entera de hasta 7 digitos significativos
*        y es la parte decimal de hasta 2 digitos significativos
*
*  - en la salida:
*        x es la parte entera de 7 digitos.
*        y es la parte decimal de 2 digitos.
*
* Aclaración:
*
*  - si por ejemplo la entrada es '0001234567', se considera que
*    'x' es '1234567' y se acepta como valido (los digitos
*    significativos son 7).
*
*  - si la entrada es '12,3400', se considera que 'y' es '34' y
*    se acepta como valido (los digitos significativos son 2).
*-----------------------------------------------------------------

*--- Inicializar.
     SET ENTRADA-OK TO TRUE.
     MOVE ZERO TO LONGITUD-ENTERO LONGITUD-DECIMAL.

*--- Ignorar los posibles espacios inciales en la entrada.
     PERFORM VARYING INDICE-ENTRADA FROM 1 BY 1
                 UNTIL INDICE-ENTRADA GREATER 10
                 OR BYTE-ENTRADA(INDICE-ENTRADA) NOT EQUAL SPACE
       CONTINUE
     END-PERFORM. 
   
     IF  INDICE-ENTRADA GREATER THAN 10
         SET ERROR-SOLO-ESPACIOS TO TRUE
         GO TO FIN-VALIDAR-ENTRADA.

*--- Preservar la posicion del supuesto digito inicial de la
*    parte entera del numero.
     MOVE INDICE-ENTRADA TO PRIMER-DIGITO-ENTERO PROXIMO-BYTE.

*--- Buscar el final de la parte entera del numero.
     PERFORM VARYING INDICE-ENTRADA  FROM PROXIMO-BYTE  BY 1
                 UNTIL INDICE-ENTRADA GREATER 10
                 OR BYTE-ENTRADA(INDICE-ENTRADA) NOT NUMERIC
       CONTINUE
     END-PERFORM. 

     MOVE INDICE-ENTRADA TO PROXIMO-BYTE.

*--- Calcular la longitud en bytes de la parte entera.
     COMPUTE
       LONGITUD-ENTERO = INDICE-ENTRADA - PRIMER-DIGITO-ENTERO.

*--- Verificar si por lo menos hay un digito en la parte entera.
     IF  LONGITUD-ENTERO EQUAL 0
         SET ERROR-CAMPO-NO-NUMERICO TO TRUE
         GO TO FIN-VALIDAR-ENTRADA.

*--- Determinar que sigue a la parte entera del numero.
     IF  INDICE-ENTRADA LESS OR EQUAL 10
         IF  BYTE-ENTRADA(INDICE-ENTRADA) EQUAL ','
             GO TO ENCONTRE-LA-COMA.

*--- Hasta aqui solo tengo digitos de la parte entera (no hay
*    coma) y el resto del campo si lo hay debe ser espacios.
     PERFORM VARYING INDICE-ENTRADA  FROM PROXIMO-BYTE  BY 1
             UNTIL INDICE-ENTRADA GREATER 10

       IF  BYTE-ENTRADA(INDICE-ENTRADA) EQUAL ',' OR
           BYTE-ENTRADA(INDICE-ENTRADA) IS NUMERIC
           SET ERROR-ESPACIOS-EMBEBIDOS TO TRUE
           GO TO FIN-VALIDAR-ENTRADA
       END-IF

       IF  BYTE-ENTRADA(INDICE-ENTRADA) NOT EQUAL SPACE
           SET ERROR-CAMPO-NO-NUMERICO TO TRUE
           GO TO FIN-VALIDAR-ENTRADA
       END-IF
     END-PERFORM.

     GO TO VALIDAR-CANTIDAD-DE-DIGITOS.

 ENCONTRE-LA-COMA.

     IF  INDICE-ENTRADA GREATER OR EQUAL 10     
         SET ERROR-FALTAN-LOS-DECIMALES TO TRUE
         GO TO FIN-VALIDAR-ENTRADA.

*--- Saltear la coma.
     ADD 1 TO INDICE-ENTRADA.
*--- Preservar la posicion del supuesto digito inicial de
*    la parte decimal.
     MOVE INDICE-ENTRADA TO PRIMER-DIGITO-DECIMAL PROXIMO-BYTE.

*--- Buscar el fin de la parte decimal.
     PERFORM VARYING INDICE-ENTRADA  FROM PROXIMO-BYTE  BY 1
                   UNTIL INDICE-ENTRADA GREATER 10
                   OR BYTE-ENTRADA(INDICE-ENTRADA) NOT NUMERIC
       CONTINUE
     END-PERFORM.

     MOVE INDICE-ENTRADA TO PROXIMO-BYTE.
 
*--- Calcular la longitud en bytes de la parte decimal.
     COMPUTE
       LONGITUD-DECIMAL = INDICE-ENTRADA - PRIMER-DIGITO-DECIMAL.

*--- Verificar si por lo menos hay un digito en la parte dec.
     IF  LONGITUD-DECIMAL EQUAL 0
         SET ERROR-FALTAN-LOS-DECIMALES TO TRUE
         GO TO FIN-VALIDAR-ENTRADA.

*--- Aqui termine de encontrar los digitos decimales, el resto
*    del campo si lo hay hay debe ser todos espacios.
     PERFORM VARYING INDICE-ENTRADA  FROM PROXIMO-BYTE  BY 1
             UNTIL INDICE-ENTRADA GREATER 10

       IF  BYTE-ENTRADA(INDICE-ENTRADA) IS NUMERIC
           SET ERROR-ESPACIOS-EMBEBIDOS TO TRUE
           GO TO FIN-VALIDAR-ENTRADA
       END-IF
       IF  BYTE-ENTRADA(INDICE-ENTRADA) EQUAL ','
           SET ERROR-MAS-DE-UNA-COMA TO TRUE
           GO TO FIN-VALIDAR-ENTRADA
       END-IF
       IF  BYTE-ENTRADA(INDICE-ENTRADA) NOT EQUAL SPACES
           SET ERROR-CAMPO-NO-NUMERICO TO TRUE
           GO TO FIN-VALIDAR-ENTRADA
       END-IF
     END-PERFORM.


 VALIDAR-CANTIDAD-DE-DIGITOS.

*--- Verificar que la parte entera no tenga mas 7 digitos.
     IF LONGITUD-ENTERO GREATER 7
        PERFORM VARYING INDICE-ENTRADA FROM PRIMER-DIGITO-ENTERO
          BY 1 UNTIL INDICE-ENTRADA
          GREATER (PRIMER-DIGITO-ENTERO + LONGITUD-ENTERO - 8)

            IF BYTE-ENTRADA (INDICE-ENTRADA) NOT EQUAL ZERO
               SET ERROR-ENTERO-MAS-DE-7-DIGITOS TO TRUE
               GO TO FIN-VALIDAR-ENTRADA
            END-IF
        END-PERFORM
        MOVE 7 TO LONGITUD-ENTERO
     END-IF.


*--- Verificar que la parte decimal no tenga mas de 2 digitos.
     
     IF LONGITUD-DECIMAL GREATER THAN 2
     
        COMPUTE PROXIMO-BYTE =
             PRIMER-DIGITO-DECIMAL + LONGITUD-DECIMAL - 1

        PERFORM VARYING INDICE-ENTRADA
          FROM PROXIMO-BYTE
          BY -1
          UNTIL INDICE-ENTRADA LESS PRIMER-DIGITO-DECIMAL + 2

            IF BYTE-ENTRADA(INDICE-ENTRADA) NOT EQUAL ZERO
               SET ERROR-DECIMAL-MAS-DE-2-DIGITOS TO TRUE
               GO TO FIN-VALIDAR-ENTRADA
            END-IF
        END-PERFORM     
        MOVE 2 TO LONGITUD-DECIMAL
     END-IF.

*--- Pasar los datos al campo de salida.
     MOVE ZERO TO CAMPO-SALIDA.

*--- Pasar la parte entera al campo de salida.

     MOVE CAMPO-ENTRADA(PRIMER-DIGITO-ENTERO:LONGITUD-ENTERO)
          TO CAMPO-SALIDA(8 - LONGITUD-ENTERO:LONGITUD-ENTERO).

*--- Pasar la parte decimal (si es que existe) al campo de salida.
     IF LONGITUD-DECIMAL GREATER THAN 0
        MOVE CAMPO-ENTRADA(PRIMER-DIGITO-DECIMAL:LONGITUD-DECIMAL)
             TO CAMPO-SALIDA(8:LONGITUD-DECIMAL).

*--- Terminar.
 FIN-VALIDAR-ENTRADA.
     EXIT.

Carlos Emilio Speroni
Vicente Lopéz - Argentina

El GoTo no es el malo de la película, los malos son algunos programadores.
Si no existiese la instrucción branch (GoTo) los procesadores no servirían para nada.
Avatar de Usuario
carlossperoni
Colaborador
Colaborador
 
Mensajes: 106
Registrado: 10 Jun 2005, 19:05
País: Argentina
Ciudad: Vicente Lopéz
Ocupación: System Programmer

Notapor sunnver » 03 Abr 2008, 17:38

Muchas gracias por vuestra ayuda y en especial a carlossperoni
sunnver
 


Volver a Cobol

cron

MKPortal ©2003-2008 mkportal.it