Category : Dbase (Clipper, FoxBase, etc) Languages Source Code
Archive   : C5ANOM07.ZIP
Filename : CL507.TXT

 
Output of file : CL507.TXT contained in archive : C5ANOM07.ZIP
----------------------------------------------------------------------------
README About this report.

Report Name: CL507 Report Date: 12/18/90
Author: Compiled by Jo W. French dba Practical Computing of La Canada
290 Starlight Crest Drive
La Canada, CA 91011
(818) 790-3699
CompuServe ID: 74730,1751
Notes: Supercedes CL506. See Credits. ~ indicates change from last issue.

This report pertains to Clipper(r) 5.0. Each item herein contains the
applicable version number. It has been compiled from messages posted
on CompuServe forums from 09/15/90 through 12/17/90. The author has
verified most, but not all, of the stated anomalies. The severity of
each item is best left to the reader's judgement; however, those items
which will 'crash' the system are so noted.

Verification Conditions.

a) COMPILER: Clipper 5.0 version 1.03 dtd 09/15/90.
b) LINKER: RTLINK version 3.11 as supplied by lanquage vendor.
No Incremental Linking was used.
c) SYSTEM: IBM PS/2 Model 80 with 4Mb RAM, 222 Mb Fixed Disk.
d) DOS Version: IBM DOS version 3.30.
e) CONFIG.SYS:
DEVICE=c:\dos\vdisk.sys 1536 512 128 /E
DEVICE=c:\qemm\qemm.sys RAM
SHELL=c:\command.com /E:512 /P
FILES=51
BUFFERS=8
f) ENVIRONMENT
COMSPEC=C:\COMMAND.COM
PROMPT=$p$g
PATH=C:\dos;C:\bat;C:\;C:\me;C:\ws5;F:\clipper5\bin;D:\trh;
C:\qemm;F:\ng;
LIB=F:\clipper5\lib;
INCLUDE=F:\clipper5\include;
OBJ=F:\clipper5\obj;
PLL=F:\clipper5\pll;
CLIPPER=F21;
g) EXTENDED MEMORY: 1536Kb (DOS VDISK)
h) EXPANDED MEMORY: 1536Kb (QEMM vs. 5.0)
i) TSR's: All TSR's are loaded above 9FFF using QEMM's LOADHI.
----------------------------------------------------------------------------
Credits That's Thanks Folks!

My Thanks to the Sysops and Members of CompuServe for their
countless hours of cussing, working and losing sleep to present
solutions to the anomalies presented herein. Keep up the Good Work!

This is NOT an official Nantucket(r) publication.

Please report errors and ommissions to: Jo W. French 74730,1751

Note: See Read Me
----------------------------------------------------------------------------
ACOPY() Fails to copy under certain conditions.

Clipper Version 1.03 dtd 09/15/90.

Problem Statement

ACOPY() fails to copy when the 4th parameter, , is NIL in a
parameter list; e.g., ACOPY(, , , , ).

Cause

Unknown. is apparently defaulting to 0 in this incidence.

Work Around(s)

Place a valid number in this parameter position; e.g.,
ACOPY(, , , LEN(), ).

Notes

ACOPY(, ) works satisfactorily for a complete copy.

----------------------------------------------------------------------------
AEVAL() Undocumented return reference.

Clipper Version 1.03 dtd 09/15/90.

Problem Statement

AEVAL() documentation does not mention the presence of a second return
reference; i.e., the element number.

Cause

Documentation omission.

Work Around(s)

Annotate your documentation.

Notes

This permits things like the following:

AEVAL(array, { | value, element | array[element] = value * 2 } )

which replaces each element with 2 times the original value.

seealso "DBEVAL()"

----------------------------------------------------------------------------
ALLTRIM() Returns runtime error if embedded in a macro.

Clipper Version 1.03 dtd 09/15/90.

Problem Statement

When ALLTRIM(cVar) is included in a macro statement, a runtime
error occurs when the macro is expanded.

Cause

ALLTRIM(cVar) is a psuedo-function, created by directive in STD.CH; i.e.,

#translate Alltrim() => Ltrim(Trim( ))

Work Around(s)

1) Create a real function, ALLTRIM(cVar), in your .PRG; e.g.,
FUNCTION ALLTRIM
PARAMETERS cVar
RETURN LTRIM(TRIM(cVar))

2) Create the above function and compile using the /N option.
Include the resultant .OBJ file when linking.
Note: You may delete the #translate line from MYNAME.CH.

3) Create the above function and compile using the /N option.
Add the resultant .OBJ file to a .LIB file; e.g., EXTEND.LIB.
Note: You may delete the #translate line from MYNAME.CH.

4) Replace all ALLTRIM(cVar) references in your .PRG with
LTRIM(TRIM(cVar)).

Note

See Support Bulletin 4 in the NANFORUM Library.

seealso "RIGHT()" "STD.CH"

----------------------------------------------------------------------------
APPEND 'Sticks' at EOF() ??. ~

Clipper Version 1.03 dtd 09/15/90.

Problem Statement

The following is extracted from a message posted by ron 70671, 156:

When appending records to a file and successfully writing to and unlocking
that record, a SKIP -1, or lookup with the SEEK command, results in the
record pointer going to EOF(). GO TOP and GO BOTTOM do not work and
neither does SKIP -1.

Cause

Unknown

Work Around(s)

Close .dbf and re-open for subsequent operations.

Notes
Netware 386 3.1 LAN with MS-DOS 4.01 and 3.3 workstations. 35 files open.
Problem not reproducible with same database and only 4 other files open.
Index and .dbf are updated successfully.

----------------------------------------------------------------------------
ARRAYS/Externals AADD() and ASIZE() .. Incompatible with C/ASM. ~

Clipper Version 1.03 dtd 09/15/90.

Problem Statement

If an array is declared using the form:

LOCAL aArray := {}

and AADD() or ASIZE() are used to size the array, the array is not
compatible with externals such as C and ASM.

Cause

Unknown

Work Around(s)

If the array is declared and sized using the form:

LOCAL aArray[20]

it can be used with C and ASM.

----------------------------------------------------------------------------
ASORT() Array sort with NIL elements out of order.

Clipper Version 1.03 dtd 09/15/90.

Problem Statement

When ASORT() is used on an array containing NIL elements, the last
non-NIL data will appear in the last element; e.g., AA, BB, NIL,
NIL, CC.

Cause

Unknown.

Work Around(s)

After sorting an array which contains NIL elements, perform the
following operation:

FOR i = LEN(aArray) TO 1 STEP -1
IF aArray[i] = NIL
ADEL(aArray,i)
ENDIF
NEXT

which will place all NIL elements at the end of the array; e.g.,
AA, BB, CC, NIL, NIL.

----------------------------------------------------------------------------
BOF() Set to .F. on each database access.

Clipper Version 1.03 dtd 09/15/90.

Problem Statement

1) BOF() is reverts to .F. each time the database is accessed; e.g.,
IF .and. BOF() will always return .F. where condition> might be something like IF field_data == "something".

2) BOF() will return .T. under the following example:
USE test
GO LASTREC() + 1
? BOF() // => .T.

Cause

Unknown.

Work Around(s)

1) Assure that BOF() is evaluated before evaluating other database items.
In the example above, change it to read IF BOF() .and. .

----------------------------------------------------------------------------
BASE50.PLL Pre-linking with this file may 'hang' the system.

Clipper Version 1.03 dtd 09/15/90.

Problem Statement

A user, without EMS, reported that his system 'hung' when indexing a
7674 record file containing a 6 character field. He was pre-linking
BASE50.PLL

Cause

Unknown.

Work Around(s)

In the reported incident, the problem was cured by NO pre-linking
or pre-linking with Roger Donnay's, FULLBASE.PLL. See FAST50.ZIP
in NANFORUM's LIB 17.

seealso "INDICES" "MEMORY/VMM"

----------------------------------------------------------------------------
CALL()* Parameters are passed in reverse order.

Clipper Version 1.03 dtd 09/15/90.

Problem Statement

When CALL proc WITH a, b, c is executed the receiving procedure will
receive the parameters as c, b, a.

Cause

Unknown.

Work Around(s)

Reverse order of parameter list or use extend system.

seealso "EXTEND System"
----------------------------------------------------------------------------
CLD Debugger anomalies.

Clipper Version 1.03 dtd 09/15/90.

Problem Statement

1. Linking CLD.LIB, as a LIB, does not work.
2. RESTART command does not work, gives SYNTAX ERROR.
3. PASS POINTS does not work as described in documentation.
4. LIST only lists Break Points not Watch Points and Trace Points.
5. F6 DBF file view: Moving in alist of tables when one or more is
empty or EOF() causes the debugger to bomb.
6. Only one command line parameter is recognized; i.e., when
CLD testprog par1 par2 is executed, par2 is NIL.
7. Other. See CLDBUG.ZIP in the NANFORUM LIB for 4 other anomalies;
i.e., date display, ambiquous variables, erroneous commands and
accessing the error class exported variable e.args.

Cause

Unknown.

Work Around(s)

1. Link CLD.LIB as an .OBJ; i.e., RTLINK FI yourfile, CLD.LIB
2. Unknown.
3. Use 'PASSPOINT' instead of 'PP'.
4. Unknown.
5. Pressing a menu hot key and RESTART off the menu will get things
back in order.
6. Unknown.
7. See referenced file.

----------------------------------------------------------------------------
CLOSE-UP Problem with CLOSE-UP remote operation.

Clipper Version 1.03 dtd 09/15/90.

Problem Statement

Keys not recognized when using CLOSE-UP remote operation, specifically
in MENU TO operation.

Cause

Incorrect CLOSE-UP settings.

Work Around(s)

Set CLOSE-UP keys to Advanced (requires version 3.0A).

----------------------------------------------------------------------------
COL() Returns start of 'get' display vs end in S'87.

Clipper Version 1.03 dtd 09/15/90.

Problem Statement

COL() returns the column at the start of a get display in Clipper 5.0
vis-a-vis the end of the get display in Summer '87.

Cause

Unknown.

Work Around(s)

Adjust screen display commands accordingly or use the new Get Class
functions; e.g.,

...
@ 0,0 say "Input" GET VALID myfunc
READ

