Hacker’s Guide to Visual FoxPro
An irreverent look at how Visual FoxPro really works. Tells you the inside scoop on every command, function, property, event and method of Visual FoxPro.
AFIELDS()
This function puts information about table structure into an array. Read it as “Array from fields.” In Visual FoxPro, this function returns a lot more information than in previous FoxPro versions.
nFieldCount = AFIELDS( ArrayName [, cAlias | nWorkarea ] )
Parameter |
Value |
Meaning |
ArrayName |
Array Name |
The array to hold table structure information. |
cAlias |
Character |
The alias of the table whose structure information is placed in ArrayName. |
Omitted |
If nWorkarea is also omitted, use current work area. |
|
nWorkarea |
Numeric |
The number of the work area containing the table whose structure information is placed in ArrayName. |
Omitted |
If cAlias is also omitted, use current work area. |
|
nFieldCount |
Positive number |
The number of rows in the array, which is the number of fields in the specified table. |
In VFP 5 and later, the resulting array has 16 columns. In VFP 3, the array has only the first 11 of these columns.
Column |
Type |
Meaning |
1 |
Character |
Field name. |
2 |
Single Character |
Field type (see TYPE() for a list of field types). |
3 |
Numeric |
Field size. |
4 |
Numeric |
Decimal places. |
5 |
Logical |
Nulls allowed? |
6 |
Logical |
Code page translation NOT allowed? |
7 |
Character |
Field Validation rule (from DBC). |
8 |
Character |
Field Validation text (from DBC). |
9 |
Character |
Field Default value (from DBC). |
10 |
Character |
Table Validation rule (from DBC). |
11 |
Character |
Table Validation text (from DBC). |
12 |
Character |
Long table name (from DBC). |
13 |
Character |
Insert Trigger expression (from DBC). |
14 |
Character |
Update Trigger expression (from DBC). |
15 |
Character |
Delete Trigger expression (from DBC). |
16 |
Character |
Table Comment (from DBC). |
The sixth column indicates whether code page translation is allowed, but it uses a sort of double negative. In other words, this column is .T. if the field has the NOCPTRANS attribute, which happens if you define it as Character (binary) or Memo (binary). TYPE()
doesn’t supply this information, so you need to use either AFIELDS()
, COPY STRUCTURE
EXTENDED or SET(“NOCPTRANS”) to find out which fields have this attribute. All the columns from 10 to the end contain table-level information and are filled in only for the first field of the table (the first array row). We’re not really sure why this information is returned by AFIELDS()
at all. DBGetProp()
returns the information, so it’s already available, though not in array form. We guess it’s to make it possible to use AFIELDS()
, followed by CREATE TABLE
with the FROM ARRAY clause.
As discussed in “DBF, FPT, CDX, DBC—Hike!,” tables that contain nullable fields also have a hidden system field called _NullFlags. Note that this field is not returned by AFIELDS()
(it wouldn’t be very well hidden if it was, now, would it?) and therefore routines that think they can add the values returned from AFIELDS()
to calculate the size of a DBF will break. Check out RECSIZE()
instead.
The same array is created for a FREE TABLE
as for a table contained in a database, but the columns marked “(from DBC)” in the table above are empty, in that case.
SELECT Customer
= AFIELDS(aCustFlds) && structure array for Customer
USE MyTable IN 0
= AFIELDS(aMyStruc, "MyTable") && structure array for MyTable
ADatabases(), ADBObjects(), ADir(), Array Manipulation, Copy Structure Extended, Create Table, DBGetProp(), FCount(), FSize(), RecSize(), Set NoCPTrans, Type()