


Function    Description/Notes

DDEXISTS    Does DBF exist in the data dictionary   
            
            This function checks to see if a file is in the  
            data dictionary.  Is is called by the function   
            OPENDBF.                                         

DDGENKX     Creates compressed unique values        
            
            This function generates a unique key value.  The 
            current value is kept in the data dictionary file
            (EXPRESSD.DBF). This function  uses compressed   
            numbers stored in character fields. This fuction 
            started out as ddGenKey and was modified by Lee  
            Harrington.                                      
                                                             

DDISFLD     Determine if Field exists for DBF in DD 
            
            Determine if Field exists for database in DD.    

DDPROPTY    Get any property (SIZE,VALID) for field 
            
            Queries properties from the data dictionary.  For
            instance you can get the SIZE, DECIMALS, VALID,  
            or any other field from the data dictionary.     

FIRSTDAY    Return Date of First day of the month   
            
            Return Date of First day of the month given month
            and year.                                        

GETJOIN     Returns Join Condition                  
            
            Returns Join Condition.  Called by JOINARAY.     
            Uses the data dictionary to create a LOOKUP()    
            function.                                        

GETINSTR    Gets Instructions from DEVNOTES in DD   
            
            Retrieves the value of an instruction stored in  
            EXPRESSD.DEVNOTES.  To add abilities to          
            FoxExpress without changing the structure of     
            EXPRESSD, I use the DEVNOTES field to store      
            "instructions".  Instructions have the form:     
                                                             
            *[INSTRUCTION:VALUE:]                            
                                                             
            For example: Instruction "PICKTITLE" having the  
            value "Customer List" would be:                  
                                                             
            *[PICKTITLE:Customer List:]                      
                                                             
            This function is a great tool for creating your  
            own functions that read and write information to 
            the datadictionary.                              
                                                             
                                                             

GROW        UnShrink a Base 128 number              
            
            UnShrink a Base 128 number.  Used to expand      
            numbers created by SHRINK.                       


Function    Description/Notes


ISTAG       Is lcTAG a valid index tag              
            
            Determine whether or not parameter lcTag, is a   
            valid TAG name.                                  
                                                             

JKEYLEE     JKEY pick list routine from within FE DD
            
            JKEYLEE is used by LHLOOKUP to provide JKEY      
            browse picklists from within FoxExpress's lookup.

JOINARAY    Creates Array of related tables         
            
            Creates Array of related tables. This function   
            works in conjuction with LEEPOINT,an optimized   
            replacement for SETPOINT provided by Neon. This  
            function allows you to place fields from related 
            tables on your screens.  This function is called 
            from the SETUP snippet:                          
                                                             
            DIMENSION laJoins(1)                             
            =JOINARAY(@laJoins)                              
                                                             
            Also:                                            
                                                             
            1. You must open all tables in your SETUP        
            snippets that appear on your screen.             
                                                             
            2. Do not set relations between the files.       

LAST_DAY    Return Date of the Last day of the month
            
            Return Date of the Last day of the month given   
            month and year.                                  

LEEPOINT    Set Pointers to related tables          
            
            Set Pointers to related tables.  This is an      
            optimized replacement for SETPOINT provided by   
            Neon. This function allows you to place fields   
            from related tables on your screens.  This       
            function is called from the SHOW snippet.        
                                                             
            =LEEPOINT(@LAJOINS)                              
                                                             
            The array laJoins should be created in your SETUP
            snippet:                                         
                                                             
            DIMENSION laJoins(1)                             
            =JOINARAY(@laJoins)                              
                                                             
            Also:                                            
                                                             
            1. You must open all tables in your SETUP        
            snippets that appear on your screen.             
                                                             
            2. Do not set relations between the files.       
                                                             
            3. Place the line:                               
                 =LEEPOINT(@LAJOINS,.T.)                     
               immediately after:                            


Function    Description/Notes

                 CASE m.action="ADD"                         
               in your control panel.  This will set the     
            related tables to EOF() at                       
               the beginning of your add routine.  Otherwise,
            your users will see                              
               false values at the beginning of adding new   
            records.                                         
                                                             