FUNCTION myfunc
LOCAL g := getactive()
@ g:row, g:col + len(g:buffer) + 1 SAY ''
RETURN .t.

----------------------------------------------------------------------------
COMPILER Miscellaneous observations. ~

Clipper Version 1.03 dtd 09/15/90.

Observations

1) IF the /P parameter is used in SET CLIPPERCMD and in the command
line, the result is no .ppo file.

2) Fatal compiler errors, or aborting the compile, will leave, what
one user has dubbed, 'compiler turds'; i.e., compiler working files
on your disk.

3) Reminder, per the manual, pg. 3-2, SET CLIPPERCMD or command line
options MUST be separated by a space (or the remainder will be ignored).

4) /O Compiler Option ( Programming and Utilities Guide, pg 3-10)
If only a path is supplied, it must end with \.

----------------------------------------------------------------------------
DBEVAL() Documentation interpretation. ~

Clipper Version 1.03 dtd 09/15/90.

Problem Statement

DBEVAL() documentation states that DBEVAL() returns NIL. This statement
should not limit your imaginative use of this function, as illustrated
below.

Cause

Not Applicable.

Work Around(s)

Not Applicable.

Notes:

* This example fills a multi-dimensional array with the contents of a ~
* .dbf file using DBEVAL and AEVAL.
* It also demonstrates the dynamic attribute of STATIC arrays and
* use of AEVAL's undocumented, second variable.

STATIC aArray := {}
LOCAL n, y
CLS ; USE test NEW ; ASIZE(aArray,LASTREC())
DBEVAL( {|| ;
aArray[RECNO()] := {} , ASIZE(aArray[RECNO()], FCOUNT()), ;
AEVAL(aArray[RECNO()],{|x,e| aArray[RECNO(),e] := FIELDGET(e)} ) } )
USE
QOUT() ; QOUT()
AEVAL(aArray, { |x,e| AEVAL(aArray[e], { |x| QQOUT(x), QQOUT(" ") }), ;
QOUT() })

seealso "AEVAL()"

----------------------------------------------------------------------------
DBU Miscellaneous anomalies. ~

Clipper Version 1.03 dtd 09/15/90.

Problem Statement

1) If you try to change the name of a memo field, of an existing indexed
(with DBU) database, and answer 'Yes' to the warning that 'Memos will
be lost..'; you will lose all the records in your database as well.

2) You may end up in an 'run-away' situation (Alt C to break) in the
following set of circumstances: (Note: files containg 1000+? records)

a) Open a database and Index with DBU.
b) (F5) Browse the database.
c) Before the screen has completely refreshed the database information,
press (F7) to perform a seek operation (select seek).
d) Enter an index key and 'Watch the fun begin'. (Thanks Kelly!)

Cause

Unknown.

Work Around(s)

Unknown.

----------------------------------------------------------------------------
SET DELETED ON DELETED() records may still be visible. ~

Clipper Version 1.03 dtd 09/15/90.

Problem Statement

Under certain combinations of physical file order (adjacent records),
indexing and filtering, it can be shown that DELETED() records in a file
may remain visible.

Cause

Unknown.

Work Around(s)

Test for DELETED() records; i.e.; in an example, the following showed
a deleted record. Adding .AND. .NOT. DELETED() to the filter cured the
problem. Thanks to a user for submitting test program, files, et al!

SET DELETED ON
USE test NEW
SET INDEX TO test
SET FILTER TO .....
GO TOP
WHILE .NOT. EOF()
? DELETED()
SKIP
END

----------------------------------------------------------------------------
DELIMITED | SDF COPY TO or APPEND FROM anomalies.

Clipper Version 1.03 dtd 09/15/90.

Problem Statement

COPY and APPEND commands, using certain delimiters, do not produce
the desired result. Further, certain APPEND FROM commands will
append junk until all available disk space is exhausted.

Cause

Unknown.

Work Around(s)

Unknown. Nantucket to supply.

Notes:

1) COPY commands; using SDF, DELIMITED or DELIMITED WITH comma; work.
2) APPEND commands; using SDF, DELIMITED or DELIMITED WITH comma; work,
only if the text file ends in ^^Z or . Caution! APPEND will
try to append 'records' until out of disk space, causing a crash.
3) DELIMITED WITH commands, other than those above, fail to produce
the desired results. A hi-bit character will be used as the delimiter.
4) The Detroit Area Clipper Users Group BBS (313-651-7841) has a file,
DBAPPDEL.ZIP (E. Mark Kothe) which contains a program for appending
with a BLANK delimiter.

----------------------------------------------------------------------------
DIRECTORY() Resultant array may == NIL.

Clipper Version 1.03 dtd 09/15/90.

Problem Statement

The array created by the DIRECTORY() function will == NIL if no files
meet the or the is not valid.

Work Around(s)

Annotate your documentation. Test result for NIL.

----------------------------------------------------------------------------
ERRORSYS.PRG Not compatible with S'87.

Clipper Version 1.03 dtd 09/15/90.

Problem Statement

Clipper 5.0's ERRORSYS.PRG is incompatible with S'87 routines.

Work Around(s)

A user has uploaded ERRSUB.ZIP to NANFORUM to resolve differences.

