Ahh, I bet you have NULL set to -0-!!  ALL my code does this::
 
SET NULL ' '
EDIT USING .... *(when going into form that edits/enters data)
SET NULL -0-  *(when exiting the form
 
 
David Blocker
[EMAIL PROTECTED]
781-784-1919
Fax: 781-784-1860
Cell: 339-206-0261
----- Original Message -----
Sent: Tuesday, March 15, 2005 10:03 AM
Subject: [RBG7-L] - Re: Date with year optional - Solution

Thanks David.  I tried setting vDateMM to null in the EEP when there is a data entry error (month > 12), but when I SKIP TO it (or SET FOCUS, I tried both) for the user to re-enter, the null symbol does not autoselect, even though Autoselect is checked in properties; I also tried the Autoselect and Selectall properties in the EEP.  Since the null symbol is not autoselected, user has to manually delete it, something they shouldn't have to do.  If I leave the text value in vDateMM, the field does autoselect when I skip (or SET FOCUS) to it.  BTW, when user first tabs into vDateMM, the null _is_ autoselected.  If they click on it, null does not autoselect.  Apparently SKIP TO and SET FOCUS are equivalent to entering a field via mouse clicks rather than tabbing.

version 80.30228

Doug

David M. Blocker wrote:
Doug
 
Thanks for posting this.
 
On # 1 in your list re resetting field with error value to NULL, why not include in your EEP
 
SET VAR vDateMM = NULL
 
 
David Blocker
[EMAIL PROTECTED]
781-784-1919
Fax: 781-784-1860
Cell: 339-206-0261
----- Original Message -----
Sent: Monday, March 14, 2005 11:46 AM
Subject: [RBG7-L] - Re: Date with year optional - Solution

The original issue was how to enter and store a date with no year.  Full description of the issue is at the end of this email.
A couple of notes:
1. If the text field is nulled out due to error trapping, i.e. a month is > 12, then the null symbol is not autoselected when Skipping to the field or using Set Focus to the componentID.  I tried AUTOSELECT and SELECTALL properties, but no luck. So I figured, ok, leave the old value in the field so user can see what was typed in error.
2. I do locate the [DateColumn] that's being updated on the form after the three variables.  It shows what is really in the database - sort of a digital security blanket.
3. The Variable Edits all have Autoselect checked.
4.  I used Text data type for the variables (vs. integer) for better error trapping and consistent error messages.
5. Thanks to everybody for their suggestions.  I hope this is helpfull to somebody.
6.  There's understandable odd behavior if user tries to [shift-tab] backwards from month to day but I can't trap [shift-tab] with (Lastkey(0 or 1)), it shows as [Tab].  Anybody have ideas?

Thanks again to all.  
Doug

Here's what I did:

1) Define 4 variables, either in a command file or On Before Start EEP:
SET V vDateDD TEXT = NULL, +
  vDateMM TEXT = NULL, +
  vDateYYYY TEXT = NULL, +
  vNewDate DATE = NULL
RETURN


2) Locate vDateMM, vDateDD and vDateYYYY in that order as separate variable edits on the form.

3) Each variable has it's own On Exit From EEP for preliminary error check:
vDateMM:
IF vDateMM IS NULL OR vDateMM = ' '  THEN
    --If no month entered, assume date will not be entered.
    --Skip out of date entry to next field.
    PROPERTY [SomeOtherCompID] SET_FOCUS 'true'
    GOTO Done
ENDIF

IF (NINT(vDateMM)) > 12 OR +
      vDateMM NOT BETWEEN '0' AND '9' THEN

    PAUSE 2 USING 'Invalid Month' +
      CAPTION 'caption' Button 'OK' +
      OPTION ICON_FILE icons\information.bmp
    --Re-enter month if > 12 or not numeric
    SKIP TO vDateMM
    GOTO Done
ENDIF

--If month is OK, go to enter the day
SKIP TO vDateDD

LABEL Done

RETURN

vDateDD:
IF vDateDD IS NULL OR vDateDD = ' ' THEN
    --SKIP MM & YYY fields, go to
[SomeOtherCompID]
    SET V vDateMM = NULL
    PROPERTY 
[SomeOtherCompID] SET_FOCUS 'true'
    -- or you could: SKIP TO vDateDD to re-enter DD
    GOTO Done
ENDIF

IF (NINT(vDateDD)) > 31 OR +
      vDateDD NOT BETWEEN '0' AND '9' THEN
    PAUSE 2 USING 'Invalid Day' +
      CAPTION 'caption' Button 'OK' +
      OPTION ICON_FILE icons\information.bmp
    --Re-enter date
    SKIP TO vDateDD
    GOTO Done
ENDIF

--Go to enter year
SKIP TO vDateYYYY

LABEL Done

RETURN


vDateYYYY:
IF vDateMM IS NOT NULL AND vDateDD IS NOT NULL THEN
    IF vDateYYYY = ' ' THEN
        SET V vDateYYYY = NULL
    ENDIF
    --Create a date; if no year entered, default year is 1004
    --1004 allows for Feb 29 (thank you Larry)
    SET V vNewDate = +
      (IFNULL(vDateYYYY, +
      (RDATE((NINT(vDateMM)),(NINT(vDateDD)),1004)), +
      (RDATE((NINT(vDateMM)),(NINT(vDateDD)), (NINT(vDateYYYY)) ))))

    --if valid date is not created or YYYY is less than four digits
    --  it's an error.
    IF vNewDate IS NULL OR +
          ((SLEN(vDateYYYY)) < 4 AND vDateYYYY IS NOT NULL) OR +
          vNewDate > .#DATE THEN
        SET V vMsg = +
          (.vDateMM + '/' + .vDateDD + '/' + .vDateYYYY)
        SET V vMsg = (.vMsg & 'is not a valid date.')
        PAUSE 2 USING .vMsg +
          CAPTION 'caption' Button 'OK' +
          OPTION ICON_FILE icons\information.bmp
        SKIP TO vDateDD
        GOTO Done
    ENDIF

    -- If the date is valid, go ahead and update the table.
    UPDATE [TableName] SET [DateColumn] = .vNewDate +
      WHERE [clause]
    PROPERTY TABLE [TableName] 'REFRESH'

ENDIF

LABEL Done

RETURN


Orginal Issue:
My question was on storing a birthdate without the year.  Some adults don't care to give their birthyear, so all we have is MM/DD in DateOfBirthColumn.  For the kids (who aren't so particular), we want to store MM/DD/YYYY in DateOfBirthColumn so we can determine their age for placement in classes as well as printing the birthday list.  So, for the adults who don't give us a birth year, I'm thinking the best thing is to store something like MM/DD/1000 or MM/DD/0001 or some obviously bogus year.


Reply via email to