LHLOOKUP    Improved DDLOOKUP, ability to use JKEY  
            
            LHLOOKUP improves and completely replaces        
            DDLOOKUP.  The biggest improvement is the ability
            to automatically use JKEY browses for the pick   
            list. Also, if fields used in the browse have    
            indexes, then tabbing to those fields will       
            provide searches on the values of those fields.  
            To use this feature place:                       
                                                             
            *[JKEY:YES:] or *[JKEY:MIXEDCASE:]               
                                                             
            on a separate line of the NOTES field in the data
            dictionary. MIXEDCASE is used if you want case   
            sensitive searches.                              
                                                             
            *[PICKTITLE:TITLE CONTENTS:]                     
                                                             
            Place your title instead of "TITLE CONTENTS" for 
            the pick list title.  Do not use quotes.  Default
            title is "Pick List"                             
                                                             
            To use LHLOOKUP instead of DDLOOKUP you can do   
            one of two things:                               
                                                             
            1. Copy code into LIBRARY.PRG replacing          
            DDLOOKUP's code with LHLOOKUP                    
                                                             
            2. Place the following line as the first line in 
            DDLOOKUP                                         
               RETURN IIF(LHLOOKUP(),.T.,0)                  
                                                             

OPENDBF     Improved DDOPEN(), open file routine    
            
            Open dbf routine that improves upon DDOPEN.      
                                                             
            Improvements:                                    
                                                             
            1. Has ability to open file exclusively or not   
                                                             
            2. Can use SETUP.DBF to store data directory thus
            enabling multiple datasets with ease.            
                                                             
            3. Opening a table AGAIN in a new work area with 
            a new alias                                      

PUTINSTR    Puts instructions into EXPRESSD.DEVNOTES
            
            Places instructio into EXPRESSD.DEVNOTES.  To add
            abilities to FoxExpress without changing the     
            structure of EXPRESSD, I use the DEVNOTES field  
            to store "instructions".  Instructions have the  


Function    Description/Notes

            form:                                            
                                                             
            *[INSTRUCTION:VALUE:]                            
                                                             
            For example: Instruction "PICKTITLE" having the  
            value "Customer List" would be:                  
                                                             
            *[PICKTITLE:Customer List:]                      
                                                             
            This function is a great tool for creating your  
            own functions that read and write information to 
            the datadictionary.                              
                                                             

SHRINK      Compress a number to Base 128           
            
            Compress a number to Base 128.  Used to save up  
            to 40% of the space required to store a number.  
            Useful for internal keys.                        

STAMPVAL    Stores Date & Time in numeric form      
            
            Stores Date & Time in Number or Compressed       
            Character format.  This function comes with both 
            TRANSPORT.PRG (foxpro) and LIBRARY.PRG           
            (FoxExpress).  My function fixes a bug found in  
            both programs and adds the ability to compress   
            the result from a 10 char field to a 5 char      
            field.                                           
                                                             

VALSTAMP    Decode the Date, or Time for a STAMPVAL 
            
            Decode the Date, or Time for a STAMPVAL value.   
            Fox should have provided this function.  Can be  
            used to return the data and time from a .PJX file
            as well as decode values created with my         
            STAMPVAL.                                        

ALTQUERY    Alternative Pick Lists                  
            
            Modify this function to include custom pick lists
            of your own.                                     

LEEPICK     Array Based Pick List Routine           
            
                                                             

PARSELST    Parse Any Delimited List                
            
            Parse any delimited list                         

ATYPE       Like TYPE only works with arrays as well
            
                                                             