----------------------------------------------------------------------------
EXTEND System Changes made to a variable may effect other variables.

Clipper Version 1.03 dtd 09/15/90.

Problem Statement

When a pointer points to more than one variable and one of the variables
is changed in an ASM or C function, the other variables may be changed.

Work Around(s)
a) Make a local copy of the variable and pass it to the function.
b) Break the pointer relationship before passing the variable.

Notes This subject is slightly over the author's head, so forgive
the terminology .
a) The following is an abstract of a forum message on the subject:

Fm: Pedro P. Polakoff [3PS] 73157,2412
Here is code that will demonstrate that:

1. _parc() returns a pointer to the actual data.
2. cVar1:=cVar2:="Foobar" points both variables at the same
block of memory much as a C char * does.

CLIPPER PORTION ---
static cVar1
static cVar2

function str_test
cVar1:=cVar2:="Foobar" // HERE IS THE ASSIGNMENT
QOut(cVar1,cVar2)
ChangeStr(cVar2) // NOTE NOT PASSED BY REFERENCE
QOut(cVar1,cVar2)
return(NIL)

C PORTION ---

#include

CLIPPER changestr()
{
char *str;
register int p;
byte q='A';

if(PCOUNT==1 && ISCHAR(1)){
str=_parc(1); // pointer to pointer
for(p=0;p<_parclen(1);p++){str[p]^=q;} // directly changed
}
_ret(); // NIL return
}
b) Another example can be found in EXTBUG.ZIP in the NANFORUM LIB 17.
Uploaded by Francois Batte 70022,3424.

seealso "CALL()*"

----------------------------------------------------------------------------
FCREATE Norton Guide documentation error.

Clipper Version 1.03 dtd 09/15/90.

Problem Statement

FCREATE's attribute definition is incorrect in the Norton Guide.

Work Around(s)

Use the documentation in the manual or refer to FILEIO.CH.
The correct attributes are:
0 Create normal read/write file (default)
1 Create read-only file
2 Create hidden file
4 Create system file

----------------------------------------------------------------------------
FIELDWBLOCK() Does not work per 'Guide' description.

Clipper Version 1.03 dtd 09/15/90.

Problem Statement

FIELDWBLOCK(, ) does not access nWorkArea; e.g.,

USE test1 ALIAS one NEW; nOne:= Select() // cFieldName is keyid
USE test2 ALIAS two NEW; nTwo:= Select() // cFieldName is last_name

? EVAL(fieldwblock ("last_name", nTwo)) // works ok.
? EVAL(fieldwblock ("keyid", nOne)) // does not work.

Work Around(s) as submitted by MIKE SCHINKEL 73567,3612.

USE test1 ALIAS one NEW; nOne:= Select()
USE test2 ALIAS two NEW; nTwo:= Select()

? one->( EVAL( FieldWBlock( "keyid", nOne ) ) ) // Both these
? ( nOne )->( EVAL( FieldWBlock( "keyid", nOne ) ) ) // are same.

? two->( EVAL( FieldWBlock( "last_name", nTwo ) ) ) // Both these
? ( nTwo )->( EVAL( FieldWBlock( "last_name", nTwo ) ) ) // are same.

Notes

A description of FIELDWBLOCK's behaviour, as submitted by Manuel
Gonzalez 71121,1442, is as follows:

1) If the work-area number fed to FIELDWBLOCK is the same as the current
work area and the field exists, it returns the field's value when
it's EVALuated.

2) If the work-area number fed to FIELDWBLOCK is the same as the current
work area and the field does not exist, it returns NIL.

3) If the work-area number fed to FIELDWBLOCK is not the same as the
current work area and the field does not exist in the work area
specified, ERRORSYS says: "Variable does not exist: (fieldname)."

4) If the work-area number fed to FIELDWBLOCK is not the same as the
current work area and the field DOES exist in the work area spe-
cified, FIELDWBLOCK returns NIL. EVALuating FIELDWBLOCK bombs.


----------------------------------------------------------------------------
GETSYS.PRG Modifications and corrections. ~

Clipper Version 1.03 dtd 09/15/90.

Problem Statements

1) Unable to enter characters having an ASCII value > 127 in GET's.

2) Control W or Control End exits getlist.

3) Unable to enter negative decimal numbers using decimal point
movement.

4) When a GET ... WHEN command is issued and a condition dependent
entry is at the top or bottom of the getlist, the system appears to
lock up.

5) An 'unselected' color setting is ignored until the GET is entered ~
and exited.

Cause

1) Line 413 of an unmodified GETSYS.PRG reads as follows:
if (nKey >= 32 .and. nKey <= 127)

2) GETSYS.PRG option

3) Unknown.

4) GETSYS.PRG programming error.

5) Unknown.

Work Arounds

1) Line 413 may be edited, with caution, to permit a greater range of
entries. Check for conflicts with any SET KEY's or SET FUNCTION's.
GETSYS.PRG should be compiled and linked with your .PRG.

2) The GETSYS.PRG has an #ifdef NOTDEF in the program. If you
#define NOTDEF at the beginning of the file, CTRL W and CTRL END
will move to the last valid item of the getlist.

3) Enter negative decimal numbers, with PICTURE template #, as
spaces up to the position before the decimal point, then minus,
then number OR enter minus, then zeros until cursor jumps past
decimal point, then number.

