Iniciar Sesión

Ver la Versión Completa : [Sintaxis] Validación de Fecha


jmeza
22 de noviembre de 2017, 16:55
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:


comienzo.
move "text" of txtFcpfec to fecha-ing.
perform completa-fecha. *> esta es la rutina que completa la fecha
move fecha-dma to "text" of txtFcpfec.

perform valida-fecha.
if error-fecha = 1
perform fecha-mal
go sale
end-if.

invoke txtFcpfecha "setfocus". *> acá hago foco el text siguiente

sale.
exit program.

#include "Copys\comunpro.cpy". *> acá tengo todas las rutinas de manejo de fechas


Acá pego la rutina "completa-fecha".


completa-fecha.
move function current-date to fecha-sis. *> tomo la fecha de sistema
if fecha-ing > zeros and < 32 *> acá pregunto si ingresó el dia solamente
move fecha-ing-2 to fecha-dma-dd
move fecha-sis-fec-mm to fecha-dma-mm
move fecha-sis-fec-aa to fecha-dma-aa
else
if fecha-ing > 31 and < 3113 *> acá pregunto si ingresó dia y mes
move fecha-ing-1 to fecha-dma-dd
move fecha-ing-2 to fecha-dma-mm
move fecha-sis-fec-aa to fecha-dma-aa
else
move fecha-ing to fecha-dma
end-if
end-if.
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


01 variables-fecha global.
02 fecha-ing pic 9(8).
02 redefines fecha-ing.
03 pic x(4).
03 fecha-ing-1 pic 99.
03 fecha-ing-2 pic 99.

02 fecha-sis pic x(16).
02 redefines fecha-sis.
03 fecha-sis-fec pic 9(8).
03 redefines fecha-sis-fec.
04 fecha-sis-fec-aa pic 9999.
04 fecha-sis-fec-mm pic 99.
04 fecha-sis-fec-dd pic 99.
03 fecha-sis-hora pic 9(8).
03 redefines fecha-sis-hora.
04 fecha-sis-hora-hh pic 99.
04 fecha-sis-hora-mm pic 99.
04 fecha-sis-hora-ss pic 99.
04 fecha-sis-hora-ms pic 99.

02 fecha-amd pic 9(8).
02 redefines fecha-amd.
03 fecha-amd-aa pic 9999.
03 fecha-amd-mm pic 99.
03 fecha-amd-dd pic 99.
02 redefines fecha-amd.
03 fecha-amd-x pic x(8).

02 fecha-dma pic 9(8).
02 redefines fecha-dma.
03 fecha-dma-dd pic 99.
03 fecha-dma-mm pic 99.
03 fecha-dma-aa pic 9999.
03 redefines fecha-dma-aa.
04 fecha-century pic 99.
04 fecha-siglo pic 99.
02 redefines fecha-dma.
03 fecha-dma-x pic x(8).

02 fecha99-amd pic 9(6).
02 redefines fecha99-amd.
03 fecha99-amd-aa pic 99.
03 fecha99-amd-mm pic 99.
03 fecha99-amd-dd pic 99.
02 redefines fecha99-amd.
03 fecha99-amd-x pic x(6).

02 fecha99-dma pic 9(6).
02 redefines fecha99-dma.
03 fecha99-dma-dd pic 99.
03 fecha99-dma-mm pic 99.
03 fecha99-dma-aa pic 99.
02 redefines fecha99-dma.
03 fecha99-dma-x pic x(6).

02 fecha-4 pic 9999.
02 fecha-bisiesto pic 9999.

02 error-fecha pic 9.

02 fecha-editada.
03 fecha-editar pic zz/zz/zzzz.

02 fecha-inicial pic 9(8).
02 fecha-integer pic 9(8).
02 fecha-dias pic s9(8).
02 fecha-final pic 9(8).
02 fecha-1 pic 9(8).
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.