Cobol Foro

Cobol Foro (https://www.cobolforo.es/index.php)
-   PowerCOBOL (ActiveX, v4 - v11) (https://www.cobolforo.es/forumdisplay.php?f=9)
-   -   [Sintaxis] Validación de Fecha (https://www.cobolforo.es/showthread.php?t=771)

jmeza 22 de noviembre de 2017 16:55

Validación de Fecha
 
Hola, alguien me podría ayudar como validar los ingresos de fechas en powercobolv9,
ya que este es un dato muy sensible de ingresar en forma errónea.
Ejemplo, que el día no sea mayor a 30 o 31 según el mes, que el mes no sea mayor 12, etc.

Favor si alguien me puede ayudar con una rutina de validación

Saludos

Kuk 22 de noviembre de 2017 19:04

jmeza, el control CmText tiene la opción de parseo de fecha que lo hace todo él solito! :)

Fito 23 de noviembre de 2017 23:24

Hola Amigos:

Yo siempre usé la fecha en los text como cobol picture zz/zz/zzzz y tengo una rutina de validación hecha por mi para controlarla, teniendo en cuenta bisiestos y todo.

A raiz de los que dice KUK, me puse a probar el rendertext date. Está muy bueno, porque la validación la hace solo.

Pero como siempre hay un pero, quiero preguntar, espero haceme entender.

Para agilizar la carga de las fechas, yo le hago que cuando ingrese el dia y le de enter, automáticamente le complete el mes y año en curso. Tambien si ingresa dia y mes y le da enter completa con el año en curso.

en el evento Return del textbox (txtFcpfec) hago lo siguente:

Código COBOL:
  1.  comienzo.
  2.      move "text" of txtFcpfec    to fecha-ing.
  3.      perform completa-fecha.  *> esta es la rutina que completa la fecha
  4.      move fecha-dma    to "text" of txtFcpfec.
  5.          
  6.      perform valida-fecha.
  7.      if error-fecha = 1
  8.         perform fecha-mal
  9.         go sale
  10.      end-if.  
  11.  
  12.      invoke txtFcpfecha "setfocus". *> acá hago foco el text siguiente
  13.  
  14.  sale.
  15.      exit program.
  16.  
  17.  #include "Copys\comunpro.cpy". *> acá tengo todas las rutinas de manejo de fechas

Acá pego la rutina "completa-fecha".

Código COBOL:
  1.        completa-fecha.
  2.            move function current-date    to fecha-sis.  *> tomo la fecha de sistema
  3.            if fecha-ing > zeros and < 32     *> acá pregunto si ingresó el dia solamente
  4.               move fecha-ing-2           to fecha-dma-dd
  5.               move fecha-sis-fec-mm      to fecha-dma-mm
  6.               move fecha-sis-fec-aa      to fecha-dma-aa
  7.            else
  8.               if fecha-ing > 31 and < 3113  *> acá pregunto si ingresó dia y mes
  9.                  move fecha-ing-1        to fecha-dma-dd
  10.                  move fecha-ing-2        to fecha-dma-mm
  11.                  move fecha-sis-fec-aa   to fecha-dma-aa
  12.               else
  13.                  move fecha-ing          to fecha-dma
  14.               end-if
  15.            end-if.
  16.            perform dma-to-amd. *> esta rutina simplemente es para dar vuelta la fecha dma a amd

Acá les pego la working, por si no se entienden las variables

Código COBOL:
  1.        01  variables-fecha global.
  2.            02 fecha-ing                 pic 9(8).
  3.            02 redefines fecha-ing.
  4.               03                        pic x(4).
  5.               03 fecha-ing-1            pic 99.
  6.               03 fecha-ing-2            pic 99.
  7.  
  8.            02 fecha-sis                 pic x(16).
  9.            02 redefines fecha-sis.
  10.               03 fecha-sis-fec          pic 9(8).
  11.               03 redefines fecha-sis-fec.
  12.                  04 fecha-sis-fec-aa    pic 9999.
  13.                  04 fecha-sis-fec-mm    pic 99.
  14.                  04 fecha-sis-fec-dd    pic 99.
  15.               03 fecha-sis-hora         pic 9(8).
  16.               03 redefines fecha-sis-hora.
  17.                  04 fecha-sis-hora-hh   pic 99.
  18.                  04 fecha-sis-hora-mm   pic 99.
  19.                  04 fecha-sis-hora-ss   pic 99.
  20.                  04 fecha-sis-hora-ms   pic 99.
  21.  
  22.            02 fecha-amd                 pic 9(8).
  23.            02 redefines fecha-amd.
  24.               03 fecha-amd-aa           pic 9999.
  25.               03 fecha-amd-mm           pic 99.
  26.               03 fecha-amd-dd           pic 99.
  27.            02 redefines fecha-amd.
  28.               03 fecha-amd-x            pic x(8).
  29.  
  30.            02 fecha-dma                 pic 9(8).
  31.            02 redefines fecha-dma.
  32.               03 fecha-dma-dd           pic 99.
  33.               03 fecha-dma-mm           pic 99.
  34.               03 fecha-dma-aa           pic 9999.
  35.               03 redefines fecha-dma-aa.
  36.                  04 fecha-century       pic 99.
  37.                  04 fecha-siglo         pic 99.
  38.            02 redefines fecha-dma.
  39.               03 fecha-dma-x            pic x(8).
  40.  
  41.            02 fecha99-amd               pic 9(6).
  42.            02 redefines fecha99-amd.
  43.               03 fecha99-amd-aa         pic 99.
  44.               03 fecha99-amd-mm         pic 99.
  45.               03 fecha99-amd-dd         pic 99.
  46.            02 redefines fecha99-amd.
  47.               03 fecha99-amd-x          pic x(6).
  48.  
  49.            02 fecha99-dma               pic 9(6).
  50.            02 redefines fecha99-dma.
  51.               03 fecha99-dma-dd         pic 99.
  52.               03 fecha99-dma-mm         pic 99.
  53.               03 fecha99-dma-aa         pic 99.
  54.            02 redefines fecha99-dma.
  55.               03 fecha99-dma-x          pic x(6).
  56.  
  57.            02 fecha-4                   pic 9999.
  58.            02 fecha-bisiesto            pic 9999.
  59.  
  60.            02 error-fecha               pic 9.
  61.  
  62.            02 fecha-editada.
  63.               03 fecha-editar           pic zz/zz/zzzz.
  64.      
  65.            02 fecha-inicial             pic 9(8).
  66.            02 fecha-integer             pic 9(8).
  67.            02 fecha-dias                pic s9(8).
  68.            02 fecha-final               pic 9(8).
  69.            02 fecha-1                   pic 9(8).
  70.            02 fecha-2                   pic 9(8).

Esta es la exlpicación de lo que hago.

Ahora el problema es que con el text en date, todo esto no lo voy a poder hacer, porque ya me da la fecha "terminada". Si ingreso solo el día, me completa con 010001 y el dia y mes me completa con año 0001.
Podría controlar que si el año es 0001 lo tomo como que no ingresó año, pero el tema es el mes, cómo diferencio el mes 01, no sé si no le puso mes o realmente puso enero.

A lo mejor me estoy "liando" mucho como dicen uds, pero no le veo la respuesta. Seguramente es más sencilla de lo que parece.

Saludos.

Fito...

jmeza 24 de noviembre de 2017 03:11

Ok, acostumbrado al rmcobol (dos) que hay que programar todas las validaciones.
Ahora lo haré con lo que me recomiendan.

Saludos

Kuk 24 de noviembre de 2017 10:32

Fito, yo nunca he hecho lo que tu haces, pero podrías probar con el evento "KeyPressed". Validando si lo que se ha pulsado es la tecla Enter, miras los valores.

Es posible que al darle, el control ya ponga el resto, pero puede que no. Pruébalo y nos cuentas.


La franja horaria es GMT +2. Ahora son las 02:49.

Powered by: vBulletin, Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.