4) The following changes to GETSYS.PRG will correct the problem.

5) Unknown.

Note: This group of changes should be ignored if the 'Ira' fixes,
below, are incorporated.
********************************************************************

The changes commence at line 242 of the original program.

// 242 if (localReadExit)
i := 0
// 244 else
// 245 i := 0
// 246 direction := BACKWARD
// 247 end
end
else
if ( --i < 1 )
* going backward, at top of getlist
if (localReadExit)
i := 0
else
i := 2 // changed 255, was i := 1

********************************************************************
GETSYS.PRG should be compiled with the /N option and linked with
your .PRG.

Note: The following changes to GETSYS.PRG have been submitted by
Ira Emus (76702,672) to 'fix a bunch of anomalies you might find when
using the WHEN keyword.' :

********************************************************************
186 LOCAL nKey := 0, cKey // change
242 IF (LocalReadExit) .OR. nKey == K_ENTER // change
246 i := nLen-1 // change
256 i := 2 // change
334 new := if( localReadExit, 0, 1 ) // reference
335 GetExitRequested := new == 0 // Add
341 new := if( localReadExit, 0, nLen ) // reference
348 GetExitRequested := new == 0 // Add
183 local g, passcount := 0 // change
246 direction := BACKWARD // reference
247 passcount++ // add
256 direction := FORWARD // reference
257 passcount++ // add
260 IF passcount = 2 // add
261 i := 0 // add
262 ENDIF // add
263 loop // reference
264 end // reference
265 passcount := 0 // add
260 g:display() // Add
261 loop // reference
********************************************************************

The above 'Ira' changes have been 're-ordered' by another user
as follows:

"The changes are reordered so that the added lines are in reverse
order so that line numbers don't change their reference line number.
183->182 means 'Ira' code showed line 183 but it should have been 182.

Changed Lines:
183->182 local g, passcount := 0 // change
186->185 LOCAL nKey := 0, cKey // change
242 IF (LocalReadExit) .OR. nKey == K_ENTER // change
246->245 i := nLen-1 // change
256->255 i := 2 // change

Added Lines:
341->334 new := if( localReadExit, 0, nLen ) // reference
348->335 GetExitRequested := new == 0 // Add
334->327 new := if( localReadExit, 0, 1 ) // reference
335->328 GetExitRequested := new == 0 // Add

These 7 line numbers are difficult to tell exactly where g:display()
goes since two changes were made here. They've been combined.

Original code reference:
263->260 loop // reference
264->261 end // reference

After additions (with new line numbers for loop and end).
260 IF passcount = 2 // add
261 i := 0 // add
262 ENDIF // add
260->263 g:display() // add
263->264 loop // reference
264->265 end // reference
265->266 passcount := 0 // add

These four lines are correct.
256 direction := FORWARD // reference
257 passcount++ // add
246 direction := BACKWARD // reference
247 passcount++ // add "

Note
Author's note: I think the 'differences' may be due to Version 1.02 vs.
1.03 - hope everyone can decipher 'em. Thanks to Ira!

seealso "\SOURCE\SYS" "READ" "PICTURE"

----------------------------------------------------------------------------
Get:Delete() Documentation omission.

Clipper Version 1.03 dtd 09/15/90.

Problem Statement

Get:Delete() Syntax is not in documentation.

Cause

Documentation omission.

Work Around(s)

Annotate your documentation to add the definition to the GET Class,
Cursor Movement Methods definitions

delete() Deletes the character under the cursor

----------------------------------------------------------------------------
GetNew() Error in syntax documentation.

Clipper Version 1.03 dtd 09/15/90.

Problem Statement

GetNew() Syntax is not correct in documentation.

Cause

Error in documentation.

Work Around(s)

Edit your documentation to reflect the correct syntax:

GetNew([], [], [],[],[],
[]) --> objGet

----------------------------------------------------------------------------
Get:VarGet() Get Class, missing manual documentation.

Clipper Version 1.03 dtd 09/15/90.

Problem Statement

The definition of VarGet() is missing from the manual, but included
in the Norton(r) Guide.

Cause

Ommission.

Work Around(s)

Annotate your manual to include VarGet() as follows:

varGet() Returns the current value of the Get variable ^r^CEA^r

varGet() --> GetVarValue

Returns the current value of the Get variable. For simple Get
variables this is equivalent to executing Get:block:

aGet:varGet() == EVAL(aGet:block)

However, if the Get variable is an array element, EVAL(aGet:block)
will not return the value of the Get variable; in this case use of
varGet() is required. An example of varGet() may be found in the
READMODAL() function, defined in Getsys.prg.

----------------------------------------------------------------------------
Get:VarPut() Get Class, missing manual documentation.

Clipper Version 1.03 dtd 09/15/90.

Problem Statement

The definition of VarPut() is missing from the manual, but included
in the Norton(r) Guide.

Cause

Ommission.

Work Around(s)

Annotate your manual to include VarPut() as follows:

varPut() Sets the Get variable to the passed value ^r^CEA^r

varPut() --> Value

Sets the Get variable to the passed value. For simple Get variables
this is equivalent to executing Get:block with an argument:

