DesignBais Tip – Formatting Date/Time Fields

VALIDATION:
* Use this code to validate user changes to work fields
BEGIN CASE
   CASE EVENTSOURCE = "WORK03"
      * User changed start time
      IF DBVALUE # "" THEN
         GOSUB VALIDATE.DATE.TIME
         IF IVALUE # "" THEN
            DBRECORD<E.START.TIME> = IVALUE
            DBPASS.DBVALUE = OVALUE
            DBPASS.DBVALUE.TO = "WORK03"
         END ELSE
            IERR.TEXT = "Invalid Time format"
         END
      END ELSE
         DBRECORD<E.START.TIME> = ""
      END
   CASE EVENTSOURCE = "WORK04"
      * User changed end time
      IF DBVALUE # "" THEN
         GOSUB VALIDATE.DATE.TIME
         IF IVALUE # "" THEN
            DBRECORD<E.END.TIME> = IVALUE
            DBPASS.DBVALUE = OVALUE
            DBPASS.DBVALUE.TO = "WORK04"
         END ELSE
            IERR.TEXT = "Invalid Time format"
         END
      END ELSE
         DBRECORD<E.END.TIME> = ""
      END
   CASE 1
      NULL
END CASE
RETURN

VALIDATE.DATE.TIME:
* Specific code to see if user entered a valid date or time
* May require some enhancement, works OK as-is
USER.VALUE = DBVALUE
IVALUE = "" ; * returning with a null IVALUE means bad data
OVALUE = ""
IMASK = ""
IF PROCESS.PARAMETER[1,2] = "MT" THEN IMASK = "MT"
IF PROCESS.PARAMETER[1,1] = "D" THEN IMASK = "D"
IF IMASK = "" THEN RETURN
IVALUE = ICONV(USER.VALUE,IMASK)
IF IMASK = "MT" THEN
   GOSUB VALIDATE.TIME
   IF IVALUE = "" THEN RETURN
END
IF IMASK = "D" THEN
   GOSUB VALIDATE.DATE
   IF IVALUE = "" THEN RETURN
END
OVALUE = OCONV(IVALUE,PROCESS.PARAMETER)
IF OVALUE # "" THEN
   * User seemed to enter a valid value per the mask
   * Return IVALUE for DBRECORD data and OVALUE for display
   RETURN
END
IVALUE = ""
OVALUE = ""
RETURN
     
VALIDATE.DATE:
* Add your own code here to decide if the date is valid 
*  IF IVALUE < EARLIEST~~DATE OR IVALUE > LATEST~~DATE THEN
*    IVALUE = ""
*    RETURN
*  END
RETURN
     
VALIDATE.TIME:
* Basic checks to parse and check various time entry formats
* Add more to suit your application 
IF NUM(USER.VALUE) THEN
   IF LEN(USER.VALUE) = 1 OR LEN(USER.VALUE) = 2 THEN
      USER.VALUE = USER.VALUE * 100
   END
   MINUTES = USER.VALUE ‘R%2’
   IF MINUTES > 59 THEN USER.VALUE = -1      
   IF USER.VALUE < 0 OR USER.VALUE > 2359 THEN
      IVALUE = ""
      RETURN
   END
   NEW.VALUE = ""
   IF LEN(USER.VALUE) = 3 THEN
      NEW.VALUE = (USER.VALUE[1,1]) : (USER.VALUE[2,2])
   END
   IF LEN(USER.VALUE) = 4 THEN
      NEW.VALUE = (USER.VALUE[1,2]) : (USER.VALUE[3,2])
   END
   IVALUE = ICONV(NEW.VALUE,’MT’)
END
IF IVALUE < 0 OR IVALUE > 86399 THEN
   IVALUE = ""
   RETURN
END
RETURN

Please let me know how this works for you!

 

Leave a Reply