Proper Field Validation Methods and other annoyances...

Frank D. Engel, Jr. fde101 at fjrhome.net
Thu Sep 6 17:49:15 EDT 2007


Wow, let's put together a new feature request for BZ...

How about, "is a user readable date", or "is really a date"?

"is a formatted date"?


On Aug 15, 2007, at 12:21 PM, Rob Cozens wrote:

> Hi Len,
>
>> 1) Why does  put "4" is a date return true?  If this function  
>> doesn't actually work, why is it still available?  I'd like to be  
>> able to have users enter a date without any kind of punctuation  
>> (i.e., 08142007) and be able to validate it as a valid date.  The  
>> same applies to entering 1315 as a time (no colon).
>
> Others have explained why "is a date" returns true for any integer.
>
> Here is a function that validates user input as valid according to  
> the current system date format and returns the date in dateItems  
> format.
>
>  function validDate theString -- 5 April 04:RCC
>   put stripBlanks(theString,false) into theString -- strips leading  
> or trailing blanks from a string
>   get systemDateFormat() -- see Called Routines below
>   set the itemDelimiter to char -1 of it -- the Separater
>   if the number of items of theString <> 3 then return false
>   delete the last char of it
>   delete char offset("mm",it) of it -- remove double characters, if  
> any...
>                                                          -- which  
> there will be until RR system date
>                                                          --  
> correctly recognizes suppression of leading
>                                                          -- zeroes
>   delete char offset("dd",it) of it
>   delete char offset("yy",it) of it
>   repeat with x = 1 to 3
>     switch char x of it
>     case "m"
>       put item x of theString into theMonth
>       if not validDigits(theMonth) then return false  -- each char  
> >= "0" and <= "9"
>       if theMonth < 1 or theMonth > 12 then return false
>       break
>     case "d"
>       put item x of theString into theDay
>       if not validDigits(theDay) then return false
>       if theDay < 1 or theDay > 31 then return false
>       break
>     case "y"
>       put item x of theString into theYear
>       if not validDigits(theYear) then return false
>       put length(theYear) into charCount
>       if charCount <> 2 and charCount <> 4 then return false
>       if charCount is 2 then add 2000 to theYear
>       if theYear < 1 then return false
>       break
>     end switch
>   end repeat
>   if theDay < 29 then return  
> true&return&theYear&comma&theMonth&comma&theDay&",0,0,0,0"
>   if theMonth is 2 then
>     if theDay > 29 or not leapYear(theYear) then return false --  
> leapYear returns boolean
>     else return true&return&theYear&comma&theMonth&comma&theDay&", 
> 0,0,0,0"
>   else
>     if offset("0",theMonth) = 1 then delete char 1 of theMonth
>     set the itemDelimiter to comma
>     if theMonth is among the items of "1,3,5,7,8,10,12" then return  
> true&return&theYear&comma&theMonth&comma&theDay&",0,0,0,0"
>     if theDay is 31 then return false
>     else return true&return&theYear&comma&theMonth&comma&theDay&", 
> 0,0,0,0"
>   end if
> end validDate
>
> Cal;led routines:
>
> function systemDateFormat
>   put "1999,1,9,0,0,0,0" into testDate
>   convert testDate to short system date -- RR pads day/month  
> regardless of settings
>                                                                        
>  -- which means function will not recognize the
>                                                                        
> -- absence of leading zeroes until this is fixed
>   put 2 into characterNumber
>   repeat while char characterNumber of testDate is in "1,9"
>     add 1 to characterNumber
>   end repeat
>   put char characterNumber of testDate into dateSeparater
>   put empty into returnDateFormat
>   set the itemDelimiter to dateSeparater
>   repeat for each item datePart in testDate
>     if datePart > 9 then
>       if datePart > 99 then put "y" after returnDateFormat
>       put "y" after returnDateFormat
>     else if datePart > 1 then
>       if length(datePart) > 1 then put "d" after returnDateFormat
>       put "d" after returnDateFormat
>     else
>       if length(datePart) > 1 then put "m" after returnDateFormat
>       put "m" after returnDateFormat
>     end if
>   end repeat
>   return returnDateFormat&dateSeparater
> end systemDateFormat
>
>
>> 2) This is the "biggie."  What is the proper way to validate the  
>> contents of a field.  I tried writing a "closeField" script that  
>> would do the validation, put up a message box if the format/ 
>> contents are wrong, then set the focus back to the field for  
>> correction by the user. I end up getting two insertion point  
>> cursors (one in the "bad" field and one in the next field.  The  
>> keyboard does go to the bad field but having more than one  
>> insertion point is confusing to me let alone my end users.  By the  
>> way, I have tried not passing the closeField message but I'm not  
>> sure if the "tab to next field" takes place anyway.
>
> Among my back burner projects is a Data Dictionary-driven RAD,  
> which will validate user input in a field as compliant with the  
> Data Dictionary specifications for the data that field captures  
> (eg: required?, numeric?, # of decimal positions, show thousands  
> separator?, show currency symbol?, lookup table, autoentry?, max  
> length, max lines, etc).  Only some of the edits have been tested  
> at this stage; but all that our working are triggered by  
> closeField, enterInField (and returnInField for single-line  
> fields),or internal logic if auto-entry fields, and I have not  
> experienced the problems you describe.
>
> However, I would note that my user interface keeps ALL fields  
> without focus locked while accepting user input in a field.  When  
> the user signals "I'm done", the field contents are validated to DD  
> specs.  If invalid, an error message is displayed; if valid, the  
> field is locked and the next (either by ordinal or based on the  
> user input) field is unlocked and given focus.
>
>> 3) Related to #2 above, I frequently get vertical lines (insertion  
>> point cursors) in a field as I move the mouse across it.  Once  
>> they start showing up, (and they stay so I end up with vertical  
>> bars between every letter in the field!), I can get them to appear  
>> by moving the mouse ABOVE the field (not in it) like I have a  
>> vertical line that runs the height of the entire screen.  Is this  
>> something I'm doing or is it a known problem?
>
> Do you get the same effect from a standalone compiled from your stack?
>
> Rob Cozens CCW
> Serendipity Software Company
>
> "And I, which was two fooles, do so grow three;
>  Who are a little wise, the best fooles bee."
>
>  from "The Triple Foole" by John Donne (1572-1631)  
> _______________________________________________
> use-revolution mailing list
> use-revolution at lists.runrev.com
> Please visit this url to subscribe, unsubscribe and manage your  
> subscription preferences:
> http://lists.runrev.com/mailman/listinfo/use-revolution
>



_________________________________________________________________
Need personalized email and website? Look no further. It's easy
with Doteasy $0 Web Hosting! Learn more at www.doteasy.com



More information about the use-livecode mailing list