aGet:varPut(aValue) == EVAL(aGet:block, aValue)

However, if the Get variable is an array element, EVAL(aGet:block,
aValue) will not set the value of the Get variable; in this case use
of varPut() is required.

----------------------------------------------------------------------------
IF() Use with caution with commands and statements.

Clipper Version 1.03 dtd 09/15/90.

Problem Statement

IF() will be pre-processed as though it was the IF command and
a compiler error will occur; e.g.,

SET RELATION TO field + IF(
Cause

Pre-processor action

Workaround(s)

1) Use IIF() instead of IF()
2) Make IF() into an expression; e.g., field + (IF())

----------------------------------------------------------------------------
IF nX == 0 May return incorrect logic.

Clipper Version 1.03 dtd 09/15/90.

Problem Statement

Given the assignment, nX := 0.6, the test, IF (nX == 0) will return
true.

Cause

Unknown.

Workaround(s)

1) IF nX == 0.0 works ok.
2) IF 0 == nX or IF 0.0 == nX work ok.
3) IF | IFF( nX == 0, action1, action2 ) work ok.
4) IF ROUND( nX, 2 ) == ROUND( 0, 2 ) works ok.

----------------------------------------------------------------------------
INCREMENT RTlink option, problems.

Clipper Version 1.03 dtd 09/15/90.

Problem Statement

Users have reported problems when attempting to use the Incremental
Linking feature of RTLINK.

Cause

Unknown.

Work Around(s)

Avoid the use of this feature until a fix is available.

----------------------------------------------------------------------------
INDICES Numerous reported problems.

Clipper Version 1.03 dtd 09/15/90.

Problem Statement

Numerous reported problems re' indices; e.g., SEEK's, SET RELATION TO's
and PACK's. Numerical indices containing appended blanks are out of
order. Indexing on a child relation will destroy the child's index.

Cause

Unknown.

Work Around(s)

Unknown. Suggest use of character type index keys. The following
function will handle negative numbers and treat blanks as zeros.

FUNCTION num2str(nNumber)
RETURN ( PADL(LTRIM(STR(IF(nNumber<0,ABS(1/nNumber),nNumber),;
LEN(STR(nNumber))+2,LEN(STR(nNumber))-AT(".",STR(nNumber))+2)),;
LEN(STR(nNumber))+2,IF(nNumber<0,"-","0")) )

A workaround for indexing on a child's data is to use a UDF. Example:

SELECT 2
USE test2 ALIAS S
INDEX ON key_id TO test2
SELECT 1
USE test1 ALIAS P
INDEX ON RELFUNC(P->key_id) TO test1

FUNCTION RELFUNC(idkey)
LOCAL cRetVal
SELECT 2
SEEK idkey
cRetVal = IF( !S->(EOF()), S->last_name+S->first_name,;
SPACE(LEN(S->last_name+S->first_name)) )
SELECT 1
RETURN cRetVal

Note: The index file created by indexing on a number field has a
different internal representation depending upon whether the file was
created by Summer '87 or Clipper 5.0.

seealso "MEMORY/VMM" "PACK" "SET RELATION"

----------------------------------------------------------------------------
INSTALL Installation Problems

See Support Bulletins 1 and 2 in NANFORUM LIB 16.

----------------------------------------------------------------------------
LABEL FORM A runtime error occurs on second execution.

Clipper Version 1.03 dtd 09/15/90.

Problem Statement

If the user attempts to execute a second label report, a runtime
(assignment) error will occur.

Cause

LBLRUN.PRG programming error.

Work Around(s)

Edit lines 115 to 119 of the original LBLRUN.PRG as follows:

aLabelData := {}
aBandToPrint := {}
nCurrentCol := 1
cBlank := ""
lOneMoreBand := .T.

Re-compile and link with programs requiring LABEL FORM.

seealso "NOCONSOLE" "SET CONSOLE"

----------------------------------------------------------------------------
LOCAL Inline assignment clarification.

Clipper Version 1.03 dtd 09/15/90.

Clarification:

Inline assignments of the following form:

LOCAL a := b := c:= 0

result in LOCAL a and PRIVATE b and c

----------------------------------------------------------------------------
MANUAL Missing documentation.

Clipper Version 1.03 dtd 09/15/90.

As noted in the README file, the following function or statement

definitions are missing from the manual:

BREAK() Branch out of a BEGIN SEQUENCE...END construct F
DECLARE* Create and initialize private memory variables and arrays S
DEVOUT() Write a value to the current device F
FIELDBLOCK() Return a set-get code block for a field variable F
FIELDGET() Retrieve the value of a field variable F
FIELDPUT() Set the value of a field variable F
FIELDWBLOCK() Return a set-get block for a field in a given work area F
GETACTIVE() Return the currently active Get object F
MEMVARBLOCK() Return a set-get code block for a given memory variable F
OUTERR() Write a list of values to the standard error device F
OUTSTD() Write a list of values to the standard output device F
SETBLINK() Toggle asterisk (*) interpretation in SETCOLOR() F
SETMODE() Change display mode to specified number of rows, columns F

Note: These definitions have been uploaded as MAN001.TXT and MAN002.TXT
in the NANFORUM library.

