If a multi-dimension array
– have a fixed number elements in each dimension and
– each column contains the same type of information for each row in array
called “uniform”.
This structure is similar to a table structure.
Built-in functions DBSTRUCT() and DIRECTORY() produces uniform arrays.
Array produced by DBSTRUCT() will have field count in size and the structure of an array is:
Field Name C
Field Type C
Field Width N
Field Dec N
And DIRECTORY() function produces an array with elements as file count and with this structure:
File Name C
File Size N
File Date D
File Time C
File Attributes C
Building, maintaining and using those arrays is simple as possible.
Let’s look at a sample .prg:
-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._
#include "directry.ch"
#include "dbstruct.ch"
PROCEDURE Main()
SET DATE GERM
SET CENT ON
?
? "Uniform arrays :"
?
?
? " Directory file list :"
?
FileList()
?
? " Table structure list :"
?
IF MakUseTable()
DispStru()
ELSE
? "Couldn't USE or Make th table."
ENDIF
?
@ MAXROW(), 0
WAIT "EOF UF_Arrays.prg"
RETURN // UF_Arrays.Main
*-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._
PROCEDURE FileList()
LOCAL aFList := DIRECTORY( "C:\Harbour\*.*" )
LOCAL a1File
FOR EACH a1File IN aFList
? SPACE( 4 ),;
PAD( a1File[ F_NAME ], 13 ),; /* File name */
TRAN( a1File[ F_SIZE ], "999,999,999" ),; /* File size */
a1File[ F_DATE ],; /* File date */
a1File[ F_TIME ],; /* File time */
a1File[ F_ATTR ] /* File attribute */
NEXT
RETURN // FileList()
*-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._
FUNCTION MakUseTable()
LOCAL cTablName := "CUSTOMER.DBF"
LOCAL lRetval, aStru
IF FILE( cTablName )
USE (cTablName)
ELSE
aStru := { { "CUST_ID", "C", 5, 0 },;
{ "CUST_NAME", "C", 10, 0 },;
{ "CUST_SNAM", "C", 10, 0 },;
{ "CUST_FDAT", "D", 8, 0 },;
{ "CUST_ACTV", "L", 1, 0 },;
{ "CUST_BLNCE", "N", 11, 2 } }
*
* 5-th parameter of DBCREATE() is alias -
* if not given then WA is open without alias
* ^^^^^^^^^^^^^
DBCREATE( cTablName, aStru, , .F., "CUSTOMER" )
ENDIF
lRetval := ( ALIAS() == "CUSTOMER" )
RETURN lRetval // MakUseTable()
*-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._
PROCEDURE DispStru()
LOCAL nTotal := 1
IF SELECT() > 0
aStructur := DBSTRUCT()
? SPACE( 4 ), "No: Field Name Type Width Dec"
? SPACE( 4 ), "--- ---------- ---- ----- ---"
AEVAL( aStructur, { | aF1, nFNo | ;
QOUT( SPACE( 4 ),; // Left Marj
PADL( nFNo, 3 ),; // Field No
PADR( aF1[ DBS_NAME ], 11 ),; // Field Name
PADC( aF1[ DBS_TYPE ], 4 ),; // Field Type
PADL( aF1[ DBS_LEN ], 4 ),; // Field Len
PADL( aF1[ DBS_DEC ], 3 )),; // Field Dec
nTotal += aF1[ 3 ] } )
? SPACE( 4 ), "--- ---------- ---- ----- ---"
? SPACE( 4 ), "** Total ** ", TRAN( nTotal, "9,999" )
ELSE
? "Current work area is empty"
ENDIF
RETURN // DispStru()
*-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._
