Work-around: At the D: prompt invoke CLIPPER with the following syntax: CLIPPER filename #DF=C: PUBLISHED: 16 Dec 1986 MAIN_TOPICS: AUTUMN RESERVED WORDS TEXT: The following list of RESERVED WORDS is for the AUTUMN '86 version of CLIPPER. ALLMEM ATOF AUTUMN86 BLDMEM CHGFC CHKUFB CXA55 CXA_55 CXC33 CXC55 CXC88 CXC_55 CXD22 CXD33 CXD55 CXDVT CXD_55 CXFDIV CXFERR CXFMUL CXFNM5 CXFNM5A CXFXT5 CXFXT5A CXINIT CXLSH CXM22 CXM33 CXM55 CXMAT CXMVT CXM_55 CXN5 CXNDP0 CXNDP1 CXNDP2 CXNDP3 CXNDPH CXNDPL CXNDPX CXNM8 CXRSH CXS55 CXSERR CXSERZ CXS_55 CXT5 CXV25 CXV35 CXV50 CXV51 CXV53 CXVDF CXVFD DCLOSE DCREAT DCREATX DOPEN DREAD DSEEK DUNIQUE DWRITE ENVIRON ERRNO EXCEPT EXP FABS FMOD FREXP GETFC GETMEM GETML ISSPACE LDEXP LOG LOG10 LSBRK LSEEK MATHERR MODF MOVMEM NETERR OPEN PCNGMN POW POW2 RBRK READ REMOVE RENAME RLOCK RLSMEM RLSML RSTMEM RUNLK SBRK SETMEM SIZMEM SQRT STBCPY STCCPY STPBLK STPCHR STPCPY STRCAT STRCMP STRCPY STRLEN STRNCAT STRNCMP STRNCPY STSCMP UNLINK WRITE XCABT PUBLISHED: 16 Dec 1986 MAIN_TOPICS: WINTER RESERVED WORDS TEXT: The following list of RESERVED WORDS is for the WINTER'85 version of CLIPPER. As of this version of CLIPPER, words beginning with an underscore are not allowed; therefore, they are not included in this list. $STRT$ ALLMEM ATOF BDOS BLDMEM CLOSE CREAT CXA38 CXA55 CXA_55 CXC33 CXC55 CXC88 CXC_55 CXD33 CXD55 CXD_55 CXFER CXFNM4 CXFNM5 CXFXT4 CXFXT5 CXM33 CXM55 CXM_55 CXN5 CXNDPB CXNDPH CXNDPL CXNM8 CXS55 CXS88 CXS_55 CXT5 CXV05 CXV25 CXV35 CXV45 CXV50 CXV52 CXV53 CXV54 CXV83 CXVDF CXVFD CXV_45 CXV_54 ERRNO EXCEPT EXIT EXP FABS FCLOSE FMOD FOPEN FORKL FORKLP FORKV FORKVP FREOPEN FREXP GETENV GETMEM GETML IEXEC LDEXP LOG LOG10 LSBRK LSEEK MATHERR MKEXT MKNAME MODF MOVMEM OPEN POW POW2 RBRK READ REMOVE RENAME RLSMEM RLSML RSTMEM SBRK SETMEM SIZMEM SQRT STBCPY STCCPY STCD_I STCIS STCISN STCI_D STCU_D STPBLK STPCHR STPCPY STRCAT STRCMP STRCPY STRCSPN STRLEN STRNCAT STRNCMP STRNCPY STRSPN STSCMP SYSTEM UNLINK WAIT WINTER85 WRITE XCEXIT XCOVF PUBLISHED: 16 Dec 1986 MAIN_TOPICS: FLASHCODE WITH CLIPPER TEXT: A few callers have reported that programs that were linked with FLASHCODE were generating 'System error memory fault'. This was because of FLCLIP.OBJ. Call SOFTWARE BOTTLING COMPANY to get an upgrade to this program called FWCLIP.OBJ. The number is (718)458-3700. PUBLISHED: 16 Dec 1986 MAIN_TOPICS: TEXT: When is hit in a screen of GETs with only one READ, CLIPPER will save the contents of the GETs prior to the . dBASE will not save any of the GETS. PUBLISHED: 16 Dec 1986 MAIN_TOPICS: DEBUGGER TEXT: When using the "M" option to list PRIVATE variables, some of the variables will display a type @ . This means that the variable is a PARAMETER passed to that procedure. The @ sign is a reference symbol. Use the "E" option to display the contents of the variable. PUBLISHED: 16 Dec 1986 MAIN_TOPICS: 80287 MATH CHIP TEXT: The 80287 MATH CHIP is not supported as of the WINTER 85 version of CLIPPER. This is because the version of LATTICE C used does not recognize it. It IS supported in AUTUMN '86. PUBLISHED: 16 Dec 1986 MAIN_TOPICS: TYPE CONFLICT IN + TEXT: A TYPE CONFLICT IN + can occur when using a .FRM file that has a Y in the TOTALS? column on a character field. CLIPPER's Report utility will accept a Y in the TOTALS? column. Also, dBASE will keep a Y when changing a field's contents from a numeric to a character. PUBLISHED: 16 Dec 1986 MAIN_TOPICS: TYPE CONFLICT IN = TEXT: May occur when using a SET KEY TO without a PARAMETERS statement in the 'SET KEY - procedure'. The error usually happens on the 11th time that the key is pressed. PUBLISHED: 16 Dec 1986 MAIN_TOPICS: TYPE CONFLICT IN ACCUM TEXT: Has occurred when returning from a UDF that has a RETURN statement without a returning value. Example: FUNCTION funcname PARAMETERS a --source code-- RETURN && no value is retuned PUBLISHED: 16 Dec 1986 MAIN_TOPICS: SYSTEM ERROR - STACK UNDERFLOW TEXT: This message indicates that you are doing some type of transaction which makes use of more parameters than are available. Examples: 1) ? chr(n), && The comma implies another parameter should * be printed resulting in the error. 2) DO prog a,b && Two parameters are being passed to --source code--- && prog, but three parameters are PROCEDURE prog && being received. PARAMETES a,b,c PUBLISHED: 16 Dec 1986 MAIN_TOPICS: SYSTEM ERROR MEMORY FAULT TEXT: Has occurred as a result of a negative constants number after compiling. PUBLISHED: 16 Dec 1986 MAIN_TOPICS: PROGRAM TOO BIG TO FIT IN MEMORARY TEXT: 1) This error can happen when the mother-board is set for 640K while the expansion board is set for 256K RAM. 2) Can happen if PLINK86 was incorrecty copied (i.e. bad sector). PUBLISHED: 16 Dec 1986 MAIN_TOPICS: INDEX ERROR READ/WRITE TEXT: 1) This error can happen when the mother-board is set for 640K while the expansion board is set for 256K RAM. 2) Will happen when the disk is full. PUBLISHED: 16 Dec 1986 MAIN_TOPICS: INDEX ERROR _NTX SET TEXT: Can happen when REPLACing a field in work area one while in work area two. This is allowed in AUTUMN '86. Example: SELECT 1 USE file_one SELECT 2 USE file_two REPLACE 1->field_name WITH 2->field_name PUBLISHED: 16 Dec 1986 MAIN_TOPICS: DOS ERROR 2 TEXT: Has occured when trying to RESTORE FROM a .MEM file in a program that had a negative constants number after compiling. This situation is unique to WINTER '85. PUBLISHED: 16 Dec 1986 Screen 14 MAIN_TOPICS: DOS ERROR 0 TEXT: DOS ERROR 0 is not a DOS error. When an internal runtime error occurs that CLIPPER cannot identify, it goes out to DOS to check as to whether it is a DOS problem. If it cannot find the DOS error ( and its associated number) it assigns a '0' to an internal CLIPPER memory variable that is used in our error messages. A DOS ERROR 0 usually occurs when indexing or reporting. This error is unique to WINTER '85. The following is a list of possible reasons for this error: 1) When the constants number after compiling is a negative number. 2) When a program attempts to SET FORMAT TO a format file with the same name as the calling program. 3) When not ending a program with a RETURN while using WORDSTAR editor. PUBLISHED: 16 Dec 1986 MAIN_TOPICS: FATAL AT LINE-NUMBER UNEXPECTED EOF TEXT: This compiler error can occur when the hard disk runs out of disk space while compiling. PUBLISHED: 16 Dec 1986 MAIN_TOPICS: CLIPPER -L TEXT: When using the "Enhanced Native Code" option '-l', the line number passed in the F1 HELP program or a SET KEY TO procedure will be erroneous. The line number will be 4068 which is a line in the library. Also, the DEBUGGER will not work properly when setting breakpoints. PUBLISHED: 16 Dec 1986 MAIN_TOPICS: && TEXT: If a line begins with the double ampersand (&&) used as a comment CLIPPER will stop compiling on this line without issuing an error message. This comment should only be used at the end of a command line. PUBLISHED: 16 Dec 1986 MAIN_TOPICS: FATAL ERROR 57 - UNDEFINED $OVLYM TEXT: Will occur when the "OVERLAY PROG,..." statement is issued after a "ENDAREA" statement. PUBLISHED: 16 Dec 1986 MAIN_TOPICS: PLINK86 TEXT: PLINK86 will lose track of the directory that the overlay library is in if it is different than the default. This can be resolved by creating an OBJ variable in DOS that contains the path of the objs and lib files to be linked. Example: SET OBJ=C:\CLIP\ PUBLISHED: 16 Dec 1986 MAIN_TOPICS: MS ASSEMBLER LINKER TEXT: When using MICROSOFT ASSEMBLER LINKER, you must change the default setting of segments. The default is 128; however, you can reset the number of segments up to 1024. EX. Syntax: LINK /SE:1024,,,; PUBLISHED: 16 Dec 1986 MAIN_TOPICS: INSTALLATION TEXT: If Clipper has been installed on the C:drive, and a second physical hard drive (D:) is added to the system, invoking CLIPPER from the D:drive may return the error: "error 0013 - product has been uninstalled" even if the path has been set. What to do? A: at the D:drive, invoke Clipper with the command: CLIPPER f #DF=x: where: - f = file to be compiled - x = drive where Clipper is - therefore, to compile FILE.PRG from the D:drive with Clipper installed in the C:drive, issue the following command at the D> prompt: CLIPPER FILE #DF=C: - note: may also happen with "partitioned" disks PUBLISHED: 16 Dec 1986 MAIN_TOPICS: INSTALLATION: HIGH DENSITY TEXT: HIGH DENSITY DISKETTES - Users who are installing a floppy working copy must use a formatted, double sided, double density diskette as the target disk. The messages, "Install terminated Error Code 6100 or 8304 " will be displayed if the target diskette is high capacity (1.2 Mb). HIGH DENSITY DRIVES - Any floppy disk made in or written to in the high capacity drive may be unusable on a regular disk drive. With this in mind, if the distribution disk will be used to install on machines with regular drives, run INSTALL from the low density drive. If the working copy is to be used on regular drives in addition to high density drives, make the working copy in a low density drive. If the IBM AT has only one low density drive, use it for a one drive install specifying that drive letter for both Product and Target disks. PUBLISHED: 16 Dec 1986 MAIN_TOPICS: INSTALLATION: THYSYS FASTCARD TEXT: When using THYSYS FASTCARD be sure to turn the cash buffer off; otherwise, you will get an installation error #120. With the cash buffer on, SUPERLoCK thinks it is trying to copy to a RAM disk. PUBLISHED: 16 Dec 1986 MAIN_TOPICS: INSTALLATION TEXT: The version of SUPERLoK (2.0.3) that we use on CLIPPER supports the Televideo IBM compatibles, including the portable TCB2. The TCB2, however, has undergone various changes in its EPROM and only releases D and higher are supported. How, you ask, does a customer know if he has the wrong EPROM ? Well, that's probably why he's calling us in the first place - 'cause it dosn't install. Advise the customer to call Televideo Tech Support. The numbers are: In CA: 1-800-821-3774 Outside CA: 1-800-521-4897 They will arrange for him to receive a free upgraded EPROM and then his installation problems will be over. PUBLISHED: 16 Dec 1986 MAIN_TOPICS: INSTALLATION TEXT: SUPERLoK does not want to install on a two drive A.C.T EXTURBO (P.C.clone). In fact, in some cases it will completly trash your CLIPPER disk. PUBLISHED: 16 Dec 1986 MAIN_TOPICS: INSTALLATION: ROUTINE BACKUPS TEXT: Users who do routine daily or weekly backups of their hard disks do not have to use the UNInstall command. If they are unsure if they are restoring the root directory then use the "/p" option on the DOS RESTORE command when and if a RESTORE becomes necessary. Reply N if any attempts are made to restore "read-only" files. In this way protected programs will never become unauthorized. The "/p" option of the RESTORE command will not harm anything even if it is not nesessary. Some marketers of third party backup/restore programs have made changes to their program so that the "/p" is not required. The only special consideration when using these programs is to UNInstall if you plan to reformat your hard disk. PUBLISHED: 16 Dec 1986 MAIN_TOPICS: INSTALLATION: SUPERLOK UNINSTALL TEXT: When to use the SUPERLoK UNInstall: 1. If for some reason you need to reformat your hard disk. For instance you are having some type of problem which requires removal, repair or you need to re-partition the disk then you need to UNInstall the SUPERLoK protected products. Formatting a hard disk will unauthorize protected products and will cause you to loose an "install count" unless you UNInstall first. This is unfortunate but necessary to prevent unauthorized copies from easily being transferred to other hard disks. If you know that you will be reformatting, then: a) UNInstall the protected products. b) Do a full BACKUP of the hard disk. c) Do the re-formatting or whatever is necessary. d) RESTORE the entire hard disk ("/p" not required). e) Re-Install the protected products. 2. If you want to move the protected software from the hard disk on one computer to the hard disk of another computer then it is necessary to use the SUPERLoK UNInstall and Install procedures. In this way you will never have more than one authorized copy at a time. PUBLISHED: 16 Dec 1986 MAIN_TOPICS: INSTALLATION: BACKUP, RESTORE TEXT: SUPERLoK 2.0.3 Backup / Restore Considerations With version 2.0.3 of Softgaurd's SUPERLoK protection system additional ease-of-use features were incorporated into the hard disk protection. When SUPERLoK protected software is installed to any hard disk directory the floppy "key" disk is not required for execution. The software remains protected on the hard disk. SUPERLoK protection is designed to prevent the unauthorized transfer of the protected software from one hard disk to another. The SUPERLoK UNINSTALL feature allows the user to remove the protected software from the hard disk in a controlled manner. With regard to backing up or restoring a hard disk which contains SUPERLoK 2.0.3 protected sofware the following should be noted: The DOS BACKUP (or similar backup's from other vendors) may be used freely and can never have any adverse effect on the protected software. Users may freely copy the protected software from one sub- directory to another on the same hard disk with no restrictions. The protected software may be executed from any hard disk directory. The only restrictions have to do with RESTORING a hard disk. To be more specific, only when the root directory is to be restored (which would include the case when a full 10MB or 20MB restore is being done) must the user do anything different from the way unprotected software would be handled. When restoring the root directory you must use the "/p" option on the DOS RESTORE command. This option will prompt the user each time it attempts to restore a "read-only' file. The user should reply N to the request. In this way the protected products will remain authorized. Note the following examples which should make this more clear: a) If the protected product has been installed in some directory other than the root directory then this directory may be freely backed up and restored just as you would if the software were not protected. b) The protected program and its related files may be backed up and restored even to the root directory with no restrictions if specific file names are used. Remember that it is only a full root directory restore that requires the "/p" option on the DOS RESTORE command. c) If a streaming tape is being used to do the backup/restore operation then the only special consideration revolves around the root derectory of the hard disk. If you need to restore the root directory with a streaming tape, then restore the full hard disk. If only a file restore or a sub-directory is being restored, then there are no restrictions. PUBLISHED: 16 Dec 1986 MAIN_TOPICS: INSTALLATION: SUPERLOK TEXT: Computers supported by SUPERLoK 2.0.3a IBM PC, XT, AT, Portable, 3270 AT&T PC-6300 Columbia 1600 VP COMPAQ Portable, Plus, Deskpro, and 286 Corona (may have problems with models made before March 1984) Ericsson PC and Portable PC HP Vectra ITT XTRA and XP Kaypro 16 Leading Edge NCR Model 4 Olivetti M21 and M24 (with 48 TPI disk drives only) Panasonic Senior Partner Sanyo MBC-775 Sperry Tandy 1000 (when optional DMA card is installed) and 1200 Televideo AT and 1605 (with ROM version 2.4, earlier versions only ran executable distribution copy or floppy working copy made on another machine. Televideo will provide a ROM upgrade kit). Visual Commuter (must boot with PC-DOS) Wyse 1100 Zenith 150 (floppy installation on A: drive only. ZENITH now offers a ROM update for its 150 series. It allows installation on both drives. Just call ZENITH and ask for update version 1.8A) ---------------- Special Cases ------------------------------ The VICTOR VPC and WANG (with PC emulation card) will run an executable distribution copy and install to a hard disk; it does not install floppy working copies. The IBM PCjr and EPSON QX-16 will run an executable distribu tion copy and install to a hard disk if the distribution disk is duplicated on a Formaster machine. Disks made with SGCOPY are not supported. The GRID CASE will run an executable working distribution copy or working copy made on another machine. It does not support either hard disk or floppy disk installs. The DATA GENERAL 1 will run an executable 5-1/4 " distribution copy if the disk was made on a Formaster machine and the miniloader has been patched to disable logical drive assignments. The NORTHSTAR DIMENSION will run an executable distribution copy if duplicated on a Formaster machine. Disks made with SGCOPY are not supported. SUPERLoK can be customized to support the APRICOT, DGI (3-1/2" microfloppy), GRID CASE (3-1/2" microfloppy), MINDSET, TANDY 2000, and T.I. PROFESSIONAL. Available for site licensees and large volume dealers. PUBLISHED: 16 Dec 1986 MAIN_TOPICS: VAL() TEXT: The VAL() function correctly returns data as numeric for mathematical operations. However, it displays data like a string. The value is left justified, not right justified. Example: CLEAR @ 5,0 SAY "|----|----|----|----|----|----|----|" @ 6,0 SAY VAL("1") Output: CLIPPER ------- |----|----|----|----|----|----|----| 1 dBASE III -------- |----|----|----|----|----|----|----| 1 PUBLISHED: 16 Dec 1986 MAIN_TOPICS: TYPE() TEXT: - i - a TYPE() done on an array name will return "A" for "Array" e.g. - declare ARRAY[10] - ? type("ARRAY") - * will return "A" - ii - a TYPE() done on an array element will return "U" for "Undefined" - regardless of any values assigned to it e.g. - ARRAY[1] = 25 - ARRAY[2] = "Hello" - ? type("ARRAY[1]") - * will return "U" - ? type("ARRAY[2]") - * will return "U" - iii- on the other hand, if the array elements are assigned to variables, a TYPE() function done on the respective varaible will return the appropriate type: e.g. - ARRAY[1] = 25 - ARRAY[2] = "Hello" - A = ARRAY[1] - B = ARRAY[2] - ? type("A") - * will return "N" - ? type("B") - * will return "C" PUBLISHED: 16 Dec 1986 MAIN_TOPICS: STR() TEXT: CLIPPER returns a different LEN() for the STR() of the RECNO(). Example: ? LEN(STR(RECNO())) CLIPPER returns a value of 7 dBASE III returns a value of 10 PUBLISHED: 16 Dec 1986 MAIN_TOPICS: STR() TEXT: The STR() function does not return the same value as dBASE III when used with the DAY or YEAR functions. Example: ? LEN(STR(DAY(DATE())) dBASE III returns a value of 10. CLIPPER returns a value of 3. ? LEN(STR(YEAR(DATE())) dBASE III returns value of 10. CLIPPER returns a value of 5. PUBLISHED: 16 Dec 1986 MAIN_TOPICS: MEMORY(0) TEXT: About CLIPPER AUTUMN'86's MEMORY(0) function vs the DOS CHKDSK: A lot of people have been wondering why at times the MEMORY(0) function would return a value that is far different from what CHKDSK would return. This is because the MEMORY(0) function returns only the memory available in Clipper's immediate "free pool" area. It does NOT return any buffer areas such as Index, Run, etc. Running CHKDSK, on the other hand, returns the memory available above the Clipper application program (any buffers reserved for the Clipper environment are cleared when CHKDSK is loaded and reinstated after its execution). | | | | | | T | (this area may | } What CHKDSK will return. O | contain some of | T | Clipper's Environment | A | setup...) | L | | | | M |-----------------------------| E | ----------- | M | | free <----------------- What MEMORY(0) will return. O | | pool | | R | ----------- | Y | | | Clipper Application | | | --- -------------------------- e.g. (this program was tested on a 640K machine) clear declare A[2000],B[2000],C[2000],D[2000] ? memory(0) && may return 29K run chkdsk && may return 173K PUBLISHED: 16 Dec 1986 MAIN_TOPICS: MEMOEDIT() TEXT: The contents of a DBT file are handled in blocks of 512 bytes. Each memo field in a DBF file record contains the block number (in ASCII) which identifies the memo field data location. If the memo field contains no data, there is no number in the DBF file. When you write to the memo field, the next available block is used and its number is stored in the memo field of that record (invisibly behind the word 'memo'). There is a difference between the way Clipper and dBase III handle changes to an exsiting memo field. When you change a memo field using dBASE III, the old contents remain in the DBT file. The changed contents are rewritten to the next available block, and the number in the DBF change to reflect the new location. This leaves the old block unused with no pointer to it in the DBF, which explains why DBT files grow to such a large size. Clipper continues using the same block until the whole 512 bytes are used. Clipper discards the block once it is full, copies its contents to the next available block and continues writing to the following block. The block pointer is then changed in the DBF. The following chart illustrates the differ- ences in DBT size: Resultant DBT File Size per DIR SUCCESSIVE ACTIVITIES CLIPPER dBASE III -------------------------------------------------------- Create empty database 512 513 First record processed add initial character 1026 515 change initial character 1026 1027 add second character 1027 1540 Second record processed add initial character 1538 2051 change initial character 1538 2563 add second character 1539 3076 ------------------------------------------------------- PUBLISHED: 16 Dec 1986 MAIN_TOPICS: ISCOLOR() TEXT: The ISCOLOR() will return a .T. on a AT&T 6300 with a high resolution monochrome monitor. PUBLISHED: 16 Dec 1986 MAIN_TOPICS: IF(,,) TEXT: Regardless of the validity of the first expression, the IF() function will still analyze the remaining two expressions. This is a problem when trying to use the IF() function to avoid Divide by Zero errors. Example: Y=0 N=1 ? IF(Y=0,0,N/Y) ? IF(Y<>0,N/Y,0) Y=1 ? IF(Y=0,0,N/Y) ? IF(Y<>0,N/Y,0) PUBLISHED: 16 Dec 1986 MAIN_TOPICS: INKEY() TEXT: The INKEY value of END and W is the same. They both return 23. But, they have different functions. PUBLISHED: 16 Dec 1986 MAIN_TOPICS: FILE() TEXT: 1) The FILE() does not recognize hidden files. 2) The FILE() in CLIPPER will allow the use of wildcards when referring to files. Example: ? FILE("*.PRG") && will return .T. if any .PRG * files exist in directory. PUBLISHED: 16 Dec 1986 MAIN_TOPICS: CTOD() TEXT: CLIPPER will not accept an invalid date in a CTOD(). dBASE III will convert an invalid date to its proper equivalent. Also, CLIPPER will return the absolute value of a negative month. Example: ? CTOD("02\30\86") CLIPPER dBASE ------- ----- " \ \ " "03\02\86" ? CTOD("02\-28\86") CLIPPER dBASE ------- ----- "02\28\86" "01\03\86" PUBLISHED: 16 Dec 1986 MAIN_TOPICS: CTOD() TEXT: CLIPPER and dBASE III PLUS evaluate relational comparisons between dates differently if one of them is blank or empty. CLIPPER treats the blank date as less than the substantive one. dBASE illogically denies that either date exceeds the other or that they are equal. Example: date = CTOD('06/02/86') blank = CTOD(' / / ') dDBASE CLIPPER -------- -------- ? date > blank .F. .T. ? date < blank .F. .F. ? date = blank .F. .F. PUBLISHED: 16 Dec 1986 MAIN_TOPICS: CHR(N) TEXT: CLIPPER does not support the use of CHR(0), the null byte. This has its roots in the use of the null byte as the standard string terminator in the C language, in which CLIPPER is written and to whose standards it adheres. For example, if you assign x = "ABC" + CHR(0) + "DEF" ? LEN(x) the length function returns six, not seven. Similarly, if you try to send a string consisting of CHR(0) to a device, the CHR(0) itself is interpreted as the end of the string, so nothing is sent. In order to send CHR(0) to a printer, it must be sent by itself. Example: SET PRINTER ON ? CHR(0) + CHR(n) && the CHR(0) will not be sent Work-around: SET PRINTER ON ? CHR(0) ?? CHR(12) && this will be accepted by printer PUBLISHED: 16 Dec 1986 MAIN_TOPICS: &MACRO TEXT: The maximum amount of conditions in a MACRO is 15. On the 16th condition you will get a MACRO ERROR FAULT. The amount of conditions allowed is dependent on the complexity of the conditions. For example: When using ALIASES (->) the upper limit is 9. The 10th causes the error. PUBLISHED: 16 Dec 1986 MAIN_TOPICS: TOTAL TO ON TEXT: The TOTAL command requires that the fields being TOTALed are large enough to store the results of the TOTAL. AUTUMN '86 will return the error DATABASE NUMERIC OVERFLOW. PUBLISHED: 16 Dec 1986 MAIN_TOPICS: TOTAL TO ON TEXT: The maximum number of fields to be TOTALED is 61 in WINTER '85 and 120 in AUTUMN '86. PUBLISHED: 16 Dec 1986 MAIN_TOPICS: SET RELATION TEXT: CLIPPER/dBASE have different interaction between SET RELATION ... INTO and SET FILTER TO If: - you USE a parent file, - SET RELATION ... INTO a child file on a field with the same name in both files, and - SET a FILTER condition on the child file, then, in dBASE - the child pointer, under control of the RELATION while the parent pointer is being manipulated, is allowed to land on records that fail the condition. Most other opera- tions on the child pointer, including a direct FIND or SEEK, are blind to these unqualified records. SET RELATION is an exception. This is mentioned in Ashton-Tate's Tech Notes journal, May 86 issue, p. 11. in CLIPPER - the child pointer in the same situation goes to EOF. Child pointer behavior in response to parent pointer movement is the same as in response to FIND and other commands, i.e., it respects the FILTER condition. PUBLISHED: 16 Dec 1986 MAIN_TOPICS: SET PRINTER TO TEXT: dBASE will accept the statement SET PRINTER TO LPT1:. CLIPPER will issue a DOS ERROR 2 LPT1: NOT FOUND. CLIPPER interprets the colon to be part of a file name. The work-around is to eliminate the colon in the statement. SET PRINTER TO LPT1 will work. PUBLISHED: 16 Dec 1986 MAIN_TOPICS: SET MESSAGE TO TEXT: The line used in a SET MESSAGE TO is reserved only for that command, and is not available for other displays. Example: SET MESSAGE TO 24 @ ROW, COL PROMPT "XXXX" MESSAGE "XXXX" --source code-- MENU TO --source code-- @ 24, 5 PROMPT "PRINT THIS" && This will not appear on * the screen since line 24 * is reserved for messages. Work-around: SET MESSAGE TO will free that line. PUBLISHED: 16 Dec 1986 MAIN_TOPICS: SET KEY TO TEXT: When calling a SET KEY TO procedure or the F1 help program from a WAIT TO command, the variable name is not passed to the input_var PARAMETER. PUBLISHED: 16 Dec 1986 MAIN_TOPICS: SET FUNCTION TEXT: If the function keys were set from DOS, then you can't set the function keys in CLIPPER. CLIPPER dosn't bypass what the keys were set to. If you clear the buffers before using an EXE, then they can be set. PUBLISHED: 16 Dec 1986 MAIN_TOPICS: SET FORMAT TO TEXT: When using .CLP files with a program that has SET FORMAT TO statements, the .FMT files must have .PRG extensions and they must be included in the same .CLP file as the calling program. If they are not included the error message FATAL AT n ILLEGAL SYMBOL MODE will occur where n is the last line of the calling program. Another work-around is to declare the format files as externals by using the EXTERNAL command, then compile the format files in a seperate .CLP file. This has been fixed in AUTUMN '86. PUBLISHED: 16 Dec 1986 MAIN_TOPICS: SET FILTER TO TEXT: When a MACRO is used to set a filter, the filter is changed whenever the macro variable is changed. In dBASE, the filter is retained in memory and the memory variable becomes available for other uses; but, in CLIPPER a reference is continually made to the variable when addressing the filter. PUBLISHED: 16 Dec 1986 MAIN_TOPICS: SET ESCAPE OFF TEXT: When an is entered from a MENU TO command, a zero is placed in the variable. SET ESCAPE does not affect this command. Work-around: Use the SET KEY command to nulify the key SET KEY 27 TO proc_name -source code - -etc. PROCEDURE proc_name PARAMETERS a,b,c RETURN PUBLISHED: 16 Dec 1986 MAIN_TOPICS: SELECT ALIAS TEXT: If an alias is SELECTed but never defined, CLIPPER will not issue an error message. A DELETE or REPLACE issued in this work area will result in a REC !IN NTX error message. PUBLISHED: 16 Dec 1986 MAIN_TOPICS: REPLACE TEXT: dBASE III allows REPLACEment into a numeric field of a number too large to fit field specifications, if the specs include decimal places. CLIPPER WINTER '85 fills the field with asterisks. AUTUMN '86 will display the error "Database Numeric Overflow". Example: fieldname is defined as a numeric field 6 positions wide with 3 decimal places. var = 123456 REPLACE fieldname WITH var Results- dBASE III = 123456 CLIPPER = ****** PUBLISHED: 16 Dec 1986 MAIN_TOPICS: RELEASE ALL TEXT: A variable declared PUBLIC can not be RELEASED with the RELEASE ALL statement. The PUBLIC statement takes precedence over the RELEASE statement. However, you can release a specified variable. Example: PUBLIC var RELEASE ALL ? var && var will = .F. RELEASE var ? var && var will be undefined. PUBLISHED: 16 Dec 1986 MAIN_TOPICS: RANGE TEXT: If a variable is initialized to a value outside of the specified RANGE, CLIPPER will not allow you to keep this default value. dBASE will erroneously accept this value. Example: x = 5 y = 10 num = 0 @ 2,10 GET num RANGE x,y READ && CLIPPER results in * out of range message Work-around: @ 2,10 GET num VALID ((num=0) .or. (num>=x .AND. num<=y)) PUBLISHED: 16 Dec 1986 MAIN_TOPICS: PRIVATE ALL TEXT: The CLIPPER manual states non-support of the PRIVATE ALL command; however, the command will compile without an error message and create a PRIVATE variable named "ALL". PUBLISHED: 16 Dec 1986 MAIN_TOPICS: LOCATE TEXT: Although it is not documented, dBASE III will allow LOCATE RECORD n. CLIPPER will give the error message TYPE CONFLICT IN CONDITION. PUBLISHED: 16 Dec 1986 MAIN_TOPICS: LOCATE [] [FOR/WHILE ] TEXT: The WHILE option in the LOCATE command requires a preceding FOR. Otherwise, a "TYPE CONFLICT IN CONDITION " error will occur. PUBLISHED: 16 Dec 1986 MAIN_TOPICS: KEYBOARD TEXT: CLIPPER has a keyboard buffer limit of 16 characters. Utilities such as BIGBUF will not expand limitation. PUBLISHED: 16 Dec 1986 MAIN_TOPICS: KEYBOARD TEXT: The following keys are not functional with the KEYBOARD command: HOME CHR(1), END CHR(6), CTRL PgUp CHR(30) and CTRL PGDN CHR(31). PUBLISHED: 16 Dec 1986 MAIN_TOPICS: KEYBOARD TEXT: The KEYBOARD command will not stuff the keyboard buffer with a negative number. For example, if you stuff the keyboard with a CHR(-1) , it will return a CHR(255). PUBLISHED: 16 Dec 1986 MAIN_TOPICS: JOIN TEXT: CLIPPER requires that you use alias arrows when listing fields outside the active file in USE. dBASE does not require them unless both work areas have duplicate field names. PUBLISHED: 16 Dec 1986 MAIN_TOPICS: INDEX ON TEXT: CLIPPER will allow indexing on a memo field if spaces are added to the index expression. Example: INDEX ON memfield + SPACE(100) TO mem_ntx PUBLISHED: 16 Dec 1986 MAIN_TOPICS: INDEX ON TEXT: If you index just after the computer is turned on, the index time is much slower. But if you index immediately after, the speed will be faster. Apparently this has somthing to do with DOS. This test was done on a COMPAQ 286 with 640K RAM and DOS 3.0. PUBLISHED: 16 Dec 1986 MAIN_TOPICS: INDEX ON TEXT: When INDEXing on a numeric field divided by another numeric, the runtime error "Divde by zero" will occur. This is because CLIPPER evaluates the length of an index on a blank record. A blank numeric field is a zero, resulting in the error. Work-around: INDEX ON the zero function illustrated in the READ_ME.1ST file under the REPORT FORM command. The decimal length of the index is determined by the RETURN statement in the function. Example: FUNCTION ZERO PARAMETERS znum1, znum2 IF znum2 <> 0 RETURN (znum1/znum2) ENDIF RETURN (0.00) && This sets the decimals * place to 2. PUBLISHED: 16 Dec 1986 MAIN_TOPICS: FUNCTION TEXT: CLIPPER will not allow the FUNCTION statement within an IF statement. The error "Unbalanced IF/ELSE" will occur. The same is true when creating a PROCEDURE. Example: IF Clipper FUNCTION funcname ---code--- RETURN (X) ENDIF Work-around: IF Clipper DO procedure && which creates a function ENDIF PUBLISHED: 16 Dec 1986 MAIN_TOPICS: EJECT TEXT: Some printers , i.e. Citoh, do not recognize the EJECT command. Workaround: Instead of EJECT, do this procedure SET DEVICE TO PRINT SET CONSOLE OFF @ 0,0 SAY CHR(13) SET PRINT ON ?? CHR(12) SET PRINT OFF SET CONSOLE ON SET DEVICE TO SCREEN PUBLISHED: 16 Dec 1986 MAIN_TOPICS: DO WITH TEXT: If a M->memvar is passed as a parameter, the memvar is passed by value. Any changes made in the called procedure will not change the original memvar. This is also true in dBASE but worth noting in this journal. PUBLISHED: 16 Dec 1986 MAIN_TOPICS: DO WITH TEXT: To pass a field to a procedure as a parameter, the fieldname must be in parenthesis. For example: DO IT WITH (sally) This passes the field (sally) to the procedure IT by value. PROCEDURE IT PARAMETER memvar (memvar) contains the image of (sally). Changing (memvar) will not change (sally). PUBLISHED: 16 Dec 1986 MAIN_TOPICS: DO FILENAME TEXT: The official party-line limit on procedure name lengths is 10 characters, same as dBASE. However, names up to and including 15 characters seem to work. Problem: names 16 characters or greater cause compilation to halt abruptly on the DO command line. Neither Alt-C nor Ctrl-Break will unfreeze the system. Ctrl-Alt-Del will reset. Examples: ** This program can be compiled ? "hello" do A23456789012345 ? "goodbye" procedure A23456789012345 ? "I'm a subroutine" return ---------------------------------- ** This program cannot be compiled ? "hello" do A234567890123456 ? "goodbye" procedure A234567890123456 ? "I'm a subroutine" return PUBLISHED: 16 Dec 1986 MAIN_TOPICS: DO TEXT: CLIPPER will not DO a file that begins with a number. All programs must begin with a letter or the error message ".PRG assumed external" will occur. However, if the main program begins with a number it can be compiled. PUBLISHED: 16 Dec 1986 MAIN_TOPICS: DECLARE - ARRAYS TEXT: Memory is allocated "dynamically" when using arrays. For example: If an array of 100 elements has been declared, a pointer is set from the memvar area to a small chunk of memory area where a reference to the array elements are kept. This array area is 22 bytes wide times the number of elements long. (See figure 1) If the values in the array elements are of type NUMERIC, they are stored within this area in their respective storage element area. (See figure 2) If the values were of type CHARACTER, a pointer is set from the storage element area of that array to any contiguous area of memory that can hold that string. (See figure 3) figure 1: memvar area ------------------ 22 bytes | | <--long--> ------------------ |-----------| ------------------ |-----------| Array(100) | | |-----------| | ------------------ |-----------| | | Array(100) | ------> |-----------| ------------------ |-----------| | | |-----------| | | figure 2: 22 bytes long ------------------ | 1) | Array(2) = 75 ------------------ Array(3) = 40 | 2) 75 | | ------------------ Array(100) | 3) 40 | | ------------------ | | 4) | ------------------ | | figure 3: --------------- 22 bytes long ----> | "Hello There" | ------------------ | --------------- | 1) | ------------ ------------------ | 2) 75 | | ------------------ Array(1) = "Hello There" Array(100 | 3) 40 | Array(4) = "Waz Happenin..." | ------------------ | | 4) | ----- ------------------ | | | | ------------------- ---------> | "Waz Happenin..." | ------------------- PUBLISHED: 16 Dec 1986 MAIN_TOPICS: DECLARE [EXPN] TEXT: When GETting array elements from a loop, the VALID option will only work on the array element to which the variable indexing the array is assigned. In the following example, only array element five will honor the VALID statement. Example: DECLARE ARR[7] FOR X = 1 TO 7 ARR[X] = 'A' NEXT col = 24 FOR X = 1 TO 7 @ ROW() + 1 , col GET ARR[X] VALID (ARR[X] $ "AB") NEXT x = 5 READ RETURN *** Note: The RANGE option will work with numerics. PUBLISHED: 16 Dec 1986 MAIN_TOPICS: COPY FILE TEXT: Command.com must be available to the default drive when issuing this command. Example: COPY FILE a:filename TO b:filename if A: is the default drive then Command.com must be on that drive. PUBLISHED: 16 Dec 1986 MAIN_TOPICS: APPEND FROM [FOR/WHILE ] TEXT: When appending from a file with a FOR/WHILE condition, CLIPPER requires that the fields referred to in the condition are present in both files. CLIPPER will not append any records, but dBASE will accept it. Also, the fields must be of the same type. Otherwise, TYPE CONFLICT IN REPLACE will occur. PUBLISHED: 16 Dec 1986 MAIN_TOPICS: APPEND FROM TEXT: If you go into dBASE III, use a .DBF, delete records from there, pack it, and then go into Clipper and then append from that file, Clipper may add those deleted records. The above happens because after a PACK transaction, dBASE does not reset DOS's eof marker, and Clipper (which reads to DOS's eof) will add those "deleted/packed" records. You can avoid this problem by: 1 - doing ALL your file processing in Clipper, or 2 - if you have to go into dBASE, then the minute you get back into Clipper, open the file and then close it before you do any type of transaction. This ensures that the DOS eof marker is reset to the real end-of-file. PUBLISHED: 16 Dec 1986 MAIN_TOPICS: @ ROW, COL SAY GET TEXT: If a row greater than 24 is specified, no error message will be displayed. Instead, the cursor will go to the bottom of the screen and the program will hang. PUBLISHED: 16 Dec 1986 MAIN_TOPICS: @ [EXPN],[EXPN] SAY [EXPC] PICT [PICT. LIST] TEXT: A PICTURE clause that uses the 9 or # symbol but specifies no decimal position causes the decimal position of a numeric [exp] to be rounded. dBASE III instead truncates it. Example: x = 2.6 @ 10,10 SAY x PICT "9" ********* Output ******** dBASE III CLIPPER 2 3 PUBLISHED: 16 Dec 1986 MAIN_TOPICS: '!==' TEXT: The exclamation mark used with the double equal sign will not work. The error MACRO ERROR EXPRESSION will occur. PUBLISHED: 16 Dec 1986 MAIN_TOPICS: APPEND FROM TEXT: If you go into dBASE III, use a .DBF, delete records from there, pack it, and then go into Clipper and then append from that file, Clipper may add those deleted records. The above happens because after a PACK transaction, dBASE does not reset DOS's eof marker, and Clipper (which reads to DOS's eof) will add those "deleted/packed" records. You can avoid this problem by: 1 - doing ALL your file processing in Clipper, or 2 - if you have to go into dBASE, then the minute you get back into Clipper, open the file and then close it before you do any type of transaction. This ensures that the DOS eof marker is reset to the real end-of-file. PUBLISHED: 16 Dec 1986 MAIN_TOPICS: @ ROW, COL SAY GET TEXT: If a row greater than 24 is specified, no error message will be displayed. Instead, the cursor will go to the bottom of the screen and the program will hang. PUBLISHED: 16 Dec 1986 MAIN_TOPICS: @ [EXPN],[EXPN] SAY [EXPC] PICT [PICT. LIST] TEXT: A PICTURE clause that uses the 9 or # symbol but specifies no decimal position causes the decimal position of a numeric [exp] to be rounded. dBASE III instead truncates it. Example: x = 2.6 @ 10,10 SAY x PICT "9" ********* Output ******** dBASE III CLIPPER 2 3