The following match-marker description is also missing from the manual:

<(idMarker)> Extended Expression match-marker
ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Extended Expression match-marker: matches a regular or
extended expression, including a filename or path specification. It
is used in combination with the smart stringify result-marker to
assure that extended expressions won't get stringified, while
normal, unquoted string file specifcations will.

----------------------------------------------------------------------------
MEMORY/VMM Numerous reported VMM crashes.

Clipper Version 1.03 dtd 09/15/90.

Problem Statement

Numerous problems have been reported re' memory related crashes.

Cause

Unknown.

Work Around(s)

Unknown, however:

a) One user, Pedro P. Polakoff [3PS] 73157,2412 reports:
Anyone who is having problems with the VMM error: 5317 (Swap space
exhausted), especially when using linker's other than RTLink, can
solve the problem by using the following function call:

Function VMMKickStart()
local cDummy:=Space(8000) // Warplink Base
-- or --
local cDummy:=Space(16000) // Blinker Base
return(NIL)

as the very first executed line of your program.

b) If the system locks up when indexing, and you linked WITH
BASE50.PLL, try linking WITHOUT BASE50.PLL or linking with
Roger Donnay's suggested FULLBASE.PLL. (See FAST50.ZIP in
NANFORUM LIB 17, New Uploads.)

Notes

See Support Bulletins 3 and 4 in NANFORUM LIB 16.

----------------------------------------------------------------------------
MENU TO w/SETKEY Setkey() receives incorrect parameters.

Clipper Version 1.03 dtd 09/15/90.

Problem Statement

The set key procedure does not receive the correct parameters for
cproc, cline and, cvar.

Cause

Unknown.

Work Around(s)

1) Tech support at Nantucket suggests the following work around to be
placed at the top of all setkey() procedures :

if procname(3) == "__MENUTO"
cproc := procname(4)
else
cproc := procname(3)
endi

2) The following alternative(s) have been suggested by a user.

First create an #include file called BUGFIX.CH as follows:

#define FIXCPROC procname(if(procname(3)=='__MENUTO',4,3))
#define FIXCLINE procline(if(procname(3)=='__MENUTO',4,3))
#define FIXCVAR readvar()

and modify your set key procedure by placing the following at the
top of each procedure:

cproc := FIXCPROC
cline := FIXCLINE
cvar := FIXCVAR

OR (Combination of above.)

#define FIXCPASS(x,y,z);
x := procname(if(procname(3)=='__MENUTO',4,3)) ;;
y := procline(if(procname(3)=='__MENUTO',4,3)) ;;
z := readvar()

Place the following at the top of setkey procedures:

FIXCPASS(cproc,cline,cvar)

seealso "PROCNAME()"

----------------------------------------------------------------------------
MISC Miscellaneous clarification/anomalies. ~

Clipper Version 1.03 dtd 09/15/90.

a) CL.BAT (Support Bulletin S50004.TXT)
This batch file was not supplied with Clipper 5.0.
Here are the intended contents:

CLIPPER %1
RTLINK FI %1

b) NDX File Support ( Card contained with Clipper 5.0 )
You must request this feature from Nantucket(r). Not available
as of late November.

c) SETBLINK(), SETMODE() (NG Function Descriptions)
These are environmental or screen attributes; hence, they may
change the full screen when invoked. SETMODE() should be followed
by a CLS or CLEAR SCREEN. You may want to save the screen before
invoking either of these functions.

d) MEMVARBLOCK() (NG Function Description)
MEMVARBLOCK() cannot be used to create set-get blocks for LOCAL
or STATIC variables.

e) A 'splash of color' may remain at 0, 65 after using SETCOLOR()
and GET. This can be eliminated by SET SCOREBOARD OFF.

f) Code block parameter visibility - documentation anomaly.
Page 1-21 of the Clipper 5 Reference, last sentence, 2nd paragraph
reads: "....a declaration that occurs within a code block (a block
parameter), applies to that code block and any code blocks nested
within it.". The block parameter IS NOT visible to nested code blocks,
unless you pass it.

g) In certain incidences, terminating a macro expression with a period,
'.', does not work; e.g.,
FUNCTION IndexFile(cKey, cIndexName)
INDEX ON &cKey. TO (cIndexName)
RETURN (NIL)
Result: Compiler "Error C2081 Macro of declared symbol: '&cKey.'

h) Menu.prg example on page 1-2 of the Reference Manual has as its
first line '#include "Database.prg" ...'. This directive should
be placed at the end of the program (it includes generic database
functions).

i) Cursor anomalies. Try using SET CLIPPER=CGACURS if you are
experiencing cursor anomalies. Reference: NG Environment.

j) Re-direction. Clipper 5.0 does not accept command line parameters
re-directed from a text file; e.g. CLIPPROG < TEXTFILE.

k) Internal Error Numbers are not documented.

l) STATIC arrays. Documentation anomaly, pg. 1-57. Contrary to the
documentation, STATIC arrays are also dynamic.

m) The following program results in a run-time error because x was not
initialized; however, the error message, "Error BASE/1087 Argument
error: -- " should reference ++ instead.

function main
local x
x++
return nil

----------------------------------------------------------------------------
MULTI-STATEMENT Multi-statement lines, CAUTION.

