Tag Archives: Index File
xBase File Types
xBase File Types and Extensions
Ext. | File Type | Introduced or used by |
.$$$ | temporary file | dBASE III |
.$db | temporary file | dBASE IV |
.act | FoxDoc Action Diagrams | FoxPro |
.app | application object file | dBASE Appl. Generator |
.app | generated application | FoxPro |
.bak | Backup file | dBASE |
.bar | horizontal bar menu object file | dBASE Appl. Generator |
.bin | Binary files | dBASE |
.bch | batch process object file | dBASE Appl. Generator |
.cac | executable when caching on/off | dBASE IV |
.cat | catalog | dBASE III, IV |
.cdx | compound index | FoxPro |
.ch | header file | Clipper |
.cht | interface file for ChartMaster | dBASE |
.clp | compiler script file (clip list) | Clipper |
.cmd | command | dBASE – Waffle |
.cod | template source file | dBASE Appl. Generator |
.cpt | encrypted memo file | dBASE |
.crp | encrypted database | dBASE IV |
.ctl | control file | dBASE IV – Aldus Setup |
.cvt | backup file for CONVERTed database file | dBASE IV |
.db | configuration | dBASE |
.db$ | temporary file | dBASE |
.db2 | database | dBASE II |
.db3 | database | dBASE III |
.dbf | database file | dBASE – FoxPro |
.dbk | database backup | dBASE IV |
.dbo | compiled program | dBASE IV |
.dbt | FoxBASE+ style memo | FoxPro |
.dbt | memo file for database w/same name | dBASE – Clipper |
.def | Definitions list | dBASE |
.dif | Data Interchange Format. For APPEND FROM, COPY | dBASE – VisiCal |
.doc | Documentation text file | dBASE Appl. Generator |
.fil | files list object file | dBASE Appl. Generator |
.fky | macro file | FoxPro |
.fmo | compiled format file | dBASE IV |
.fmt | format file | dBASE – FoxPro – Clipper |
.fp | configuration file | FoxPro |
.fpc | catalog | FoxPro |
.fpt | memo | FoxPro |
.fr3 | renamed dBASE III+ form file | dBASE IV |
.frg | uncompiled report file, code fragment file | dBASE IV |
.frm | report file | dBASE – Clipper |
.fro | compiled report file | dBASE IV |
.frt | report memo | FoxPro |
.frx | report | FoxPro |
.fw2 | Framework spreadsheet or database file | Framework – dBASE |
.fxp | compiled format | FoxPro |
.gen | compiled template | dBASE Appl. Generator |
.idx | index (many) | FoxPro |
.ind | include index | dBASE IV |
.inx | index | FoxBase |
.key | Key macro library | dBASE |
.lbg | label generator data | dBASE IV |
.lbl | label | dBASE – Clipper |
.lbo | compiled label | dBASE IV |
.lbt | label memo | FoxPro |
.lbx | label | FoxPro |
.ld1 | overlay file | dBASE |
.log | Transaction log file | dBASE |
.mbk | multiple index file backup | dBASE IV |
.mdx | multiple index file | dBASE IV |
.mem | memory variable save file | dBASE – FoxPro |
.mnt | menu memo | FoxPro |
.mnx | menu | FoxPro |
.mpr | generated program | FoxPro |
.mpx | compiled menu program | FoxPro |
.ndx | index file | dBASE |
.npi | source for DGEN.EXE interpreter | dBASE Appl. Generator |
.ntx | index file | Clipper |
.pjt | project memo | FoxPro |
.pjx | project | FoxPro |
.plb | library | FoxPro |
.pll | pre-linked library | Clipper |
.plt | pre-linked transfer file | Clipper |
.pop | pop-up menu object | dBASE Appl. Generator |
.ppo | pre-processor output | Clipper |
.pr2 | printer driver | dBASE IV |
.pr3 | PostScript printer driver | dBASE IV |
.prf | printer driver | dBASE IV |
.prg | program source file | dBASE – FoxPro – Clipper |
.prs | procedure | dBASE IV |
.prt | Print dump | dBASE |
.prx | compiled program | FoxPro |
.qbe | saved query (Query By Example) | dBASE IV – Quattro Pro |
.qbo | compiled query | dBASE IV |
.qpr | generated query program | FoxPro |
.qpx | compiled query program | FoxPro |
.qry | query | dBASE IV |
.res | dBASE resources | dBASE IV |
.rpd | Rapid file. For IMPORT/EXPORT,APPEND FROM, COPY | dBASE |
.sc3 | renamed dBASE III screen mask file | dBASE IV |
.scr | screen – screen snapshot | dBASE IV |
.sct | screen memo | FoxPro |
.scx | screen | FoxPro |
.spr | generated screen program | FoxPro |
.spx | compiled screen program | FoxPro |
.str | structure list object file | dBASE Appl. Generator |
.t44 | Temporary file for Sort or Index | dBASE IV |
.tbk | memo backup | dBASE IV – FoxPro |
.tvf | table view settings | dBASE |
.upd | update data | dBASE |
.upo | compiled update data | dBASE |
.val | values list object file | dBASE Appl. Generator |
.vew | view file | Clipper, Lotus Approach |
.vue | view | dBASE IV – FoxPro |
.w44 | temporary file for Sort or Index | dBASE |
.wfm | form object | dBASE Form Designer |
.win | window file | FoxPro – dBASE |
Source : http://www.clicketyclick.dk/databases/xbase/format/index.html
Notes:
– Such a list can’t be perfect. Some item may be obsolete / forgotten and something may not exist when this list compiled.
– “Clipper” may not include all versions of Clipper.
– Most of Clipper files are supported by Harbour.
HbRun
HbRun is a console interpreter and program ( command file / script file / .prg / .hrb ) runner for the Harbour Language.
Addendum: a clarification by Przemek:
HBRUN is a simple wrapper to Harbour compiler so the same syntax as in
Cl*pper is supported:
DO <filename>[.prg]
only .prg is accepted as extension and it’s default so you do not
have to set it explicitly.
( In Harbour Users Google group, under “hbmk2 and the Dot Prompt” topic:
It can work as interpreter when invoked without parameters or can execute xBase / Harbour source code in .prg file or compiled Harbour Portable Objects (.hrb) file given as parameter.
Type of file is recognized by extension used with <file> parameter. If not given then .hrb is used.
In other words, HbRun can be use in both interpret and batch mode.
Regarding parameter given or not, when calling HbRun this ‘mode’ determined by program itself. If a parameter ( usually a .prg or .hrb file name ) given, program run in ‘batch’ mode, runs (executes) given script file and end. If no parameter given, program enter interpreter mode.
Using HbRun as an interpreter, may be very useful, productive, and educative for xBase programmers. Too many xBase programmers was learned everything, including DBF file system and xBase programming language by famous “dot prompt”. Today many xBase programmers uses HbRun daily basis.
When HbRun begin, open a console screen with two basic area: status bars at top and dot prompt line at bottom.
Status bars :
Dot prompt is quite simple visually: a dot and a line in inverse color beginning with a blinking cursor :
You may enter here a command to see the result.
For example “DIR” command will give a list of database (.dbf) files in current directory:
SET COLO TO “GR+/N” command will remember you old days :
The DIR command can be used with DOS style “filter / skeleton” parameter :
DIR *.PRG
DIR *.*
etc.
Inspecting any table ( .dbf file ) is very simple:
USE CLIENTS
BROWSE ()
Expand a little:
SET COLO TO “GB+/N”
USE CLIENTS
BROWSE( 3, 10, 24, 60 )
If you plan to use this snap frequently, make a .prg file (say brwclien.prg) with this three line and run it with DO command:
DO BRWCLIEN
Sometime LIST command may be better:
LIST CL_ID, CLI_SNAM, CLI_NAME, CLI_TLF
You can add FOR clause to the LIST command:
LIST CL_ID, CLI_SNAM, CLI_NAME, CLI_TLF FOR RECN() < 10
or
LIST CL_ID, CLI_SNAM, CLI_NAME, CLI_TLF FOR EMPTY( CLI_TLF )
The structure info of a table frequently requires while daily work to xBase Programmers.
Here three small programs for obtain structure info of a table. Usage is quite simple: open ( USE ) your table and enter DO <prgFileName>; for example:
USE CLIENT
DO LISTSTRU
or
DO DISPSTRU
or
DO SAVESTRU
Notes :
– To avoid some possible screen metric conflicts caused by default console (DOS box) settings of OS, may be useful some adjusting before invoke HbRun; such as:
MODE CON LINES=48 COLS=128
– “?” command may be useful as a built-in calculator :
? 2*2 // 4
? 2**8 // 256
? SQRT( 81 ) // 9
– HbRun keep a “history” for commands entered (for a limited count of commands of course). You can access (and re-enter when required) by using up and down keys. Moreover this history may be usable after re-invoke HbRun.
– Though Harbour Language is essential, some legal Harbour commands / functions may be un-recognizable by HbRun.
– Though some legal statements works in interpret mode, may not works in batch mode (such as Browse() ).
Last Note : No further explanation required for experienced xBase programmers; try, see and learn.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Examples :
/* DispStru.prg Display structure of current table ( .dbf file ) on screen. */ MEMVAR ASTRUCT, NTOTLEN IF EMPTY( ALIAS() ) SETCOLOR( "R/N" ) ? "No active table in the current work area !", LTRIM( STR( SELECT() ) ) ELSE @ 3, 0 CLEA TO MAXROW() - 1, MAXCOL() aStruct := DBSTRUCT() nTotLen := 1 AEVAL( aStruct, { | a1Field | nTotLen += a1Field[ 3 ] } ) AEVAL( aStruct, { | a1Field, n1FieldNo | ; aStruct[ n1FieldNo ] := STR( n1FieldNo, 3 ) + " " +; PADR( a1Field[ 1 ], 12 ) +; PADC( a1Field[ 2 ], 4 ) +; PADL( a1Field[ 3 ], 5 ) +; PADL( a1Field[ 4 ], 3 ) } ) ? "Structure of database :", DBINFO( 10 ) ? "Number of data records :", LTRIM( STR( LASTREC() ) ) ? "Date of last update :", LUPDATE() ? "Fld Name Type Width Dec" ? "--- ---------- ---- ----- ---" @ 21,0 SAY "** Total ** " + PADL( nTotLen, 6 ) ACHOICE( 8, 0, 20, 30, aStruct ) ENDIF ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* ListStru.prg List structure of current table ( .dbf file ) on screen. */ MEMVAR ASTRUCT, NTOTLEN IF EMPTY( ALIAS() ) SETCOLOR( "R/N" ) ? "No active table in the current work area !", LTRIM( STR( SELECT() ) ) ELSE @ 3, 0 CLEA TO MAXROW() - 1, MAXCOL() aStruct := DBSTRUCT() nTotLen := 1 AEVAL( aStruct, { | a1Field | nTotLen += a1Field[ 3 ] } ) AEVAL( aStruct, { | a1Field, n1FieldNo | ; aStruct[ n1FieldNo ] := STR( n1FieldNo, 3 ) + " " +; PADR( a1Field[ 1 ], 12 ) +; PADC( a1Field[ 2 ], 4 ) +; PADL( a1Field[ 3 ], 5 ) +; PADL( a1Field[ 4 ], 3 ) } ) ? "Structure of database :", DBINFO( 10 ) ? "Number of data records :", LTRIM( STR( LASTREC() ) ) ? "Date of last update :", LUPDATE() ? "Fld Name Type Width Dec" ? "--- ---------- ---- ----- ---" AEVAL( aStruct, { | c1Field | QOUT( c1Field ) } ) ? "** Total ** ", PADL( nTotLen, 5 ) ENDIF ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /* SaveStru.prg Save structure of current table ( .dbf file ) to a file. Notes : - This program uses ListStru.prg - Name of target file constructed at line 18; if required you may use alternate ways or simply using a constant. */ MEMVAR AlteFName IF EMPTY( ALIAS() ) SETCOLOR( "R/N" ) ? "No active table in the current work area !", LTRIM( STR( SELECT() ) ) ELSE AlteFName := LEFT( ALIAS(), 4 ) + "STRU" SET ALTE TO &AlteFName SET ALTE ON DO LISTSTRU SET ALTE OFF SET ALTE TO ENDIF ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Clipper and Networking
Hash vs Table
Consider a table for customers records with two character fields : Customer ID and customer name:
Cust_ID | Cust_Name |
CC001 | Pierce Firth |
CC002 | Stellan Taylor |
CC003 | Chris Cherry |
CC004 | Amanda Baranski |
It’s known all possible and necessary operations on a table: APPEND, DELETE, SEEK and so on; by the way, for SEEK we need an index file also.
Listing this table is quite simple:
USE CUSTOMER
WHILE .NOT. EOF()
? CUST_ID, CUST_NAME
DBSKIP()
ENDDO
If our table is sufficiently small, we can find a customer record without index and SEEK :
LOCATE FOR CUST_ID = “CC003”
? CUST_ID, CUST_NAME
If we want all our data will stand in memory and we could manage it more simple and quick way, we would use an array ( with some considerations about size of table; if it is too big, this method will be problematic ) :
aCustomer := {} // Declare / define an empty array
USE CUSTOMER
WHILE .NOT. EOF()
AADD(aCustomer, { CUST_ID, CUST_NAME } )
DBSKIP()
ENDDO
Traversing this array is quite simple :
FOR nRecord := 1 TO LEN( aCustomer )
? aCustomer[ nRecord, 1 ], aCustomer[ nRecord, 2 ]
NEXT
or :
a1Record := {}
FOR EACH a1Record IN aCustomer
? a1Record[ 1 ], a1Record[ 2 ]
NEXT
And locating a specific record too:
nRecord := ASCAN( aCustomer, { | a1Record | a1Record[ 1 ] == “CC003” } )
? aCustomer[ nRecord, 1 ], aCustomer[ nRecord, 2 ]
A lot of array functions are ready to use for maintain this array : ADEL(), AADD(), AINS() etc …
Now, let’s see how we could use a hash for achieve this job :
hCustomer := { => } // Declare / define an empty hash
USE CUSTOMER
WHILE .NOT. EOF()
hCustomer[ CUST_ID ] := CUST_NAME
DBSKIP()
ENDDO
Let’s traversing :
h1Record := NIL
FOR EACH h1Record IN hCustomer
? h1Record: __ENUMKEY(),h1Record:__ENUMVALUE()
NEXT
Now, we have a bit complicate our job; a few field addition to the table :
No: | Field Name | Type | Width | Dec | Decription |
1 |
CUST_ID |
C |
5 |
0 |
Id ( Code ) |
2 |
CUST_NAME |
C |
10 |
0 |
Name |
3 |
CUST_SNAM |
C |
10 |
0 |
Surname |
4 |
CUST_FDAT |
D |
8 |
0 |
First date |
5 |
CUST_ACTV |
L |
1 |
0 |
Is active ? |
6 |
CUST_BLNCE |
N |
11 |
2 |
Balance |
While <key> part of an element of a hash may be C / D / N / L type; <xValue> part of hash too may be ANY type of data, exactly same as arrays.
So, we can make fields values other than first ( ID) elements of an array:
hCustomer := { => } // Declare / define an empty hash
USE CUSTOMER
WHILE .NOT. EOF()
a1Data:= { CUST_NAME, CUST_SNAM, CUST_FDAT, CUST_ACTV, CUST_BLNCE }
hCustomer[ CUST_ID ] := a1Data
DBSKIP()
ENDDO
Let’s traversing :
h1Record := NIL
FOR EACH h1Record IN hCustomer
a1Key := h1Record:__ENUMKEY()
a1Data := h1Record:__ENUMVALUE()
? a1Key
AEVAL( a1Data, { | x1 | QQOUT( x1 ) } )
NEXT *-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._ /* Hash vs Tables */ #define NTrim( n ) LTRIM( STR( n ) ) #define cLMarj SPACE( 3 ) PROCEDURE Main() SET DATE GERM SET CENT ON SET COLO TO "W/B" SetMode( 40, 120 ) CLS hCustomers := { => } // Declare / define an empty PRIVATE hash IF MakUseTable() Table2Hash() * Here the hash hCustomers may be altered in any way ZAP Hash2Table() ELSE ? "Couldn't make / USE table" ENDIF ? @ MAXROW(), 0 WAIT "EOF HashVsTable.prg" RETURN // HashVsTable.Main() *-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._. PROCEDURE Table2Hash() hCustomers := { => } WHILE .NOT. EOF() hCustomers[ CUST_ID ] := CUST_SNAM DBSKIP() ENDDO ListHash( hCustomers, "A hash transferred from a table (single value)" ) hCustomers := { => } // Declare / define an empty hash DBGOTOP() WHILE .NOT. EOF() hCustomers[ CUST_ID ] := { CUST_NAME, CUST_SNAM, CUST_FDAT, CUST_ACTV, CUST_BLNCE } DBSKIP() ENDDO ListHash( hCustomers, "A hash transferred from a table (multiple values)" ) RETURN // Table2Hash() *-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._. PROCEDURE Hash2Table() LOCAL h1Record,; c1Key,; a1Record,; n1Field FOR EACH h1Record IN hCustomers c1Key := h1Record:__ENUMKEY() a1Record := h1Record:__ENUMVALUE() DBAPPEND() FIELDPUT( 1, c1Key ) AEVAL( a1Record, { | x1, n1 | FIELDPUT( n1 + 1 , x1 ) } ) NEXT h1Record DBGOTOP() ? ? "Data trasferred from hash to table :" ? WHILE ! EOF() ? STR( RECN(), 5), '' FOR n1Field := 1 TO FCOUNT() ?? FIELDGET( n1Field ), '' NEXT n1Field DBSKIP() ENDDO RETURN // Hash2Table() *-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._. PROCEDURE ListHash( hHash, cComment ) LOCAL x1Pair cComment := IF( HB_ISNIL( cComment ), '', cComment ) ? ? cComment // , "-- Type :", VALTYPE( hHash ), "size:", LEN( hHash ) ? IF HB_ISHASH( hHash ) FOR EACH x1Pair IN hHash nIndex := x1Pair:__ENUMINDEX() x1Key := x1Pair:__ENUMKEY() x1Value := x1Pair:__ENUMVALUE() ? cLMarj, NTrim( nIndex ) * ?? '', VALTYPE( x1Pair ) ?? '', x1Key, "=>" * ?? '', VALTYPE( x1Key ) * ?? VALTYPE( x1Value ) IF HB_ISARRAY( x1Value ) AEVAL( x1Value, { | x1 | QQOUT( '', x1 ) } ) ELSE ?? '', x1Value ENDIF NEXT ELSE ? "Data type error; Expected hash, came", VALTYPE( hHash ) ENDIF HB_ISHASH( hHash )
RETURN // ListHash() *-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._. FUNCTION MakUseTable() // Make / USE table LOCAL cTablName := "CUSTOMER.DBF" LOCAL lRetval, aStru, aData, a1Record 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" ) aData := { { "CC001", "Pierce", "Firth", 0d20120131, .T., 150.00 },; { "CC002", "Stellan", "Taylor", 0d20050505, .T., 0.15 },; { "CC003", "Chris", "Cherry", 0d19950302, .F., 0 },; { "CC004", "Amanda", "Baranski", 0d20011112, .T., 12345.00 } } FOR EACH a1Record IN aData CUSTOMER->(DBAPPEND()) AEVAL( a1Record, { | x1, nI1 | FIELDPUT( nI1, X1 ) } ) NEXT a1Record DBGOTOP() ENDIF lRetval := ( ALIAS() == "CUSTOMER" ) RETURN lRetval // MakUseTable() *-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._