LHBROWSE    JKEY activated BROWSE                   
            
            This function works instead of DDBROWSE from the 
            BROWSE button of the control panel.  It activates
            JKEY for incremental searches on your browse for 
            each field that has an index (index must have    


Function    Description/Notes

            same name as field and be part of the .CDX).     
                                                             
            To use this function you must modify the ACTION  
            procedure in the CLEANUP snippet of CONTROL.SCX. 
            Replace DO DDBROWSE with DO LHBROWSE.            
                                                             
            Then for each table that you wish this type of   
            browse you must enter the following in the notes 
            field for the _table_.                           
                                                             
            *[BROWSE:<FIELD LIST>:]                          
                                                             
            Where <FIELD LIST> is a comma delimited list of  
            fields in the order they are to appear in the    
            browse:                                          
                                                             
            *[BROWSE:NAME,CUSTNO,PHONE,FAX:]                 
                                                             
            To have your own title place the following in the
            notes field for the _table_.                     
                                                             
            *[TITLE:<TITLE>:]                                
                                                             
            Where <TITLE> is title that is to appear in the  
            browse:                                          
                                                             
            *[TITLE:Customer List:]                          
                                                             
            If you want your incremental search to be case   
            sensitive place the                              
            instruction:                                     
                                                             
            *[MIXEDCASE:YES:]                                
            in the Notes field.                              
                                                             

VIEWMODE    Not Adding or Editing                   
            
            I found myself often checking the value of the   
            array WINDHANDLR to see if                       
            I was adding or editing.  VIEWMODE returns true  
            if you are viewing that is not adding or editing 
            a record.  Saves time of having to remember what 
            the WINDHANDLR values are.                       

VIDMODE     Change Video Mode from 25/50 Lines      
            
            VIDMODE is called from a menu and toggles the    
            sceen from 25 to 50 lines.  When in 50 line mode 
            a mark (diamond) is placed next to the menu      
            prompt.  It   is much more convenient than       
            DISPMODE which is provided with FoxExpress.  You 
            place DO VIEWMODE WITH "ENVIRONMEN" as a command 
            in the menu.  If you have changed FoxExpress's   
            menu, you may have to change "ENVIRONMEN" to the 
            name of the popup that your menu option is now   
            under.                                           

WINDLIST    Open Screens appear in Windows Menu     
            
            WINDLIST enables you to place the name of all    
            open screens under the Window menu pad and by    


Function    Description/Notes

            selecting the menu uption bring forward the      
            screen.  In my applications each data entry      
            screen takes up the whole screen, thus other open
            screens are inaccessable.  Now my users simply   
            bring up a list of the open screens and choose   
            the one the want to bring forward.  After all,   
            what use is there in having the ability to open a
            bunch of screens if you can't easily switch      
            between them.                                    
                                                             
            To use this feature place the following in the   
            SETUP SNIPPET of each data entry screen (only the
            first one in a set):                             
                                                             
            DO WINDLIST WITH "<screen name>","ADD"           
                                                             
            Where <screen name> is the name of the window as 
            displayed in the screen options for the screen   
            (FE defaults each screen name to the name of the 
            primary database).                               
                                                             
            Place the following in the CLEANUP SNIPPET of    
            each data entry screen (only the first in a set):
                                                             
            DO WINDLIST WITH "<screen                        
            name>","REMOVE",m.action                         
                                                             
            Where <screen name> is the same as in the SETUP  
            SNIPPET.                                         
                                                             
            You must have a Menu Pad named "Window" (which is
            in the FE default menus) for this to work.       
                                                             
                                                             
                                                             

LHDELETE    Cascade delete unlimited levels         
            
            LHDELETE replaces DDDELETE. It over comes Neons  
            limit of 2 levels for cascade deleting.  LHDELETE
            can handle relationships of any complexity.      
            Improved user feedback: Thermometer to indicate  
            progress and list boxes that  display all        
            dependant relationships.                         
                                                             
            To use LHDELETE, simply place RETURN LHDELETE()  
            as the first line in DDDELETE.PRG or rename      
            LHDELETE.PRG as DDDELETE.PRG and remove the old  
            DDELETE.                                         
                                                             

WALKREL     Create cursor of all relationships      
            
            WALKREL "walks" the relationship tree for a given
            file.  It will find all levels of relationships. 
            It is used by LHDELETE and JOINARAY.             
                                                             
                                                             




Function    Description/Notes

THERMLEE    Thermometer                             
            
            Thermometer used in LHDELETE.                    