Clipper Version 1.03 dtd 09/15/90.

Problem Statement

When using multiple statements on one programming line; i.e.;
separating commands with a semi-colon; there are several commands
which will cause erroneous results, if they are not at the end of
line.

Cause

Pre-processor action.

Work Around(s)

Make sure that the following commands, if used, appear at the end
of the line, ONLY.

ENDDO <*x*> SET STEP <*x*>
ENDIF <*x*> SET SAFETY <*x*>
ENDCASE <*x*> SET TALK <*x*>
ENDFOR <*x*> SET PATH TO <*path*>
SET ECHO <*x*> SET COLOR TO <*spec*>
SET HEADING <*x*> SET COLOUR TO <*spec*>
SET MENU <*x*> RUN <*cmd*>
SET STATUS <*x*> ! <*cmd*>

COPY TO <(file)> DELIMITED WITH <*delim*>
APPEND FROM <(file)> DELIMITED WITH <*delim*>

seealso "STD.CH" "DELIMITED | SDF" "SET COLOUR"

----------------------------------------------------------------------------
Numerics Problem with numbers > 2 ** 31.

Clipper Version 1.03 dtd 09/15/90.

Problem Statement

Certain large numbers, entered as variables, return unexpected
values. Examples:

Assignment ? nVar

nVar := 4503599627436033 => 4503599627436033
nVar := 4503599627436032 => 4503599627436032
nVar := 4503599627436031 => 65535
nVar := 4503599627403264 => 35868
nVar := 4503599627403263 => 32767
nVar := 4503599627370498 => 2
nVar := 4503599627370497 => 1
nVar := 4503599627370496 => 0 // 2 ** 54
nVar := 4503599627370495 => -1
nVar := 4503599627370494 => -2
nVar := 4503599627337729 => -32767
nVar := 4503599627337728 => 4503599627337728
nVar := 4503599627337727 => 4503599627337727


Cause

Unknown.

Work Around(s)

Append '.0' to the variable at assignment; e.g.,

nVar := 4503599627370496.0 => 4503599627370496.0

Notes

The above example 'ranges' about 2 ** 54. Similar, but not identical,
results will occur when nVar > 2 ** 31. Attempts to assign nVar as
ROUND(nNumber,nPlaces) or nNumber * 1.0 failed to cure the problem;
however, if nVar is created as a result of say 2 ** 32, the assignment
appears to be correct.

----------------------------------------------------------------------------
NG MODE Un-documented Norton(r) Guide Mode.

Clipper Version 1.03 dtd 09/15/90.

Problem Statement

NG can be executed in a mode which will permit it to unload from
memory when F10 or Escape is used to exit the program.

Cause

Documentation omission.

Work Around(s)

Enter NG TEST.NG at the DOS prompt. When NG receives the specific
parameter TEST.NG, it will load in the above described mode.
Annotate your documentation.

Note TEST.NG is the specific parameter to be used. This is NOT
the name of an existing file.

----------------------------------------------------------------------------
NOCONSOLE Not documented as REPORT | LABEL FORM option.

Clipper Version 1.03 dtd 09/15/90.

Problem Statement

NOCONSOLE parameter to REPORT | LABEL FORM .. commands is missing.

Cause

Syntactical ommissions in documentation. Note: FRMRUN.PRG | LBLRUN.PRG
programming uses the presence | absence of a NOCONSOLE parameter to
SET CONSOLE accordingly. See SET CONSOLE for re-programming solutions.

Work Around(s)

1) Change documentation to reflect addition of this parameter:
REPORT | LABEL FORM [TO PRINTER] [TO FILE ][]
[WHILE ] [FOR ][PLAIN | HEADING ]
[NOEJECT] [SUMMARY] [NOCONSOLE]

----------------------------------------------------------------------------
OS() Does not return user's operating system.

Clipper Version 1.03 dtd 09/15/90.

Problem Statement

OS() returns the operating system programmed into EXAMPLP.PRG.

Cause

Incorrect documentation or non-implementation of function.

Work Around(s)

1) Change documentation to reflect true action of this function.
2) Edit EXAMPLEP.PRG to reflect the desired system, compile and
link with your program.

----------------------------------------------------------------------------
PACK PACK's with multiple open indices may fail.

Clipper Version 1.03 dtd 09/15/90.

Problem Statement

PACK's with multiple indices may fail. The BADPAC.ZIP file on
NANFORUM illustrates the problem.

Cause

Unknown. Suspect indexing procedure.

Work Around(s)

Close indices before PACKing. Re-index the files, using INDEX ON rather
than REINDEX. Some users recommend erasing the index files prior to
usage of the INDEX ON. Otherwise, design your program so that PACK's
are not required.

seealso "REINDEX" "INDICES"

----------------------------------------------------------------------------
PICTURE Anomalies with the PICTURE clause.

Clipper Version 1.03 dtd 09/15/90.

Problem Statement

1) PICTURE "Y" May return lowercase, if character type variable.
Using @ , GET PICTURE "Y" OR
Using @ , SAY GET PICTURE "Y"
will not force UPPER(cVar); i.e., cVar returned will be the same
case as entered by the user.

2) PICTURE "@R